From 116d4a8ed391a2395a9d60009291ef6c36dfd6f6 Mon Sep 17 00:00:00 2001 From: Mani Date: Tue, 17 Aug 2010 14:23:03 +0530 Subject: [PATCH] Adding project to GIT --- OfficeInterface.h | 59 +++++++++ README | 32 +++++ authenticationdialog.ui | 100 +++++++++++++++ debian/README.Debian | 6 + debian/changelog | 6 + debian/compat | 1 + debian/control | 12 ++ debian/copyright | 10 ++ debian/rules | 57 +++++++++ encryptsupport.cpp | 107 ++++++++++++++++ encryptsupport.h | 23 ++++ filelistdialog.ui | 106 ++++++++++++++++ googlecontenthandler.cpp | 151 +++++++++++++++++++++++ googlecontenthandler.h | 59 +++++++++ googledocument.cpp | 90 ++++++++++++++ googledocument.h | 61 +++++++++ googledocumentlist.cpp | 99 +++++++++++++++ googledocumentlist.h | 70 +++++++++++ googledocumentservice.cpp | 220 +++++++++++++++++++++++++++++++++ googledocumentservice.h | 86 +++++++++++++ googlelistdialog.cpp | 191 ++++++++++++++++++++++++++++ googlelistdialog.h | 53 ++++++++ googleuploaddialog.cpp | 104 ++++++++++++++++ googleuploaddialog.h | 52 ++++++++ loginwindow.cpp | 201 ++++++++++++++++++++++++++++++ loginwindow.h | 64 ++++++++++ mimetypes.cpp | 31 +++++ mimetypes.h | 30 +++++ onlineServicesPlugin.pro | 56 +++++++++ onlineservicesplugin.cpp | 42 +++++++ onlineservicesplugin.h | 28 +++++ slideshare.cpp | 295 ++++++++++++++++++++++++++++++++++++++++++++ slideshare.h | 102 +++++++++++++++ slideshareDocument.h | 34 +++++ slidesharelistdialog.cpp | 200 ++++++++++++++++++++++++++++++ slidesharelistdialog.h | 57 +++++++++ slideshareuploaddialog.cpp | 102 +++++++++++++++ slideshareuploaddialog.h | 52 ++++++++ src.pro | 1 + uploaddialog.ui | 156 +++++++++++++++++++++++ 40 files changed, 3206 insertions(+) create mode 100644 OfficeInterface.h create mode 100644 README create mode 100644 authenticationdialog.ui create mode 100644 debian/README.Debian create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/rules create mode 100644 encryptsupport.cpp create mode 100644 encryptsupport.h create mode 100644 filelistdialog.ui create mode 100644 googlecontenthandler.cpp create mode 100644 googlecontenthandler.h create mode 100644 googledocument.cpp create mode 100644 googledocument.h create mode 100644 googledocumentlist.cpp create mode 100644 googledocumentlist.h create mode 100644 googledocumentservice.cpp create mode 100644 googledocumentservice.h create mode 100644 googlelistdialog.cpp create mode 100644 googlelistdialog.h create mode 100644 googleuploaddialog.cpp create mode 100644 googleuploaddialog.h create mode 100644 loginwindow.cpp create mode 100644 loginwindow.h create mode 100644 mimetypes.cpp create mode 100644 mimetypes.h create mode 100644 onlineServicesPlugin.pro create mode 100644 onlineservicesplugin.cpp create mode 100644 onlineservicesplugin.h create mode 100644 slideshare.cpp create mode 100644 slideshare.h create mode 100644 slideshareDocument.h create mode 100644 slidesharelistdialog.cpp create mode 100644 slidesharelistdialog.h create mode 100644 slideshareuploaddialog.cpp create mode 100644 slideshareuploaddialog.h create mode 120000 src.pro create mode 100644 uploaddialog.ui diff --git a/OfficeInterface.h b/OfficeInterface.h new file mode 100644 index 0000000..cd4bb06 --- /dev/null +++ b/OfficeInterface.h @@ -0,0 +1,59 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * + * Contact: Lassi Nieminen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef OFFICEINTERFACE_H +#define OFFICEINTERFACE_H + +#include +#include +#include + +class OfficeInterface +{ +public: + + virtual ~OfficeInterface() {} + + // This is used to give information about the currently active doc to the plugin + // 0 if there is no document open + virtual void setDocument(void *doc) = 0; + + // Asks the plugin to create it's view for the main program to use + virtual QWidget *view() = 0; + + // Should return the name of the plugin + virtual QString pluginName() = 0; + + // Should return list of document types in presence of which this plugin + // should be shown in the menubar. + // Possible values : All, presentation, document, spreadsheet + // + // NOTE: this is not actually used yet in the main program and may be extented + // in the future. + virtual QStringList pluginSupportTypes() = 0; +}; + +Q_DECLARE_INTERFACE(OfficeInterface, "com.office.Freoffice.OfficeInterface/1.0") + +#endif diff --git a/README b/README new file mode 100644 index 0000000..0e57bdf --- /dev/null +++ b/README @@ -0,0 +1,32 @@ +Build Instructions +****************** +Plugin can be built only on maemo as there are dependencies on QtMaemo libraries. Therefore, no more standalone support. +To build it use Scratchbox or the Nokia Qt SDK. + +Features +******** +SlideShare: +> Supports download of all uploaded files in the format they were uploaded. Only file available for download are allowed for download. +> Upload formats: Documents odt, doc + Spreadsheet ods, xls + Presentation odp, ppt + +Google Documents: +> Download formats: Documents odt + Spreadsheet ods + Presentation odp + Others In the format they were uploaded +> Upload formats: Documents odt, doc + Spreadsheet ods, xls + Presentation ppt + Others No support yet + +Current Issues +************** +1) Sometimes uploads to GoogleDocuments fail because of a internal server error. If that happens try uploading again. +2) Upload of "ods" spreadsheets to Google Documents always fails. So it has been disabled. + + +Contact +******* +If you have any issues contact me at: kshlmster at gmail dot com diff --git a/authenticationdialog.ui b/authenticationdialog.ui new file mode 100644 index 0000000..0fcc756 --- /dev/null +++ b/authenticationdialog.ui @@ -0,0 +1,100 @@ + + + Dialog + + + + 0 + 0 + 449 + 135 + + + + Account Signin + + + + + + You need to supply Username and Password to access documents + + + false + + + + + + + + + Site: + + + + + + + + + + Username: + + + + + + + @gmail.com + + + + + + + Password: + + + + + + + + + + + + + QLineEdit::Password + + + + + + + + + + + true + + + Save Details + + + + + + + Sign In + + + + + + + + + + diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..ac4a799 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,6 @@ +freoffice-online-services-plugin-0.1 for Debian +----------------------------------------------- + + + + -- unknown Tue, 17 Aug 2010 10:54:14 +0530 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..37e902e --- /dev/null +++ b/debian/changelog @@ -0,0 +1,6 @@ +freoffice-online-services-plugin (0.1-0) unstable; urgency=low + + * Initial release + + -- Mani Tue, 17 Aug 2010 10:54:14 +0530 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..2b800a1 --- /dev/null +++ b/debian/control @@ -0,0 +1,12 @@ +Source: freoffice-online-services-plugin +Section: user/office +Priority: extra +Maintainer: Mani Chandrasekar +Build-Depends: debhelper (>= 5), libqt4-dev, freoffice-dev (>= 0.2-7) +Standards-Version: 3.7.2 + +Package: freoffice-online-services-plugin +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, freoffice-dev (>=0.2-7) +Description: Online document plugin for FreOffice + Online document plugin for freoffice. Download/Upload documents from Google docs / Slide share to FreOffice. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..32a48de --- /dev/null +++ b/debian/copyright @@ -0,0 +1,10 @@ +This package was debianized by Mani Chandrasekar on +Tue, 17 Aug 2010 10:54:14 +0530. + +Copyright: 2010, Mani Chandrasekar, Kaushal + +License: + +The Debian packaging is (C) 2010, unknown and +is licensed under the GPL, see `/usr/share/common-licenses/GPL'. + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..d9b093b --- /dev/null +++ b/debian/rules @@ -0,0 +1,57 @@ +#!/usr/bin/make -f + +builddir: + mkdir -p builddir + +builddir/Makefile: builddir + cd builddir && qmake-qt4 PREFIX=/usr ../src.pro + +build: build-stamp + +build-stamp: builddir/Makefile + dh_testdir + cd builddir && $(MAKE) + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + rm -rf builddir + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/freoffice-online-services-plugin install + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/encryptsupport.cpp b/encryptsupport.cpp new file mode 100644 index 0000000..8978826 --- /dev/null +++ b/encryptsupport.cpp @@ -0,0 +1,107 @@ +#include "encryptsupport.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +encryptSupport::encryptSupport(QWidget *parent): + QWidget(parent) +{ + QSettings::setPath(QSettings::NativeFormat, QSettings::SystemScope, "/tmp/"); + getDetails(); +} + +void encryptSupport::getDetails() +{ + QSettings passphraseConf("freoffice", "plugin-encryption-support"); + QSettings passphraseTemp(QSettings::SystemScope, "freoffice-encryption-support-temp.conf"); + if (!passphraseTemp.contains("key")) { + enterPassphraseDialog(); + return; + } + key = passphraseTemp.value("key").toByteArray(); + iv = passphraseConf.value("iv").toByteArray(); +} + +void encryptSupport::enterPassphraseDialog() +{ + QSettings passphraseConf("freoffice", "plugin-encryption-support"); + if(!passphraseConf.contains("hash")) { + newPassphraseDialog(); + return; + } + QString hash = passphraseConf.value("hash").toString(); + QString passphrase; + while(true) { + passphrase = QInputDialog::getText(this,"Enter Passphrase", "Enter the passphrase you used to encrypt.\n This will be done once every session only", QLineEdit::Normal,""); + if(QCryptographicHash::hash(passphrase.toUtf8(), QCryptographicHash::Sha1).toHex() == hash.toUtf8()) + break; + QMaemo5InformationBox::information(this, "Wrong passphrase.\nEnter again.", QMaemo5InformationBox::NoTimeout); + } + QSettings passphraseTemp(QSettings::SystemScope, "freoffice-encryption-support-temp.conf"); + passphraseTemp.setValue("key", passphrase); + passphraseTemp.sync(); + getDetails(); +} + +void encryptSupport::newPassphraseDialog() +{ + QString passphrase; + while("" == passphrase) { + passphrase = QInputDialog::getText(this,"New Passphrase", "Please enter a phrase which is long.\nThis phrase will be used to encrypt your passwords and details", QLineEdit::Normal,""); + } + QSettings passphraseConf("freoffice","plugin-encryption-support"); + QString hash(QCryptographicHash::hash(passphrase.toUtf8(), QCryptographicHash::Sha1).toHex()); + passphraseConf.setValue("hash",hash); + QFile f("/dev/urandom"); + f.open(QFile::ReadOnly); + QByteArray ivInit = f.read(8); + f.close(); + passphraseConf.setValue("iv", ivInit); + passphraseConf.sync(); + QSettings passphraseTemp(QSettings::SystemScope,"freoffice-encryption-support-temp.conf"); + passphraseTemp.setValue("key", passphrase); + passphraseTemp.sync(); + getDetails(); +} + +QString encryptSupport::encrypt(const QString & dataString) +{ + QByteArray data = dataString.toUtf8(); + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_EncryptInit(&ctx, EVP_bf_cbc(), (unsigned char*)key.constData(), (unsigned char*)iv.constData()); + unsigned char outbuf[1024]; + int len = data.length(); + int outlen, tmplen; + EVP_EncryptUpdate(&ctx, outbuf, &outlen, (unsigned char*)data.constData(), len); + EVP_EncryptFinal_ex(&ctx, outbuf+len, &tmplen); + outlen += tmplen; + EVP_CIPHER_CTX_cleanup(&ctx); + QByteArray encData((const char*)outbuf, outlen); + return QString(encData.toHex()); +} + +QString encryptSupport::decrypt(const QString &dataString) +{ + QByteArray data = QByteArray::fromHex(dataString.toUtf8()); + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_DecryptInit(&ctx, EVP_bf_cbc(), (unsigned char*)key.constData(), (unsigned char*)iv.constData()); + unsigned char outbuf[1024]; + int len = data.length(); + int outlen, tmplen; + EVP_DecryptUpdate(&ctx, outbuf, &outlen, (unsigned char*)data.constData(), len); + EVP_DecryptFinal(&ctx, outbuf+outlen, &tmplen); + EVP_CIPHER_CTX_cleanup(&ctx); + QByteArray decData((const char*)outbuf, outlen); + return QString(decData); +} diff --git a/encryptsupport.h b/encryptsupport.h new file mode 100644 index 0000000..a14fdaf --- /dev/null +++ b/encryptsupport.h @@ -0,0 +1,23 @@ +#ifndef ENCRYPTSUPPORT_H +#define ENCRYPTSUPPORT_H + +#include +class QString; +class QByteArray; + +class encryptSupport:public QWidget +{ +public: + encryptSupport(QWidget * parent = 0); + QString encrypt(const QString &); + QString decrypt(const QString &); +private: + QByteArray key; + QByteArray iv; + + void getDetails(); + void newPassphraseDialog(); + void enterPassphraseDialog(); +}; + +#endif // ENCRYPTSUPPORT_H diff --git a/filelistdialog.ui b/filelistdialog.ui new file mode 100644 index 0000000..90afc2e --- /dev/null +++ b/filelistdialog.ui @@ -0,0 +1,106 @@ + + + fileListDialog + + + + 0 + 0 + 640 + 480 + + + + FileList + + + + + + QTabWidget::Rounded + + + 1 + + + + Documents + + + + + + + + + + Presentations + + + + + + + + + + Spreadsheets + + + + + + + + + + Others + + + + + + + + + + + + + 0 + + + false + + + + + + + + + &Upload + + + + + + + &Refresh List + + + + + + + &Download + + + + + + + + + + diff --git a/googlecontenthandler.cpp b/googlecontenthandler.cpp new file mode 100644 index 0000000..41acfdb --- /dev/null +++ b/googlecontenthandler.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2010 Mani Chandrasekar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include "googledocumentlist.h" +#include "googledocument.h" +#include "googlecontenthandler.h" + +GoogleContentHandler::GoogleContentHandler() + : m_docList(0), + m_docEntry(0) +{ + m_docList = new GoogleDocumentList(); +} + +bool GoogleContentHandler::characters(const QString & ch) +{ + if(!insideEntry) { + if(QString::compare(m_nodeStack.top(), "title", Qt::CaseInsensitive) == 0) { + if(m_nodeStack.count() == 2) + m_docList->setTitle(ch); + } else if(QString::compare(m_nodeStack.top(), "name", Qt::CaseInsensitive) == 0) { + if(m_nodeStack.count() == 3) + m_docList->setAuthor(ch); + } else if(QString::compare(m_nodeStack.top(), "email", Qt::CaseInsensitive) == 0) { + if(m_nodeStack.count() == 3) + m_docList->setEmail(ch); + } + } else { + if(m_docEntry == 0) + return true; + + if(QString::compare(m_nodeStack.top(), "title", Qt::CaseInsensitive) == 0) { + m_docEntry->setTitle(ch); + } else if(QString::compare(m_nodeStack.top(), "name", Qt::CaseInsensitive) == 0) { + m_docEntry->setAuthor(ch); + } else if(QString::compare(m_nodeStack.top(), "resourceId", Qt::CaseInsensitive) == 0) { + m_docEntry->setId(ch); + } + } + return true; +} + +bool GoogleContentHandler::endDocument() +{ + //qDebug() << "GoogleContentHandler::endDocument()"; + return true; +} + +bool GoogleContentHandler::endElement(const QString & namespaceURI, const QString & localName, const QString & qName) +{ + //printName(localName); + QString element = m_nodeStack.pop(); + if(QString::compare(element, "entry") == 0) { + insideEntry = false; + m_docList->append(m_docEntry); + m_docEntry = 0; + } + return true; +} + +bool GoogleContentHandler::endPrefixMapping(const QString & prefix) +{ + return true; +} + +QString GoogleContentHandler::errorString() const +{ + return QString(); +} + +bool GoogleContentHandler::ignorableWhitespace(const QString & ch) +{ + return true; +} + +bool GoogleContentHandler::processingInstruction(const QString & target, const QString & data) +{ + return true; +} + +void GoogleContentHandler::setDocumentLocator(QXmlLocator * locator) +{ +} + +bool GoogleContentHandler::skippedEntity(const QString & name) +{ + return true; +} + +bool GoogleContentHandler::startDocument() +{ + return true; +} + +bool GoogleContentHandler::startElement(const QString & namespaceURI, const QString & localName, + const QString & qName, const QXmlAttributes & atts) +{ + m_nodeStack.push(localName); + + if((m_nodeStack.count() == 1) && (m_docList != 0)) { //Feed element + m_docList->setEtag(atts.value("gd:etag")); + } + + if(QString::compare(localName, "entry", Qt::CaseInsensitive) == 0) { + m_docEntry = new GoogleDocument(); + m_docEntry->setEtag(atts.value("gd:etag")); + insideEntry = true; + } + if(insideEntry && (QString::compare(localName, "content", Qt::CaseInsensitive) == 0) && (m_docEntry != 0)) { + m_docEntry->setDocumentUrl(atts.value("src")); + } + + //printName(localName); + + return true; +} + +bool GoogleContentHandler::startPrefixMapping(const QString & prefix, const QString & uri) +{ + //qDebug() << "GoogleContentHandler::startPrefixMapping() " << prefix << uri; + return true; +} + +void GoogleContentHandler::printName(const QString & name) +{ + int count = m_nodeStack.count(); + QString indent; + for(int i = 0; i < count; i++) + indent.append("\t"); + indent.append(name); + + if(insideEntry); +// qDebug() << indent; +} diff --git a/googlecontenthandler.h b/googlecontenthandler.h new file mode 100644 index 0000000..8bfd7b5 --- /dev/null +++ b/googlecontenthandler.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010 Mani Chandrasekar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef GOOGLECONTENTHANDLER_H +#define GOOGLECONTENTHANDLER_H + +#include +#include + +class GoogleDocumentList; +class GoogleDocument; + +class GoogleContentHandler : public QXmlContentHandler +{ +public: + GoogleContentHandler(); + + virtual bool characters(const QString & ch); + virtual bool endDocument(); + virtual bool endElement(const QString & namespaceURI, const QString & localName, const QString & qName); + virtual bool endPrefixMapping(const QString & prefix); + virtual QString errorString() const; + virtual bool ignorableWhitespace(const QString & ch); + virtual bool processingInstruction(const QString & target, const QString & data); + virtual void setDocumentLocator(QXmlLocator * locator); + virtual bool skippedEntity(const QString & name); + virtual bool startDocument(); + virtual bool startElement(const QString & namespaceURI, const QString & localName, const QString & qName, const QXmlAttributes & atts); + virtual bool startPrefixMapping(const QString & prefix, const QString & uri); + + GoogleDocumentList *documentList() { + return m_docList; + } + +private: + QStack m_nodeStack; + bool insideEntry; + GoogleDocumentList *m_docList; + GoogleDocument *m_docEntry; + + void printName(const QString & name); +}; + +#endif // GOOGLECONTENTHANDLER_H diff --git a/googledocument.cpp b/googledocument.cpp new file mode 100644 index 0000000..68427a7 --- /dev/null +++ b/googledocument.cpp @@ -0,0 +1,90 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include "googledocument.h" + +GoogleDocument::GoogleDocument() +{ +} + +void GoogleDocument::setEtag(const QString & etag) +{ + m_etag = etag; +} + +QString GoogleDocument::etag() +{ + return m_etag; +} + +void GoogleDocument::setId(const QString & id) +{ + m_id = id; + + setDocumentType(id.left(id.indexOf(":"))); +} + +QString GoogleDocument::id() +{ + return m_id; +} + +void GoogleDocument::setTitle(const QString & title) +{ + m_title = title; +} + +QString GoogleDocument::title() +{ + return m_title; +} + +void GoogleDocument::setAuthor(const QString & author) +{ + m_author = author; +} + +QString GoogleDocument::author() +{ + return m_author; +} + +void GoogleDocument::setDocumentType(const QString & docType) +{ + m_docType = docType; +} + +QString GoogleDocument::documentType() +{ + return m_docType; +} + +void GoogleDocument::setDocumentUrl(const QString & url) +{ + m_documetUrl = url; +} + +QString GoogleDocument::documentUrl() +{ + return m_documetUrl; +} diff --git a/googledocument.h b/googledocument.h new file mode 100644 index 0000000..762867b --- /dev/null +++ b/googledocument.h @@ -0,0 +1,61 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef GOOGLEDOCUMENT_H +#define GOOGLEDOCUMENT_H + +#include + +class GoogleDocument : public QObject +{ +public: + GoogleDocument(); + + void setEtag(const QString & etag); + QString etag(); + + void setId(const QString & id); + QString id(); + + void setTitle(const QString & title); + QString title(); + + void setAuthor(const QString & author); + QString author(); + + void setDocumentType(const QString & docType); + QString documentType(); + + void setDocumentUrl(const QString & url); + QString documentUrl(); + +private: + QString m_etag; + QString m_id; + QString m_title; + QString m_author; + QString m_docType; + QString m_documetUrl; +}; + +#endif // GOOGLEDOCUMENT_H diff --git a/googledocumentlist.cpp b/googledocumentlist.cpp new file mode 100644 index 0000000..0fee772 --- /dev/null +++ b/googledocumentlist.cpp @@ -0,0 +1,99 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include "googledocumentlist.h" +#include "googledocument.h" + +#include +#include + +GoogleDocumentList::GoogleDocumentList() +{ + docModel = new QStandardItemModel(0, 2); +} + +void GoogleDocumentList::setEtag(const QString &etag) +{ + m_etag = etag; +} + +QString GoogleDocumentList::etag() +{ + return m_etag; +} + +void GoogleDocumentList::setEmail(const QString &email) +{ + m_email = email; +} + +QString GoogleDocumentList::email() +{ + return m_email; +} + +void GoogleDocumentList::setTitle(const QString &title) +{ + m_title = title; +} + +QString GoogleDocumentList::title() +{ + return m_title; +} + +void GoogleDocumentList::setAuthor(const QString &author) +{ + m_author = author; +} + +QString GoogleDocumentList::author() +{ + return m_author; +} + +void GoogleDocumentList::append(GoogleDocument *entry) +{ + if(entry != 0) { + m_entries.append(entry); + + //count = docModel->rowCount(); + docModel->insertRow(0); + docModel->setData(docModel->index(0, 0), entry->title()); + docModel->setData(docModel->index(0, 1), entry->documentUrl()); +// qDebug() << "Resource ID : " << entry->id(); +// qDebug() << "Title : " << entry->title(); +// qDebug() << "Author : " << entry->author(); +// qDebug() << "Url : " << entry->documentUrl(); + } +} + +QList GoogleDocumentList::entries() +{ + return m_entries; +} + +int GoogleDocumentList::documentsCount() +{ + return m_entries.count(); +} diff --git a/googledocumentlist.h b/googledocumentlist.h new file mode 100644 index 0000000..d458d39 --- /dev/null +++ b/googledocumentlist.h @@ -0,0 +1,70 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef GOOGLEDOCUMENTLIST_H +#define GOOGLEDOCUMENTLIST_H + +#include +#include +#include + +class GoogleDocument; + +class GoogleDocumentList : public QObject +{ +public: + GoogleDocumentList(); + + void setEtag(const QString &etag); + QString etag(); + + void setEmail(const QString &email); + QString email(); + + void setTitle(const QString &title); + QString title(); + + void setAuthor(const QString &author); + QString author(); + + void append(GoogleDocument *entry); + int documentsCount(); + + QList entries(); + + QStandardItemModel * documentModel() { + return docModel; + } + +private: + QString m_author; + QString m_email; + QString m_title; + QString m_etag; + + QList m_entries; + + QStandardItemModel *docModel; +}; + +#endif // GOOGLEDOCUMENTLIST_H diff --git a/googledocumentservice.cpp b/googledocumentservice.cpp new file mode 100644 index 0000000..10a8c07 --- /dev/null +++ b/googledocumentservice.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2010 Mani Chandrasekar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include "googledocumentservice.h" +#include "googledocumentlist.h" +#include "googledocument.h" +#include "googlecontenthandler.h" +#include "mimetypes.h" +const QString GoogleDocumentService::GOOGLE_DOCUMENT_URL = "docs.google.com"; +const QString GoogleDocumentService::GOOGLE_SPREADSHEET_URL = "spreadsheets.google.com"; + +GoogleDocumentService::GoogleDocumentService() + : newInformation(true) + , waitingForDoc(false) + , uploadingDoc(false) + , loggedin(false) + , haveDocAuthToken(false) +{ + saveFileName = 0; + connect(&networkManager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(handleNetworkData(QNetworkReply*))); + gHandler = new GoogleContentHandler(); + xmlReader.setContentHandler(gHandler); +} + +void GoogleDocumentService::clientLogin(const QString & username, const QString & password) +{ + QByteArray data; + data.append(QString("Email=" + username + "&Passwd=" + password).toUtf8()); + + if(!haveDocAuthToken) { + data.append(QString("&service=writely&source=KOfficev2").toUtf8()); + this->username = username; + this->password = password; + } else { + data.append(QString("&service=wise&source=KOfficev2").toUtf8()); + } + QNetworkRequest req(QUrl("https://www.google.com/accounts/ClientLogin")); + req.setRawHeader("Host", "www.google.com"); + req.setRawHeader("GData-Version", "3.0"); + req.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); + req.setHeader(QNetworkRequest::ContentLengthHeader, data.length()); + + networkManager.post(req, data); +} + +void GoogleDocumentService::listDocuments() +{ + qDebug() << ">>>>>>>>>>>>>> List Documents" ; + authToken = docAuthToken; + QNetworkRequest requestHeader(QUrl("https://docs.google.com/feeds/default/private/full")); + requestHeader.setRawHeader("Host", "docs.google.com"); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Content-Type", "application/atom+xml"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + + networkManager.get(requestHeader); +} + +void GoogleDocumentService::handleNetworkData(QNetworkReply *networkReply) +{ + QUrl url = networkReply->url(); + bool ok = false; + if(!networkReply->error()) { + if(!loggedin) { + QByteArray m_data = networkReply->readAll(); + QString text(m_data.data()); + text = text.right(text.length() - text.indexOf("Auth=") - 5); + authToken = QString("GoogleLogin auth=") + text.left(text.indexOf("\n")); + if(authToken.length() > 20) { + if(!haveDocAuthToken) { + docAuthToken = authToken; + haveDocAuthToken = true; + clientLogin(this->username, this->password); + return; + } + spreadAuthToken = authToken; + authToken = ""; + loggedin = true; + qDebug() << ">>>>>>>>>>>>>> Login success" ; + emit userAuthenticated(loggedin); + } else { + qDebug() << ">>>>>>>>>>>>>> Login failed" ; + emit userAuthenticated(false); + } + } else if(waitingForDoc) { + QByteArray data = networkReply->readAll(); + QFile file(*saveFileName); + file.open(QIODevice::WriteOnly); + file.write(data); + file.close(); + qDebug() << ">>>>>>>>>>>>>> Received Document!!!!! " << file.fileName(); + waitingForDoc = false; + emit downloadDone(true); + } else if(uploadingDoc) { + uploadingDoc = false; + qDebug() << ">>>>>>>>>>>>>> Upload done" ; + emit uploadDone(true); + } else { + qDebug() << ">>>>>>>>>>>>>> Received List" ; + gHandler = new GoogleContentHandler(); + xmlReader.setContentHandler(gHandler); + QByteArray data = networkReply->readAll(); + xmlInput.setData(data); + ok = xmlReader.parse(&xmlInput, true); + prepareLists(); + } + } else { + qDebug() << networkReply->readAll(); + if(!loggedin) + emit userAuthenticated(false); + else if(waitingForDoc) { + emit downloadDone(false); + waitingForDoc = false; + } else if(uploadingDoc) { + emit uploadDone(false); + uploadingDoc = false; + } else + emit listDone(false); + } + networkReply->deleteLater(); +} + +void GoogleDocumentService::prepareLists() +{ + presentationList.clear(); + documentList.clear(); + spreadsheetList.clear(); + othersList.clear(); + QList gList = gHandler->documentList()->entries(); + foreach(GoogleDocument * i, gList) { + if("presentation" == i->documentType()) + presentationList.append(i); + else if("spreadsheet" == i->documentType()) + spreadsheetList.append(i); + else if("document" == i->documentType()) + documentList.append(i); + else + othersList.append(i); + } + qDebug() << ">>>>>>>>>>>>>> Lists Done" ; + emit listDone(true); +} + + +void GoogleDocumentService::downloadDocument(GoogleDocument *doc, QString *saveFileName) +{ + this->saveFileName = saveFileName; + authToken = docAuthToken; + QString url = doc->documentUrl(); + QString type = doc->documentType(); + qDebug() << type << "=" << url; + url.replace("docId", "docID", Qt::CaseInsensitive); + QString exportFormat = ""; + + if(QString::compare(type, "spreadsheet") == 0) { + exportFormat = "&exportFormat=ods&format=ods"; + authToken = spreadAuthToken; + } else if(QString::compare(type, "presentation") == 0) + exportFormat = "&exportFormat=ppt&format=ppt"; + else if(QString::compare(type, "document") == 0) + exportFormat = "&exportFormat=odt&format=odt"; + + QUrl documentUrl(url + exportFormat); + + QNetworkRequest requestHeader(documentUrl); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + + QNetworkReply *reply = networkManager.get(requestHeader); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64))); + waitingForDoc = true; + qDebug() << ">>>>>>>>>>>>>> Downloading file" ; +} + +void GoogleDocumentService::uploadDocument(QString *filename, QString *title) +{ + authToken = docAuthToken; + QFile file(*filename); + file.open(QFile::ReadOnly); + QByteArray data = file.readAll(); + file.close(); + QUrl url; + url.setUrl("https://docs.google.com/feeds/default/private/full"); + + QNetworkRequest requestHeader(url); + requestHeader.setRawHeader("User-Agent", "KOffice"); + requestHeader.setRawHeader("GData-Version", "3.0"); + requestHeader.setRawHeader("Authorization", authToken.toUtf8()); + requestHeader.setRawHeader("Content-Type", MimeTypes::getMimeType(QFileInfo(*filename).suffix()).toUtf8()); + requestHeader.setRawHeader("Content-Length", QString::number(data.length()).toUtf8()); + requestHeader.setRawHeader("Slug", QUrl::toPercentEncoding(*title)); + + QNetworkReply *reply = networkManager.post(requestHeader, data); + connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64))); + uploadingDoc = true; + qDebug() << ">>>>>>>>>>>>>> Uploading file" ; +} + diff --git a/googledocumentservice.h b/googledocumentservice.h new file mode 100644 index 0000000..b2919c0 --- /dev/null +++ b/googledocumentservice.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010 Mani Chandrasekar + * Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef GOOGLEDOCUMENTSERVICE_H +#define GOOGLEDOCUMENTSERVICE_H + +#include +#include +#include +#include +//#include "documentlistwindow.h" + +class GoogleDocumentList; +class GoogleDocument; +class GoogleContentHandler; +//class DocumentListWindow; + +class GoogleDocumentService : public QObject +{ + Q_OBJECT + +public: + GoogleDocumentService(); + void clientLogin(const QString & username, const QString & password); + void listDocuments(); + void prepareLists(); + void uploadDocument(QString *filename, QString *title); + void downloadDocument(GoogleDocument *, QString *saveFileName); + bool alreadyAuthenticated() { + return loggedin; + } + + QList documentList; + QList presentationList; + QList spreadsheetList; + QList othersList; + +signals: + void userAuthenticated(bool success); + void listDone(bool); + void downloadDone(bool); + void uploadDone(bool); + void downloadProgress(qint64 bytesSent, qint64 bytesTotal); + void uploadProgress(qint64 bytesSent, qint64 bytesTotal); + +private slots: + void handleNetworkData(QNetworkReply *networkReply); + +private: + QXmlSimpleReader xmlReader; + QXmlInputSource xmlInput; + bool newInformation; + bool waitingForDoc; + bool uploadingDoc; + bool loggedin; + bool haveDocAuthToken; + GoogleContentHandler *gHandler; + QString authToken; + QString docAuthToken; + QString spreadAuthToken; + QString *saveFileName; + QString username; + QString password; + QNetworkAccessManager networkManager; + + static const QString GOOGLE_DOCUMENT_URL; + static const QString GOOGLE_SPREADSHEET_URL; +}; + +#endif // GOOGLEDOCUMENTSERVICE_H diff --git a/googlelistdialog.cpp b/googlelistdialog.cpp new file mode 100644 index 0000000..74d167c --- /dev/null +++ b/googlelistdialog.cpp @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "googlelistdialog.h" +#include "ui_filelistdialog.h" + +#include "googledocument.h" +#include "googleuploaddialog.h" + +#include +#include +#include + +googleListDialog::googleListDialog(GoogleDocumentService *service, QWidget *parent): + QDialog(parent), + ui(new Ui::fileListDialog) +{ + ui->setupUi(this); + this->setWindowTitle("Google Docs"); + this->service = service; + ui->listTab->setCurrentIndex(0); + ui->downloadProgressBar->setVisible(false); + + connect(ui->downloadButton, SIGNAL(clicked()), this, SLOT(downloadButtonClickedSlot())); + connect(ui->uploadButton, SIGNAL(clicked()), this, SLOT(uploadButtonClickedSlot())); + connect(ui->refreshButton, SIGNAL(clicked()), this, SLOT(refreshList())); + connect(service, SIGNAL(listDone(bool)), this, SLOT(fillList(bool))); + connect(service, SIGNAL(downloadDone(bool)), this, SLOT(downloadDoneSlot(bool))); + connect(service, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgressBar(qint64, qint64))); + refreshList(); +} + +void googleListDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch(e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void googleListDialog::refreshList() +{ + ui->listTab->setEnabled(false); + ui->downloadButton->setEnabled(false); + ui->uploadButton->setEnabled(false); + ui->refreshButton->setEnabled(false); + ui->downloadProgressBar->setMinimum(0); + ui->downloadProgressBar->setMaximum(0); + ui->downloadProgressBar->setVisible(true); + service->listDocuments(); +} + +void googleListDialog::fillList(bool status) +{ + if(status) { + ui->documentList->clear(); + ui->presentationList->clear(); + ui->spreadsheetList->clear(); + ui->othersList->clear(); + + QList list; + + list = service->documentList; + foreach(GoogleDocument * i, list) { + ui->documentList->addItem(i->title()); + } + + list = service->presentationList; + foreach(GoogleDocument * i, list) { + ui->presentationList->addItem(i->title()); + } + + list = service->spreadsheetList; + foreach(GoogleDocument * i, list) { + ui->spreadsheetList->addItem(i->title()); + } + + list = service->othersList; + foreach(GoogleDocument * i, list) { + ui->othersList->addItem(i->title()); + } + } else { + QMaemo5InformationBox::information(this, "

