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)
33 , waitingForDoc(false)
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;
55 data.append(QString("&service=wise&source=KOfficev2").toUtf8());
57 QNetworkRequest req(QUrl("https://www.google.com/accounts/ClientLogin"));
58 req.setRawHeader("Host", "www.google.com");
59 req.setRawHeader("GData-Version", "3.0");
60 req.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
61 req.setHeader(QNetworkRequest::ContentLengthHeader, data.length());
63 networkManager.post(req, data);
66 void GoogleDocumentService::listDocuments()
68 qDebug() << ">>>>>>>>>>>>>> List Documents" ;
69 authToken = docAuthToken;
70 QNetworkRequest requestHeader(QUrl("https://docs.google.com/feeds/default/private/full"));
71 requestHeader.setRawHeader("Host", "docs.google.com");
72 requestHeader.setRawHeader("User-Agent", "KOffice");
73 requestHeader.setRawHeader("GData-Version", "3.0");
74 requestHeader.setRawHeader("Content-Type", "application/atom+xml");
75 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
77 networkManager.get(requestHeader);
80 void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply)
82 QUrl url = networkReply->url();
84 if(!networkReply->error()) {
86 QByteArray m_data = networkReply->readAll();
87 QString text(m_data.data());
88 text = text.right(text.length() - text.indexOf("Auth=") - 5);
89 authToken = QString("GoogleLogin auth=") + text.left(text.indexOf("\n"));
90 if(authToken.length() > 20) {
91 if(!haveDocAuthToken) {
92 docAuthToken = authToken;
93 haveDocAuthToken = true;
94 clientLogin(this->username, this->password);
97 spreadAuthToken = authToken;
100 qDebug() << ">>>>>>>>>>>>>> Login success" ;
101 emit userAuthenticated(loggedin);
103 qDebug() << ">>>>>>>>>>>>>> Login failed" ;
104 emit userAuthenticated(false);
106 } else if(waitingForDoc) {
107 QByteArray data = networkReply->readAll();
108 QFile file(*saveFileName);
109 file.open(QIODevice::WriteOnly);
112 qDebug() << ">>>>>>>>>>>>>> Received Document!!!!! " << file.fileName();
113 waitingForDoc = false;
114 emit downloadDone(true);
115 } else if(uploadingDoc) {
116 uploadingDoc = false;
117 qDebug() << ">>>>>>>>>>>>>> Upload done" ;
118 emit uploadDone(true);
120 qDebug() << ">>>>>>>>>>>>>> Received List" ;
121 gHandler = new GoogleContentHandler();
122 xmlReader.setContentHandler(gHandler);
123 QByteArray data = networkReply->readAll();
124 xmlInput.setData(data);
125 ok = xmlReader.parse(&xmlInput, true);
129 qDebug() << networkReply->readAll();
131 emit userAuthenticated(false);
132 else if(waitingForDoc) {
133 emit downloadDone(false);
134 waitingForDoc = false;
135 } else if(uploadingDoc) {
136 emit uploadDone(false);
137 uploadingDoc = false;
139 emit listDone(false);
141 networkReply->deleteLater();
144 void GoogleDocumentService::prepareLists()
146 presentationList.clear();
147 documentList.clear();
148 spreadsheetList.clear();
150 QList<GoogleDocument *> gList = gHandler->documentList()->entries();
151 foreach(GoogleDocument * i, gList) {
152 if("presentation" == i->documentType())
153 presentationList.append(i);
154 else if("spreadsheet" == i->documentType())
155 spreadsheetList.append(i);
156 else if("document" == i->documentType())
157 documentList.append(i);
159 othersList.append(i);
161 qDebug() << ">>>>>>>>>>>>>> Lists Done" ;
166 void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName)
168 this->saveFileName = saveFileName;
169 authToken = docAuthToken;
170 QString url = doc->documentUrl();
171 QString type = doc->documentType();
172 qDebug() << type << "=" << url;
173 url.replace("docId", "docID", Qt::CaseInsensitive);
174 QString exportFormat = "";
176 if(QString::compare(type, "spreadsheet") == 0) {
177 exportFormat = "&exportFormat=ods&format=ods";
178 authToken = spreadAuthToken;
179 } else if(QString::compare(type, "presentation") == 0)
180 exportFormat = "&exportFormat=ppt&format=ppt";
181 else if(QString::compare(type, "document") == 0)
182 exportFormat = "&exportFormat=odt&format=odt";
184 QUrl documentUrl(url + exportFormat);
186 QNetworkRequest requestHeader(documentUrl);
187 requestHeader.setRawHeader("User-Agent", "KOffice");
188 requestHeader.setRawHeader("GData-Version", "3.0");
189 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
191 QNetworkReply *reply = networkManager.get(requestHeader);
192 connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64)));
193 waitingForDoc = true;
194 qDebug() << ">>>>>>>>>>>>>> Downloading file" ;
197 void GoogleDocumentService::uploadDocument(QString *filename, QString *title)
199 authToken = docAuthToken;
200 QFile file(*filename);
201 file.open(QFile::ReadOnly);
202 QByteArray data = file.readAll();
205 url.setUrl("https://docs.google.com/feeds/default/private/full");
207 QNetworkRequest requestHeader(url);
208 requestHeader.setRawHeader("User-Agent", "KOffice");
209 requestHeader.setRawHeader("GData-Version", "3.0");
210 requestHeader.setRawHeader("Authorization", authToken.toUtf8());
211 requestHeader.setRawHeader("Content-Type", MimeTypes::getMimeType(QFileInfo(*filename).suffix()).toUtf8());
212 requestHeader.setRawHeader("Content-Length", QString::number(data.length()).toUtf8());
213 requestHeader.setRawHeader("Slug", QUrl::toPercentEncoding(*title));
215 QNetworkReply *reply = networkManager.post(requestHeader, data);
216 connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));
218 qDebug() << ">>>>>>>>>>>>>> Uploading file" ;