X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=googledocumentservice.cpp;fp=googledocumentservice.cpp;h=10a8c076daaae311cac5722db6b8249bcd701117;hb=116d4a8ed391a2395a9d60009291ef6c36dfd6f6;hp=0000000000000000000000000000000000000000;hpb=deea0c427563154d3880223f029ebe3ebd4f656c;p=froff-onlinedoc diff --git a/googledocumentservice.cpp b/googledocumentservice.cpp new file mode 100644 index 0000000..10a8c07 --- /dev/null +++ b/googledocumentservice.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2010 Mani Chandrasekar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include "googledocumentservice.h" +#include "googledocumentlist.h" +#include "googledocument.h" +#include "googlecontenthandler.h" +#include "mimetypes.h" +const QString GoogleDocumentService::GOOGLE_DOCUMENT_URL = "docs.google.com"; +const QString GoogleDocumentService::GOOGLE_SPREADSHEET_URL = "spreadsheets.google.com"; + +GoogleDocumentService::GoogleDocumentService() + : newInformation(true) + , waitingForDoc(false) + , uploadingDoc(false) + , loggedin(false) + , haveDocAuthToken(false) +{ + saveFileName = 0; + connect(&networkManager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(handleNetworkData(QNetworkReply*))); + gHandler = new GoogleContentHandler(); + xmlReader.setContentHandler(gHandler); +} + +void GoogleDocumentService::clientLogin(const QString & username, const QString & password) +{ + QByteArray data; + data.append(QString("Email=" + username + "&Passwd=" + password).toUtf8()); + + if(!haveDocAuthToken) { + data.append(QString("&service=writely&source=KOfficev2").toUtf8()); + this->username = username; + this->password = password; + } else { + data.append(QString("&service=wise&source=KOfficev2").toUtf8()); + } + QNetworkRequest req(QUrl("https://www.google.com/accounts/ClientLogin")); + req.setRawHeader("Host", "www.google.com"); + req.setRawHeader("GData-Version", "3.0"); + req.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); + req.setHeader(QNetworkRequest::ContentLengthHeader, data.length()); + + networkManager.post(req, data); +} + +void GoogleDocumentService::listDocuments() +{ + qDebug() << ">>>>>>>>>>>>>> List Documents" ; + authToken = docAuthToken; + QNetworkRequest requestHeader(QUrl("https://docs.google.com/feeds/default/private/full")); + requestHeader.setRawHeader("Host", "docs.google.com"); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Content-Type", "application/atom+xml"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + + networkManager.get(requestHeader); +} + +void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply) +{ + QUrl url = networkReply->url(); + bool ok = false; + if(!networkReply->error()) { + if(!loggedin) { + QByteArray m_data = networkReply->readAll(); + QString text(m_data.data()); + text = text.right(text.length() - text.indexOf("Auth=") - 5); + authToken = QString("GoogleLogin auth=") + text.left(text.indexOf("\n")); + if(authToken.length() > 20) { + if(!haveDocAuthToken) { + docAuthToken = authToken; + haveDocAuthToken = true; + clientLogin(this->username, this->password); + return; + } + spreadAuthToken = authToken; + authToken = ""; + loggedin = true; + qDebug() << ">>>>>>>>>>>>>> Login success" ; + emit userAuthenticated(loggedin); + } else { + qDebug() << ">>>>>>>>>>>>>> Login failed" ; + emit userAuthenticated(false); + } + } else if(waitingForDoc) { + QByteArray data = networkReply->readAll(); + QFile file(*saveFileName); + file.open(QIODevice::WriteOnly); + file.write(data); + file.close(); + qDebug() << ">>>>>>>>>>>>>> Received Document!!!!! " << file.fileName(); + waitingForDoc = false; + emit downloadDone(true); + } else if(uploadingDoc) { + uploadingDoc = false; + qDebug() << ">>>>>>>>>>>>>> Upload done" ; + emit uploadDone(true); + } else { + qDebug() << ">>>>>>>>>>>>>> Received List" ; + gHandler = new GoogleContentHandler(); + xmlReader.setContentHandler(gHandler); + QByteArray data = networkReply->readAll(); + xmlInput.setData(data); + ok = xmlReader.parse(&xmlInput, true); + prepareLists(); + } + } else { + qDebug() << networkReply->readAll(); + if(!loggedin) + emit userAuthenticated(false); + else if(waitingForDoc) { + emit downloadDone(false); + waitingForDoc = false; + } else if(uploadingDoc) { + emit uploadDone(false); + uploadingDoc = false; + } else + emit listDone(false); + } + networkReply->deleteLater(); +} + +void GoogleDocumentService::prepareLists() +{ + presentationList.clear(); + documentList.clear(); + spreadsheetList.clear(); + othersList.clear(); + QList gList = gHandler->documentList()->entries(); + foreach(GoogleDocument * i, gList) { + if("presentation" == i->documentType()) + presentationList.append(i); + else if("spreadsheet" == i->documentType()) + spreadsheetList.append(i); + else if("document" == i->documentType()) + documentList.append(i); + else + othersList.append(i); + } + qDebug() << ">>>>>>>>>>>>>> Lists Done" ; + emit listDone(true); +} + + +void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName) +{ + this->saveFileName = saveFileName; + authToken = docAuthToken; + QString url = doc->documentUrl(); + QString type = doc->documentType(); + qDebug() << type << "=" << url; + url.replace("docId", "docID", Qt::CaseInsensitive); + QString exportFormat = ""; + + if(QString::compare(type, "spreadsheet") == 0) { + exportFormat = "&exportFormat=ods&format=ods"; + authToken = spreadAuthToken; + } else if(QString::compare(type, "presentation") == 0) + exportFormat = "&exportFormat=ppt&format=ppt"; + else if(QString::compare(type, "document") == 0) + exportFormat = "&exportFormat=odt&format=odt"; + + QUrl documentUrl(url + exportFormat); + + QNetworkRequest requestHeader(documentUrl); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + + QNetworkReply *reply = networkManager.get(requestHeader); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64))); + waitingForDoc = true; + qDebug() << ">>>>>>>>>>>>>> Downloading file" ; +} + +void GoogleDocumentService::uploadDocument(QString *filename, QString *title) +{ + authToken = docAuthToken; + QFile file(*filename); + file.open(QFile::ReadOnly); + QByteArray data = file.readAll(); + file.close(); + QUrl url; + url.setUrl("https://docs.google.com/feeds/default/private/full"); + + QNetworkRequest requestHeader(url); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + requestHeader.setRawHeader("Content-Type", MimeTypes::getMimeType(QFileInfo(*filename).suffix()).toUtf8()); + requestHeader.setRawHeader("Content-Length", QString::number(data.length()).toUtf8()); + requestHeader.setRawHeader("Slug", QUrl::toPercentEncoding(*title)); + + QNetworkReply *reply = networkManager.post(requestHeader, data); + connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64))); + uploadingDoc = true; + qDebug() << ">>>>>>>>>>>>>> Uploading file" ; +} +