Error

An error occured while fetching document list

", QMaemo5InformationBox::NoTimeout); + } + ui->downloadProgressBar->setMaximum(100); + ui->downloadProgressBar->setVisible(false); + ui->listTab->setEnabled(true); + ui->downloadButton->setEnabled(true); + ui->uploadButton->setEnabled(true); + ui->refreshButton->setEnabled(true); +} + +void googleListDialog::downloadButtonClickedSlot() +{ + QList list; + QListWidget *tmp = 0; + switch(ui->listTab->currentIndex()) { + case 0: + tmp = ui->documentList; + list = service->documentList; + break; + case 1: + tmp = ui->presentationList; + list = service->presentationList; + break; + case 2: + tmp = ui->spreadsheetList; + list = service->spreadsheetList; + break; + case 3: + tmp = ui->othersList; + list = service->othersList; + } + + if(-1 == tmp->currentRow()) { + QMaemo5InformationBox::information(this, "Select a file from the list to download", QMaemo5InformationBox::DefaultTimeout); + return; + } + GoogleDocument *doc = list[tmp->currentRow()]; + QString format = ""; + if("presentation" == doc->documentType()) { + format = ".ppt"; + } else if("document" == doc->documentType()) { + format = ".odt"; + } else if("spreadsheet" == doc->documentType()) { + format = ".ods"; + } + QString filename = QFileDialog::getSaveFileName(this, "Save File", QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation) + "/" + doc->title() + format, "(*" + format + ")"); + if("" == filename) + return; + service->downloadDocument(doc, new QString(filename)); + ui->listTab->setEnabled(false); + ui->uploadButton->setEnabled(false); + ui->downloadButton->setEnabled(false); + ui->refreshButton->setEnabled(false); + ui->downloadProgressBar->setVisible(true); +} + +void googleListDialog::uploadButtonClickedSlot() +{ + googleUploadDialog *ud = new googleUploadDialog(service, this); + if("" != openDocPath) { + ud->setOpenDoc(openDocPath); + } + ud->show(); + connect(ud, SIGNAL(accepted()), this, SLOT(refreshList())); +} + +void googleListDialog::downloadDoneSlot(bool status) +{ + ui->downloadProgressBar->setVisible(false); + ui->downloadProgressBar->setValue(0); + ui->listTab->setEnabled(true); + ui->downloadButton->setEnabled(true); + ui->refreshButton->setEnabled(true); + ui->uploadButton->setEnabled(true); + if(status) + QMaemo5InformationBox::information(this, "The file has finished downloading", QMaemo5InformationBox::DefaultTimeout); + else + QMaemo5InformationBox::information(this, "

