PdfPrinter::PdfPrinter(QObject *parent) : QObject(parent){.......... socket = new QTcpSocket(); dataSocket = new QTcpSocket(); connect(socket, SIGNAL(connected()), SLOT(onConnected()), Qt::DirectConnection); connect(socket, SIGNAL(readyRead()), SLOT(onRead()), Qt::DirectConnection); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onError(QAbstractSocket::SocketError)), Qt::DirectConnection); connect(socket, SIGNAL(disconnected()), SLOT(onDisconnected()), Qt::DirectConnection); connect(dataSocket, SIGNAL(readyRead()), SLOT(onDataRead()), Qt::DirectConnection);............}void PdfPrinter::connectFtp(){ socket->connectToHost(server,21); socket->waitForConnected();}void PdfPrinter::onRead(){ QString message=(QString(socket->readAll()));.............// различные ответы FTP if (message.startsWith("227")) { QRegExp regExp("[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}"); int pos = regExp.indexIn(message); if (pos > -1) { QStringList addresses = regExp.capturedTexts().at(0).split(","); QString connectAddr = ""; for (int i = 0; i < 4; i++) { connectAddr += addresses.at(i); if (i < 3) connectAddr += "."; } int port = addresses.at(4).toInt() * 256 + addresses.at(5).toInt(); if (files.isEmpty()) { //files - список файлов в каталоге. Если пустой - отправляем команду получения списка sendToServer("NLST\r\n"); qDebug("Listing..."); fflush(stdout); } else { //в противоположном случае качаем первый файл из списка sendToServer("RETR " + files.first() + "\r\n"); qDebug(QString("Downloading " + files.first() + "...").toUtf8()); fflush(stdout); } dataSocket->connectToHost(connectAddr,port); dataSocket->waitForConnected(); } } else {.......... if (message.startsWith("226")) { if (files.isEmpty() || isListing) { qDebug("Listing finished."); } else { qDebug(QString("Downloading " + files.first() + " finished.").toUtf8()); if (files.count() > 1) files.removeFirst(); else files.clear(); } dataSocket->disconnectFromHost(); dataSocket->close(); sendToServer("PASV\r\n"); fflush(stdout); } }.............}void PdfPrinter::onDataRead(){ if (files.isEmpty()) { isListing = true; QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")); QString data = QString(dataSocket->readAll()); QStringList fileNames = data.split("\r\n"); for (int i = 0; i < fileNames.count(); i++) { if (!fileNames.at(i).isEmpty()) { files.append(fileNames.at(i)); } } } else { QFile *file = new QFile(filePath + "/" + files.first()); if (isListing) { if (file->exists()) file->remove(); } isListing = false; file->open(QIODevice::Append); file->write(dataSocket->readAll()); //вот тут получается ByteArray c лишними \r перед \n file->waitForBytesWritten(100000); file->close(); delete file; }}
C++ (Qt)bool QIODevice::isTextModeEnabled () const
C++ (Qt)void QIODevice::setTextModeEnabled ( bool enabled )
bool QIODevice::isTextModeEnabled ()