diff --git a/core/utilities/assistants/webservices/CMakeLists.txt b/core/utilities/assistants/webservices/CMakeLists.txt index d76657466e..389bdd482f 100644 --- a/core/utilities/assistants/webservices/CMakeLists.txt +++ b/core/utilities/assistants/webservices/CMakeLists.txt @@ -1,333 +1,332 @@ # # Copyright (c) 2010-2018 by Gilles Caulier, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. if (POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif (POLICY CMP0063) include_directories($ $ $ $ $ $ $ $ $ ) if(ENABLE_QWEBENGINE) include_directories($) else() include_directories($) endif() if(KF5KIO_FOUND) include_directories($ $ ) endif() if(ENABLE_QWEBENGINE) include_directories($) else() include_directories($) endif() # OAuth2 library --------------------------------------------------- # The o2 library does not adhere to the flags we use remove_definitions( -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_URL_CAST_FROM_STRING -DQT_NO_CAST_FROM_BYTEARRAY) # It also does not export symbols, so export all by default unset(CMAKE_CXX_VISIBILITY_PRESET) if(WIN32) add_definitions(-DO2_DLL_EXPORT) endif() # Copied from o2/src/CMakeLists.txt set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(libwso2_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2reply.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2replyserver.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2requestor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2simplecrypt.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o0settingsstore.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o0baseauth.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o0abstractstore.h ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o0globals.h # Enable when needed ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1requestor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1timedreply.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1smugmug.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1twitter.h ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/oxtwitter.cpp #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1dropbox.h #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o1flickr.h #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2gft.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2facebook.cpp #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2skydrive.cpp #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2hubic.cpp #${CMAKE_CURRENT_SOURCE_DIR}/common/o2/src/o2uber.cpp ) if(ENABLE_QWEBENGINE) set(libwso2_SRCS ${libwso2_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/common/webwidget_qwebengine.cpp ) else() set(libwso2_SRCS ${libwso2_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/common/webwidget.cpp ) endif() # Helper classes ------------------------------------------------------------------ set(libwebservices_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/common/wscomboboxdelegate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wscomboboxintermediate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wstoolutils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wssettingswidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wsnewalbumdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wsselectuserdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wstooldialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wslogindialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wsstarter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/manager/wssettings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/manager/wsauthentication.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/manager/wstalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wsalbumspage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wsfinalpage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wsimagespage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wsintropage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wssettingspage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wsauthenticationpage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/common/wizard/wswizard.cpp ) # Flickr tool ---------------------------------------------------------------- set(libwsflickr_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrlist.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/flickr/flickrwindow.cpp ) # Imgur tool ---------------------------------------------------------------- set(libwsimgur_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/imgur/imgurtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imgur/imgurimageslist.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imgur/imgurwindow.cpp ) # DropBox tool -------------------------------------------------------------- set(libwsdropbox_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/dropbox/dbnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dropbox/dbmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dropbox/dbtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dropbox/dbwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dropbox/dbwindow.cpp ) # OneDrive tool -------------------------------------------------------------- set(libwsonedrive_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/onedrive/odnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/onedrive/odmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/onedrive/odtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/onedrive/odwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/onedrive/odwindow.cpp ) # Pinterest tool -------------------------------------------------------------- set(libwspinterest_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/pinterest/pnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pinterest/pmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pinterest/ptalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pinterest/pwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pinterest/pwindow.cpp ) # Box tool -------------------------------------------------------------- set(libwsbox_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/box/boxnewalbumdlg.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/box/boxmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/box/boxtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/box/boxwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/box/boxwindow.cpp ) # Twitter tool -------------------------------------------------------------- set(libwstwitter_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/twitter/twitternewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/twitter/twittermpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/twitter/twittertalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/twitter/twitterwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/twitter/twitterwindow.cpp ) # SmugMug tool ------------------------------------------------------------- set(libwssmugmug_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/smugmug/smugnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/smugmug/smugmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/smugmug/smugtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/smugmug/smugwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/smugmug/smugwindow.cpp ) # ImageShack tool ------------------------------------------------------------- set(libwsimageshack_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshacksession.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshacknewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshackmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshacktalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshackwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imageshack/imageshackwindow.cpp ) # FaceBook tool ------------------------------------------------------------- set(libwsfacebook_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/facebook/fbnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/facebook/fbmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/facebook/fbtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/facebook/fbwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/facebook/fbwindow.cpp ) # Rajce tool ---------------------------------------------------------------- set(libwsrajce_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcenewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcempform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcecommand.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcetalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcesession.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcealbum.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcewidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rajce/rajcewindow.cpp ) # Google tool ---------------------------------------------------------------- set(libwsgoogle_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/google/gdrive/gdmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gdrive/gdtalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gphoto/gpmpform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gphoto/gptalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gstalkerbase.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gsreplacedlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gsnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gswindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/google/gswidget.cpp ) # YandexFotki tool ---------------------------------------------------------------- set(libwsyandexfotki_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfalbum.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfauth.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfrsa.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yftalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfphoto.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfnewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfwindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/yandexfotki/yfwidget.cpp ) # Piwigo tool ------------------------------------------------------------- set(libwspiwigo_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/piwigo/piwigologindlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/piwigo/piwigotalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/piwigo/piwigosession.cpp ${CMAKE_CURRENT_SOURCE_DIR}/piwigo/piwigowindow.cpp ) # MediaWiki tool ------------------------------------------------------------ set(libwsmediawiki_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/mediawikiwindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/mediawikiwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/mediawikitalker.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_image.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_imageinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_iface.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_login.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_logout.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_queryimageinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_queryimages.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_querysiteinfogeneral.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_generalinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_querysiteinfousergroups.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_queryrevision.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_queryinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_edit.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_job.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_usergroup.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_revision.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_page.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_parse.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_protection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mediawiki/iface/mediawiki_upload.cpp ) # VKontakte tool ------------------------------------------------------------ if(KF5Vkontakte_FOUND) set(libwsvkontakte_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/vkontakte/vkwindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vkontakte/vknewalbumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vkontakte/vkalbumchooser.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vkontakte/vkauthwidget.cpp ) endif() # FileTransfer tool --------------------------------------------------------- if(KF5KIO_FOUND) set(libwsfiletransfer_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/filetransfer/ftexportwindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filetransfer/ftexportwidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filetransfer/ftimportwindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filetransfer/ftimportwidget.cpp ) endif() # ------------------------------------------------------------------------------ add_library(webservices_src OBJECT ${libwebservices_SRCS} ${libwso2_SRCS} ${libwsflickr_SRCS} ${libwsimgur_SRCS} ${libwsdropbox_SRCS} ${libwsonedrive_SRCS} ${libwspinterest_SRCS} ${libwsbox_SRCS} ${libwssmugmug_SRCS} ${libwsimageshack_SRCS} ${libwsfacebook_SRCS} ${libwsrajce_SRCS} ${libwsgoogle_SRCS} ${libwsyandexfotki_SRCS} ${libwspiwigo_SRCS} ${libwsmediawiki_SRCS} ${libwsvkontakte_SRCS} ${libwsfiletransfer_SRCS} # Not yet finalized #${libwstwitter_SRCS} ) diff --git a/core/utilities/assistants/webservices/box/boxmpform.cpp b/core/utilities/assistants/webservices/box/boxmpform.cpp deleted file mode 100644 index a08aa19a6e..0000000000 --- a/core/utilities/assistants/webservices/box/boxmpform.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* ============================================================ - * - * This file is a part of digiKam project - * http://www.digikam.org - * - * Date : 2018-05-20 - * Description : a tool to export images to Box web service - * - * Copyright (C) 2018 by Tarek Talaat - * - * 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, 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. - * - * ============================================================ */ - -#include "boxmpform.h" - -// Qt includes - -#include - -// Local includes - -#include "digikam_debug.h" - -namespace Digikam -{ - -BOXMPForm::BOXMPForm() -{ -} - -BOXMPForm::~BOXMPForm() -{ -} - -bool BOXMPForm::addFile(const QString& imgPath) -{ - QFile file(imgPath); - - if (!file.open(QIODevice::ReadOnly)) - { - return false; - } - - m_buffer = file.readAll(); - - file.close(); - - return true; -} - -QByteArray BOXMPForm::formData() const -{ - return m_buffer; -} - -} // namespace Digikam diff --git a/core/utilities/assistants/webservices/box/boxmpform.h b/core/utilities/assistants/webservices/box/boxmpform.h deleted file mode 100644 index 36eb714f7f..0000000000 --- a/core/utilities/assistants/webservices/box/boxmpform.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ============================================================ - * - * This file is a part of digiKam project - * http://www.digikam.org - * - * Date : 2018-05-20 - * Description : a tool to export images to Box web service - * - * Copyright (C) 2018 by Tarek Talaat - * - * 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, 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. - * - * ============================================================ */ - -#ifndef DIGIKAM_BOX_MPFORM_H -#define DIGIKAM_BOX_MPFORM_H - -// Qt includes - -#include - -// Local includes - -#include "wstoolutils.h" - -namespace Digikam -{ - -class BOXMPForm -{ - -public: - - explicit BOXMPForm(); - ~BOXMPForm(); - - bool addFile(const QString& imgPath); - QByteArray formData() const; - -private: - - QByteArray m_buffer; -}; - -} // namespace Digikam - -#endif // DIGIKAM_BOX_MPFORM_H diff --git a/core/utilities/assistants/webservices/box/boxtalker.cpp b/core/utilities/assistants/webservices/box/boxtalker.cpp index 1b0f2717f0..ff4d2d942c 100644 --- a/core/utilities/assistants/webservices/box/boxtalker.cpp +++ b/core/utilities/assistants/webservices/box/boxtalker.cpp @@ -1,508 +1,504 @@ /* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2018-05-20 * Description : a tool to export images to Box web service * * Copyright (C) 2018 by Tarek Talaat * * 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, 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. * * ============================================================ */ #include "boxtalker.h" // Qt includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include -#include #include // Local includes #include "digikam_debug.h" #include "digikam_version.h" #include "wstoolutils.h" #include "boxwindow.h" #include "boxitem.h" -#include "boxmpform.h" #include "previewloadthread.h" #include "o0settingsstore.h" namespace Digikam { class Q_DECL_HIDDEN BOXTalker::Private { public: enum State { BOX_USERNAME = 0, BOX_LISTFOLDERS, BOX_CREATEFOLDER, BOX_ADDPHOTO }; public: explicit Private() { clientId = QLatin1String("w2gevz5rargld3aun22fwmssnmswptrn"); clientSecret = QLatin1String("iIL49xl04DJH7on8NYLrcYTQEgNKVmbs"); authUrl = QLatin1String("https://account.box.com/api/oauth2/authorize"); tokenUrl = QLatin1String("https://api.box.com/oauth2/token"); redirectUrl = QLatin1String("https://app.box.com"); state = BOX_USERNAME; + + parent = 0; netMngr = 0; reply = 0; - accessToken = QString(); + settings = 0; + o2 = 0; } public: QString clientId; QString clientSecret; QString authUrl; QString tokenUrl; QString redirectUrl; - QString accessToken; - QString refreshToken; + QWidget* parent; QNetworkAccessManager* netMngr; QNetworkReply* reply; + QSettings* settings; + O2* o2; + State state; + QByteArray buffer; DMetadata meta; - QMap urlParametersMap; - QSettings* settings; - O2* o2; + QMap urlParametersMap; QList > foldersList; }; BOXTalker::BOXTalker(QWidget* const parent) : d(new Private) { d->parent = parent; d->netMngr = new QNetworkAccessManager(this); connect(this, SIGNAL(boxLinkingFailed()), this, SLOT(slotLinkingFailed())); connect(this, SIGNAL(boxLinkingSucceeded()), this, SLOT(slotLinkingSucceeded())); connect(d->netMngr, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotFinished(QNetworkReply*))); d->o2 = new O2(this); d->o2->setClientId(d->clientId); d->o2->setClientSecret(d->clientSecret); d->o2->setRefreshTokenUrl(d->tokenUrl); d->o2->setRequestUrl(d->authUrl); d->o2->setTokenUrl(d->tokenUrl); d->o2->setLocalPort(8000); d->settings = WSToolUtils::getOauthSettings(this); O0SettingsStore* const store = new O0SettingsStore(d->settings, QLatin1String(O2_ENCRYPTION_KEY), this); store->setGroupKey(QLatin1String("Box")); d->o2->setStore(store); connect(d->o2, SIGNAL(linkingFailed()), this, SLOT(slotLinkingFailed())); connect(d->o2, SIGNAL(linkingSucceeded()), this, SLOT(slotLinkingSucceeded())); connect(d->o2, SIGNAL(openBrowser(QUrl)), this, SLOT(slotOpenBrowser(QUrl))); } BOXTalker::~BOXTalker() { if (d->reply) { d->reply->abort(); } WSToolUtils::removeTemporaryDir("box"); delete d; } void BOXTalker::link() { emit signalBusy(true); d->o2->link(); } void BOXTalker::unLink() { d->o2->unlink(); d->settings->beginGroup(QLatin1String("Box")); d->settings->remove(QString()); d->settings->endGroup(); } void BOXTalker::slotLinkingFailed() { qCDebug(DIGIKAM_WEBSERVICES_LOG) << "LINK to Box fail"; emit signalBusy(false); } void BOXTalker::slotLinkingSucceeded() { if (!d->o2->linked()) { qCDebug(DIGIKAM_WEBSERVICES_LOG) << "UNLINK to Box ok"; emit signalBusy(false); return; } qCDebug(DIGIKAM_WEBSERVICES_LOG) << "LINK to Box ok"; emit signalLinkingSucceeded(); } bool BOXTalker::authenticated() { return d->o2->linked(); } void BOXTalker::cancel() { if (d->reply) { d->reply->abort(); d->reply = 0; } emit signalBusy(false); } void BOXTalker::slotOpenBrowser(const QUrl& url) { qCDebug(DIGIKAM_WEBSERVICES_LOG) << "Open Browser..."; QDesktopServices::openUrl(url); } void BOXTalker::createFolder(QString& path) { QString name = path.section(QLatin1Char('/'), -1); QString folderPath = path.section(QLatin1Char('/'),-2,-2); QString id; for (int i = 0 ; i < d->foldersList.size() ; ++i) { if (d->foldersList.value(i).second == folderPath) { id = d->foldersList.value(i).first; } } QUrl url(QLatin1String("https://api.box.com/2.0/folders")); QNetworkRequest netRequest(url); netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/json")); netRequest.setRawHeader("Authorization", QString::fromLatin1("Bearer %1").arg(d->o2->token()).toUtf8()); QByteArray postData = QString::fromUtf8("{\"name\": \"%1\",\"parent\": {\"id\": \"%2\"}}").arg(name).arg(id).toUtf8(); d->reply = d->netMngr->post(netRequest, postData); d->state = Private::BOX_CREATEFOLDER; d->buffer.resize(0); emit signalBusy(true); } void BOXTalker::getUserName() { QUrl url(QLatin1String("https://api.box.com/2.0/users/me")); QNetworkRequest netRequest(url); netRequest.setRawHeader("Authorization", QString::fromLatin1("Bearer %1").arg(d->o2->token()).toUtf8()); netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/json")); d->reply = d->netMngr->get(netRequest); d->state = Private::BOX_USERNAME; d->buffer.resize(0); emit signalBusy(true); } void BOXTalker::listFolders(const QString& /*path*/) { QUrl url(QLatin1String("https://api.box.com/2.0/folders/0/items"));; QNetworkRequest netRequest(url); netRequest.setRawHeader("Authorization", QString::fromLatin1("Bearer %1").arg(d->o2->token()).toUtf8()); netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/json")); d->reply = d->netMngr->get(netRequest); d->state = Private::BOX_LISTFOLDERS; d->buffer.resize(0); emit signalBusy(true); } bool BOXTalker::addPhoto(const QString& imgPath, const QString& uploadFolder, bool rescale, int maxDim, int imageQuality) { if (d->reply) { d->reply->abort(); d->reply = 0; } emit signalBusy(true); - BOXMPForm form; QMimeDatabase mimeDB; QString path = imgPath; QString mimeType = mimeDB.mimeTypeForFile(path).name(); if (mimeType.startsWith(QLatin1String("image/"))) { QImage image = PreviewLoadThread::loadHighQualitySynchronously(imgPath).copyQImage(); if (image.isNull()) { return false; } path = WSToolUtils::makeTemporaryDir("box").filePath(QFileInfo(imgPath) .baseName().trimmed() + QLatin1String(".jpg")); if (rescale && (image.width() > maxDim || image.height() > maxDim)) { image = image.scaled(maxDim, maxDim, Qt::KeepAspectRatio, Qt::SmoothTransformation); } image.save(path, "JPEG", imageQuality); if (d->meta.load(imgPath)) { d->meta.setImageDimensions(image.size()); d->meta.setImageOrientation(DMetadata::ORIENTATION_NORMAL); d->meta.setImageProgramId(QLatin1String("digiKam"), digiKamVersion()); d->meta.setMetadataWritingMode((int)DMetadata::WRITETOIMAGEONLY); d->meta.save(path); } } QString id; for (int i = 0 ; i < d->foldersList.size() ; ++i) { if (d->foldersList.value(i).second == uploadFolder) { id = d->foldersList.value(i).first; } } - if (!form.addFile(path)) - { - emit signalBusy(false); - return false; - } - - QHttpMultiPart* const multipart = new QHttpMultiPart (QHttpMultiPart::FormDataType); + QHttpMultiPart* const multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart attributes; QString attributesHeader = QLatin1String("form-data; name=\"attributes\""); - attributes.setHeader(QNetworkRequest::ContentDispositionHeader,attributesHeader); + attributes.setHeader(QNetworkRequest::ContentDispositionHeader, attributesHeader); QString postData = QLatin1String("{\"name\":\"") + QFileInfo(imgPath).fileName() + QLatin1Char('"') + QLatin1String(", \"parent\":{\"id\":\"") + id + QLatin1String("\"}}"); attributes.setBody(postData.toUtf8()); - multipart->append(attributes); + multiPart->append(attributes); - //QFile* const file = new QFile(imgPath); - //file->open(QIODevice::ReadOnly); + QFile* const file = new QFile(path); + file->open(QIODevice::ReadOnly); - QHttpPart imagepart; - QString imagepartHeader = QLatin1String("form-data; name=\"file\"; filename=\"") + + QHttpPart imagePart; + QString imagePartHeader = QLatin1String("form-data; name=\"file\"; filename=\"") + QFileInfo(imgPath).fileName() + QLatin1Char('"'); - imagepart.setHeader(QNetworkRequest::ContentDispositionHeader, imagepartHeader); - imagepart.setHeader(QNetworkRequest::ContentTypeHeader, mimeType); + imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, imagePartHeader); + imagePart.setHeader(QNetworkRequest::ContentTypeHeader, mimeType); - imagepart.setBody(form.formData()); - //imagepart.setBodyDevice(file); - multipart->append(imagepart); + imagePart.setBodyDevice(file); + multiPart->append(imagePart); QUrl url(QString::fromLatin1("https://upload.box.com/api/2.0/files/content?access_token=%1").arg(d->o2->token())); QNetworkRequest netRequest(url); - QString content = QLatin1String("multipart/form-data;boundary=") + multipart->boundary(); + QString content = QLatin1String("multipart/form-data;boundary=") + multiPart->boundary(); netRequest.setHeader(QNetworkRequest::ContentTypeHeader, content); - d->reply = d->netMngr->post(netRequest, multipart); + d->reply = d->netMngr->post(netRequest, multiPart); + // delete the multiPart and file with the reply + multiPart->setParent(d->reply); d->state = Private::BOX_ADDPHOTO; d->buffer.resize(0); emit signalBusy(true); return true; } void BOXTalker::slotFinished(QNetworkReply* reply) { if (reply != d->reply) { return; } d->reply = 0; if (reply->error() != QNetworkReply::NoError) { if (d->state != Private::BOX_CREATEFOLDER) { emit signalBusy(false); QMessageBox::critical(QApplication::activeWindow(), i18n("Error"), reply->errorString()); reply->deleteLater(); return; } } d->buffer.append(reply->readAll()); switch (d->state) { case Private::BOX_LISTFOLDERS: qCDebug(DIGIKAM_WEBSERVICES_LOG) << "In BOX_LISTFOLDERS"; parseResponseListFolders(d->buffer); break; case Private::BOX_CREATEFOLDER: qCDebug(DIGIKAM_WEBSERVICES_LOG) << "In BOX_CREATEFOLDER"; parseResponseCreateFolder(d->buffer); break; case Private::BOX_ADDPHOTO: qCDebug(DIGIKAM_WEBSERVICES_LOG) << "In BOX_ADDPHOTO"; parseResponseAddPhoto(d->buffer); break; case Private::BOX_USERNAME: qCDebug(DIGIKAM_WEBSERVICES_LOG) << "In BOX_USERNAME"; parseResponseUserName(d->buffer); break; default: break; } reply->deleteLater(); } void BOXTalker::parseResponseAddPhoto(const QByteArray& data) { QJsonDocument doc = QJsonDocument::fromJson(data); QJsonObject jsonObject = doc.object(); bool success = jsonObject.contains(QLatin1String("total_count")); emit signalBusy(false); if (!success) { emit signalAddPhotoFailed(i18n("Failed to upload photo")); } else { emit signalAddPhotoSucceeded(); } } void BOXTalker::parseResponseUserName(const QByteArray& data) { QJsonDocument doc = QJsonDocument::fromJson(data); QString name = doc.object()[QLatin1String("name")].toString(); emit signalBusy(false); emit signalSetUserName(name); } void BOXTalker::parseResponseListFolders(const QByteArray& data) { QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); if (err.error != QJsonParseError::NoError) { emit signalBusy(false); emit signalListAlbumsFailed(i18n("Failed to list folders")); return; } QJsonObject jsonObject = doc.object(); QJsonArray jsonArray = jsonObject[QLatin1String("entries")].toArray(); d->foldersList.clear(); d->foldersList.append(qMakePair(QLatin1String("0"), QLatin1String("root"))); foreach (const QJsonValue& value, jsonArray) { QString path; QString folderName; QString type; QString id; QJsonObject obj = value.toObject(); type = obj[QLatin1String("type")].toString(); if (type == "folder") { folderName = obj[QLatin1String("name")].toString(); id = obj[QLatin1String("id")].toString(); d->foldersList.append(qMakePair(id, folderName)); } } emit signalBusy(false); emit signalListAlbumsDone(d->foldersList); } void BOXTalker::parseResponseCreateFolder(const QByteArray& data) { QJsonDocument doc = QJsonDocument::fromJson(data); QJsonObject jsonObject = doc.object(); bool fail = jsonObject.contains(QLatin1String("error")); emit signalBusy(false); if (fail) { QJsonParseError err; QJsonDocument doc = QJsonDocument::fromJson(data, &err); emit signalCreateFolderFailed(jsonObject[QLatin1String("error_summary")].toString()); } else { emit signalCreateFolderSucceeded(); } } } // namespace Digikam