Initial Commit.
[onlineservices] / 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     }
55     else {
56         data.append(QString("&service=wise&source=KOfficev2").toUtf8());
57     }
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());
63
64     networkManager.post(req, data);
65 }
66
67 void GoogleDocumentService::listDocuments()
68 {
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());
77
78     networkManager.get(requestHeader);
79 }
80
81 void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply)
82 {
83     QUrl url = networkReply->url();
84     bool ok = false;
85     if (!networkReply->error()) {
86         if (!loggedin) {
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);
96                     return;
97                 }
98                 spreadAuthToken = authToken;
99                 authToken = "";
100                 loggedin = true;
101                 qDebug() << ">>>>>>>>>>>>>> Login success" ;
102                 emit userAuthenticated(loggedin);
103             }
104             else {
105                 qDebug() << ">>>>>>>>>>>>>> Login failed" ;
106                 emit userAuthenticated(false);
107             }
108         }
109         else if (waitingForDoc) {
110             QByteArray data = networkReply->readAll();
111             QFile file(*saveFileName);
112             file.open(QIODevice::WriteOnly);
113             file.write(data);
114             file.close();
115             qDebug() << ">>>>>>>>>>>>>> Received Document!!!!! " << file.fileName();
116             waitingForDoc = false;
117             emit downloadDone(true);
118         }
119         else if (uploadingDoc) {
120             uploadingDoc = false;
121             qDebug() << ">>>>>>>>>>>>>> Upload done" ;
122             emit uploadDone(true);
123         }
124         else {
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);
131             prepareLists();
132         }
133     }
134     else {
135         qDebug() << networkReply->readAll();
136         if(!loggedin)
137             emit userAuthenticated(false);
138         else if (waitingForDoc) {
139             emit downloadDone(false);
140             waitingForDoc = false;
141         }
142         else if (uploadingDoc) {
143             emit uploadDone(false);
144             uploadingDoc = false;
145         }
146         else
147             emit listDone(false);
148     }
149     networkReply->deleteLater();
150 }
151
152 void GoogleDocumentService::prepareLists()
153 {
154     presentationList.clear();
155     documentList.clear();
156     spreadsheetList.clear();
157     othersList.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);
166         else
167             othersList.append(i);
168     }
169     qDebug() << ">>>>>>>>>>>>>> Lists Done" ;
170     emit listDone(true);
171 }
172
173
174 void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName)
175 {
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 = "";
183
184     if (QString::compare(type, "spreadsheet") == 0 ) {
185         exportFormat = "&exportFormat=ods&format=ods";
186         authToken = spreadAuthToken;
187     }
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";
192
193     QUrl documentUrl(url + exportFormat);
194
195     QNetworkRequest requestHeader(documentUrl);
196     requestHeader.setRawHeader("User-Agent", "KOffice");
197     requestHeader.setRawHeader("GData-Version", "3.0");
198     requestHeader.setRawHeader("Authorization", authToken.toUtf8());
199
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" ;
204 }
205
206 void GoogleDocumentService::uploadDocument(QString *filename, QString *title)
207 {
208     authToken = docAuthToken;
209     QFile file(*filename);
210     file.open(QFile::ReadOnly);
211     QByteArray data = file.readAll();
212     file.close();
213     QUrl url;
214     url.setUrl("https://docs.google.com/feeds/default/private/full");
215
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));
223
224     QNetworkReply *reply = networkManager.post(requestHeader, data);
225     connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64,qint64)));
226     uploadingDoc = true;
227     qDebug() << ">>>>>>>>>>>>>> Uploading file" ;
228 }
229