/** * Puts groups and entries data into the given array (without encryption). * Sets groupCount and entryCount to the number of saved groups/entries. */ PwDatabaseV3::ErrorCode PwDatabaseV3::writeContent(QByteArray& contentData, int& groupCount, int& entryCount) { QDataStream contentStream(&contentData, QIODevice::WriteOnly); contentStream.setByteOrder(QDataStream::LittleEndian); setPhaseProgressRawTarget((quint64)(groupCount + entryCount)); // first prepare the content QList<PwGroup*> groups; QList<PwEntry*> entries; getRootGroup()->getAllChildren(groups, entries); for (int i = 0; i < groups.size(); i++) { dynamic_cast<PwGroupV3*>(groups.at(i))->writeToStream(contentStream); increaseProgress(1); } for (int i = 0; i < entries.size(); i++) { dynamic_cast<PwEntryV3*>(entries.at(i))->writeToStream(contentStream); increaseProgress(1); } // also write the meta-stream entries (which are not included in the above list) for (int i = 0; i < metaStreamEntries.size(); i++) { metaStreamEntries.at(i)->writeToStream(contentStream); } groupCount = groups.size(); entryCount = entries.size(); groups.clear(); entries.clear(); return SUCCESS; }
/*------------------------------------------------------------------------------* *------------------------------------------------------------------------------*/ void WebProxy::processQuery() { QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); QByteArray requestData = socket->readAll(); int pos = requestData.indexOf("\r\n"); QByteArray requestLine = requestData.left(pos); requestData.remove(0, pos + 2); QList<QByteArray> entries = requestLine.split(' '); QByteArray method = entries.value(0); QByteArray address = entries.value(1); QByteArray version = entries.value(2); qDebug( ) << __FILE__ << __FUNCTION__ << "Processing " << address; QUrl url = QUrl::fromEncoded(address); if (!url.isValid()) { //qWarning() << "Invalid URL:" << url; socket->disconnectFromHost(); return; } //Act as server is request are for local server if ((url.host() == "") && (QFile(address).exists())) { //qDebug( ) << __FILE__ << __FUNCTION__ << "Sending " << address; QByteArray header; QTextStream headerStream(&header, QIODevice::WriteOnly); //Construct response header headerStream << "HTTP/1.0 200 OK" << endl; headerStream << "Server: gpsbook/" << qApp->applicationVersion() << endl; headerStream << "Date: " << QDateTime::currentDateTime().toUTC().toString("ddd, dd MMM yyyy hh:mm:ss") << "GMT" << endl; headerStream << "Content-Type: text/html; charset=utf-8" << endl; headerStream << "Connection: close" << endl; headerStream << "Pragma: no-cache" << endl; headerStream << "Cache-Control: no-cache" << endl; QFile file(address); if (!file.open(QFile::ReadOnly | QFile::Text)) { qWarning() << "Cannot open:" << address; socket->disconnectFromHost(); return ; } QByteArray content; QTextStream contentStream(&content, QIODevice::WriteOnly); while (!file.atEnd()) { contentStream << file.readLine() << endl; } headerStream << "Content-Length:" << content.size() << endl; headerStream << "" << endl; socket->write(header); socket->write(content); //qDebug( ) << __FILE__ << __FUNCTION__ << "File sent (" << content.size() << "bytes) :-)"; socket->disconnectFromHost(); return; } #if ( QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) ) // Some finction of QUrl have been deprecated // This code is require for the internet browser and should be reviewed. #else #ifdef Q_OS_LINUX //Remove advert to speedup development ;-) if (url.toString().contains("googlesyndication") || url.toString().contains("yieldmanager.com")) { socket->disconnectFromHost(); return; } #endif qDebug( ) << __FILE__ << __FUNCTION__ << "URL: " << url.toString(); QString host = url.host(); int port = (url.port() < 0) ? 80 : url.port(); QByteArray req = url.encodedPath(); if (url.hasQuery()) req.append('?').append(url.encodedQuery()); requestLine = method + " " + req + " " + version + "\r\n"; requestData.prepend(requestLine); QString key = host + ':' + QString::number(port); QTcpSocket *proxySocket = socket->findChild<QTcpSocket*>(key); if (proxySocket) { proxySocket->setObjectName(key); proxySocket->setProperty("url", url); proxySocket->setProperty("requestData", requestData); proxySocket->write(requestData); } else { proxySocket = new QTcpSocket(socket); proxySocket->setObjectName(key); proxySocket->setProperty("url", url); proxySocket->setProperty("requestData", requestData); connect(proxySocket, SIGNAL(connected()), this, SLOT(sendRequest())); connect(proxySocket, SIGNAL(readyRead()), this, SLOT(transferData())); connect(proxySocket, SIGNAL(disconnected()), this, SLOT(closeConnection())); connect(proxySocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(closeConnection())); proxySocket->connectToHost(host, port); } #endif } //WebProxy::processQuery