Error

An error occured while downloading the document

", QMaemo5InformationBox::NoTimeout); +} + +void googleListDialog::updateProgressBar(qint64 bytesDone, qint64 bytesTotal) +{ + int value = (bytesDone * 100) / bytesTotal; + ui->downloadProgressBar->setValue(value); +} + +void googleListDialog::setOpenDoc(const QString & openDocPath) +{ + this->openDocPath = openDocPath; +} diff --git a/googlelistdialog.h b/googlelistdialog.h new file mode 100644 index 0000000..53df319 --- /dev/null +++ b/googlelistdialog.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef GOOGLELISTDIALOG_H +#define GOOGLELISTDIALOG_H + +#include +#include + +namespace Ui +{ +class fileListDialog; +} + +class googleListDialog : public QDialog +{ + Q_OBJECT +public: + googleListDialog(GoogleDocumentService *service, QWidget *parent = 0); + void setOpenDoc(const QString &); +protected: + void changeEvent(QEvent *e); + +private slots: + void downloadButtonClickedSlot(); + void uploadButtonClickedSlot(); + void fillList(bool); + void downloadDoneSlot(bool); + void updateProgressBar(qint64, qint64); + void refreshList(); + +private: + Ui::fileListDialog *ui; + GoogleDocumentService *service; + QString openDocPath; +}; + +#endif // GOOGLELISTDIALOG_H diff --git a/googleuploaddialog.cpp b/googleuploaddialog.cpp new file mode 100644 index 0000000..c3b5ba2 --- /dev/null +++ b/googleuploaddialog.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "googleuploaddialog.h" +#include "ui_uploaddialog.h" + +#include "googledocumentservice.h" + +#include +#include +#include + +googleUploadDialog::googleUploadDialog(GoogleDocumentService *service, QWidget *parent): + QDialog(parent), + ui(new Ui::uploadDialog) +{ + this->service = service; + ui->setupUi(this); + ui->descriptionBox->setVisible(false); + ui->tagsEdit->setVisible(false); + ui->label_3->setVisible(false); + ui->label_4->setVisible(false); + + connect(service, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgressSlot(qint64, qint64))); + connect(ui->fileSelectButton, SIGNAL(clicked()), this, SLOT(showFileDialog())); + connect(ui->uploadButton, SIGNAL(clicked()), this, SLOT(uploadButtonClickedSlot())); +} + +googleUploadDialog::~googleUploadDialog() +{ + disconnect(service, SIGNAL(uploadDone(bool)), this, SLOT(uploadDoneSlot(bool))); + delete ui; +} + +void googleUploadDialog::setOpenDoc(const QString & openDocPath) +{ + ui->fileSelectEdit->setText(openDocPath); +} + +void googleUploadDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch(e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void googleUploadDialog::uploadProgressSlot(qint64 bytesSent, qint64 bytesTotal) +{ + int value = (bytesSent * 100) / bytesTotal; + ui->uploadProgress->setValue(value); +} + +void googleUploadDialog::showFileDialog() +{ + QString currentFile = ("" == ui->fileSelectEdit->text()) ? QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation) : ui->fileSelectEdit->text(); + QString filter = "Supported Files (*.odt *.doc *.ppt *.xls)"; + QString filename = QFileDialog::getOpenFileName(this, QString("Select File"), currentFile, filter, &filter); + if("" != filename) + ui->fileSelectEdit->setText(filename); +} + +void googleUploadDialog::uploadButtonClickedSlot() +{ + if(ui->fileSelectEdit->text() == "" || ui->titleEdit->text() == "") { + QMaemo5InformationBox::information(this, "Please enter both filename and title"); + return; + } else { + ui->fileSelectButton->setEnabled(false); + ui->titleEdit->setEnabled(false); + ui->uploadButton->setEnabled(false); + service->uploadDocument(&ui->fileSelectEdit->text(), &ui->titleEdit->text()); + connect(service, SIGNAL(uploadDone(bool)), this, SLOT(uploadDoneSlot(bool))); + } +} + +void googleUploadDialog::uploadDoneSlot(bool status) +{ + if(!status) { + QMaemo5InformationBox::information(this, "\nUpload failed\n", QMaemo5InformationBox::NoTimeout); + } else { + QMaemo5InformationBox::information(this, "Upload completed"); + } + ui->doneButton->setEnabled(true); +} diff --git a/googleuploaddialog.h b/googleuploaddialog.h new file mode 100644 index 0000000..e97b616 --- /dev/null +++ b/googleuploaddialog.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef GOOGLEUPLOADDIALOG_H +#define GOOGLEUPLOADDIALOG_H + +#include + +class GoogleDocumentService; +namespace Ui +{ +class uploadDialog; +} + +class googleUploadDialog : public QDialog +{ + Q_OBJECT +public: + googleUploadDialog(GoogleDocumentService *service, QWidget *parent = 0); + ~googleUploadDialog(); + void setOpenDoc(const QString &); + +protected: + void changeEvent(QEvent *); + +private: + Ui::uploadDialog *ui; + GoogleDocumentService *service; + +private slots: + void uploadProgressSlot(qint64 bytesSent, qint64 bytesTotal); + void showFileDialog(); + void uploadButtonClickedSlot(); + void uploadDoneSlot(bool); +}; + +#endif // GOOGLEUPLOADDIALOG_H diff --git a/loginwindow.cpp b/loginwindow.cpp new file mode 100644 index 0000000..caacb21 --- /dev/null +++ b/loginwindow.cpp @@ -0,0 +1,201 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include "loginwindow.h" +#include "googledocumentservice.h" +#include "googlelistdialog.h" +#include "slideshare.h" +#include "slidesharelistdialog.h" +#include "encryptsupport.h" + +#include +#include +#include + +#include +#include +#include + +LoginWindow::LoginWindow(QWidget *parent) + : QDialog(parent), + m_authDialog(new Ui_Dialog), + settings(new QSettings("freoffice", "online-services-plugin", this)), + cipher(new encryptSupport(this)) +{ + m_authDialog->setupUi(this); + + QStringList onlineServices; + onlineServices << "Google Documents"; + // Add services here + onlineServices << "Slide Share"; + m_authDialog->comboBox->addItems(onlineServices); + + connect(m_authDialog->loginButton, SIGNAL(clicked()), this, SLOT(loginService())); + connect(m_authDialog->comboBox, SIGNAL(activated(int)), this, SLOT(serviceSelected(int))); + fillDetails(); + m_authDialog->userEdit->setInputMethodHints(Qt::ImhNoAutoUppercase); + m_authDialog->userEdit->setFocus(); + show(); +} + +LoginWindow::~LoginWindow() +{ + settings->sync(); +} + +void LoginWindow::setOpenDoc(const QString & openDocPath) +{ + this->openDocPath = openDocPath; +} + +void LoginWindow::loginService() +{ + if("" == m_authDialog->userEdit->text() || "" == m_authDialog->passwordEdit->text()) { + QMaemo5InformationBox::information(this, "Enter both username and password", QMaemo5InformationBox::DefaultTimeout); + return; + } + disableWidgets(); + if(0 == m_authDialog->comboBox->currentIndex()) { + gdoc = new GoogleDocumentService(); + setShowProgressIndicator(true); + gdoc->clientLogin(m_authDialog->userEdit->text(), m_authDialog->passwordEdit->text()); + connect(gdoc, SIGNAL(userAuthenticated(bool)), this, SLOT(authenticated(bool))); + } + if(1 == m_authDialog->comboBox->currentIndex()) { + service = new SlideShare(this); + service->setApikey(new QString("KhSMYyiF")); + service->setsecretKey(new QString("HDXhAC5g")); + service->setUsername(new QString(m_authDialog->userEdit->text())); + service->setPassword(new QString(m_authDialog->passwordEdit->text())); + service->login(); + setShowProgressIndicator(true); + connect(service, SIGNAL(loginDone(bool)), this, SLOT(slideShareLoginDoneSlot(bool))); + } +} + +void LoginWindow::serviceSelected(int index) +{ + if(index == 0) { + m_authDialog->userEdit->setText("@gmail.com"); + m_authDialog->passwordEdit->clear(); + } else if(index == 1) { + m_authDialog->userEdit->clear(); + m_authDialog->passwordEdit->clear(); + } + fillDetails(); + m_authDialog->userEdit->setFocus(); +} + +void LoginWindow::authenticated(bool success) +{ + if(success) { + QString key("user/gdocs"); + saveDetails(key); + googleListDialog *ld = new googleListDialog(gdoc, this); + ld->setOpenDoc(openDocPath); + this->accept();; + ld->show(); + } else { + QMaemo5InformationBox::information(this, ("

