Added KOfficemeego dependency
[froff-onlinedoc] / googledocumentservice.cpp
1 /*
2  *  Copyright (c) 2010 Mani Chandrasekar <maninc@gmail.com>
3  *
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.
8  *
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.
13  *
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.
17  */
18
19 #include <QtGui>
20 #include <QtNetwork>
21 #include <QMessageBox>
22
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";
30
31 GoogleDocumentService::GoogleDocumentService()
32     : newInformation(true)
33     , waitingForDoc(false)
34     , uploadingDoc(false)
35     , loggedin(false)
36     , haveDocAuthToken(false)
37 {
38     saveFileName = 0;
39     connect(&networkManager, SIGNAL(finished(QNetworkReply*)),
40             this, SLOT(handleNetworkData(QNetworkReply*)));
41     gHandler = new GoogleContentHandler();
42     xmlReader.setContentHandler(gHandler);
43 }
44
45 void GoogleDocumentService::clientLogin(const QString & username, const QString & password)
46 {
47     QByteArray data;
48     data.append(QString("Email=" + username + "&Passwd=" + password).toUtf8());
49
50     if(!haveDocAuthToken) {
51         data.append(QString("&service=writely&source=KOfficev2").toUtf8());
52         this->username = username;
53         this->password = password;
54     } else {
55         data.append(QString("&service=wise&source=KOfficev2").toUtf8());
56     }
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());
62
63     networkManager.post(req, data);
64 }
65
66 void GoogleDocumentService::listDocuments()
67 {
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());
76
77     networkManager.get(requestHeader);
78 }
79
80 void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply)
81 {
82     QUrl url = networkReply->url();
83     bool ok = false;
84     if(!networkReply->error()) {
85         if(!loggedin) {
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);
95                     return;
96                 }
97                 spreadAuthToken = authToken;
98                 authToken = "";
99                 loggedin = true;
100                 qDebug() << ">>>>>>>>>>>>>> Login success" ;
101                 emit userAuthenticated(loggedin);
102             } else {
103                 qDebug() << ">>>>>>>>>>>>>> Login failed" ;
104                 emit userAuthenticated(false);
105             }
106         } else if(waitingForDoc) {
107             QByteArray data = networkReply->readAll();
108             QFile file(*saveFileName);
109             file.open(QIODevice::WriteOnly);
110             file.write(data);
111             file.close();
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);
119         } else {
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);
126             prepareLists();
127         }
128     } else {
129         qDebug() << networkReply->readAll();
130         if(!loggedin)
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;
138         } else
139             emit listDone(false);
140     }
141     networkReply->deleteLater();
142 }
143
144 void GoogleDocumentService::prepareLists()
145 {
146     presentationList.clear();
147     documentList.clear();
148     spreadsheetList.clear();
149     othersList.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);
158         else
159             othersList.append(i);
160     }
161     qDebug() << ">>>>>>>>>>>>>> Lists Done" ;
162     emit listDone(true);
163 }
164
165
166 void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName)
167 {
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 = "";
175
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";
183
184     QUrl documentUrl(url + exportFormat);
185
186     QNetworkRequest requestHeader(documentUrl);
187     requestHeader.setRawHeader("User-Agent", "KOffice");
188     requestHeader.setRawHeader("GData-Version", "3.0");
189     requestHeader.setRawHeader("Authorization", authToken.toUtf8());
190
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" ;
195 }
196
197 void GoogleDocumentService::uploadDocument(QString *filename, QString *title)
198 {
199     authToken = docAuthToken;
200     QFile file(*filename);
201     file.open(QFile::ReadOnly);
202     QByteArray data = file.readAll();
203     file.close();
204     QUrl url;
205     url.setUrl("https://docs.google.com/feeds/default/private/full");
206
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));
214
215     QNetworkReply *reply = networkManager.post(requestHeader, data);
216     connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));
217     uploadingDoc = true;
218     qDebug() << ">>>>>>>>>>>>>> Uploading file" ;
219 }
220