2 * Copyright (c) 2010 Mani Chandrasekar <maninc@gmail.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include <QMessageBox>
23 #include "googledocumentservice.h"
24 #include "googledocumentlist.h"
25 #include "googledocument.h"
26 #include "googlecontenthandler.h"
27 #include "mimetypes.h"
28 const QString GoogleDocumentService::GOOGLE_DOCUMENT_URL = "docs.google.com";
29 const QString GoogleDocumentService::GOOGLE_SPREADSHEET_URL = "spreadsheets.google.com";
31 GoogleDocumentService::GoogleDocumentService()
32 : newInformation(true)
36 , haveDocAuthToken(false)
39 connect(&networkManager, SIGNAL(finished(QNetworkReply*)),
40 this, SLOT(handleNetworkData(QNetworkReply*)));
41 gHandler = new GoogleContentHandler();
42 xmlReader.setContentHandler(gHandler);
45 void GoogleDocumentService::clientLogin(const QString & username, const QString & password)
48 data.append(QString("Email="+username+"&Passwd="+password).toUtf8());
50 if(!haveDocAuthToken) {
51 data.append(QString("&service=writely&source=KOfficev2").toUtf8());
52 this->username = username;
53 this->password = password;
56 data.append(QString("&service=wise&source=KOfficev2").toUtf8());
58 QNetworkRequest req(QUrl("https://www.google.com/accounts/ClientLogin"));
59 req.setRawHeader("Host", "www.google.com");
60 req.setRawHeader("GData-Version", "3.0");
61 req.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
62 req.setHeader(QNetworkRequest::ContentLengthHeader, data.length());
64 networkManager.post(req, data);
67 void GoogleDocumentService::listDocuments()
69 qDebug() << ">>>>>>>>>>>>>> List Documents" ;
70 authToken = docAuthToken;
71 QNetworkRequest requestHeader(QUrl("https://docs.google.com/feeds/default/private/full"));
72 requestHeader.setRawHeader("Host", "docs.google.com");
73 requestHeader.setRawHeader("User-Agent", "KOffice");
74 requestHeader.setRawHeader("GData-Version", "3.0");
75 requestHeader.setRawHeader("Content-Type", "application/atom+xml");
76 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
78 networkManager.get(requestHeader);
81 void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply)
83 QUrl url = networkReply->url();
85 if (!networkReply->error()) {
87 QByteArray m_data = networkReply->readAll();
88 QString text(m_data.data());
89 text = text.right(text.length()-text.indexOf("Auth=")-5);
90 authToken = QString("GoogleLogin auth=")+text.left(text.indexOf("\n"));
91 if (authToken.length() > 20) {
92 if(!haveDocAuthToken) {
93 docAuthToken = authToken;
94 haveDocAuthToken = true;
95 clientLogin(this->username, this->password);
98 spreadAuthToken = authToken;
101 qDebug() << ">>>>>>>>>>>>>> Login success" ;
102 emit userAuthenticated(loggedin);
105 qDebug() << ">>>>>>>>>>>>>> Login failed" ;
106 emit userAuthenticated(false);
109 else if (waitingForDoc) {
110 QByteArray data = networkReply->readAll();
111 QFile file(*saveFileName);
112 file.open(QIODevice::WriteOnly);
115 qDebug() << ">>>>>>>>>>>>>> Received Document!!!!! " << file.fileName();
116 waitingForDoc = false;
117 emit downloadDone(true);
119 else if (uploadingDoc) {
120 uploadingDoc = false;
121 qDebug() << ">>>>>>>>>>>>>> Upload done" ;
122 emit uploadDone(true);
125 qDebug() << ">>>>>>>>>>>>>> Revieved List" ;
126 gHandler = new GoogleContentHandler();
127 xmlReader.setContentHandler(gHandler);
128 QByteArray data = networkReply->readAll();
129 xmlInput.setData(data);
130 ok = xmlReader.parse(&xmlInput, true);
135 qDebug() << networkReply->readAll();
137 emit userAuthenticated(false);
138 else if (waitingForDoc) {
139 emit downloadDone(false);
140 waitingForDoc = false;
142 else if (uploadingDoc) {
143 emit uploadDone(false);
144 uploadingDoc = false;
147 emit listDone(false);
149 networkReply->deleteLater();
152 void GoogleDocumentService::prepareLists()
154 presentationList.clear();
155 documentList.clear();
156 spreadsheetList.clear();
158 QList<GoogleDocument *> gList = gHandler->documentList()->entries();
159 foreach(GoogleDocument *i, gList) {
160 if("presentation" == i->documentType())
161 presentationList.append(i);
162 else if("spreadsheet" == i->documentType())
163 spreadsheetList.append(i);
164 else if("document" == i->documentType())
165 documentList.append(i);
167 othersList.append(i);
169 qDebug() << ">>>>>>>>>>>>>> Lists Done" ;
174 void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName)
176 this->saveFileName = saveFileName;
177 authToken = docAuthToken;
178 QString url = doc->documentUrl();
179 QString type = doc->documentType();
180 qDebug() << type << "=" << url;
181 url.replace("docId", "docID", Qt::CaseInsensitive);
182 QString exportFormat = "";
184 if (QString::compare(type, "spreadsheet") == 0 ) {
185 exportFormat = "&exportFormat=ods&format=ods";
186 authToken = spreadAuthToken;
188 else if (QString::compare(type, "presentation") == 0 )
189 exportFormat = "&exportFormat=ppt&format=ppt";
190 else if (QString::compare(type, "document") == 0)
191 exportFormat = "&exportFormat=odt&format=odt";
193 QUrl documentUrl(url + exportFormat);
195 QNetworkRequest requestHeader(documentUrl);
196 requestHeader.setRawHeader("User-Agent", "KOffice");
197 requestHeader.setRawHeader("GData-Version", "3.0");
198 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
200 QNetworkReply *reply = networkManager.get(requestHeader);
201 connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SIGNAL(downloadProgress(qint64,qint64)));
202 waitingForDoc = true;
203 qDebug() << ">>>>>>>>>>>>>> Downloading file" ;
206 void GoogleDocumentService::uploadDocument(QString *filename, QString *title)
208 authToken = docAuthToken;
209 QFile file(*filename);
210 file.open(QFile::ReadOnly);
211 QByteArray data = file.readAll();
214 url.setUrl("https://docs.google.com/feeds/default/private/full");
216 QNetworkRequest requestHeader(url);
217 requestHeader.setRawHeader("User-Agent", "KOffice");
218 requestHeader.setRawHeader("GData-Version", "3.0");
219 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
220 requestHeader.setRawHeader("Content-Type", MimeTypes::getMimeType(QFileInfo(*filename).suffix()).toUtf8());
221 requestHeader.setRawHeader("Content-Length", QString::number(data.length()).toUtf8());
222 requestHeader.setRawHeader("Slug", QUrl::toPercentEncoding(*title));
224 QNetworkReply *reply = networkManager.post(requestHeader, data);
225 connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64,qint64)));
227 qDebug() << ">>>>>>>>>>>>>> Uploading file" ;