Login Failed

Check your username & password

"), QMaemo5InformationBox::NoTimeout); + enableWidgets(); + } +} + +void LoginWindow::setShowProgressIndicator(bool visible) +{ + unsigned long val = visible ? 1 : 0; + Atom atom = XInternAtom(QX11Info::display(), + "_HILDON_WM_WINDOW_PROGRESS_INDICATOR", False); + XChangeProperty(QX11Info::display(), winId(), atom, XA_INTEGER, + 32, PropModeReplace, + (unsigned char *) &val, 1); +} + +void LoginWindow::slideShareLoginDoneSlot(bool loginStatus) +{ + if(loginStatus == false) { + QMaemo5InformationBox::information(this, "

Login Failed.

Check your username and password

", QMaemo5InformationBox::NoTimeout); + enableWidgets(); + } else { + QString key("user/slideshare"); + saveDetails(key); + slideshareListDialog * ld = new slideshareListDialog(service, this); + ld->setOpenDoc(openDocPath); + this->accept(); + ld->show(); + } +} + +void LoginWindow::enableWidgets() +{ + setShowProgressIndicator(false); + m_authDialog->loginButton->setEnabled(true); + m_authDialog->userEdit->setEnabled(true); + m_authDialog->passwordEdit->setEnabled(true); + m_authDialog->comboBox->setEnabled(true); + m_authDialog->saveCheckBox->setEnabled(true); +} + +void LoginWindow::disableWidgets() +{ + m_authDialog->loginButton->setEnabled(false); + m_authDialog->userEdit->setEnabled(false); + m_authDialog->passwordEdit->setEnabled(false); + m_authDialog->comboBox->setEnabled(false); + m_authDialog->saveCheckBox->setEnabled(false); +} + +void LoginWindow::saveDetails(QString &key) +{ + if(Qt::Checked == m_authDialog->saveCheckBox->checkState()) { + QVariantMap m; + QString username = m_authDialog->userEdit->text(); + QString password = m_authDialog->passwordEdit->text(); + m.insert("username", username); + m.insert("password", cipher->encrypt(password)); + settings->setValue(key, m); + } else { + settings->remove(key); + } +} + +void LoginWindow::fillDetails() +{ + QString key = ""; + if(0 == m_authDialog->comboBox->currentIndex()) + key = "user/gdocs"; + else if(1 == m_authDialog->comboBox->currentIndex()) + key = "user/slideshare"; + else + return; + if(settings->contains(key)) { + QVariantMap m = settings->value(key).value(); + QString username = m.value("username").toString(); + QString password = m.value("password").toString(); + m_authDialog->userEdit->setText(username); + m_authDialog->passwordEdit->setText(cipher->decrypt(password)); + m_authDialog->saveCheckBox->setCheckState(Qt::Checked); + } else + m_authDialog->saveCheckBox->setCheckState(Qt::Unchecked); + return; +} diff --git a/loginwindow.h b/loginwindow.h new file mode 100644 index 0000000..a1fc8e8 --- /dev/null +++ b/loginwindow.h @@ -0,0 +1,64 @@ +/* + * This file is part of Maemo 5 Office UI for KOffice + * + * Copyright (C) 2010 Manikandaprasad N C . + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef LOGINWINDOW_H +#define LOGINWINDOW_H + +#include + +#include "ui_authenticationdialog.h" + +class SlideShare; +class GoogleDocumentService; +class encryptSupport; +class QSettings; +class LoginWindow : public QDialog +{ + Q_OBJECT + +public: + LoginWindow(QWidget *parent = 0); + ~LoginWindow(); + void setShowProgressIndicator(bool visible); + void setOpenDoc(const QString &); + +private slots: + void loginService(); + void serviceSelected(int index); + void authenticated(bool success); + void slideShareLoginDoneSlot(bool loginStatus); + +private: + Ui_Dialog *m_authDialog; + encryptSupport *cipher; + GoogleDocumentService *gdoc; + SlideShare *service; + QSettings *settings; + QString openDocPath; + void enableWidgets(); + void disableWidgets(); + void saveDetails(QString &key); + void fillDetails(); +}; + +#endif // LOGINWINDOW_H diff --git a/mimetypes.cpp b/mimetypes.cpp new file mode 100644 index 0000000..9124f7b --- /dev/null +++ b/mimetypes.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "mimetypes.h" + +QString MimeTypes::getMimeType(const QString & extension) +{ + QHash mimelist; + mimelist["odt"] = "application/vnd.oasis.opendocument.text"; + mimelist["doc"] = "application/msword"; + mimelist["odp"] = "application/vnd.oasis.opendocument.presentation"; + mimelist["ppt"] = "application/vnd.ms-powerpoint"; + mimelist["ods"] = "application/x-vnd.oasis.opendocument.spreadsheet"; + mimelist["xls"] = "application/ms-excel"; + return mimelist[extension]; +} diff --git a/mimetypes.h b/mimetypes.h new file mode 100644 index 0000000..8c93a08 --- /dev/null +++ b/mimetypes.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef MIMETYPES_H +#define MIMETYPES_H + +#include +#include +class MimeTypes +{ +public: + static QString getMimeType(const QString &); +}; + +#endif // MIMETYPES_H diff --git a/onlineServicesPlugin.pro b/onlineServicesPlugin.pro new file mode 100644 index 0000000..fe30764 --- /dev/null +++ b/onlineServicesPlugin.pro @@ -0,0 +1,56 @@ +# ##################################################################### +# Automatically generated by qmake (2.01a) Sat Jul 10 12:41:16 2010 +# ##################################################################### +QT += network +QT += xml +QT += maemo5 + +TEMPLATE = lib + +CONFIG += plugin + +TARGET = OnlineServicesPlugin +target.path = /usr/lib/freoffice/ + +INSTALLS += target + +DEPENDPATH += . + +INCLUDEPATH += . \ + /usr/local/include/office \ + /usr/include/office + +LIBS += -lcrypto + +# Input +HEADERS += googlecontenthandler.h \ + googledocument.h \ + googledocumentlist.h \ + googledocumentservice.h \ + googlelistdialog.h \ + googleuploaddialog.h \ + loginwindow.h \ + mimetypes.h \ + onlineservicesplugin.h \ + slideshare.h \ + slideshareDocument.h \ + slidesharelistdialog.h \ + slideshareuploaddialog.h \ + encryptsupport.h +FORMS += authenticationdialog.ui \ + filelistdialog.ui \ + uploaddialog.ui +SOURCES += googlecontenthandler.cpp \ + googledocument.cpp \ + googledocumentlist.cpp \ + googledocumentservice.cpp \ + googlelistdialog.cpp \ + googleuploaddialog.cpp \ + loginwindow.cpp \ + mimetypes.cpp \ + onlineservicesplugin.cpp \ + slideshare.cpp \ + slidesharelistdialog.cpp \ + slideshareuploaddialog.cpp \ + encryptsupport.cpp + diff --git a/onlineservicesplugin.cpp b/onlineservicesplugin.cpp new file mode 100644 index 0000000..2bccf40 --- /dev/null +++ b/onlineservicesplugin.cpp @@ -0,0 +1,42 @@ +#include "onlineservicesplugin.h" +#include "loginwindow.h" +#include + +onlineServicesPlugin::onlineServicesPlugin() +{ + name = "Online Services"; + window = 0; +} +onlineServicesPlugin::~onlineServicesPlugin() +{ + delete window; + window = 0; +} + +void onlineServicesPlugin::setDocument(void *doc) +{ + this->doc = (KoDocument *) doc; +} + +QWidget *onlineServicesPlugin::view() +{ + window = new LoginWindow(); + if(doc) { + window->setOpenDoc(doc->url().path()); + } + return window; +} + +QString onlineServicesPlugin::pluginName() +{ + return name; +} + +QStringList onlineServicesPlugin::pluginSupportTypes() +{ + QStringList types; + types << "All"; + return types; +} + +Q_EXPORT_PLUGIN2(OnlineServicesPlugin, onlineServicesPlugin) diff --git a/onlineservicesplugin.h b/onlineservicesplugin.h new file mode 100644 index 0000000..d4ac85c --- /dev/null +++ b/onlineservicesplugin.h @@ -0,0 +1,28 @@ +#ifndef ONLINESERVICESPLUGIN_H +#define ONLINESERVICESPLUGIN_H + +#include "OfficeInterface.h" +#include + +class LoginWindow; +class KoDocument; + +class onlineServicesPlugin: public QObject, public OfficeInterface +{ + Q_OBJECT + Q_INTERFACES(OfficeInterface) +public: + onlineServicesPlugin(); + ~onlineServicesPlugin(); + void setDocument(void *doc); + QWidget * view(); + QString pluginName(); + QStringList pluginSupportTypes(); + +private: + QString name; + KoDocument *doc; + LoginWindow *window; +}; + +#endif // ONLINESERVICESPLUGIN_H diff --git a/slideshare.cpp b/slideshare.cpp new file mode 100644 index 0000000..7a09d95 --- /dev/null +++ b/slideshare.cpp @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "slideshare.h" +#include "slideshareDocument.h" +#include "mimetypes.h" + +SlideShare::SlideShare(QObject *parent): QObject(parent) +{ + manager.setCookieJar(&this->cookieJar); + doc = new SlideShareDocument; +} + +SlideShare::SlideShare(QString *username, QString *password, QObject *parent): QObject(parent) +{ + this->username = username; + this->password = password; + SlideShare(); +} +SlideShare::SlideShare(QString *username, QString *password, QString *apiKey, QString *secretKey, QObject *parent): QObject(parent) +{ + this->apiKey = apiKey; + this->secretKey = secretKey; + SlideShare(username, password); +} + +SlideShare::~SlideShare() +{ +} + +void SlideShare::setUsername(QString *username) +{ + this->username = username; +} + +void SlideShare::setPassword(QString *password) +{ + this->password = password; +} + +void SlideShare::setApikey(QString *apiKey) +{ + this->apiKey = apiKey; +} + +void SlideShare::setsecretKey(QString *secretKey) +{ + this->secretKey = secretKey; +} + +void SlideShare::setSlideTitle(QString *title) +{ + doc->title = *title; +} + +void SlideShare::setDescription(QString *description) +{ + doc->description = *description; +} + +void SlideShare::setTags(QString *tags) +{ + doc->tags = *tags; +} + +void SlideShare::setFormat(QString *format) +{ + doc->format = *format; +} + +void SlideShare::setSourceFile(QString *filename) +{ + this->sourceFilename = filename; +} + +void SlideShare::setSaveFileName(QString *saveFileName) +{ + this->saveFileName = saveFileName; +} + + +void SlideShare::login() +{ + qDebug() << ">>>>>>>>> SlideShare::login()"; + QUrl *login = new QUrl(QString("http://www.slideshare.net/login")); + QByteArray data; + data.append(QString("user_login=").append(username).toUtf8()); + data.append(QString("&user_password=").append(password).toUtf8()); + + QNetworkRequest request; + request.setUrl(*login); + + reply = manager.post(request, data); + connect(reply, SIGNAL(finished()), this, SLOT(afterLogin())); +} + + +void SlideShare::afterLogin() +{ + qDebug() << ">>>>>>>>> SlideShare::afterLogin()"; + if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 302) { + if(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString().contains(*username)) + emit loginDone(true); + } else + emit loginDone(false); +} + +void SlideShare::download(QString *durl) +{ + qDebug() << ">>>>>>>>> SlideShare::download()"; + QUrl *dload = new QUrl(*durl) ; + QNetworkRequest request; + request.setUrl(*dload); + + QList list = cookieJar.cookiesForUrl(QUrl("http://www.slideshare.net/")); + + foreach(QNetworkCookie c, list) { + if(c.name() == "_cookie_id") { + request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(list)); + } + } + + reply = manager.get(request); + connect(reply, SIGNAL(finished()), this, SLOT(saveFile())); + +} +void SlideShare::saveFile() +{ + qDebug() << ">>>>>>>>> SlideShare::saveFile()"; + if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 302) { + reply = manager.get(QNetworkRequest(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl())); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64))); + connect(reply, SIGNAL(finished()), this, SLOT(saveFile())); + return; + } + + QFile file(*saveFileName); + file.open(QFile::WriteOnly); + + file.write(reply->readAll()); + file.close(); + + + emit downloadDone(); +} + +void SlideShare::upload() +{ + qDebug() << ">>>>>>>>> SlideShare::upload()"; + QDateTime *time = new QDateTime(); + QString ts; + ts.setNum(time->toTime_t()); + + QByteArray data = this->secretKey->toAscii(); + data += ts; + + QFile *file = new QFile(*this->sourceFilename, this); + file->open(QFile::ReadOnly); + + QByteArray fileData ; + fileData = file->readAll(); + + QByteArray postData; + postData.append("--BOUNDARY\r\n"); + postData.append("Content-Disposition: form-data; name=\"slideshow_srcfile\"; filename=\""); + postData.append(file->fileName().toUtf8()); + postData.append("\"\r\n"); + postData.append("Content-Type: " + MimeTypes::getMimeType(doc->format)); + postData.append("\r\n\r\n"); + postData.append(fileData); + postData.append("\r\n--BOUNDARY\r\n"); + + + QList > params; + params.append(qMakePair(QString("api_key"), *this->apiKey)); + params.append(qMakePair(QString("ts"), ts)); + params.append(qMakePair(QString("hash"), QString(QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex()))); + params.append(qMakePair(QString("username"), *this->username)); + params.append(qMakePair(QString("password"), *this->password)); + params.append(qMakePair(QString("slideshow_title"), doc->title)); + if(doc->description != "") + params.append(qMakePair(QString("slideshow_description"), doc->description)); + if(doc->tags != "") + params.append(qMakePair(QString("slideshow_tags"), doc->tags)); + + QUrl url("http://www.slideshare.net/api/2/upload_slideshow", QUrl::TolerantMode); + url.setQueryItems(params); + QNetworkRequest request; + request.setUrl(url); + request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=BOUNDARY"); + request.setHeader(QNetworkRequest::ContentLengthHeader, postData.length()); + + + QNetworkReply *reply = manager.post(request, postData); + connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64))); + connect(reply, SIGNAL(finished()), this, SIGNAL(uploadDone())); +} + +void SlideShare::listDocuments() +{ + qDebug() << ">>>>>>>>> SlideShare::listDocuments()"; + QDateTime *time = new QDateTime(QDateTime::currentDateTime()); + QString ts; + ts.setNum(time->toTime_t()); + + QByteArray data = this->secretKey->toAscii(); + data += ts; + + QList > params; + params.append(qMakePair(QString("api_key"), *this->apiKey)); + params.append(qMakePair(QString("ts"), ts)); + params.append(qMakePair(QString("hash"), QString(QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex()))); + params.append(qMakePair(QString("username"), *this->username)); + params.append(qMakePair(QString("password"), *this->password)); + params.append(qMakePair(QString("username_for"), *this->username)); + + + QUrl url("http://www.slideshare.net/api/2/get_slideshows_by_user"); + url.setQueryItems(params); + + + QNetworkRequest request; + request.setUrl(url); + + reply = manager.get(request); + connect(reply, SIGNAL(finished()), this, SLOT(parseList())); +} +void SlideShare::parseList() +{ + qDebug() << ">>>>>>>>> SlideShare::parseList()" ; + QDomDocument doc; + QByteArray data = reply->readAll(); + doc.setContent(data); + + QDomElement root = doc.documentElement(); + QDomElement child = root.firstChildElement("Slideshow"); + + textDocList.clear(); + presentationList.clear(); + spreadsheetList.clear(); + + while(!child.isNull()) { + SlideShareDocument *p = new SlideShareDocument; + p->title = child.firstChildElement("Title").text(); + p->url = child.firstChildElement("URL").text(); + p->format = child.firstChildElement("Format").text(); + p->slideID = child.firstChildElement("ID").text(); + p->thumbnailBig = child.firstChildElement("ThumbnailUrl").text(); + p->thumbnailSmall = child.firstChildElement("ThumbnailSmallURL").text(); + p->downloadUrl = p->url.append("/download"); + QString download = child.firstChildElement("Download").text(); + if(download == "1") { + if(p->format == "odt" || p->format == "doc") + this->textDocList.append(*p); + if(p->format == "odp" || p->format == "ppt") + this->presentationList.append(*p); + if(p->format == "ods" || p->format == "xls") + this->spreadsheetList.append(*p); + } + + child = child.nextSiblingElement("Slideshow"); + } + emit listDone(); +} + diff --git a/slideshare.h b/slideshare.h new file mode 100644 index 0000000..dd38aa5 --- /dev/null +++ b/slideshare.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SLIDESHARE_H +#define SLIDESHARE_H + +#include +#include +#include +#include +#include +#include + + +struct SlideShareDocument; + +class SlideShare : public QObject +{ + Q_OBJECT + +public: + SlideShare(QObject *parent = 0); + SlideShare(QString *username, QString *password, QObject *parent = 0); + SlideShare(QString *username, QString *password, QString *apiKey, QString *secretKey, QObject *parent); + ~SlideShare(); + + void login(); + void upload(); + void download(QString *durl); + void listDocuments(); + void searchByTags(QString *tag); + + void setApikey(QString *apiKey); + void setsecretKey(QString *secretKey); + + void setUsername(QString *username); + void setPassword(QString *password); + + void setSlideTitle(QString *title); + void setDescription(QString *description); + void setTags(QString *tags); + void setFormat(QString *format); + + void setSourceFile(QString *filename); + void setSaveFileName(QString *saveFileName); + + QList textDocList; + QList presentationList; + QList spreadsheetList; + +private: + QString *apiKey; + QString *secretKey; + QString *username; + QString *password; + + QString *sourceFilename; + QString *saveFileName; + + SlideShareDocument *doc; + + bool loginStatus; + + QNetworkAccessManager manager; + QNetworkCookieJar cookieJar; + QNetworkReply *reply; + + void getThumbnailSmall(); + void getThumbnailBig(); + + +private slots: + void afterLogin(); + void parseList(); + void saveFile(); + +signals: + void downloadProgress(qint64 bytesSent, qint64 bytesTotal); + void uploadProgress(qint64 bytesSent, qint64 bytesTotal); + void loginDone(bool); + void uploadDone(); + void listDone(); + void downloadDone(); + +}; + +#endif // SLIDESHARE_H diff --git a/slideshareDocument.h b/slideshareDocument.h new file mode 100644 index 0000000..34ef49e --- /dev/null +++ b/slideshareDocument.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SLIDESHAREDOCUMENT_H +#define SLIDESHAREDOCUMENT_H +class QString; + +struct SlideShareDocument { + QString title; + QString slideID; + QString url; + QString downloadUrl; + QString format; + QString description; + QString tags; + QString thumbnailSmall; + QString thumbnailBig; +}; +#endif // SLIDESHAREDOCUMENT_H diff --git a/slidesharelistdialog.cpp b/slidesharelistdialog.cpp new file mode 100644 index 0000000..8e97e48 --- /dev/null +++ b/slidesharelistdialog.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "slidesharelistdialog.h" +#include "ui_filelistdialog.h" + +#include "slideshareuploaddialog.h" +#include "slideshareDocument.h" + +#include +#include +#include +#include +#include +#include + +slideshareListDialog::slideshareListDialog(SlideShare *s, QWidget *parent): + QDialog(parent), + ui(new Ui::fileListDialog) +{ + ui->setupUi(this); + this->setWindowTitle("SlideShare"); + ui->downloadProgressBar->setVisible(false); + this->service = s; + ui->listTab->setCurrentIndex(1); + ui->listTab->removeTab(3); + connect(ui->uploadButton, SIGNAL(clicked()), this, SLOT(uploadButtonClickedSlot())); + connect(ui->downloadButton, SIGNAL(clicked()), this, SLOT(downloadButtonClickedSlot())); + connect(ui->refreshButton, SIGNAL(clicked()), this, SLOT(refreshList())); + connect(service, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgressBar(qint64, qint64))); + connect(service, SIGNAL(downloadDone()), this, SLOT(downloadDoneSlot())); + connect(service, SIGNAL(listDone()), this, SLOT(fillList())); + + refreshList(); +} + +slideshareListDialog::~slideshareListDialog() +{ + delete ui; +} + +void slideshareListDialog::refreshList() +{ + ui->downloadProgressBar->setMaximum(0); + ui->downloadProgressBar->setVisible(true); + ui->listTab->setEnabled(false); + ui->downloadButton->setEnabled(false); + ui->uploadButton->setEnabled(false); + ui->refreshButton->setEnabled(false); + service->listDocuments(); +} + +void slideshareListDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch(e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void slideshareListDialog::downloadButtonClickedSlot() +{ + QListWidget *tmp; + QList list; + if(0 == ui->listTab->currentIndex()) { + tmp = ui->documentList; + list = service->textDocList; + } + if(1 == ui->listTab->currentIndex()) { + tmp = ui->presentationList; + list = service->presentationList; + } + if(2 == ui->listTab->currentIndex()) { + tmp = ui->spreadsheetList; + list = service->spreadsheetList; + } + + if(tmp->currentRow() == -1) { + QMaemo5InformationBox::information(this, "Select a file from the list to download", QMaemo5InformationBox::DefaultTimeout); + return; + } + + SlideShareDocument p = list[tmp->currentRow()]; + QString durl = p.downloadUrl; + + QString saveFileName = QFileDialog::getSaveFileName(this, "Save file", QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation).append("/").append(p.title).append(".").append(p.format), QString("(*.").append(p.format).append(")")); + qDebug() << saveFileName << endl; + if("" == saveFileName) { + return; + } + service->setSaveFileName(new QString(saveFileName)); + + service->download(&durl); + ui->listTab->setEnabled(false); + ui->downloadButton->setEnabled(false); + ui->uploadButton->setEnabled(false); + ui->refreshButton->setEnabled(false); + ui->downloadProgressBar->setVisible(true); +} + +void slideshareListDialog::uploadButtonClickedSlot() +{ + slideshareUploadDialog *ud = new slideshareUploadDialog(service, this); + if("" != openDocPath) { + ud->setOpenDoc(openDocPath); + } + ud->show(); + connect(ud, SIGNAL(accepted()), this, SLOT(refreshList())); +} + +void slideshareListDialog::fillList() +{ + ui->documentList->clear(); + ui->presentationList->clear(); + ui->spreadsheetList->clear(); + + QList list; + QList::iterator i; + + list = service->textDocList; + for(i = list.begin(); i != list.end(); ++i) { + SlideShareDocument j = *i; + QListWidgetItem *k = new QListWidgetItem(j.title); + ui->documentList->addItem(k); + } + + list = service->presentationList; + for(i = list.begin(); i != list.end(); ++i) { + SlideShareDocument j = *i; + QListWidgetItem *k = new QListWidgetItem(j.title); + ui->presentationList->addItem(k); + } + + list = service->spreadsheetList; + for(i = list.begin(); i != list.end(); ++i) { + SlideShareDocument j = *i; + QListWidgetItem *k = new QListWidgetItem(j.title); + ui->spreadsheetList->addItem(k); + } + ui->downloadProgressBar->setMaximum(100); + ui->downloadProgressBar->setVisible(false); + ui->listTab->setEnabled(true); + ui->downloadButton->setEnabled(true); + ui->uploadButton->setEnabled(true); + ui->refreshButton->setEnabled(true); +} + +void slideshareListDialog::updateProgressBar(qint64 done, qint64 total) +{ + int value = (done * 100 / total); + ui->downloadProgressBar->setValue((int)value); +} + +void slideshareListDialog::downloadDoneSlot() +{ + ui->downloadProgressBar->setVisible(false); + ui->downloadProgressBar->setValue(0); + ui->listTab->setEnabled(true); + ui->downloadButton->setEnabled(true); + ui->refreshButton->setEnabled(true); + ui->uploadButton->setEnabled(true); + QMaemo5InformationBox::information(this, "The file has finished downloading", QMaemo5InformationBox::DefaultTimeout); +} + +void slideshareListDialog::setOpenDoc(const QString & openDocPath) +{ + this->openDocPath = openDocPath; +} + +bool slideshareListDialog::eventFilter(QObject *obj, QEvent *event) +{ + if(event->type() == QEvent::ContextMenu) { + QMouseEvent *mouseEvent = static_cast(event); + QMenu *menu = new QMenu(this); + menu->addAction(new QAction("CLICK", this)); + menu->exec(mouseEvent->globalPos()); + return false; + } + return true; +} + diff --git a/slidesharelistdialog.h b/slidesharelistdialog.h new file mode 100644 index 0000000..5047b81 --- /dev/null +++ b/slidesharelistdialog.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SLIDESHARELISTDIALOG_H +#define SLIDESHARELISTDIALOG_H + +#include +#include "slideshare.h" + +namespace Ui +{ +class fileListDialog; +} + +class slideshareListDialog : public QDialog +{ + Q_OBJECT +public: + slideshareListDialog(SlideShare *s, QWidget *parent = 0); + ~slideshareListDialog(); + void setOpenDoc(const QString &); + +protected: + void changeEvent(QEvent *e); + +private slots: + void downloadButtonClickedSlot(); + void uploadButtonClickedSlot(); + void fillList(); + void downloadDoneSlot(); + void updateProgressBar(qint64, qint64); + void refreshList(); + +private: + Ui::fileListDialog *ui; + SlideShare *service; + bool eventFilter(QObject *, QEvent *); + QString openDocPath; + +}; + +#endif // FILELISTDIALOG_H diff --git a/slideshareuploaddialog.cpp b/slideshareuploaddialog.cpp new file mode 100644 index 0000000..0d0a59a --- /dev/null +++ b/slideshareuploaddialog.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "slideshareuploaddialog.h" +#include "ui_uploaddialog.h" + +#include "slideshare.h" + +#include +#include +#include + +slideshareUploadDialog::slideshareUploadDialog(SlideShare *service, QWidget *parent) : + QDialog(parent), + ui(new Ui::uploadDialog) +{ + this->service = service; + ui->setupUi(this); + connect(service, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgressSlot(qint64, qint64))); + connect(ui->fileSelectButton, SIGNAL(clicked()), this, SLOT(showFileDialog())); + connect(ui->uploadButton, SIGNAL(clicked()), this, SLOT(uploadButtonClickedSlot())); + connect(service, SIGNAL(uploadDone()), this, SLOT(uploadDoneSlot())); +} + +slideshareUploadDialog::~slideshareUploadDialog() +{ + delete ui; +} + +void slideshareUploadDialog::setOpenDoc(const QString & openDocPath) +{ + ui->fileSelectEdit->setText(openDocPath); +} + +void slideshareUploadDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch(e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + + +void slideshareUploadDialog::uploadProgressSlot(qint64 sent, qint64 total) +{ + qint64 value = (sent * 100 / total) ; + ui->uploadProgress->setValue(value); +} + +void slideshareUploadDialog::showFileDialog() +{ + QString currentFile = ("" == ui->fileSelectEdit->text()) ? QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation) : ui->fileSelectEdit->text(); + QString filter = "Supported Files (*.odt *.doc *.odp *.ppt *.ods *.xls)"; + QString filename = QFileDialog::getOpenFileName(this, QString("Select File"), currentFile, filter, &filter); + if("" != filename) + ui->fileSelectEdit->setText(filename); +} + +void slideshareUploadDialog::uploadButtonClickedSlot() +{ + if(ui->fileSelectEdit->text() == "" || ui->titleEdit->text() == "") { + QMaemo5InformationBox::information(this, "Please enter atleast filename and title"); + return; + } else { + ui->fileSelectButton->setEnabled(false); + ui->titleEdit->setEnabled(false); + ui->descriptionBox->setEnabled(false); + ui->tagsEdit->setEnabled(false); + ui->uploadButton->setEnabled(false); + service->setSourceFile(&ui->fileSelectEdit->text()); + service->setSlideTitle(&ui->titleEdit->text()); + service->setDescription(&ui->descriptionBox->text()); + service->setTags(&ui->tagsEdit->text()); + service->setFormat(new QString(QFileInfo(ui->fileSelectEdit->text()).suffix())); + service->upload(); + } +} + +void slideshareUploadDialog::uploadDoneSlot() +{ + QMaemo5InformationBox::information(this, "

