2 * Copyright (c) 2010 Kaushal M <kshlmster@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.
19 #include <QNetworkAccessManager>
20 #include <QNetworkRequest>
21 #include <QNetworkReply>
23 #include <QCryptographicHash>
31 #include <QDomDocument>
32 #include <QNetworkProxy>
34 #include "slideshare.h"
35 #include "slideshareDocument.h"
36 #include "mimetypes.h"
38 SlideShare::SlideShare(QObject *parent): QObject(parent)
40 manager.setCookieJar(&this->cookieJar);
41 doc = new SlideShareDocument;
44 SlideShare::SlideShare(QString *username, QString *password, QObject *parent): QObject(parent)
46 this->username = username;
47 this->password = password;
50 SlideShare::SlideShare(QString *username, QString *password, QString *apiKey, QString *secretKey, QObject *parent): QObject(parent)
52 this->apiKey = apiKey;
53 this->secretKey = secretKey;
54 SlideShare(username, password);
57 SlideShare::~SlideShare()
61 void SlideShare::setUsername(QString *username)
63 this->username = username;
66 void SlideShare::setPassword(QString *password)
68 this->password = password;
71 void SlideShare::setApikey(QString *apiKey)
73 this->apiKey = apiKey;
76 void SlideShare::setsecretKey(QString *secretKey)
78 this->secretKey = secretKey;
81 void SlideShare::setSlideTitle(QString *title)
86 void SlideShare::setDescription(QString *description)
88 doc->description = *description;
91 void SlideShare::setTags(QString *tags)
96 void SlideShare::setFormat(QString *format)
98 doc->format = *format;
101 void SlideShare::setSourceFile(QString *filename)
103 this->sourceFilename = filename;
106 void SlideShare::setSaveFileName(QString *saveFileName)
108 this->saveFileName = saveFileName;
112 void SlideShare::login()
114 qDebug() << ">>>>>>>>> SlideShare::login()";
115 QUrl *login = new QUrl(QString("http://www.slideshare.net/login"));
117 data.append(QString("user_login=").append(username).toUtf8());
118 data.append(QString("&user_password=").append(password).toUtf8());
120 QNetworkRequest request;
121 request.setUrl(*login);
123 reply = manager.post(request, data);
124 connect(reply, SIGNAL(finished()), this, SLOT(afterLogin()));
128 void SlideShare::afterLogin()
130 qDebug() << ">>>>>>>>> SlideShare::afterLogin()";
131 if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 302) {
132 if(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString().contains(*username))
133 emit loginDone(true);
135 emit loginDone(false);
138 void SlideShare::download(QString *durl)
140 qDebug() << ">>>>>>>>> SlideShare::download()";
141 QUrl *dload = new QUrl(*durl) ;
142 QNetworkRequest request;
143 request.setUrl(*dload);
145 QList<QNetworkCookie> list = cookieJar.cookiesForUrl(QUrl("http://www.slideshare.net/"));
147 foreach(QNetworkCookie c, list) {
148 if(c.name() == "_cookie_id") {
149 request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(list));
153 reply = manager.get(request);
154 connect(reply, SIGNAL(finished()), this, SLOT(saveFile()));
157 void SlideShare::saveFile()
159 qDebug() << ">>>>>>>>> SlideShare::saveFile()";
160 if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 302) {
161 reply = manager.get(QNetworkRequest(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()));
162 connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64)));
163 connect(reply, SIGNAL(finished()), this, SLOT(saveFile()));
167 QFile file(*saveFileName);
168 file.open(QFile::WriteOnly);
170 file.write(reply->readAll());
177 void SlideShare::upload()
179 qDebug() << ">>>>>>>>> SlideShare::upload()";
180 QDateTime *time = new QDateTime();
182 ts.setNum(time->toTime_t());
184 QByteArray data = this->secretKey->toAscii();
187 QFile *file = new QFile(*this->sourceFilename, this);
188 file->open(QFile::ReadOnly);
190 QByteArray fileData ;
191 fileData = file->readAll();
194 postData.append("--BOUNDARY\r\n");
195 postData.append("Content-Disposition: form-data; name=\"slideshow_srcfile\"; filename=\"");
196 postData.append(file->fileName().toUtf8());
197 postData.append("\"\r\n");
198 postData.append("Content-Type: " + MimeTypes::getMimeType(doc->format));
199 postData.append("\r\n\r\n");
200 postData.append(fileData);
201 postData.append("\r\n--BOUNDARY\r\n");
204 QList<QPair<QString, QString> > params;
205 params.append(qMakePair(QString("api_key"), *this->apiKey));
206 params.append(qMakePair(QString("ts"), ts));
207 params.append(qMakePair(QString("hash"), QString(QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex())));
208 params.append(qMakePair(QString("username"), *this->username));
209 params.append(qMakePair(QString("password"), *this->password));
210 params.append(qMakePair(QString("slideshow_title"), doc->title));
211 if(doc->description != "")
212 params.append(qMakePair(QString("slideshow_description"), doc->description));
214 params.append(qMakePair(QString("slideshow_tags"), doc->tags));
216 QUrl url("http://www.slideshare.net/api/2/upload_slideshow", QUrl::TolerantMode);
217 url.setQueryItems(params);
218 QNetworkRequest request;
220 request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=BOUNDARY");
221 request.setHeader(QNetworkRequest::ContentLengthHeader, postData.length());
224 QNetworkReply *reply = manager.post(request, postData);
225 connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));
226 connect(reply, SIGNAL(finished()), this, SIGNAL(uploadDone()));
229 void SlideShare::listDocuments()
231 qDebug() << ">>>>>>>>> SlideShare::listDocuments()";
232 QDateTime *time = new QDateTime(QDateTime::currentDateTime());
234 ts.setNum(time->toTime_t());
236 QByteArray data = this->secretKey->toAscii();
239 QList<QPair<QString, QString> > params;
240 params.append(qMakePair(QString("api_key"), *this->apiKey));
241 params.append(qMakePair(QString("ts"), ts));
242 params.append(qMakePair(QString("hash"), QString(QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex())));
243 params.append(qMakePair(QString("username"), *this->username));
244 params.append(qMakePair(QString("password"), *this->password));
245 params.append(qMakePair(QString("username_for"), *this->username));
248 QUrl url("http://www.slideshare.net/api/2/get_slideshows_by_user");
249 url.setQueryItems(params);
252 QNetworkRequest request;
255 reply = manager.get(request);
256 connect(reply, SIGNAL(finished()), this, SLOT(parseList()));
258 void SlideShare::parseList()
260 qDebug() << ">>>>>>>>> SlideShare::parseList()" ;
262 QByteArray data = reply->readAll();
263 doc.setContent(data);
265 QDomElement root = doc.documentElement();
266 QDomElement child = root.firstChildElement("Slideshow");
269 presentationList.clear();
270 spreadsheetList.clear();
272 while(!child.isNull()) {
273 SlideShareDocument *p = new SlideShareDocument;
274 p->title = child.firstChildElement("Title").text();
275 p->url = child.firstChildElement("URL").text();
276 p->format = child.firstChildElement("Format").text();
277 p->slideID = child.firstChildElement("ID").text();
278 p->thumbnailBig = child.firstChildElement("ThumbnailUrl").text();
279 p->thumbnailSmall = child.firstChildElement("ThumbnailSmallURL").text();
280 p->downloadUrl = p->url.append("/download");
281 QString download = child.firstChildElement("Download").text();
282 if(download == "1") {
283 if(p->format == "odt" || p->format == "doc")
284 this->textDocList.append(*p);
285 if(p->format == "odp" || p->format == "ppt")
286 this->presentationList.append(*p);
287 if(p->format == "ods" || p->format == "xls")
288 this->spreadsheetList.append(*p);
291 child = child.nextSiblingElement("Slideshow");