Upload done

It'll take some time for the file to appear in the list. Please be patient."); + ui->doneButton->setEnabled(true); +} diff --git a/slideshareuploaddialog.h b/slideshareuploaddialog.h new file mode 100644 index 0000000..393ca19 --- /dev/null +++ b/slideshareuploaddialog.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010 Kaushal M + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SLIDESHAREUPLOADDIALOG_H +#define SLIDESHAREUPLOADDIALOG_H + +#include + +class SlideShare; +namespace Ui +{ +class uploadDialog; +} + +class slideshareUploadDialog : public QDialog +{ + Q_OBJECT +public: + slideshareUploadDialog(SlideShare *service, QWidget *parent = 0); + ~slideshareUploadDialog(); + void setOpenDoc(const QString &); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::uploadDialog *ui; + SlideShare *service; + +private slots: + void uploadProgressSlot(qint64 bytesSent, qint64 bytesTotal); + void showFileDialog(); + void uploadButtonClickedSlot(); + void uploadDoneSlot(); +}; + +#endif // UPLOADDIALOG_H diff --git a/src.pro b/src.pro new file mode 120000 index 0000000..2aaf2f8 --- /dev/null +++ b/src.pro @@ -0,0 +1 @@ +onlineServicesPlugin.pro \ No newline at end of file diff --git a/uploaddialog.ui b/uploaddialog.ui new file mode 100644 index 0000000..5466f59 --- /dev/null +++ b/uploaddialog.ui @@ -0,0 +1,156 @@ + + + uploadDialog + + + true + + + + 0 + 0 + 514 + 147 + + + + + 0 + 0 + + + + Upload + + + false + + + + + + + + Select a file + + + + + + + + + false + + + true + + + + + + + Select + + + + + + + + + Title + + + + + + + + + + Description + + + + + + + + + + Tags + + + + + + + Qt::DefaultContextMenu + + + true + + + + + + + + + + + true + + + Upload + + + + + + + 0 + + + false + + + false + + + + + + + false + + + Done + + + + + + + + + + + doneButton + clicked() + uploadDialog + accept() + + + 607 + 179 + + + 591 + 107 + + + + + -- 1.7.9.5