From a0fbc2b8c36adbec9d200bd59d3846422b09625f Mon Sep 17 00:00:00 2001 From: Marko Mattila Date: Wed, 10 Apr 2013 08:40:51 +0300 Subject: [PATCH] [nemo-transfer-engine] Initial commit. Files added to the git repo. --- README | 19 + dbus/org.nemo.transferengine.service | 4 + dbus/org.nemo.transferengine.xml | 122 ++ doc/compat.qdocconf | 31 + doc/config/compat.qdocconf | 31 + doc/config/images/.directory | 3 + doc/config/images/breadcrumb.png | Bin 0 -> 318 bytes doc/config/images/bullet_dn.png | Bin 0 -> 282 bytes doc/config/images/bullet_gt.png | Bin 0 -> 240 bytes doc/config/images/bullet_sq.png | Bin 0 -> 149 bytes doc/config/images/bullet_up.png | Bin 0 -> 262 bytes doc/config/macros.qdocconf | 37 + doc/config/qt-cpp-ignore.qdocconf | 99 ++ doc/config/qt-defines.qdocconf | 17 + doc/config/qt-html-default-styles.qdocconf | 27 + doc/config/qt-html-templates.qdocconf | 43 + doc/config/style/offline.css | 675 ++++++++++ doc/config/transfer-engine-ditaxml.qdocconf | 13 + doc/config/transfer-engine-project.qdocconf | 62 + doc/config/transfer-engine.qdocconf | 2 + doc/doc.pri | 15 + doc/html/callbackinterface-members.html | 18 + doc/html/callbackinterface.html | 63 + doc/html/dbmanager-members.html | 30 + doc/html/dbmanager.html | 150 +++ doc/html/imageoperation-members.html | 18 + doc/html/imageoperation.html | 66 + doc/html/index.html | 42 + doc/html/nemo-transferengine.index | 277 ++++ doc/html/nemo-transferengine.pageindex | 609 +++++++++ doc/html/transfer-engine.tags | 598 +++++++++ doc/html/transferdbrecord-members.html | 42 + doc/html/transferdbrecord.html | 88 ++ doc/html/transferengine-members.html | 39 + doc/html/transferengine.html | 195 +++ doc/html/transferengine.qch | Bin 0 -> 53248 bytes doc/html/transferengine.qhp | 144 ++ doc/html/transferengineclient-members.html | 23 + doc/html/transferengineclient.html | 155 +++ doc/html/transfermethodinfo-members.html | 28 + doc/html/transfermethodinfo.html | 95 ++ doc/html/transferplugininterface-members.html | 19 + doc/html/transferplugininterface.html | 66 + doc/src/index.qdoc | 90 ++ doc/src/mediaplugininterface.qdoc | 76 ++ doc/src/transfer-engine-all.qdoc | 54 + doc/src/transferplugininfo.qdoc | 82 ++ doc/transfer-engine-project.qdocconf | 64 + lib/imageoperation.cpp | 202 +++ lib/imageoperation.h | 41 + lib/lib.pro | 53 + lib/mediaitem.cpp | 127 ++ lib/mediaitem.h | 89 ++ lib/mediatransferinterface.cpp | 291 ++++ lib/mediatransferinterface.h | 86 ++ lib/metatypedeclarations.h | 40 + lib/nemotransferengine-plugin.prf | 26 + lib/nemotransferengine.pc | 11 + lib/transferdbrecord.cpp | 253 ++++ lib/transferdbrecord.h | 92 ++ lib/transferengineclient.cpp | 341 +++++ lib/transferengineclient.h | 89 ++ lib/transfermethodinfo.cpp | 182 +++ lib/transfermethodinfo.h | 69 + lib/transferplugininfo.h | 45 + lib/transferplugininterface.h | 48 + lib/transfertypes.h | 50 + license.lgpl | 514 ++++++++ nemo-transfer-engine.conf | 5 + rpm/transfer-engine.spec | 120 ++ src/dbmanager.cpp | 778 +++++++++++ src/dbmanager.h | 80 ++ src/main.cpp | 51 + src/src.pro | 68 + src/transferengine.cpp | 1170 +++++++++++++++++ src/transferengine.h | 112 ++ src/transferengine_p.h | 123 ++ tests/main.cpp | 41 + tests/testimage.jpg | Bin 0 -> 1202040 bytes tests/tests.pro | 37 + tests/ut_imageoperation.cpp | 190 +++ tests/ut_imageoperation.h | 45 + tests/ut_mediatransferinterface.cpp | 178 +++ tests/ut_mediatransferinterface.h | 69 + transfer-engine.pro | 17 + translations/translations.pro | 30 + 86 files changed, 10094 insertions(+) create mode 100644 README create mode 100644 dbus/org.nemo.transferengine.service create mode 100644 dbus/org.nemo.transferengine.xml create mode 100644 doc/compat.qdocconf create mode 100644 doc/config/compat.qdocconf create mode 100644 doc/config/images/.directory create mode 100644 doc/config/images/breadcrumb.png create mode 100644 doc/config/images/bullet_dn.png create mode 100644 doc/config/images/bullet_gt.png create mode 100644 doc/config/images/bullet_sq.png create mode 100644 doc/config/images/bullet_up.png create mode 100644 doc/config/macros.qdocconf create mode 100644 doc/config/qt-cpp-ignore.qdocconf create mode 100644 doc/config/qt-defines.qdocconf create mode 100644 doc/config/qt-html-default-styles.qdocconf create mode 100644 doc/config/qt-html-templates.qdocconf create mode 100644 doc/config/style/offline.css create mode 100644 doc/config/transfer-engine-ditaxml.qdocconf create mode 100644 doc/config/transfer-engine-project.qdocconf create mode 100644 doc/config/transfer-engine.qdocconf create mode 100644 doc/doc.pri create mode 100644 doc/html/callbackinterface-members.html create mode 100644 doc/html/callbackinterface.html create mode 100644 doc/html/dbmanager-members.html create mode 100644 doc/html/dbmanager.html create mode 100644 doc/html/imageoperation-members.html create mode 100644 doc/html/imageoperation.html create mode 100644 doc/html/index.html create mode 100644 doc/html/nemo-transferengine.index create mode 100644 doc/html/nemo-transferengine.pageindex create mode 100644 doc/html/transfer-engine.tags create mode 100644 doc/html/transferdbrecord-members.html create mode 100644 doc/html/transferdbrecord.html create mode 100644 doc/html/transferengine-members.html create mode 100644 doc/html/transferengine.html create mode 100644 doc/html/transferengine.qch create mode 100644 doc/html/transferengine.qhp create mode 100644 doc/html/transferengineclient-members.html create mode 100644 doc/html/transferengineclient.html create mode 100644 doc/html/transfermethodinfo-members.html create mode 100644 doc/html/transfermethodinfo.html create mode 100644 doc/html/transferplugininterface-members.html create mode 100644 doc/html/transferplugininterface.html create mode 100644 doc/src/index.qdoc create mode 100644 doc/src/mediaplugininterface.qdoc create mode 100644 doc/src/transfer-engine-all.qdoc create mode 100644 doc/src/transferplugininfo.qdoc create mode 100644 doc/transfer-engine-project.qdocconf create mode 100644 lib/imageoperation.cpp create mode 100644 lib/imageoperation.h create mode 100644 lib/lib.pro create mode 100644 lib/mediaitem.cpp create mode 100644 lib/mediaitem.h create mode 100644 lib/mediatransferinterface.cpp create mode 100644 lib/mediatransferinterface.h create mode 100644 lib/metatypedeclarations.h create mode 100644 lib/nemotransferengine-plugin.prf create mode 100644 lib/nemotransferengine.pc create mode 100644 lib/transferdbrecord.cpp create mode 100644 lib/transferdbrecord.h create mode 100644 lib/transferengineclient.cpp create mode 100644 lib/transferengineclient.h create mode 100644 lib/transfermethodinfo.cpp create mode 100644 lib/transfermethodinfo.h create mode 100644 lib/transferplugininfo.h create mode 100644 lib/transferplugininterface.h create mode 100644 lib/transfertypes.h create mode 100644 license.lgpl create mode 100644 nemo-transfer-engine.conf create mode 100644 rpm/transfer-engine.spec create mode 100644 src/dbmanager.cpp create mode 100644 src/dbmanager.h create mode 100644 src/main.cpp create mode 100644 src/src.pro create mode 100644 src/transferengine.cpp create mode 100644 src/transferengine.h create mode 100644 src/transferengine_p.h create mode 100644 tests/main.cpp create mode 100644 tests/testimage.jpg create mode 100644 tests/tests.pro create mode 100644 tests/ut_imageoperation.cpp create mode 100644 tests/ut_imageoperation.h create mode 100644 tests/ut_mediatransferinterface.cpp create mode 100644 tests/ut_mediatransferinterface.h create mode 100644 transfer-engine.pro create mode 100644 translations/translations.pro diff --git a/README b/README new file mode 100644 index 0000000..75574cb --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +Nemo Transfer Engine + +Simple engine for keeping track of transfers (sync, download, upload) and providing plugin mechanism for +share plugins. + +Transfer engine provides D-Bus API for managing the database and querying transfer information. + +Building: + +qmake +make + +Generating Docs: +make sure qdoc3 is installed and run: + +make docs + + + diff --git a/dbus/org.nemo.transferengine.service b/dbus/org.nemo.transferengine.service new file mode 100644 index 0000000..40c4d14 --- /dev/null +++ b/dbus/org.nemo.transferengine.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Interface=/org/nemo/transferengine +Name=org.nemo.transferengine +Exec=/usr/bin/nemo-transfer-engine diff --git a/dbus/org.nemo.transferengine.xml b/dbus/org.nemo.transferengine.xml new file mode 100644 index 0000000..19ecc18 --- /dev/null +++ b/dbus/org.nemo.transferengine.xml @@ -0,0 +1,122 @@ + + + + + + # Share API + + + + + + + + + + + + + + + + + + + # create Sync Entry + + + + + + + + + + + # create Download entry + + + + + + + + + + + + + + # API for updating either download or sync + + + + + + # Mark specific upload or a sync as started. + + + + + # Restart upload or a sync + + + + + # Mark a specific upload or a sync transfer as finished + # if success == false, then the reason for failure should + # be set to human readable message + + + + + + + # Get a list of transfers + + + + + + # Get a list of transfer methods such as FB, Twitter, BT, NFC, etc + + + + + + # clear all unfinished transfers + + + # cancel a specific transfer + + + + + # enable or disable notifications + + + + + # Query if notifications are enabled + + + + + # Signals for indicating changes in transfers + + + + + + + + + + + + + + + + diff --git a/doc/compat.qdocconf b/doc/compat.qdocconf new file mode 100644 index 0000000..d19072f --- /dev/null +++ b/doc/compat.qdocconf @@ -0,0 +1,31 @@ +#alias.i = e +alias.include = input + +macro.0 = "\\\\0" +macro.b = "\\\\b" +macro.n = "\\\\n" +macro.r = "\\\\r" +#macro.i = "\\o" +macro.i11 = "\\o{1,1}" +macro.i12 = "\\o{1,2}" +macro.i13 = "\\o{1,3}" +macro.i14 = "\\o{1,4}" +macro.i15 = "\\o{1,5}" +macro.i16 = "\\o{1,6}" +macro.i17 = "\\o{1,7}" +macro.i18 = "\\o{1,8}" +macro.i19 = "\\o{1,9}" +macro.i21 = "\\o{2,1}" +macro.i31 = "\\o{3,1}" +macro.i41 = "\\o{4,1}" +macro.i51 = "\\o{5,1}" +macro.i61 = "\\o{6,1}" +macro.i71 = "\\o{7,1}" +macro.i81 = "\\o{8,1}" +macro.i91 = "\\o{9,1}" +macro.img = "\\image" +macro.endquote = "\\endquotation" +macro.relatesto = "\\relates" + +spurious = "Missing comma in .*" \ + "Missing pattern .*" diff --git a/doc/config/compat.qdocconf b/doc/config/compat.qdocconf new file mode 100644 index 0000000..d19072f --- /dev/null +++ b/doc/config/compat.qdocconf @@ -0,0 +1,31 @@ +#alias.i = e +alias.include = input + +macro.0 = "\\\\0" +macro.b = "\\\\b" +macro.n = "\\\\n" +macro.r = "\\\\r" +#macro.i = "\\o" +macro.i11 = "\\o{1,1}" +macro.i12 = "\\o{1,2}" +macro.i13 = "\\o{1,3}" +macro.i14 = "\\o{1,4}" +macro.i15 = "\\o{1,5}" +macro.i16 = "\\o{1,6}" +macro.i17 = "\\o{1,7}" +macro.i18 = "\\o{1,8}" +macro.i19 = "\\o{1,9}" +macro.i21 = "\\o{2,1}" +macro.i31 = "\\o{3,1}" +macro.i41 = "\\o{4,1}" +macro.i51 = "\\o{5,1}" +macro.i61 = "\\o{6,1}" +macro.i71 = "\\o{7,1}" +macro.i81 = "\\o{8,1}" +macro.i91 = "\\o{9,1}" +macro.img = "\\image" +macro.endquote = "\\endquotation" +macro.relatesto = "\\relates" + +spurious = "Missing comma in .*" \ + "Missing pattern .*" diff --git a/doc/config/images/.directory b/doc/config/images/.directory new file mode 100644 index 0000000..3b070b5 --- /dev/null +++ b/doc/config/images/.directory @@ -0,0 +1,3 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2012,12,12,16,59,29 diff --git a/doc/config/images/breadcrumb.png b/doc/config/images/breadcrumb.png new file mode 100644 index 0000000000000000000000000000000000000000..128bcbd794bd9737e2c58f1ba7134319cba33ca0 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)L!3HEN&baUbDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#4i68z7KhWvvP(dreV#6kArhBk z`xX719T`}kzpb-rS)ldmLyPd0YY8XnnjEf#n%=DE3sbOgnykluVBrOpNpTAp-G%iI zJiF=;Bw?NGX6eeTf53I++h$v)4Gia0_VU-3vrY(RabR%1-_E)H!3HEvS)PI@#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPa4-dPX5X;V*c%aZMPZ!4!j_bAO z4Y`^a7~CE%-#Vk2J%EY*__c2bn0J&ge3Xz~;B3Ne#>(q=_rO+e6-5>$(}<2I_n(OE z`#M{0(gc?oRUwrHt3Ms!4CeQo;bYS4EBIR8#8s#GMV8$3t>*HkobKg0Hg(&Xkf)8ej4to^#C-R+ W=Yi?DzTbeZWbkzLb6Mw<&;$S=0b{}d literal 0 HcmV?d00001 diff --git a/doc/config/images/bullet_gt.png b/doc/config/images/bullet_gt.png new file mode 100644 index 0000000000000000000000000000000000000000..0d94209b287bcca07c615906fa918c909ab21afe GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1p!2~4zj|%JrQjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf9UdNbSw8Ej#g~CX1)eUBAsp9} zYpS&#-al`Cr|YClP#q5sk57|Y@yr{p`|i#E{rILD8yg!4>)qV2-+o^GuBh*SPi7sf z|Nqa(z@TR5)z4q=H*x1_U>zCJ6@9CO2b8`6RS)GlI4&bV_ k8|N~L8W<)pWN|Sv%w%Ou%(u_*2P$CjboFyt=akR{09c_E)H!2~3Cr4{XE)7O>#4i68zjO;Q4W*?wXo2QFo2*>r@ z6B~IC83?pK{NAUn)HHj^0*8>0l{Xk&dk%=@9JY`=pxerx(BR>C=;}jb-qe4uF8k}V zEvTDk=YOgH&RoU|-B;(-%nR7RV3X{U{aI&EPUm0<3CQx>YT2PbQEJI<2dS5C0kxe@ zyqoqHRx=$ayCL)b3WNT$qj&CotNIh`v*FsWzl@*GTLwSMGnNIqh{4m<&t;ucLK6Tw CC|^SW literal 0 HcmV?d00001 diff --git a/doc/config/macros.qdocconf b/doc/config/macros.qdocconf new file mode 100644 index 0000000..2262daa --- /dev/null +++ b/doc/config/macros.qdocconf @@ -0,0 +1,37 @@ +macro.aacute.HTML = "á" +macro.Aring.HTML = "Å" +macro.aring.HTML = "å" +macro.Auml.HTML = "Ä" +macro.author = "\\bold{Author:}" +macro.br.HTML = "
" +macro.BR.HTML = "
" +macro.copyright.HTML = "©" +macro.eacute.HTML = "é" +macro.gui = "\\bold" +macro.hr.HTML = "
" +macro.iacute.HTML = "í" +macro.key = "\\bold" +macro.menu = "\\bold" +macro.note = "\\bold{Note:}" +macro.oslash.HTML = "ø" +macro.ouml.HTML = "ö" +macro.QA = "\\e{Qt Assistant}" +macro.QD = "\\e{Qt Designer}" +macro.QL = "\\e{Qt Linguist}" +macro.QQV = "\\e{Qt QML Viewer}" +macro.param = "\\e" +macro.raisedaster.HTML = "*" +macro.rarrow.HTML = "→" +macro.reg.HTML = "®" +macro.return = "Returns" +macro.starslash = "\\c{*/}" +macro.begincomment = "\\c{/*}" +macro.endcomment = "\\c{*/}" +macro.uuml.HTML = "ü" +macro.mdash.HTML = "—" + +macro.beginfloatleft.HTML = "
" +macro.beginfloatright.HTML = "
" +macro.endfloat.HTML = "
" +macro.clearfloat.HTML = "
" +macro.emptyspan.HTML = "" diff --git a/doc/config/qt-cpp-ignore.qdocconf b/doc/config/qt-cpp-ignore.qdocconf new file mode 100644 index 0000000..9b09a60 --- /dev/null +++ b/doc/config/qt-cpp-ignore.qdocconf @@ -0,0 +1,99 @@ +Cpp.ignoretokens = QAXFACTORY_EXPORT \ + QDESIGNER_COMPONENTS_LIBRARY \ + QDESIGNER_EXTENSION_LIBRARY \ + QDESIGNER_SDK_LIBRARY \ + QDESIGNER_SHARED_LIBRARY \ + QDESIGNER_UILIB_LIBRARY \ + QM_EXPORT_CANVAS \ + QM_EXPORT_DNS \ + QM_EXPORT_DOM \ + QM_EXPORT_FTP \ + QM_EXPORT_HTTP \ + QM_EXPORT_ICONVIEW \ + QM_EXPORT_NETWORK \ + QM_EXPORT_OPENGL \ + QM_EXPORT_OPENVG \ + QM_EXPORT_SQL \ + QM_EXPORT_TABLE \ + QM_EXPORT_WORKSPACE \ + QM_EXPORT_XML \ + QT_ASCII_CAST_WARN \ + QT_ASCII_CAST_WARN_CONSTRUCTOR \ + QT_BEGIN_HEADER \ + QT_DESIGNER_STATIC \ + QT_END_HEADER \ + QT_FASTCALL \ + QT_WIDGET_PLUGIN_EXPORT \ + Q_COMPAT_EXPORT \ + Q_CORE_EXPORT \ + Q_CORE_EXPORT_INLINE \ + Q_EXPLICIT \ + Q_EXPORT \ + Q_EXPORT_CODECS_CN \ + Q_EXPORT_CODECS_JP \ + Q_EXPORT_CODECS_KR \ + Q_EXPORT_PLUGIN \ + Q_GFX_INLINE \ + Q_AUTOTEST_EXPORT \ + QM_AUTOTEST_EXPORT \ + Q_GUI_EXPORT \ + Q_GUI_EXPORT_INLINE \ + Q_GUI_EXPORT_STYLE_CDE \ + Q_GUI_EXPORT_STYLE_COMPACT \ + Q_GUI_EXPORT_STYLE_MAC \ + Q_GUI_EXPORT_STYLE_MOTIF \ + Q_GUI_EXPORT_STYLE_MOTIFPLUS \ + Q_GUI_EXPORT_STYLE_PLATINUM \ + Q_GUI_EXPORT_STYLE_POCKETPC \ + Q_GUI_EXPORT_STYLE_SGI \ + Q_GUI_EXPORT_STYLE_WINDOWS \ + Q_GUI_EXPORT_STYLE_WINDOWSXP \ + QHELP_EXPORT \ + Q_INLINE_TEMPLATE \ + Q_INTERNAL_WIN_NO_THROW \ + Q_NETWORK_EXPORT \ + Q_OPENGL_EXPORT \ + Q_OPENVG_EXPORT \ + Q_OUTOFLINE_TEMPLATE \ + Q_SQL_EXPORT \ + Q_SVG_EXPORT \ + Q_SCRIPT_EXPORT \ + Q_SCRIPTTOOLS_EXPORT \ + Q_TESTLIB_EXPORT \ + Q_TYPENAME \ + Q_XML_EXPORT \ + Q_XMLSTREAM_EXPORT \ + Q_XMLPATTERNS_EXPORT \ + QDBUS_EXPORT \ + Q_DBUS_EXPORT \ + QT_BEGIN_NAMESPACE \ + QT_BEGIN_INCLUDE_NAMESPACE \ + QT_END_NAMESPACE \ + QT_END_INCLUDE_NAMESPACE \ + PHONON_EXPORT \ + Q_DECLARATIVE_EXPORT \ + Q_GADGET \ + QWEBKIT_EXPORT \ + Q_INVOKABLE +Cpp.ignoredirectives = Q_DECLARE_HANDLE \ + Q_DECLARE_INTERFACE \ + Q_DECLARE_METATYPE \ + Q_DECLARE_OPERATORS_FOR_FLAGS \ + Q_DECLARE_PRIVATE \ + Q_DECLARE_PUBLIC \ + Q_DECLARE_SHARED \ + Q_DECLARE_TR_FUNCTIONS \ + Q_DECLARE_TYPEINFO \ + Q_DISABLE_COPY \ + QT_FORWARD_DECLARE_CLASS \ + Q_DUMMY_COMPARISON_OPERATOR \ + Q_ENUMS \ + Q_FLAGS \ + Q_INTERFACES \ + __attribute__ \ + K_DECLARE_PRIVATE \ + PHONON_OBJECT \ + PHONON_HEIR \ + Q_PRIVATE_PROPERTY \ + Q_DECLARE_PRIVATE_D \ + Q_CLASSINFO diff --git a/doc/config/qt-defines.qdocconf b/doc/config/qt-defines.qdocconf new file mode 100644 index 0000000..50a355f --- /dev/null +++ b/doc/config/qt-defines.qdocconf @@ -0,0 +1,17 @@ +defines = Q_QDOC \ + QT_.*_SUPPORT \ + QT_.*_LIB \ + QT_COMPAT \ + QT_KEYPAD_NAVIGATION \ + QT_NO_EGL \ + QT3_SUPPORT \ + Q_WS_.* \ + Q_OS_.* \ + Q_BYTE_ORDER \ + QT_DEPRECATED \ + Q_NO_USING_KEYWORD \ + __cplusplus + +versionsym = QT_VERSION_STR + +codeindent = 1 diff --git a/doc/config/qt-html-default-styles.qdocconf b/doc/config/qt-html-default-styles.qdocconf new file mode 100644 index 0000000..af1d459 --- /dev/null +++ b/doc/config/qt-html-default-styles.qdocconf @@ -0,0 +1,27 @@ +# Define the location of the templates to use. Style sheets and scripts are +# specified relative to the template directory and will be copied into +# subdirectories of the output directory. + +HTML.templatedir = . + +HTML.stylesheets = style/offline.css + +HTML.scripts = + +# Files not referenced in any qdoc file +extraimages.HTML = breadcrumb.png \ + bullet_gt.png \ + bullet_dn.png \ + bullet_sq.png \ + bullet_up.png + +# Include the style sheets and scripts used. + +HTML.headerstyles = \ + " \n" + +HTML.headerscripts = + +HTML.endheader = \ + "\n" \ + "\n" diff --git a/doc/config/qt-html-templates.qdocconf b/doc/config/qt-html-templates.qdocconf new file mode 100644 index 0000000..b528e14 --- /dev/null +++ b/doc/config/qt-html-templates.qdocconf @@ -0,0 +1,43 @@ +include(qt-html-default-styles.qdocconf) + +HTML.postheader = \ + "
\n" \ + " \n" \ + "
\n" \ + "
    \n" \ + "
  • Home
  • \n" \ + " \n" + +HTML.postpostheader = \ + "
\n" \ + "
\n" \ + "
\n" \ + "
\n" + +HTML.footer = \ + "
\n" \ + " \n" \ + "
\n" \ + "
\n" \ + "
\n" \ + "

\n" \ + " © 2013 Jolla OY\n" \ + "

\n" \ + " All other trademarks are property of their respective owners.\n" \ + "
\n" \ + " This document may be used under the terms of the GNU\n" \ + " Free Documentation License version 1.3\n" \ + " as published by the Free Software Foundation.

\n" \ + "
\n" \ + +# Files not referenced in any qdoc file. +# See also extraimages.HTML +qhp.SailfishSilica.extraFiles = index.html \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + style/offline.css diff --git a/doc/config/style/offline.css b/doc/config/style/offline.css new file mode 100644 index 0000000..8d0da24 --- /dev/null +++ b/doc/config/style/offline.css @@ -0,0 +1,675 @@ +@media screen +{ + +/* basic elements */ + html + { + color: #000000; + background: #FFFFFF; + } + table + { + border-collapse: collapse; + border-spacing: 0; + } + fieldset, img + { + border: 0; + max-width:100%; + } + address, caption, cite, code, dfn, em, strong, th, var, optgroup + { + font-style: inherit; + font-weight: inherit; + } + del, ins + { + text-decoration: none; + } + ol li + { + list-style: decimal; + } + ul li + { + list-style: none; + } + caption, th + { + text-align: left; + } + h1, h2, h3, h4, h5, h6 + { + font-size: 100%; + } + q:before, q:after + { + content: ''; + } + abbr, acronym + { + border: 0; + font-variant: normal; + } + sup, sub + { + vertical-align: baseline; + } + tt, .qmlreadonly span, .qmldefault span + { + word-spacing:0.5em; + } + legend + { + color: #000000; + } + strong + { + font-weight: bold; + } + em + { + font-style: italic; + } + + body + { + margin-left: 0.5em; + margin-right: 0.5em; + font-family: sans-serif; + line-height: normal + } + a + { + color: #735704; + text-decoration: none; + } + hr + { + background-color: #E6E6E6; + border: 1px solid #E6E6E6; + height: 1px; + width: 100%; + text-align: left; + margin: 1.5em 0 1.5em 0; + } + + pre + { + border: 1px solid #DDDDDD; + -moz-border-radius: 0.7em 0.7em 0.7em 0.7em; + -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em; + border-radius: 0.7em 0.7em 0.7em 0.7em; + margin: 0 1.5em 1em 1em; + padding: 1em 1em 1em 1em; + overflow-x: auto; + } + table, pre + { + -moz-border-radius: 0.7em 0.7em 0.7em 0.7em; + -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em; + border-radius: 0.7em 0.7em 0.7em 0.7em; + background-color: #F6F6F6; + border: 1px solid #E6E6E6; + border-collapse: separate; + margin-bottom: 2.5em; + } + pre { + font-size: 90%; + display: block; + overflow:hidden; + } + thead + { + margin-top: 0.5em; + font-weight: bold + } + th + { + padding: 0.5em 1.5em 0.5em 1em; + background-color: #E1E1E1; + border-left: 1px solid #E6E6E6; + } + td + { + padding: 0.25em 1.5em 0.25em 1em; + } + + td.rightAlign + { + padding: 0.25em 0.5em 0.25em 1em; + } + table tr.odd + { + border-left: 1px solid #E6E6E6; + background-color: #F6F6F6; + color: #66666E; + } + table tr.even + { + border-left: 1px solid #E6E6E6; + background-color: #ffffff; + color: #66666E; + } + + div.float-left + { + float: left; margin-right: 2em + } + div.float-right + { + float: right; margin-left: 2em + } + + span.comment + { + color: #008B00; + } + span.string, span.char + { + color: #000084; + } + span.number + { + color: #a46200; + } + span.operator + { + color: #202020; + } + span.keyword + { + color: #840000; + } + span.name + { + color: black + } + span.type + { + font-weight: bold + } + span.type a:visited + { + color: #0F5300; + } + span.preprocessor + { + color: #404040 + } +/* end basic elements */ + +/* font style elements */ + .heading + { + font-weight: bold; + font-size: 125%; + } + .subtitle + { + font-size: 110% + } + .small-subtitle + { + font-size: 100% + } + .red + { + color:red; + } +/* end font style elements */ + +/* global settings*/ + .header, .footer + { + display: block; + clear: both; + overflow: hidden; + } +/* end global settings*/ + +/* header elements */ + .header .qtref + { + color: #735704; + font-weight: bold; + font-size: 130%; + } + + .header .content + { + margin-bottom: 0.5em + } + + .header .breadcrumb + { + font-size: 90%; + padding: 0.5em 0 0.5em 1em; + margin: 0; + background-color: #fafafa; + height: 1.35em; + border-bottom: 1px solid #d1d1d1; + } + + .header .breadcrumb ul + { + margin: 0; + padding: 0; + } + + .header .content + { + word-wrap: break-word; + } + + .header .breadcrumb ul li + { + float: left; + background: url(../images/breadcrumb.png) no-repeat 0 3px; + padding-left: 1.5em; + margin-left: 1.5em; + } + + .header .breadcrumb ul li.last + { + font-weight: normal; + } + + .header .breadcrumb ul li a + { + color: #735704; + } + + .header .breadcrumb ul li.first + { + background-image: none; + padding-left: 0; + margin-left: 0; + } + + .header .content ol li { + background: none; + margin-bottom: 1.0em; + margin-left: 1.2em; + padding-left: 0 + } + + .header .content li + { + background: url(../images/bullet_sq.png) no-repeat 0 5px; + margin-bottom: 1em; + padding-left: 1.2em; + } + +/* end header elements */ + +/* content elements */ + .content h1 + { + font-weight: bold; + font-size: 130% + } + + .content h2 + { + font-weight: bold; + font-size: 120%; + width: 100%; + } + .content h3 + { + font-weight: bold; + font-size: 110%; + width: 100%; + } + .content table p + { + margin: 0 + } + .content ul + { + padding-left: 2.5em; + } + .content li + { + padding-top: 0.25em; + padding-bottom: 0.25em; + } + .content ul img { + vertical-align: middle; + } + + .content a:visited + { + color: #4c0033; + text-decoration: none; + } + + .content a:visited:hover + { + color: #4c0033; + text-decoration: underline; + } + + a:hover + { + color: #4c0033; + text-decoration: underline; + } + descr p a + { + text-decoration: underline; + } + + .descr p a:visited + { + text-decoration: underline; + } + + .alphaChar{ + width:95%; + background-color:#F6F6F6; + border:1px solid #E6E6E6; + -moz-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + font-size:12pt; + padding-left:10px; + margin-top:10px; + margin-bottom:10px; + } + .flowList{ + /*vertical-align:top;*/ + /*margin:20px auto;*/ + + column-count:3; + -webkit-column-count:3; + -moz-column-count:3; +/* + column-width:100%; + -webkit-column-width:200px; + -col-column-width:200px; +*/ + column-gap:41px; + -webkit-column-gap:41px; + -moz-column-gap:41px; + + column-rule: 1px dashed #ccc; + -webkit-column-rule: 1px dashed #ccc; + -moz-column-rule: 1px dashed #ccc; + } + + .flowList dl{ + } + .flowList dd{ + /*display:inline-block;*/ + margin-left:10px; + min-width:250px; + line-height: 1.5; + min-width:100%; + min-height:15px; + } + + .flowList dd a{ + } + + .content .flowList p{ + padding:0px; + } + + .content .alignedsummary + { + margin: 15px; + } + + + .qmltype + { + text-align: center; + font-size: 120%; + } + .qmlreadonly + { + padding-left: 5px; + float: right; + color: #254117; + } + + .qmldefault + { + padding-left: 5px; + float: right; + color: red; + } + + .qmldoc + { + } + + .generic .alphaChar{ + margin-top:5px; + } + + .generic .odd .alphaChar{ + background-color: #F6F6F6; + } + + .generic .even .alphaChar{ + background-color: #FFFFFF; + } + + .memItemRight{ + padding: 0.25em 1.5em 0.25em 0; + } + .highlightedCode + { + margin: 1.0em; + } + .annotated td { + padding: 0.25em 0.5em 0.25em 0.5em; + } + + .toc + { + font-size: 80% + } + + .header .content .toc ul + { + padding-left: 0px; + } + + .content .toc h3 { + border-bottom: 0px; + margin-top: 0px; + } + + .content .toc h3 a:hover { + color: #735704; + text-decoration: none; + } + + .content .toc .level2 + { + margin-left: 1.5em; + } + + .content .toc .level3 + { + margin-left: 3.0em; + } + + .content ul li + { + background: url(../images/bullet_sq.png) no-repeat 0 0.7em; + padding-left: 1em + } + + .content .toc li + { + background: url(../images/bullet_dn.png) no-repeat 0 5px; + padding-left: 1em + } + + .relpage + { + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + border: 1px solid #DDDDDD; + padding: 25px 25px; + clear: both; + } + .relpage ul + { + float: none; + padding: 1.5em; + } + + h3.fn, span.fn + { + -moz-border-radius:7px 7px 7px 7px; + -webkit-border-radius:7px 7px 7px 7px; + border-radius:7px 7px 7px 7px; + background-color: #F6F6F6; + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + font-weight: bold; + word-spacing:3px; + padding:3px 5px; + } + + .functionIndex { + font-size:12pt; + word-spacing:10px; + margin-bottom:10px; + background-color: #F6F6F6; + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + width:100%; + } + + .centerAlign + { + text-align:center; + } + + .rightAlign + { + text-align:right; + } + + .leftAlign + { + text-align:left; + } + + .topAlign{ + vertical-align:top + } + + .functionIndex a{ + display:inline-block; + } + +/* end content elements */ +/* footer elements */ + + .footer + { + color: #393735; + font-size: 0.75em; + text-align: center; + padding-top: 1.5em; + padding-bottom: 1em; + background-color: #E6E7E8; + margin: 0; + } + .footer p + { + margin: 0.25em + } + .small + { + font-size: 0.5em; + } +/* end footer elements */ + + .item { + float: left; + position: relative; + width: 100%; + overflow: hidden; + } + + + .item .primary { + margin-right: 220px; + position: relative; + } + + .item hr { + margin-left: -220px; + } + + .item .secondary { + float: right; + width: 200px; + position: relative; + } + + .item .cols { + clear: both; + display: block; + } + + .item .cols .col { + float: left; + margin-left: 1.5%; + } + + .item .cols .col.first { + margin-left: 0; + } + + .item .cols.two .col { + width: 45%; + } + + .item .box { + margin: 0 0 10px 0; + } + + .item .box h3 { + margin: 0 0 10px 0; + } + + .cols.unclear { + clear:none; + } +} + +/* end of screen media */ + +/* start of print media */ + +@media print +{ + input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft, #feedbackBox, #blurpage, .toc, .breadcrumb, .toolbar, .floatingResult + { + display: none; + background: none; + } + .content + { + background: none; + display: block; + width: 100%; margin: 0; float: none; + } +} +/* end of print media */ diff --git a/doc/config/transfer-engine-ditaxml.qdocconf b/doc/config/transfer-engine-ditaxml.qdocconf new file mode 100644 index 0000000..b207c51 --- /dev/null +++ b/doc/config/transfer-engine-ditaxml.qdocconf @@ -0,0 +1,13 @@ +include(transfer-engine-project.qdocconf) + +outputdir = ../ditaxml +outputformats = DITAXML + +generateindex = true +url = . + +macro.beginfloatleft.HTML = " " +macro.beginfloatright.HTML = " " +macro.endfloat.HTML = " " +macro.clearfloat.HTML = " " +macro.emptyspan.DITAXML = " " diff --git a/doc/config/transfer-engine-project.qdocconf b/doc/config/transfer-engine-project.qdocconf new file mode 100644 index 0000000..f021937 --- /dev/null +++ b/doc/config/transfer-engine-project.qdocconf @@ -0,0 +1,62 @@ +include(compat.qdocconf) +include(macros.qdocconf) +include(qt-cpp-ignore.qdocconf) +include(qt-defines.qdocconf) + +indexes = ../src/qt.index + +language = Cpp + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = en_US + +project = Nemo TransferEngine +description = Nemo TransferEngine Library Reference Documentation +versionsym = +version = 1.0 +url = + +sources.fileextensions = "*.cpp *.qdoc *.mm *.qml" +headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml" +examples.imageextensions = "*.png *.jpeg *.jpg *.gif *.mng" + +# don't include ../../components/*.qml in sourcedirs, that causes qdoc3 to parse the +# .qml files, not find any docs, and conclude they are internal +sourcedirs = ../../src ../../lib ../src +headerdirs = ../../src ../../lib + +#excludedirs = + +#exampledirs = ../../examples + +imagedirs = images \ + ../src/images + +outputdir = ../html +tagfile = ../html/transfer-engine.tags +base = file:../html + +outputprefixes = QML +outputprefixes.QML = qml-transfer-engine- + +qhp.projects = TransferEngine + +qhp.TransferEngine.file = transferengine.qhp +qhp.TransferEngine.namespace = Transfer.Engine.100 +qhp.TransferEngine.virtualFolder = transferengine +qhp.TransferEngine.indexTitle = Nemo Transfer Engine Reference Documentation +qhp.TransferEngine.indexRoot = + +qhp.TransferEngine.filterAttributes = transferengine 1.0.0 +qhp.TransferEngine.customFilters.TransferEngine.name = Nemo TransferEngine 1.0.0 +qhp.TransferEngine.customFilters.TransferEngine.filterAttributes = transferengine 1.0.0 +#qhp.TransferEngine.subprojects.examples.title = Examples +#qhp.TransferEngine.subprojects.examples.indexTitle = Nemo Transfer Engine Examples +#qhp.TransferEngine.subprojects.examples.selectors = fake:example +#qhp.TransferEngine.subprojects.examples.sortPages = true +#qhp.TransferEngine.subprojects.tutorials.title = Tutorials +#qhp.TransferEngine.subprojects.tutorials.indexTitle = Nemo TransferEngine Tutorials +#qhp.TransferEngine.subprojects.tutorials.selectors = fake:tutorial +#qhp.TransferEngine.subprojects.tutorials.sortPages = true diff --git a/doc/config/transfer-engine.qdocconf b/doc/config/transfer-engine.qdocconf new file mode 100644 index 0000000..76f8bcb --- /dev/null +++ b/doc/config/transfer-engine.qdocconf @@ -0,0 +1,2 @@ +include(transfer-engine-project.qdocconf) +include(qt-html-templates.qdocconf) diff --git a/doc/doc.pri b/doc/doc.pri new file mode 100644 index 0000000..dca6f96 --- /dev/null +++ b/doc/doc.pri @@ -0,0 +1,15 @@ +QDOC = qdoc3 +QHELPGENERATOR = qhelpgenerator +QDOCCONF = doc/config/transfer-engine-project.qdocconf +QHELPFILE = doc/html/transferengine.qhp +QCHFILE = doc/html/transferengine.qch + +docs.commands = ($$QDOC $$QDOCCONF) && \ + ($$QHELPGENERATOR $$QHELPFILE -o $$QCHFILE) + +QMAKE_EXTRA_TARGETS += docs + +doc.files = doc/html/* +doc.path = /usr/share/doc/nemo-transfer-engine +INSTALLS += doc + diff --git a/doc/html/callbackinterface-members.html b/doc/html/callbackinterface-members.html new file mode 100644 index 0000000..1c067b9 --- /dev/null +++ b/doc/html/callbackinterface-members.html @@ -0,0 +1,18 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for CallbackInterface +
  • Modules
  • +
  • CallbackInterface
  • +

    List of All Members for CallbackInterface

    +

    This is the complete list of members for CallbackInterface, including inherited members.

    + + + diff --git a/doc/html/callbackinterface.html b/doc/html/callbackinterface.html new file mode 100644 index 0000000..2efaa67 --- /dev/null +++ b/doc/html/callbackinterface.html @@ -0,0 +1,63 @@ + + + + + + + Nemo TransferEngine 1.0: CallbackInterface Class Reference +
  • Modules
  • +
  • CallbackInterface
  • + +

    CallbackInterface Class Reference

    + +

    The CallbackInterface class is a convenience class to wrap DBus callback infromation for TransferEngineClient API. More...

    + +
     #include <CallbackInterface>
    + +

    Public Functions

    + + + + +
    CallbackInterface ()
    CallbackInterface ( const QString & server, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod )
    ~CallbackInterface ()
    + + +
    +

    Detailed Description

    +

    The CallbackInterface class is a convenience class to wrap DBus callback infromation for TransferEngineClient API.

    +

    This class should be used with TransferEngineClient API.

    +

    NOTE: If creating an instance of this class to the heap, the caller is responsible of freeing the allocated memory.

    +
    +

    See also TransferEngineClient::createSyncEvent() and TransferEngineClient::createDownloadEvent().

    + +
    +

    Member Function Documentation

    + +

    CallbackInterface::CallbackInterface ()

    +

    Construct an empty CallbackInterface. This can be used if client doesn't want to provide callback interface to the Sync or Download events.

    + + +

    CallbackInterface::CallbackInterface ( const QString & server, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod )

    +

    Construct CallbackInterface instance to provide callback information to the TransferEngineClient. Setup arguments as:

    +
      +
    • server e.g. "com.jolla.myapp"
    • +
    • path e.g. "/com/jolla/myapp"
    • +
    • interface e.g. "com.jolla.myapp"
    • +
    • cancelMethod Cancel method name e.g. "cancelSync"
    • +
    • restartMethod Restart method name e.g. "restartSync"
    • +
    + + +

    CallbackInterface::~CallbackInterface ()

    + +
    + + diff --git a/doc/html/dbmanager-members.html b/doc/html/dbmanager-members.html new file mode 100644 index 0000000..72be390 --- /dev/null +++ b/doc/html/dbmanager-members.html @@ -0,0 +1,30 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for DbManager +
  • Modules
  • +
  • DbManager
  • +

    List of All Members for DbManager

    +

    This is the complete list of members for DbManager, including inherited members.

    + + + diff --git a/doc/html/dbmanager.html b/doc/html/dbmanager.html new file mode 100644 index 0000000..2ad540e --- /dev/null +++ b/doc/html/dbmanager.html @@ -0,0 +1,150 @@ + + + + + + + Nemo TransferEngine 1.0: DbManager Class Reference +
  • Modules
  • +
  • DbManager
  • + +

    DbManager Class Reference

    + +

    The DbManager class is a singleton class to read and write transfers database. More...

    + +
     #include <DbManager>
    + +

    Public Functions

    + + + + + + + + + + + + + + + +
    ~DbManager ()
    QStringList callback ( int key ) const
    bool callbackMethods ( int key, QString & cancelMethod, QString & restartMethod ) const
    bool clearTransfers ()
    int createCallbackEntry ( int key, const QString & service, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod )
    int createMetadataEntry ( int key, const QString & title, const QString & description )
    int createTransferEntry ( MediaItem * mediaItem )
    MediaItem * mediaItem ( int key ) const
    bool removeTransfer ( int key )
    TransferEngineData::TransferStatus transferStatus ( int key ) const
    TransferEngineData::TransferType transferType ( int key ) const
    QList<TransferDBRecord> transfers () const
    bool updateProgress ( int key, qreal progress )
    bool updateTransferStatus ( int key, TransferEngineData::TransferStatus status )
    + +

    Static Public Members

    + + +
    DbManager * instance ()
    + + +
    +

    Detailed Description

    +

    The DbManager class is a singleton class to read and write transfers database.

    +

    DbManager class takes care of reading and writing transfer database used by Nemo Transfer Engine. It's a singleton class and it can be instantiated using DbManager::instance() method.

    +
    + +
    +

    Member Function Documentation

    + +

    DbManager::~DbManager ()

    +

    Destructor.

    + + +

    QStringList DbManager::callback ( int key ) const

    +

    Get a DBus callback interface and method for the transfer with key. If there is no callback for the key then an empty QStringList is returned.

    +

    In a case there is a DBus callback, then QStringList contains the following items:

    +
      +
    • service
    • +
    • path
    • +
    • interface
    • +
    • cancel method name
    • +
    • restart method name
    • +
    + + +

    bool DbManager::callbackMethods ( int key, QString & cancelMethod, QString & restartMethod ) const

    +

    Get the callback method names for the transfer with key. The method names are set to the output arguments cancelMethod and restartMethod.

    +

    This method returns true on success, false on failure.

    + + +

    bool DbManager::clearTransfers ()

    +

    Clear all finished, canceled or failed transfers from the database.

    +

    This method returns true on success, false on failure.

    + + +

    int DbManager::createCallbackEntry ( int key, const QString & service, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod )

    +

    Create a callback entry to the callback table for the existing transfer with a key.

    +

    The callback is a dbus interface so it must contain the following attributes:

    +
      +
    • service e.g. com.jolla.myapp
    • +
    • path e.g. /com/jolla/myapp
    • +
    • interface e.g. com.jolla.myapp
    • +
    • cancelMethod The name of the cancel method
    • +
    • restartMethod The name of the restart method
    • +
    +

    This method returns a key of the created callback record in a callback table or -1 on failure.

    +

    NOTE: Deleting the record from the transfer which has a key, also deletes related callback entry.

    + + +

    int DbManager::createMetadataEntry ( int key, const QString & title, const QString & description )

    +

    Create a metadata entry for the existing transfer with key. Metadata can contain only title and/or \description.

    +

    Metadata entry will be created to the metadata table. Argument key must point to the existing entry in transfers table.

    +

    This method returns a key of the created record in metadata table or -1 on failure.

    +

    NOTE: Deleting the record from the transfer which has a key, also deletes related metadata entry.

    + + +

    int DbManager::createTransferEntry ( MediaItem * mediaItem )

    +

    Create a transfer entry to the transfers table bsaed on mediaItem content.

    +

    MediaItem instance contains all the required information for the single Upload, Download or a Sync item. Based on this information, DbManager creates a record to the transfers table, but also to the callback and metadata tables if these are defined.

    +

    This method returns a key of the created transfer or -1 on failure.

    +

    See also MediaItem.

    + + +

    DbManager * DbManager::instance () [static]

    +

    Return a singleton instance of this DbManager. Note that caller is NOT responsible of deleting the instance. It will be deleted automatically when application stack is cleaned.

    + + +

    MediaItem * DbManager::mediaItem ( int key ) const

    +

    Returns a MediaItem instance from the transfer data with a key.

    + + +

    bool DbManager::removeTransfer ( int key )

    +

    Remove an existing transfer with a key from the transfers table. If this transfer has metadata or callback defined, they will be removed too.

    +

    This method returns true on success, false on failure.

    + + +

    TransferEngineData::TransferStatus DbManager::transferStatus ( int key ) const

    +

    Returns the transfer status of the transfer with key. In a case of error the TransferEngineData::Unknown is returned.

    + + +

    TransferEngineData::TransferType DbManager::transferType ( int key ) const

    +

    Returns the transfer type e.g. Sync, Download or Upload of the transfer with a key.

    +

    If there is no transfer record with key or error occurs, this method returns TransferEngineData::Undefined.

    + + +

    QList<TransferDBRecord> DbManager::transfers () const

    +

    Returns all the transfers from the database. This method doesn't fetch all the fields from all the tables, instead it returns what is required to fill fields in TransferDBRecord class.

    + + +

    bool DbManager::updateProgress ( int key, qreal progress )

    +

    Update a transfer progress of the existing transfer with key.

    +

    This method returns true on success, false on failure.

    + + +

    bool DbManager::updateTransferStatus ( int key, TransferEngineData::TransferStatus status )

    +

    Update a transfer status of the existing transfer with key. Changing the status updates the timestamp too.

    +

    This method returns true on success, false on failure.

    + +
    + + diff --git a/doc/html/imageoperation-members.html b/doc/html/imageoperation-members.html new file mode 100644 index 0000000..5addf06 --- /dev/null +++ b/doc/html/imageoperation-members.html @@ -0,0 +1,18 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for ImageOperation +
  • Modules
  • +
  • ImageOperation
  • +

    List of All Members for ImageOperation

    +

    This is the complete list of members for ImageOperation, including inherited members.

    + + + diff --git a/doc/html/imageoperation.html b/doc/html/imageoperation.html new file mode 100644 index 0000000..abcce3a --- /dev/null +++ b/doc/html/imageoperation.html @@ -0,0 +1,66 @@ + + + + + + + Nemo TransferEngine 1.0: ImageOperation Class Reference +
  • Modules
  • +
  • ImageOperation
  • + +

    ImageOperation Class Reference

    + +

    The ImageOperation class is a helper class to manipulate images. More...

    + +
     #include <ImageOperation>
    + +

    Static Public Members

    + + + + +
    QString removeImageMetadata ( const QString & sourceFile )
    QString scaleImage ( const QString & sourceFile, qreal scaleFactor, const QString & targetFile = QString() )
    QString tempFilePath ( const QString & sourceFile )
    + + +
    +

    Detailed Description

    +

    The ImageOperation class is a helper class to manipulate images.

    +

    This class is meant to be used by share plugins. It can be used for:

    +
      +
    • Removing image metadata
    • +
    • Scaling image
    • +
    • Create a temp files from the image paths
    • +
    +
    + +
    +

    Member Function Documentation

    + +

    QString ImageOperation::removeImageMetadata ( const QString & sourceFile ) [static]

    +

    Helper method to remove metadata from jpeg files. Only author and location related metadata will be removed. sourceFile is the path to the original file.

    +

    Returns a path to the copy of the image with metadata removed.

    + + +

    QString ImageOperation::scaleImage ( const QString & sourceFile, qreal scaleFactor, const QString & targetFile = QString() ) [static]

    +

    Scale image sourceFile using scaleFactor. The scaled image is stored to the targetFile or if targetFile is not given, then a temporary file is created for saving.

    +

    The scaleFactor argument must be > 0. This function returns path to the scaled image. Note that if user doesn't specify targetFile the scaled image is stored under temp directory. Nothing guarantees that created file will remain in that diretory forewer so the caller is reponsible of copying file for more permanent storing.

    +

    Returns a path to the scaled image.

    +

    It is also recommended that if the caller doesn't use the scaled file, which is stored to the temp directory later, the caller should remove the file.

    + + +

    QString ImageOperation::tempFilePath ( const QString & sourceFile ) [static]

    +

    Creates a temporary file from the sourceFile. This function uses sourceFile as a template to create a temp file. Temporary file will be e.g:

    +

    Source file: "/home/nemo/Pictures/img_001.jpg" Temporary file: "/var/tmp/img_001_0.jpg"

    +

    Note that it's caller's responsibility to remove created temp file.

    + +
    + + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..cd5125c --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,42 @@ + + + + + + + Nemo TransferEngine 1.0: Nemo Transfer Engine +
  • Nemo Transfer Engine
  • +

    +

    Nemo Transfer Engine

    + + +
    +

    The Nemo Transfer Engine is a daemon process which takes care of tracking sharing, sync and downloads. In addition to just tracking those operations, it provides an API to create new share plugins and different functionality related these operations.The Nemo Transfer Engine doesn't provide any UI components, but the plugin interface expects sharing UIs to be written as QML.

    +

    The Nemo Transfer Engine can be understood as a front end to the database which contain all the information about sharing, syncs and downloads. For syncs and downloads it acts only as storage manager so clients can use Nemo Transfer Engine client API to create and update sync and download events. For sharing, Nemo Transfer Engine provides own API and supports share plugins.

    +

    See TransferEngine DbManager

    + +

    Nemo Transfer Engine API

    +

    The API can be divided in two different parts: the share plugin API and the client API.

    + +

    Share Plugin API

    +

    Share plugin is a Qt plugin, which must be implemented using C++ interfaces defined by Nemo Transfer Engine. The plugins must be installed to the specific location where Nemo Transfer Engine loads them. The actual share functionality implementation depends on the client e.g. if it's HW specific like NFC or online service such as Facebook. Each plugin must implement or use the following interface:

    +
      +
    • TransferPluginInterface Share plugin must implement this interface
    • +
    • MediaTransferInterface Share plugin must implement this interface
    • +
    • TransferPluginInfo Share plugin must provide information about plugin using this class
    • +
    • TransferMethodInfo Share plugin must provide information about e.g. accounts using this class
    • +
    + +

    Client API

    +

    Client API can also be divided in two sections: full features DBus API and TransferEngineClient Interface. The first one supports all the features Nemo Transfer Engine provides and makes possible to implement for example Transfer UI and client side sharing interface on top of it. The TransferEngineClient is meant to be used by clients who want to inform Nemo Transfer Engine of ongoing Sync or Downloads.

    +
      +
    • DBus API - see org.nemomobile.transferengine.xml. For the client side it will generate TransferEnginInterface class which can be used directly.
    • +
    • TransferEngineClient The convenience API to create Sync and Download events.
    • +
    +
    + + + + diff --git a/doc/html/nemo-transferengine.index b/doc/html/nemo-transferengine.index new file mode 100644 index 0000000..c28805f --- /dev/null +++ b/doc/html/nemo-transferengine.index @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/nemo-transferengine.pageindex b/doc/html/nemo-transferengine.pageindex new file mode 100644 index 0000000..89692e7 --- /dev/null +++ b/doc/html/nemo-transferengine.pageindex @@ -0,0 +1,609 @@ + + + + ImageOperation class reference + ImageOperation Class Reference + imageoperation.html + APIPage + + + tempFilePath function ImageOperation + tempFilePath Function Reference + imageoperation.html#tempFilePath + APIPage + + + removeImageMetadata function ImageOperation + removeImageMetadata Function Reference + imageoperation.html#removeImageMetadata + APIPage + + + scaleImage function ImageOperation + scaleImage Function Reference + imageoperation.html#scaleImage + APIPage + + + CallbackInterface class reference + CallbackInterface Class Reference + callbackinterface.html + APIPage + + + CallbackInterface function CallbackInterface + CallbackInterface Function Reference + callbackinterface.html#CallbackInterface + APIPage + + + CallbackInterface function CallbackInterface + CallbackInterface Function Reference + callbackinterface.html#CallbackInterface + APIPage + + + ~CallbackInterface function CallbackInterface + ~CallbackInterface Function Reference + callbackinterface.html#~CallbackInterface + APIPage + + + TransferEngineClient class reference + TransferEngineClient Class Reference + transferengineclient.html + APIPage + + + Status enum type TransferEngineClient + Status Enum Reference + transferengineclient.html#Status-enum + APIPage + + + TransferEngineClient function TransferEngineClient + TransferEngineClient Function Reference + transferengineclient.html#TransferEngineClient + APIPage + + + ~TransferEngineClient function TransferEngineClient + ~TransferEngineClient Function Reference + transferengineclient.html#~TransferEngineClient + APIPage + + + createDownloadEvent function TransferEngineClient + createDownloadEvent Function Reference + transferengineclient.html#createDownloadEvent + APIPage + + + createSyncEvent function TransferEngineClient + createSyncEvent Function Reference + transferengineclient.html#createSyncEvent + APIPage + + + startTransfer function TransferEngineClient + startTransfer Function Reference + transferengineclient.html#startTransfer + APIPage + + + updateTransferProgress function TransferEngineClient + updateTransferProgress Function Reference + transferengineclient.html#updateTransferProgress + APIPage + + + finishTransfer function TransferEngineClient + finishTransfer Function Reference + transferengineclient.html#finishTransfer + APIPage + + + DbManager class reference + DbManager Class Reference + dbmanager.html + APIPage + + + instance function DbManager + instance Function Reference + dbmanager.html#instance + APIPage + + + ~DbManager function DbManager + ~DbManager Function Reference + dbmanager.html#~DbManager + APIPage + + + createMetadataEntry function DbManager + createMetadataEntry Function Reference + dbmanager.html#createMetadataEntry + APIPage + + + callback function DbManager + callback Function Reference + dbmanager.html#callback + APIPage + + + createCallbackEntry function DbManager + createCallbackEntry Function Reference + dbmanager.html#createCallbackEntry + APIPage + + + createTransferEntry function DbManager + createTransferEntry Function Reference + dbmanager.html#createTransferEntry + APIPage + + + updateTransferStatus function DbManager + updateTransferStatus Function Reference + dbmanager.html#updateTransferStatus + APIPage + + + updateProgress function DbManager + updateProgress Function Reference + dbmanager.html#updateProgress + APIPage + + + removeTransfer function DbManager + removeTransfer Function Reference + dbmanager.html#removeTransfer + APIPage + + + clearTransfers function DbManager + clearTransfers Function Reference + dbmanager.html#clearTransfers + APIPage + + + transfers function DbManager + transfers Function Reference + dbmanager.html#transfers + APIPage + + + transferType function DbManager + transferType Function Reference + dbmanager.html#transferType + APIPage + + + transferStatus function DbManager + transferStatus Function Reference + dbmanager.html#transferStatus + APIPage + + + callbackMethods function DbManager + callbackMethods Function Reference + dbmanager.html#callbackMethods + APIPage + + + mediaItem function DbManager + mediaItem Function Reference + dbmanager.html#mediaItem + APIPage + + + TransferEngine class reference + TransferEngine Class Reference + transferengine.html + APIPage + + + TransferEngine function TransferEngine + TransferEngine Function Reference + transferengine.html#TransferEngine + APIPage + + + ~TransferEngine function TransferEngine + ~TransferEngine Function Reference + transferengine.html#~TransferEngine + APIPage + + + uploadMediaItem function TransferEngine + uploadMediaItem Function Reference + transferengine.html#uploadMediaItem + APIPage + + + uploadMediaItemContent function TransferEngine + uploadMediaItemContent Function Reference + transferengine.html#uploadMediaItemContent + APIPage + + + createDownload function TransferEngine + createDownload Function Reference + transferengine.html#createDownload + APIPage + + + createSync function TransferEngine + createSync Function Reference + transferengine.html#createSync + APIPage + + + startTransfer function TransferEngine + startTransfer Function Reference + transferengine.html#startTransfer + APIPage + + + restartTransfer function TransferEngine + restartTransfer Function Reference + transferengine.html#restartTransfer + APIPage + + + finishTransfer function TransferEngine + finishTransfer Function Reference + transferengine.html#finishTransfer + APIPage + + + updateTransferProgress function TransferEngine + updateTransferProgress Function Reference + transferengine.html#updateTransferProgress + APIPage + + + transfers function TransferEngine + transfers Function Reference + transferengine.html#transfers + APIPage + + + transferMethods function TransferEngine + transferMethods Function Reference + transferengine.html#transferMethods + APIPage + + + clearTransfers function TransferEngine + clearTransfers Function Reference + transferengine.html#clearTransfers + APIPage + + + cancelTransfer function TransferEngine + cancelTransfer Function Reference + transferengine.html#cancelTransfer + APIPage + + + enableNotifications function TransferEngine + enableNotifications Function Reference + transferengine.html#enableNotifications + APIPage + + + notificationsEnabled function TransferEngine + notificationsEnabled Function Reference + transferengine.html#notificationsEnabled + APIPage + + + progressChanged function TransferEngine + progressChanged Function Reference + transferengine.html#progressChanged + APIPage + + + statusChanged function TransferEngine + statusChanged Function Reference + transferengine.html#statusChanged + APIPage + + + transferMethodListChanged function TransferEngine + transferMethodListChanged Function Reference + transferengine.html#transferMethodListChanged + APIPage + + + transfersChanged function TransferEngine + transfersChanged Function Reference + transferengine.html#transfersChanged + APIPage + + + TransferMethodInfo class reference + TransferMethodInfo Class Reference + transfermethodinfo.html + APIPage + + + TransferMethodInfoField enum type TransferMethodInfo + TransferMethodInfoField Enum Reference + transfermethodinfo.html#TransferMethodInfoField-enum + APIPage + + + TransferMethodInfo function TransferMethodInfo + TransferMethodInfo Function Reference + transfermethodinfo.html#TransferMethodInfo + APIPage + + + operator= function TransferMethodInfo + operator= Function Reference + transfermethodinfo.html#operator= + APIPage + + + TransferMethodInfo function TransferMethodInfo + TransferMethodInfo Function Reference + transfermethodinfo.html#TransferMethodInfo + APIPage + + + ~TransferMethodInfo function TransferMethodInfo + ~TransferMethodInfo Function Reference + transfermethodinfo.html#~TransferMethodInfo + APIPage + + + registerType function TransferMethodInfo + registerType Function Reference + transfermethodinfo.html#registerType + APIPage + + + value function TransferMethodInfo + value Function Reference + transfermethodinfo.html#value + APIPage + + + displayName TransferMethodInfo + displayName + transfermethodinfo.html + APIPage + + + userName TransferMethodInfo + userName + transfermethodinfo.html + APIPage + + + methodId TransferMethodInfo + methodId + transfermethodinfo.html + APIPage + + + shareUIPath TransferMethodInfo + shareUIPath + transfermethodinfo.html + APIPage + + + capabilitities TransferMethodInfo + capabilitities + transfermethodinfo.html + APIPage + + + accountId TransferMethodInfo + accountId + transfermethodinfo.html + APIPage + + + TransferPluginInterface class reference + TransferPluginInterface Class Reference + transferplugininterface.html + APIPage + + + transferObject function TransferPluginInterface + transferObject Function Reference + transferplugininterface.html#transferObject + APIPage + + + infoObject function TransferPluginInterface + infoObject Function Reference + transferplugininterface.html#infoObject + APIPage + + + pluginId function TransferPluginInterface + pluginId Function Reference + transferplugininterface.html#pluginId + APIPage + + + enabled function TransferPluginInterface + enabled Function Reference + transferplugininterface.html#enabled + APIPage + + + TransferDBRecord class reference + TransferDBRecord Class Reference + transferdbrecord.html + APIPage + + + TransferDBRecordField enum type TransferDBRecord + TransferDBRecordField Enum Reference + transferdbrecord.html#TransferDBRecordField-enum + APIPage + + + TransferDBRecord function TransferDBRecord + TransferDBRecord Function Reference + transferdbrecord.html#TransferDBRecord + APIPage + + + operator= function TransferDBRecord + operator= Function Reference + transferdbrecord.html#operator= + APIPage + + + TransferDBRecord function TransferDBRecord + TransferDBRecord Function Reference + transferdbrecord.html#TransferDBRecord + APIPage + + + ~TransferDBRecord function TransferDBRecord + ~TransferDBRecord Function Reference + transferdbrecord.html#~TransferDBRecord + APIPage + + + registerType function TransferDBRecord + registerType Function Reference + transferdbrecord.html#registerType + APIPage + + + value function TransferDBRecord + value Function Reference + transferdbrecord.html#value + APIPage + + + transfer_id TransferDBRecord + transfer_id + transferdbrecord.html + APIPage + + + transfer_type TransferDBRecord + transfer_type + transferdbrecord.html + APIPage + + + status TransferDBRecord + status + transferdbrecord.html + APIPage + + + size TransferDBRecord + size + transferdbrecord.html + APIPage + + + progress TransferDBRecord + progress + transferdbrecord.html + APIPage + + + plugin_id TransferDBRecord + plugin_id + transferdbrecord.html + APIPage + + + url TransferDBRecord + url + transferdbrecord.html + APIPage + + + timestamp TransferDBRecord + timestamp + transferdbrecord.html + APIPage + + + display_name TransferDBRecord + display_name + transferdbrecord.html + APIPage + + + resource_name TransferDBRecord + resource_name + transferdbrecord.html + APIPage + + + mime_type TransferDBRecord + mime_type + transferdbrecord.html + APIPage + + + service_icon TransferDBRecord + service_icon + transferdbrecord.html + APIPage + + + application_icon TransferDBRecord + application_icon + transferdbrecord.html + APIPage + + + thumbnail_icon TransferDBRecord + thumbnail_icon + transferdbrecord.html + APIPage + + + cancel_supported TransferDBRecord + cancel_supported + transferdbrecord.html + APIPage + + + restart_supported TransferDBRecord + restart_supported + transferdbrecord.html + APIPage + + + Nemo Transfer Engine + Nemo Transfer Engine + index.html + Article + + + Nemo Transfer Engine Nemo Transfer Engine API + Nemo Transfer Engine API + index.html#nemo-transfer-engine-api + Article + + + Nemo Transfer Engine Share Plugin API + Share Plugin API + index.html#share-plugin-api + Article + + + Nemo Transfer Engine Client API + Client API + index.html#client-api + Article + + diff --git a/doc/html/transfer-engine.tags b/doc/html/transfer-engine.tags new file mode 100644 index 0000000..d1358f0 --- /dev/null +++ b/doc/html/transfer-engine.tags @@ -0,0 +1,598 @@ + + + + ImageOperation + imageoperation.html + + QString + tempFilePath + imageoperation.html + tempFilePath + (const QString & sourceFile) + + + QString + removeImageMetadata + imageoperation.html + removeImageMetadata + (const QString & sourceFile) + + + QString + scaleImage + imageoperation.html + scaleImage + (const QString & sourceFile, qreal scaleFactor, const QString & targetFile) + + + + CallbackInterface + callbackinterface.html + + + CallbackInterface + callbackinterface.html + CallbackInterface + () + + + + CallbackInterface + callbackinterface.html + CallbackInterface-2 + (const QString & server, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod) + + + + ~CallbackInterface + callbackinterface.html + dtor.CallbackInterface + () + + + + TransferEngineClient + transferengineclient.html + + Status + Status-enum + + + + Status-enum + + + + Status-enum + + + + Status-enum + + + + + TransferEngineClient + transferengineclient.html + TransferEngineClient + (QObject * parent) + + + + ~TransferEngineClient + transferengineclient.html + dtor.TransferEngineClient + () + + + int + createDownloadEvent + transferengineclient.html + createDownloadEvent + (const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const QUrl & url, const QString & mimeType, qlonglong expectedFileSize, const CallbackInterface & callback) + + + int + createSyncEvent + transferengineclient.html + createSyncEvent + (const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const CallbackInterface & callback) + + + void + startTransfer + transferengineclient.html + startTransfer + (int transferId) + + + void + updateTransferProgress + transferengineclient.html + updateTransferProgress + (int transferId, qreal progress) + + + void + finishTransfer + transferengineclient.html + finishTransfer + (int transferId, Status status, const QString & reason) + + + + DbManager + dbmanager.html + + DbManager * + instance + dbmanager.html + instance + () + + + + ~DbManager + dbmanager.html + dtor.DbManager + () + + + int + createMetadataEntry + dbmanager.html + createMetadataEntry + (int key, const QString & title, const QString & description) + + + QStringList + callback + dbmanager.html + callback + (int key) const + + + int + createCallbackEntry + dbmanager.html + createCallbackEntry + (int key, const QString & service, const QString & path, const QString & interface, const QString & cancelMethod, const QString & restartMethod) + + + int + createTransferEntry + dbmanager.html + createTransferEntry + (MediaItem * mediaItem) + + + bool + updateTransferStatus + dbmanager.html + updateTransferStatus + (int key, TransferEngineData::TransferStatus status) + + + bool + updateProgress + dbmanager.html + updateProgress + (int key, qreal progress) + + + bool + removeTransfer + dbmanager.html + removeTransfer + (int key) + + + bool + clearTransfers + dbmanager.html + clearTransfers + () + + + QList<TransferDBRecord> + transfers + dbmanager.html + transfers + () const + + + TransferEngineData::TransferType + transferType + dbmanager.html + transferType + (int key) const + + + TransferEngineData::TransferStatus + transferStatus + dbmanager.html + transferStatus + (int key) const + + + bool + callbackMethods + dbmanager.html + callbackMethods + (int key, QString & cancelMethod, QString & restartMethod) const + + + MediaItem * + mediaItem + dbmanager.html + mediaItem + (int key) const + + + + TransferEngine + transferengine.html + + + TransferEngine + transferengine.html + TransferEngine + (QObject * parent) + + + + ~TransferEngine + transferengine.html + dtor.TransferEngine + () + + + int + uploadMediaItem + transferengine.html + uploadMediaItem + (const QString & source, const QString & serviceId, const QString & mimeType, bool metadataStripped, const QVariantMap & userData) + + + int + uploadMediaItemContent + transferengine.html + uploadMediaItemContent + (const QVariantMap & content, const QString & serviceId, const QVariantMap & userData) + + + int + createDownload + transferengine.html + createDownload + (const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QString & filePath, const QString & mimeType, qlonglong expectedFileSize, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod) + + + int + createSync + transferengine.html + createSync + (const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod) + + + void + startTransfer + transferengine.html + startTransfer + (int transferId) + + + void + restartTransfer + transferengine.html + restartTransfer + (int transferId) + + + void + finishTransfer + transferengine.html + finishTransfer + (int transferId, int status, const QString & reason) + + + void + updateTransferProgress + transferengine.html + updateTransferProgress + (int transferId, double progress) + + + QList<TransferDBRecord> + transfers + transferengine.html + transfers + () + + + QList<TransferMethodInfo> + transferMethods + transferengine.html + transferMethods + () + + + void + clearTransfers + transferengine.html + clearTransfers + () + + + void + cancelTransfer + transferengine.html + cancelTransfer + (int transferId) + + + void + enableNotifications + transferengine.html + enableNotifications + (bool enable) + + + bool + notificationsEnabled + transferengine.html + notificationsEnabled + () + + + void + progressChanged + transferengine.html + progressChanged + (int transferId, double progress) + + + void + statusChanged + transferengine.html + statusChanged + (int transferId, int status) + + + void + transferMethodListChanged + transferengine.html + transferMethodListChanged + () + + + void + transfersChanged + transferengine.html + transfersChanged + () + + + + TransferMethodInfo + transfermethodinfo.html + + TransferMethodInfoField + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + TransferMethodInfoField-enum + + + + + TransferMethodInfo + transfermethodinfo.html + TransferMethodInfo + () + + + TransferMethodInfo & + operator= + transfermethodinfo.html + operator= + (const TransferMethodInfo & other) + + + + TransferMethodInfo + transfermethodinfo.html + TransferMethodInfo-2 + (const TransferMethodInfo & other) + + + + ~TransferMethodInfo + transfermethodinfo.html + dtor.TransferMethodInfo + () + + + void + registerType + transfermethodinfo.html + registerType + () + + + QVariant + value + transfermethodinfo.html + value + (int index) const + + + + TransferPluginInterface + transferplugininterface.html + + virtual MediaTransferInterface * + transferObject + transferplugininterface.html + transferObject + () = 0 + + + virtual TransferPluginInfo * + infoObject + transferplugininterface.html + infoObject + () = 0 + + + virtual QString + pluginId + transferplugininterface.html + pluginId + () const = 0 + + + virtual bool + enabled + transferplugininterface.html + enabled + () const = 0 + + + + TransferDBRecord + transferdbrecord.html + + TransferDBRecordField + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + TransferDBRecordField-enum + + + + + TransferDBRecord + transferdbrecord.html + TransferDBRecord + () + + + TransferDBRecord & + operator= + transferdbrecord.html + operator= + (const TransferDBRecord & other) + + + + TransferDBRecord + transferdbrecord.html + TransferDBRecord-2 + (const TransferDBRecord & other) + + + + ~TransferDBRecord + transferdbrecord.html + dtor.TransferDBRecord + () + + + void + registerType + transferdbrecord.html + registerType + () + + + QVariant + value + transferdbrecord.html + value + (int index) const + + + diff --git a/doc/html/transferdbrecord-members.html b/doc/html/transferdbrecord-members.html new file mode 100644 index 0000000..64b12f1 --- /dev/null +++ b/doc/html/transferdbrecord-members.html @@ -0,0 +1,42 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for TransferDBRecord +
  • Modules
  • +
  • TransferDBRecord
  • +

    List of All Members for TransferDBRecord

    +

    This is the complete list of members for TransferDBRecord, including inherited members.

    + + +
    +
    + + diff --git a/doc/html/transferdbrecord.html b/doc/html/transferdbrecord.html new file mode 100644 index 0000000..de12b41 --- /dev/null +++ b/doc/html/transferdbrecord.html @@ -0,0 +1,88 @@ + + + + + + + Nemo TransferEngine 1.0: TransferDBRecord Class Reference +
  • Modules
  • +
  • TransferDBRecord
  • + +

    TransferDBRecord Class Reference

    + +

    The TransferDBRecord class is a simple wrapper class for TransferEngine DBus message. More...

    + +
     #include <TransferDBRecord>
    + +

    Public Types

    + + +
    enum TransferDBRecordField { TransferID, TransferType, Progress, URL, ..., RestartSupported }
    + +

    Public Functions

    + + + + + + +
    TransferDBRecord ()
    TransferDBRecord ( const TransferDBRecord & other )
    ~TransferDBRecord ()
    QVariant value ( int index ) const
    TransferDBRecord & operator= ( const TransferDBRecord & other )
    + +

    Static Public Members

    + + +
    void registerType ()
    + + +
    +

    Detailed Description

    +

    The TransferDBRecord class is a simple wrapper class for TransferEngine DBus message.

    +

    This class wraps transfer method related information and is used to pass that information over the DBus to the any client who is interested in about it.

    +

    A single instance of TransferDBRecord contains information of a one transfer record in TransferEngine database. Usually clients don't need to fill any data to this class, instead they can request a list of TransferDBRecords from the TransferEngine and access its data via value() method.

    +
    + +
    +

    Member Type Documentation

    + +

    enum TransferDBRecord::TransferDBRecordField

    + +
    +
    +

    Member Function Documentation

    + +

    TransferDBRecord::TransferDBRecord ()

    +

    Default constructor.

    + + +

    TransferDBRecord::TransferDBRecord ( const TransferDBRecord & other )

    +

    Copy constructor. Copies the other instance to this.

    + + +

    TransferDBRecord::~TransferDBRecord ()

    +

    Destructor.

    + + +

    void TransferDBRecord::registerType () [static]

    +

    Register TransferDBRecord and QList<TransferDBRecord> as DBus types.

    + + +

    QVariant TransferDBRecord::value ( int index ) const

    +

    Returns any of the TransferDBRecord values based on the index. As an index it's recommended to use TransferDBRecord::TransferDBRecordField enum.

    + + +

    TransferDBRecord & TransferDBRecord::operator= ( const TransferDBRecord & other )

    +

    Assign operator. other is the instance of other TransferDBRecord to copy this instance.

    + +
    + + diff --git a/doc/html/transferengine-members.html b/doc/html/transferengine-members.html new file mode 100644 index 0000000..dec3f17 --- /dev/null +++ b/doc/html/transferengine-members.html @@ -0,0 +1,39 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for TransferEngine +
  • Modules
  • +
  • TransferEngine
  • +

    List of All Members for TransferEngine

    +

    This is the complete list of members for TransferEngine, including inherited members.

    + + +
    +
    + + diff --git a/doc/html/transferengine.html b/doc/html/transferengine.html new file mode 100644 index 0000000..7607cbb --- /dev/null +++ b/doc/html/transferengine.html @@ -0,0 +1,195 @@ + + + + + + + Nemo TransferEngine 1.0: TransferEngine Class Reference +
  • Modules
  • +
  • TransferEngine
  • + +

    TransferEngine Class Reference

    + +

    The TransferEngine class implements the functionality for different transfer types. More...

    + +
     #include <TransferEngine>
    + +

    Public Functions

    + + + +
    TransferEngine ( QObject * parent = 0 )
    ~TransferEngine ()
    + +

    Public Slots

    + + + + + + + + + + + + + + + +
    void cancelTransfer ( int transferId )
    void clearTransfers ()
    int createDownload ( const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QString & filePath, const QString & mimeType, qlonglong expectedFileSize, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod )
    int createSync ( const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod )
    void enableNotifications ( bool enable )
    void finishTransfer ( int transferId, int status, const QString & reason )
    bool notificationsEnabled ()
    void restartTransfer ( int transferId )
    void startTransfer ( int transferId )
    QList<TransferMethodInfo> transferMethods ()
    QList<TransferDBRecord> transfers ()
    void updateTransferProgress ( int transferId, double progress )
    int uploadMediaItem ( const QString & source, const QString & serviceId, const QString & mimeType, bool metadataStripped, const QVariantMap & userData )
    int uploadMediaItemContent ( const QVariantMap & content, const QString & serviceId, const QVariantMap & userData )
    + +

    Signals

    + + + + + +
    void progressChanged ( int transferId, double progress )
    void statusChanged ( int transferId, int status )
    void transferMethodListChanged ()
    void transfersChanged ()
    + + +
    +

    Detailed Description

    +

    The TransferEngine class implements the functionality for different transfer types.

    +

    TransferEngine is the central place for:

    +
      +
    • Sharing - Provides requires plugin interfaces for share plugins
    • +
    • Downloads - Provides an API to create Download entries
    • +
    • Syncs - Provides an API to create Sync entries
    • +
    +

    For Downloads and Syncs, the Transfer Engine acts only a place to keep track of these operations. The actual Download and Sync is executed by a client using TransferEngine API. For sharing the TransferEngine provides an API containing a few interaces, which a share plugin must implement. TransferEngine also takes care of loading and executing the sharing, based on the API it defines.

    +

    The most essential thing to remember is that Transfer Engine provides share plugin API, DBus API e.g. for creating Transfer UI or Share UIs, it stores data to the local sqlite database using DbManager and that's it.

    +

    How to implement a share plugin see: TransferPluginInterface, MediaTransferInterface, MediaItem, TransferPluginInfo

    +

    TransferEngine provides DBus API, but instead of using it directly, it's recommended to use TransferEngineClient. If there is a need to create UI to display e.g. transfer statuses, then the DBus API is the recommend way to implement it.

    +
    + +
    +

    Member Function Documentation

    + +

    TransferEngine::TransferEngine ( QObject * parent = 0 )

    +

    Constructor with optional parent arguement.

    + + +

    TransferEngine::~TransferEngine ()

    +

    Destructor.

    + + +

    void TransferEngine::cancelTransfer ( int transferId ) [slot]

    +

    DBus adaptor calls this method to cancel an existing transfer with a transferId.

    +

    If the transfer is Upload, then this method calls MediaTransferInterface instance's cancel method. In a case of Sync or Download this method calls client's cancel callback method, if the one exists.

    +

    Calling this method causes statusChanged() signal to be emitted.

    + + +

    void TransferEngine::clearTransfers () [slot]

    +

    DBus adaptor calls this method to clear all the finished, canceled or interrupted transfers in the database.

    + + +

    int TransferEngine::createDownload ( const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QString & filePath, const QString & mimeType, qlonglong expectedFileSize, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod ) [slot]

    +

    DBus adaptor calls this method to create a download entry. Note that this is purely write-only method and doesn't involve anything else from TransferEngine side than creating a new DB record of type 'Download'.

    +
      +
    • displayName The name for Download which may be used by the UI displaying the download
    • +
    • applicationIcon The application icon of the application created the download
    • +
    • serviceIcon The service icon, which provides the file to be downloaded
    • +
    • filePath The filePath e.g. url to the file to be downloaded
    • +
    • mimeType the MimeType of the file to be downloaded
    • +
    • expectedFileSize The file size of the file to be downloaded
    • +
    • callback QStringList containing DBus callback information such as: service, path and interface
    • +
    • cancelMethod The name of the cancel callback method, which DBus callback provides
    • +
    • restartMethod The name of the restart callback method, which DBus callback provides
    • +
    +

    This method returns the transfer id of the created Download transfer. Note that this method only creates an entry to the database. To start the actual transfer, the startTransfer() method must be called.

    +

    See also startTransfer(), restartTransfer(), finishTransfer(), and updateTransferProgress().

    + + +

    int TransferEngine::createSync ( const QString & displayName, const QString & applicationIcon, const QString & serviceIcon, const QStringList & callback, const QString & cancelMethod, const QString & restartMethod ) [slot]

    +

    DBus adaptor calls this method to create a Sync entry. Note that this is purely write-only method and doesn't involve anything else from TransferEngine side than creating a new DB record of type 'Download'.

    +
      +
    • displayName The name for download which may be used by the UI displaying the download
    • +
    • applicationIcon The application icon of the application created the download
    • +
    • serviceIcon The service icon, which provides the file to be downloaded
    • +
    • callback QStringList containing DBus callback information such as: service, path and interface
    • +
    • cancelMethod The name of the cancel callback method, which DBus callback provides
    • +
    • restartMethod The name of the restart callback method, which DBus callback provides
    • +
    +

    This method returns the transfer id of the created Download transfer. Note that this method only creates an entry to the database. To start the actual transfer, the startTransfer() method must be called.

    +

    See also startTransfer(), restartTransfer(), finishTransfer(), and updateTransferProgress().

    + + +

    void TransferEngine::enableNotifications ( bool enable ) [slot]

    +

    DBus adaptor calls this method to enable or disable transfer speicific notifications based on enable argument.

    + + +

    void TransferEngine::finishTransfer ( int transferId, int status, const QString & reason ) [slot]

    +

    Finish an existing Sync or Download transfer with a transferId. Transfer can be finished with different status e.g for successfully finish status can be set to TransferEngineData::TransferFinished, for canceling TransferEngineData::Canceled and for failure with TransferEngineData::TransferInterrupted. In a case of failure, the client can also provide a reason.

    +

    This method causes statusChanged() signal to be emitted. If a sync has been successfully finished, then it will also be removed from the database automatically which causes transferChanged() signal to be emitted.

    + + +

    bool TransferEngine::notificationsEnabled () [slot]

    +

    DBus adaptor calls this method. Returns true or false depending if notifications are enabled or disabled.

    + + +

    void TransferEngine::progressChanged ( int transferId, double progress ) [signal]

    + + +

    void TransferEngine::restartTransfer ( int transferId ) [slot]

    +

    DBus adaptor calls this method to restart a canceled or failed transfer with a \transferId. In a case of Upload, this method creates MediaItem instance of the existing transfer and instantiates the required share plugin. The MediaItem instance is passed to the plugin and sharing is restarted.

    +

    For Sync and Download entries, this method calls their callbacks methods, if a callback interface has been defined by the client originally created the Sync or Download entry.

    + + +

    void TransferEngine::startTransfer ( int transferId ) [slot]

    +

    DBus adaptor calls this method to start the actual transfer. This method changes the transfer status of the existing transfer with a key to TransferEngineData::TransferStarted. This method can only be called for Sync and Download transfers.

    +

    Calling this method causes the corresponding statusChanged() signal to be emitted.

    + + +

    void TransferEngine::statusChanged ( int transferId, int status ) [signal]

    + + +

    void TransferEngine::transferMethodListChanged () [signal]

    + + +

    QList<TransferMethodInfo> TransferEngine::transferMethods () [slot]

    +

    DBus adaptor calls this method to fetch a list of transfer methods. This method returns QList<TransferMethodInfo>.

    +

    Transfer methods are basically a list of share plugins installed to the system.

    + + +

    QList<TransferDBRecord> TransferEngine::transfers () [slot]

    +

    DBus adaptor calls this method to fetch a list of transfers. This method returns QList<TransferDBRecord>.

    + + +

    void TransferEngine::transfersChanged () [signal]

    + + +

    void TransferEngine::updateTransferProgress ( int transferId, double progress ) [slot]

    +

    DBus adaptor calls this method to update transfer progress of the transfer with a transferId and with a new progress.

    + + +

    int TransferEngine::uploadMediaItem ( const QString & source, const QString & serviceId, const QString & mimeType, bool metadataStripped, const QVariantMap & userData ) [slot]

    +

    DBus adaptor calls this method to start uploading a media item. The minimum information needed to start an upload and to create an entry to the transfer database is: source the path to the media item to be downloaded. serviceId the ID of the share plugin. See TransferPluginInterface::pluginId() for more details. mimeType is the MimeType of the media item e.g. "image/jpeg". metadataStripped boolean to indicate if the metadata should be kept or removed before uploading. userData is various kind of data which share UI may provide to the engine. UserData is QVariant map i.e. the data must be provided as key-value pairs, where the keys must be QStrings.

    +

    TransferEngine handles the following user defined data automatically and stores them to the database:

    +
      +
    • "title" Title for the media
    • +
    • "description" Description for the media
    • +
    • "accountId" The ID of the account which is used for sharing. See qt-accounts for more details.
    • +
    • "scalePercent" The scale percent e.g. downscale image to 50% from original before uploading.
    • +
    +

    In practice this method instantiates a share plugin with serviceId and passes a MediaItem instance filled with required data to it. When the plugin has been loaded, the MediaTransferInterface::start() method is called and the actual sharing starts.

    +

    This method returns a transfer ID which can be used later to fetch information of this specific transfer.

    + + +

    int TransferEngine::uploadMediaItemContent ( const QVariantMap & content, const QString & serviceId, const QVariantMap & userData ) [slot]

    +

    DBus adaptor calls this method to start uploading media item content. Sometimes the content to be shared is not a file, but data e.g. contact information in vcard format. In order to avoid serializing data to a file, pass url to the file, reading the data, deleting the file, TransferEngine provides this convenience API.

    +

    content is the media item content to be shared. serviceId is the id of the share plugin. See TransferPluginInterface::pluginId() for more details. userData is a QVariantMap containing share plugin specific data. See TransferEngine::uploadMediaItem for more details.

    +

    This method returns a transfer ID which can be used later to fetch information of this specific transfer.

    + +
    + + diff --git a/doc/html/transferengine.qch b/doc/html/transferengine.qch new file mode 100644 index 0000000000000000000000000000000000000000..39e8c8bab6af1e24bab599d83305ac645a06b83e GIT binary patch literal 53248 zcmeFa1z21^w=X;}*x*py3KVyDcemnF+})ibh2kwP#oa01;$9qzOR?gv#i8HOzJGh= zoO7T1eD~h-p61yT_DWXPN`5;lS(9WB&z0pYT}+A1?44{4U5Hr$Pyh%BfDkb;001Bb zf7rmE-vSEw2I@Bg{1@U+_y6ja6hQx#68e!Dc>BnM`18-dV*i!?3xQt<{GUSr9u5ht z3<9_f0AIhtF9d!e@NbF$76cH$s_JBD=WJ%`#2{{GZfR%Az|6$-X#bGFH30Ae9Q_Kv z5cq|_zZ(K*kU#*n%im1j^oQlcfky*uW(FpPANCIc{0abHzrrsBej)I0hX4WC)&&(z zZS9GFoBn^!{=~oAKP2!Q0C)?IeuZBM{6gU09|0&xAP52y2mu6v9@pmJfU}QnW(JP| z7r+zXK5z^86}b2_@!ubeUoHHFz`rE|Ocvl~G3tRM24!$WF9we29vAd!DZvp9AvmH& zef<9amsR~o`d9dcz%K;;MlNB*mkzYqYh1{i@+U~&Js{}%uN z2K)l$7XrT!_&<(-F9b9I6yWnWy%+#XfE~aDU<&X6FaRt7E&yAA4LDB|pa4#@1=s_K z0jdBefFYR68DIuZa{{M`gDLYLB~8JU3OMy=jwv|Z7)%iZ#K0wu0j^*Pk7+L8@-AS0 zdw|`e{lfu70N|?(f*K+T5&|+02m%KE*Kx3bfW@Y!h6q4#F*LFTv%0{SXEd=PMr9!oWxYpCdASTs^XI3D#S`E((=M8TEw#AT6B+W#H!+&s>IaZ zkg(Y7><|ICKQu{L+PIiH3A?yBSsJ;z{M7f)(tv-_`p-E2rS2bf{F`zcAS^a5Ekppy zpOin=?MFL*O8uRL`X?%X&-^cGvw(ude)bF^0Q*nc{-o*0E%ZOp@*{(o>QUJrc+wI7 zU911dBBl-?hK9u^A%O_|`TV5qOiVp~NcrOq<}Zr=NdGUigpOF+#MI8k(#+D-=?9Q> ze?0d;YVo6jf2pvrow0@e&l1Gc#xOs77=+7XpZcL++QroNk6Qjt!Tw`Sf6x1KZNb%g zZ08>}Ag1|Mk)C7w0bo{@Wt} zUjK&x{apWlw0~GY9{_?Bq8O3^G7*Rf3%;O;H_+t!}H+3<59OHhBp?@LJ z|1yUDCF{qeNvvw>;X+5OZfN6b`nM4>015<)&B_W9!1$N(`A@_BZ$t5)k`Vr)=bteA zhf~CF{C}RG0wCdGu{k+^o1nnDOn>)%o}0S-XzD*rMEXlr{wd3!r;q>8SujKRIaU4i z6&_{%4)b3K}^a;o&FH})8YA>@AFrUbi}HbE;he; zw=T#(UA~{)?5CKY?foI~$1U1lHUE+Eue|5Kd9Xh^^bz(`~Ux&8h#c3g}^Ta{$D|W90aZjDI7Q=h5<)-kDGotKyZW& z`RMoowuo_qf%m-!ylYy~dreEO~0>2RW{|f%v_;4OPH0mP(fqAV|PNgQy`KO^j>}?F`MquSQw8*xJDVi{sKf#9~JBKlzA7Z48~A ziB(L&uTz=Y8JlW=U_jgu0T9N9Ha13v#@3eLRa_@C@IJ^7fuMgWQ1oy7(!cTly8-8*3Bws$i5Arts7W&ZYP#6(nnu>ZYOJxCakAVdJ{Z(@HUXKZ5$-W~WM z8uC9C{j&+8KZ^XlcxVV{I3y6#v-~W|8D>Q zJOmE>8#nz|(|#fFZ;k*dB#@j{)XDURKLg%NF=b(5W~FChqi14OWn$-HXXjyMMuh;9 zJaII(P&ajQ275i=Hvqw)VCbgA&_kFKOC)wZ$X*ATt;cd$4%0x52cSu(lCHp>u5`0N z&*6D+f1nAv4oke+%6xgaz??c6sgOVWNzI41&~I)a7i29Zf~T&^O)g{J*HBs6A3sA@ zZb{m{)JLu#&#lN38;|?ZlkPd>c~DX4N_Ta;TANa;@EhWFQ7Jw-?;dNsknFF|^NVjc z-`O{N&^B6GdBD;Tb(?%qm9`8qs4wx9c^5JxeD^BBa>*>7Z@4D~Wql%r3ttir@TStz zhK=!sXu8p4QC1HWUwpwga%-s7=dtVDpIJYN5k|?GY@|)g`I~L`W0o^*u2``%0M)Lm z3zwK2n6UcE8hoUjIA|@WYsF(G-&h#uM1LY>J#*Nv%j%Kk!OSzO`FMrJ>5oWz4fK#2 ztS2^DOEF)-{~}DG3-@CC+gd-6<9swX3_g|J>h8~8ep*>?P1&B%Zfknq%ugoxz;qo} z5a=V^OIH!AJyM;V7H7U*G}yNMu2Jro=REEz(-2QE6cJ{`WI0bNQ#z{4$B{AY7}2d8 ziiC*Z)0^aU|92j#7*n|LbjI=tly8=UL~s4P;RaoG6mq|xII0wk^+$BM#c=&jM8VA~Gznh8~0VRMd zxJwecx9w1_!7ZUDm!nz%v?g_8TAVhNL9ZOHp^??0y_L44$S(9!P;HrTrJwm~55}lYZ^IWC&GRA`7{Y5ckkxEa_{887bg}W8($Ge?|0}>7#--Xw0dLR3`bzU?>1I5EARfRL6S; z`(#l5NeJB&Hc^eQG3(SC{riDo+<}44XOiPe!qw6dkx=AxY!saFGV9x-q{C(+&aLk| zg${OTdQ?c(FP@ivCm<6~NK+b2q7m)6#GF_C0d2y zG_SuhFX^%+lc;LN3~gIt1RTTTG52vwctU=*SJ+cN;o7x6{!AI>$T~hmxVrU8c=kgH z(vorkiUmlTMq4U0Di#fETq*T6|5d}pmb^w%S3V{YlCnGH5zIiJeCpHKCK$M3SIE~( znMo`TuW1@AofupwR43xAz58wn1j_hF2(snio}b~Gn5@1vPjRqw2|aEwUt&KkFv6N+ zbqk*~jd0x{_A4;Ig`Im3@3KV!i0zVpZ8+tldDyj`hLca(wlCi@={xoX$eUVC-Hl_^ zVNkzy8VT<_iMjQ9Z>;NUz)~kamgU@NLE@#gkZ(Pd^ZVUox-8K4&_e$EmxR@^*bXsF zRSsOQRX5Pu5_eTXJM2OToh(~2xVWID52x7EL+EP(}29n%m+{p5Kxo=+Mwbav51@!Ck zd$e6mN+xVaKWWopUG=y$5Wj`Y7TrkuTK=4Vgyn!>Rv3_q=$6nfUgciwO6urIq<>hlu?+=O9YMI_T zsMb6y3wB5R-m?KNm%^`()a@tRDbBkT$@z$vD)p)Zcis43u6@o6G$>_crRUQUVE1iW z)Ny0k>Ow#ml^ZRO$tvI*y@sr0URf3j2Bi0vsyUeGfKN5o$(i{V4RVOa^Cvq*2^ii> z<{)LOSpx2uY7HDmYBhPhs}y^`PxisTvz?)aOza`2Fd4K79LCGhMm8xTvZ%1JlHdNU zw|J-)lm{Vi_&kw@j70EVTpmdhdu8hyilL-CQt+|mHqCK;;8Xwf7}DX+*7?+Qv!VAQ zb`AWj6EQGGtUPMvB8%2lZ}wI3XD{G+(`B_>r>Tk#Z5y~lh2-tWdU;C`eHYp9Wo-rn zG581GR8I|y`0%H%(A!Vjf?`ZMb<|K2_(_IsW%u!E=J9SzIA#VAHFTXdt0g(xF0C1w zp)h5ms1r-(?u!oJrMi>ne9=B3?B3^-kX!kA%bGl=ePO9I0&|9Zh~{LcaTv&-IQu{ zipO=~Cttsh@`O|)Ym?DYN~fOI<6jGKF$-Nk*i%BwBGr}N27Gc&-Ok(*m7#T%^CE&S z6g$PzuiaP~e#5JE!VGE|{Js*?ciI^ya%jg1_tAM}P}OS{Dz^h}Lef>AKHdT3P5G>b1A5X5H|z=h$;?bayejj$I2uCmZdaXH4jr zIup;2AKbRC&_C%lR&=Kr;nU>vGd3$$em>hi+F|2y`{2W3g7k@kAEiur)7WehIQvZk z-jF+;azif3$E86}a+KW1N3n~AoL3rkSmgb2?;(@W*vhJTVkzhR(YJ72b|o3PqUe4o z(w8jaHAiH+4q`xQEH%ZP6BIN;my}YQfyC$}UtA-#DK$1p)#!}tuA)+h2X=>|MhBGQ z<;Lw6MSk5R&^~K8H)B5E%lT|}O+f_Fl)2Xe+8gTZ9>ncs1SC&u6pyU}KNj@DoXO&{ z7)a15S!QIbr+uittogLlE&e2f|Lb>U$F-pEkU?oVoR9XO08|ff>91#8tp zZne#38rfpF^_OW+NsRojw6ktd8%nxJhss$_aFhfo27GPsHT9cqx=!hF`8`~d=3GR- z?(9zao6|A6lb~0zc{JuIbsrCVB;yr_+|SWn&7rHmHlw__|*<7}QC?BOIOhlABrYjTUr-q7| zxhlS8<%rtgO^g2VwSw~$FP}PE{CVP&k4>%O><79l?Yas%bcx^bs~m@dCv&kV<5jmq zTGwP)lc=dOm>Vm^0%V-c(oMx>de!hgMZJo3d&kY1E{?7*&oz+#LRZ38{Yw@{fC+xZ zX6&mKY4M4==MXlev>3*Cw-;#sMj-$=IiHZc7&y77jAX}%8ZJme1wiy=tSDIqS*g+a zm3+jwSC%HPup31n)ta(N5_+70(C(UY(6O|qu^e2L*8ZI3C|4__WDbJWLcwq7&j}BP z_&9Z3kc`Vs?5cDY%;2BMhU${$%xk$&YwC|Jl7H)w%|sBO$~au^_gZ+v@Cp4u+99}` zMGU7uZvahrng^LyA=UIn`AM#Fsc7eW9cKm`(w$Cy8beH1#Ts}LM{h9&Haf;Ce)Ptn z*$Is8LrEM zS+9oi2DT<$w6eslTlIq2=>r!UcJ$WcA&uvbzviT;j{t+n%JZrpm<^vc({@^F@X-2x z(a9!vn~$=QmzfDWlq|tWG1-|eB(Je1S$FV6B_l%eX4e#wDO-51ZrZEYSRxb3u(;OK z&^b&ls_t-<-jMjITc+)c`6w-qPGpOKhOO2J7oP)cb@NUZ3>WDKH`B6~!s6Xlm5KoS zHwA8IMV!8rWwb@dEirnXDM@(~r*zte#qKr3`i(^O=7%m7vY~XKUD#9$P22Mp-9z-! zUL9kjtL^O#N)vSoyF0-%d;#b0bT3Wk2KRx!9a;9zP-29Z75yz0CAU>}L$Xl{-}tw{ zHH|Hhco~0zZfcX%SkY?>neP0u-2bguk5v7OjPApOWuPHV@T;&Q`0?ocyRQOQpa6_}lTGl{_)9-Mj6%p?(a1kbd#Xop8e297u`&XhT~r|%SM-)U%Y zejPprTDfhhHINb>R@7X|L{EF4I1b#jPM^D#enZ5T`FPRMwz1=OYUmjp7Bfa~wBt-) zgWuGJGV>wpEbHUdI_G}3!~3$j zR^rlO2}@Kb0GMljo2AtPk-6>^7JMUDwpbJ;VgoxvAKop<@dpZ(j+LrTYTjjRk6}m5nCjc=ARGVZ9`?oylSQDw;bN%@i|n<*n`DRGQTKRyKya zu%!y&W4i9T^u$|E)j;_jE)^lP|=z4;tKKJ|fCI zIrx&-Y>NQKuuo`mPa_v}Avt)Ry%f*l0GGqoJp3pbst07|J5qqsRAN8+HaHdq(a*`Y zP)xRis{T3j0pO?n1pNCy0Kkv^KL|zu`1%$8a|EI!fKY&Ur~m+Nhez75rjGpr2ZrBh zCD-$a7yh%_sY&e0wFQnr&{B%@32{ssQ%q&%-O+R9a4dRk+>GYSd2?-Wce}%zjIaCB z>*V5U8xSar^U&yv8j^bg=XY!APm;19iC{0pT`#<9Q7|TwU3l=ZR$45k8r( zvP;k9*tT+yxs5WhTl&wJp|h2ZdCNlCwD{f6A0SwKR_N_he{tvNNF>xG8p|cShU8DR z6#~(ZcPvQj_z|0+uk*MQv6qt^h1jvBrTy6YN$kF!)TW%J-31M+I0i8p4h)bf9Mfw+ zjYpX;hK7*B6ciLNW%R1w<1S+hz1MH9$%q18p?#mtIJd#vjh4Vf&YEkDE2QX*$_0`m zN3NTarJSWA7j?nSz_B4yx`&*M3^pn$%+-rG8V7@J%dhV?yjqhWn5zX%Ed^8iXy}T3 zv>tMvQ^Thbn~%Cwnj$tp*uw=ibDjuQ^F?^WZVhCCS`3a{g$~K9OC zicESzS6`5Wu)V&998t6M*r4LVW5;W{?AwIX@IO;K8?bfBt?~$ig5?{Dm1o1qQ8b#odr9jYV3?S?t0q{P{C9 z_nNnSL7x|7L`Uk(SOs2@C#OmEyza^l%05SK_B<;v&tTO%!NcN%6Gn_-&{9TOwJA0U zoX>;*N|_^7O|x-K$J!L}HDh?l4rAO*rPM=r%i@c3m4KHki--A}U=HHK_G-ktAquVp z&5`%)TQWF^ZcDOQ*xNT_F3y>WhUfb91ds%?p@{EHqQ28TsR=A>9B?kM+a|-ql%y!% zQa*@Ty=KnDQ!?VtXioeT__y)@kBI8Mq8>8g)@qfIIimCY7rLrPn(5#@cEsV=ELR7oSucGOhz=e`ITJ-*aj+y)|GwLwn!e2r4QoK-iZWy zZ+$$(FVJ1^5mX3{-jhOsuZ`t44<-rVel3%`a}C3$@EqAxeN{*dzJ(3-*%mtrmWq5@ zMM#%jaSt6z40+!Ihqc64!mp(*%S4$Z4`YHbs!ufy*72}pHVww-t*NSvyez)@1k~{M z>#2(CZcRJl>aK+OdNHigeDWORk*+A^6v90^7BY<`U%Tu=p-Z%)BIFSqkDHF_TtL1R zPOL84kH!*hQc$HWll;_jsz|{P8gG4lnC1e!s$7^`hVK*OwN=?0OIX6a9-A?mF4kHbX?}E)Lar}eCuZ)UPAi5{>(U1aQ~j%%1Wj+qC{q)s&*|C zrMvfnsW=$TAJ5)%T*zvMviqYZVp^^R2@+jTIJP92&SV-D=Ak-P>p4ZeizNt$?OEr6 z1JBcA^s&edu0C2h3J%nRYzMie+*WbX;1atqJ5d+ov(-AW3=V2m41fXzbl7^Mhlx-U zA6CS$km_Zf3yUfysN{WFCR|Vdauj>4N@Egc*UNsyt@#w2wE{j(n)Y7foc6jIeqzGB zK$fnVBCQ$us6Cbkk){uY&oZD6DreUx_f7g}@@zI^HwiVk*r;{ZO*xyo;y({6one@h zN3F>{`QF3wX`d1*jK`I*G8M{*qiMIV@R?>Ise(Jn)F=+BY)Ni~O8NkeEZ%N@1oGun zS)J_(k(R4_o`9aKeQSEg4gRd+v!Vx@%a@284f)%Pi8dMugua*fh}Mz$HkknH+PQng z2>c@(k)j;?@|1ut`U-fpi&_a6evq#-X)G0jR5$skPyroLp=b@du%!BaTmnS5PY3h8 zT@>AEn~Z3fJm=tixR%1%D0t-zh<5PY-xPJ#S~JIhYIcUc7kD?sd>flBFYJ2WvI6a# zVzbS7aQ3<5B^8uM#}EG>zypA&2S@))A>0uf3Xot1b|G>-((=`1ofjk!TW>Y8Yznx^ z$o6<%_r@gD#`2%Y?eo;}St_Pug2Hv;nh@QowZFHvGdzu@Gc7m}$M}e_(zOO;^8Buf z^}csrs+=KkV*3+7iJT|F$`y@|uA(zD=yD>i-~DXaEJE;zfuzCZ`{C-0;tVTXC)a}$ zN5tB-5%NnP-7h|nDuB!S#IUHf!399zm-$`3=!N>I`5LL2QjZhwyKZd-t+HEuJjy5e z97uhstRn64AGxwt&JPwEUNEf4ZUq~Z6+L);Kry%tX3v%?qy)sFmjk9Tzs^WhFb1Zm zV%#-7Sb4ob>mW-4c?0EJB)(=rzND4&_EPgj31C!tj-Mg*4oD(Xm8GTQVv( zR7NmmDPx?Hp;>oG>l%T$ij&?CR-gz@BWe|brHq4*6~TcILbvvmojtVDm0iR!7=7QG zKe}(OD^H2}Y)H`?WKPVL!zY;ERDfR6W}9kC$rN_&y|o{K{phFRM+!ng0a75rN4Foq zZit4h{e%?i!;(I;xe`Qi75>eJ6k(U1tav__m+jahh@`fP^MrK4+HD4OeaTs4&Fi*y zOga{(=<4Ral<8@PC-6PZ{QXxM1TDFis+ao^j7BM;M%>?)Mi?a8yhn3`jvLN6&1+uT zzYwuHz8_u?tYjE%$A|7%rZg9J5a50N^2KmPB>=NMU73_a`1rIA_Jx%kHz@F%*FmMC zPjO<$KF5`ub}yOw%jnvKlP7T=7Q=YLpWyikm6-f4_EX}{wm*{@uhTLLG`E~(-3GBa zCW^rV3`dZF^-TlkuyJX) z8=mq7I9C{x%V5iwK6^g`je`TtYL}ZkSl0#lFG{|u7?X8@63KWMH9>Xi)1R5?wplswc7yjZFX z?6}oc6SG@sj)-C*yJRA|V)znza5Z1qB)F?d+ z3L=w6u52er*eN825p7;uyTl9?Mqt?|`~z1j?)O)B6jdSUdibTT1F?|RsZzp=#HMwK zB$(=S&>uJBy3){~q%ned6KN(~cXVN@CSQ3|Dw+u@YcvYDwBw@fC#&~_#GvMBm!ZmJ zZws@;XNWkt5S;cBI1lR04^q9eDvAFtKugrlZhi3f+bqg1kxYnKI`p)0YRR~3Qf#(K z$kp;Q7T!}lRwMI5)N}#KN`uA){$$Qvp~n5Yqr;IT&WH3$&nNt67$nHv!0ZOpaG49$ zp;2Tv=!+npt~n*TeGLtKF&8J!e1ag`Z&*MYVdTuFJ9}^b?pG+iVq#4~>0;aDZh+R5 zC0jz+LvP=0p&zhJD_=#* zz(QXi6#jYl^--o@r#msL(TFVYX`2m6?3-6>Rxqk#Vw5lj?_bDTJuS$VLTjp^LYFOn z`s@S7c|Jm!vm2oOs~l_nyPcdddRS+;^^c=g&#xRW%6eNyR&QQZ-4f_u7FO)K$2Pz2 z*^GDPe&OyM>u1N5kfXsk zqa$qOij;12E)K0IS(x1iJtAR@rlD_n=fQQ7pXP*C147p*XUN11&jS<;$JE&BLd&wb zW0arRS>-I7(7x}U&pEYNko+yDs zf&sy#;EkGSK*1{Qm9OgQ3jdC#B^UX<0g+_=f)vdQ)4XpM-;=iDd(ok1sv`K9C+n*H zxavQK)bn0!IL8qBP%rWj?_4bR%&RE<>^HaVhH=51z^GU){QuVGC`x&*=IPZ;_} z;HK{>uU>*mnKTVn&#BKdk?9E$xdL%gm38FjOuggpC{^@oTwhdcR#>ucm_$>*own-r za^N49Wqvoz<`q0QKcoMWkgl9l4L*V{^vI+iORa--0jfnjMKY)4)T!Ess)nlAxPyp% zw-{yrbFf!q@|vn{HHIv$4ie*C7mK`jBcvW{ZdcRY3-#~~>)yCmDH*_mB;Yq-CPz*@ z{H!?-Z&^*wQi3J{Jl}n@q)YZmhscTAR|^0}Tc4Qjl;yynHJ@aOE`zGgt>N_(^6{e{ z?JAWQHj|uO0maQ(C{k@7!@bR#J3DL=XcG#}wvE`u2uKG+Gdr^}tl-NM_l+;sP)fgt zNmVJ%i7+5U8&xL{l6&_G7-w$Z4?#p-hRK$lI$@EX528ve6>N29F+@Z$faa{@2YlaO zuq2%jS)w~C5ryS@Q;nh9ymD=f9qFT)H9yW1oUvyBmV>6Wy9k*3l z9NbY_OjQCEqbXT^v`&}&MQrKtc9v=ZBt0Jgwr#9A_7zG~cN64!aA+nljrH33DP-PT z!ZNt?({M?93GB&JZ<TGz5aA?0=ar3oVg7&H2 zQ_ig}7V2F{`GMzXveBrhYL$jfj>;RZxKRt3)9N^FGrqZFFT!!qfM1;n^e{SMPuyR~ zWE4Mt!De8kd4NOVvl7oiQi-nxob-Y`J!t zse?+dRUk>ry6-?~vdPbZRPpA@6^35o_{9bxOuprJ!AMoAwn}`)%guZcxCZlEW^Nc= zw*77oz{Qi3k6fh5g+bjtr`-FcbAVAJJY7Om5S?LiHsTxqKF>s5R=Yk(>t?hZp#ced zrWZ&PG##fR@$-@?%q9eKWdZTXuuaJ0+Raatqhj_k1Eaw9PlO(pRzgc=+m0h-)tiAY zV$`-fAclqt!AOhT`YdwOhQ5ML@hv&*zSXl_B({d@&T%|D8p`K2r~+R&xS!u4m7%WE z3E?u6UirsM^d1iHKiP+W0TD?2FdM!Q8{PxyGhdG(qLJG5HEYJu6m+hF9~d8Gu*1}r zC||*o=4j#lp*p@_%!op=NHRQI(wZ4c#Q9OU_Pr-^oK)(?1RJ=v zBwt|d1pA-OYJbBTNyY z&A(17e#K=%*iyi|D9yUZU7F&hXv0|H*WR~Z^-MR@QZm7-z4Lm{M@WmSQ-=juV~tAu z-W>{#C-ijzA`5}4XkM%}*}kzVmU0GU2D21Q7LuD1Hg|dLw-h+0iM^-F*g5RRlrA?i zDh64Z!6DYF?bhS46cjV)(1qyV@@dceX99Q0K3Rx07`s6;@u_ojq(-hv1(xUEDQn;_ zzAV{T*vt`96JrQH<;4YhMea=vA!EtUlD; zY78Wnrb~PSLbGa#SK?+0N;e|XGW2t8OcR$+nR+Lyv+*+2j z`(OB9=6Jxu&@9qj9LHsy90n?IS}%^v0s1QYgI#uWv}7xnDov!Bze*5kxQTjU6;&cu zzHF8ivW#^cW0Cj58q=-{FkZVi!?4h5*&;9rX0of8e}+?Xw9TP3=_g8aWwtc@DU<0S zm$XIWy$ubfCPyp5ZS_h-RT4R3_v{{i(kk)w2TELImE^;fC1El&vIMTT8ww23(At*a?1GT+mv0ADW@W8lFfMMWObox`y|Fv%A;(!L$G9WNU>%tz z7UpfAPK5jj(g>ofoRZ@)ns86qDW8v7829BB!jXnL1eg+we*nH}H919|xDPcN6{EzV z=NC-$CwhUOUtHs-zvTS-0L4_y9q>7cwk0Tb42I6!aRJzxQH9OT7RM>Zx>8vr3o){T zsV*VkugGpNwi@cJZ2IOiTiZ~aEFf9W`nwF7!&ccKAEDZV?}kLyf$_Y^^oQpbp85eh za??)IL;#ft{(AHMlc6`yTt<;U4tenPD?4jsxoJFSYSGxXw|s+JM?8B06X?ok?4Du! zHtV~OQL6o%2hW z{ger{WuCr=lnxqaz)zad84>&vm6t+@GN+R2`Jg~Y+k)9>E~wiX`C$r=!^(9@1ub96 zHAOAJ7mqhGa-AbF4|hVD7=~yEi9aGoD$lmepF1cheM@dFJM}6Nx;)q1eSj*6+VVma zqBwy#l}o3(9p@;8>4YkBa>=nS=;UCD>|GmX-$g1iRKR%Cme0y2s+1y>X{5}^SM2R)*t*{PA?q|nm7e~Uw-ou<9o(%zTi;U&+F1y;cbQOJ9PeU z4XyH@S^eSP_6`Ls$t>SPU3u*VOOj4~m~n&4)synMZITT#jBlviHjc}oc@^p4JVYC0 zTV49Vz$7{@|MuKq$8k7`G}F-U>9*Ka(?@dbfjz$uSTgtY&kFEutwTGBFvSUx-kvgOI&NILF0J!%fh-$pVq9 z@T~FseL7o}N1T)0md()Dn|c;k0x9Ok=R?D#xYKZ=r8lcH(me)=X*KZqR$aoba53K; zb!WR1RfUGgK1-F2eUTC-@16(P>90o4&`65H*Ui^e2_RBnLDaP2=ZD=n9~2k0N&;GQ zcJY}@-reZqBU%*Ie{Bm0*?n2#@ag<>WJ`63w$_Ae)#i3`cMfWbA88YE1&EFuEd*=$ z8~R({WT%iT;i&?}%d98og~f9OxxR%=E`r#ih0QLRoIw($?36`PQ*z`am$Ozy1pC9! z91P%ZppbbQOwV}THvOa)s??Vy1(taPzQ`t3xI&w5CF;)UC6M}M7=x}z2aK!k+`T0y z1E*hR&An57DJzYi)Qc(qakAAlq0tm(KCW9?X58eUUHP-gKBo6hbqCQbPCbCn#rBB; zXOAJ=d?NI~0D9rZioqf=?h`H+x&lNc)^)6Emx|njvZ4zA20{y+`IW;bdUIP}kv3_D zWI_1(gV}^c+c;c2x@*+=LQBnSEKZtkJT#Y1N&^1IEZb_ip>-Y#sZjyN+-S>BWz2G*)!Ty zCAEq}mGfLkRt#$T<#VWI-ZWl1LueZ#v?xs!*T9vJxUb9S(k|shb%^q`qdJuJGz?;{ zc1tx#A(in^bKZrG`ax5^*s+ln;=4t^L>6&w`&wO-_66`cF%oKsz+kPYwaiU9?zS~t z(_3fj?H8Ea%bpWIp+%QSn#2~^O)+w^<&oX^iNyLoxiCT+=&c**9b+p_vIiHJGX`p zG(T5CBT-b3Bo7_+ogdQ|)(2W|+jbHv+F7Pn11E}oAor6s_b_K5{44lG%$W(O9K) zD*(!tkjBPla?SjQW!|Kb_7(!ldSo)i*gN=9=-95{cNR&0Sb;f4Hy}zmxvuJ<74e!) z%KPrZhrW>$R_T~0;RSr6Z!Gx_IpVY{8$K1DQVs0MrFXlrAH^rX=#n=;ojRU%pCm)| za9JuT#?^A|;n%H#tPV}e>26po7cWl1Y-}Mv_9$?D3gVAFV$8hP+VZpEs-!IxcI=mi zA?B|z6C83R9M0D659%GodR0W(MQq7g}z@gyPu)ND)Uf=-B@rgDcuYgyJ|9= zwuqG^L+ct*6^(kfzxsR3%qofNtt(}9H3`lA%}mdl&1B-HY70o%dizX5EhudkLuV7d z89mE%jtljmDc}`6v3l?rITQmTj;2rs5|i0Y^0FLmo&QjBwCjX1;^O#)W81dVQ;N5@ zTFD2AW1(teXWq=0hR7`_O?j^Jcyz+l8%#tM&+(=5&5X&$ND6D-ZX|!~2p70FNQ<`2 z^(=b9sFDHK70?ptANO1CdnpCiq<COx(Saxto%A&-d#@HF3eD>mvt0@JCxYyBKJA4$z z;r*#{DaOQiPhe>Z)pMaHWJQ~zbg#oE6e&-JHA8k(Q}Uf z*#8Ir3c!ya0(cw@eue+J2;}O*Kmk7S0RZ~O;FCNAmd^MM-s<5^*#%2^t0((E62eRt7%>97y!trTB0n_?nC6vst$jLg@JpzHIE zL4G!$iZ;c3ltR%gQ$D#bhc9uir>1}JY-^%Tp;cQz^KR$rb?({A*1Kq1jL4VQHw#CK z(X%EzncvTQKKuCj_zgXrG@MNw;Q|cIOX6cvN87xa4dbFzdRBe>z$YD=Zj2I>u+Ppk z&fMWPKnko+3o(aNdT27*t!m+H=t?ub0X$AOlJs{ypAfhtJA5had$_%^>73U`ja@l8 zg)oj#r5ZtyrUdpZ%FdTz8 zLH(S3w4{zo+>L~lIU+nzzOXhVmIiGQn{;^YBknmNl1Mc{h^-{3lIB7NwMdF?)9WTk zoHVJ>QM(7Jg>%0}lfLZ!jDF3eWoJCI8HNV#=md|Q zJ#%{8wft7+e>qJE)*&q=% zH)YuhSK?|TNbFNU24nv#4II=FGf>niX|%LkrNX-*NPUS7K09w3OCO0sbQX?xgU`qT zDtV0oSD*7jAx6C>N!^Oc3`p}Zs`QQ&)w6SzJ*yGF=}34^YUtGE7iX~d$w6M>OVBBD ze|-6-eZRw1fpwx9@-q=Za5fcsajJ#~=lI?P0_m2wgPaPBVVbmr^VKJ=4H9CwdI?+H zqj}e3)U)}P_XuCykv#FoFndS!Cp)f}5TXm0Rj_s4YSPwad)F-&th(LIbU*%7Z*222-PRTa{c2U_+^^KSe zYv75n`X-dA`4tX#gUdG;)X?3B9Ru{H53lT?B8YJNB1ewp^HK_Ggj;4}#$~TmzqAvN z53A=uOS7zJ_40p9GX~h2tKp3jz9$eh9v5npdwU8g&Djl2p_r_k9|~wF3ow*HTQ~i< z>w-rjUPx#{3J*$l-w@z}K1XInM|#IHf&|inEAp(n)8PA{V$drRZC0Wt(GgJRM?M(K zQ~MO-lKT3&ZzCVSLY7C8-e;#S*FHMUlzQC*r&()J$zh@kuk!lhamJJ>x>xUek(BgX z5cY=k+aLwfNV@ym_wSlX-tIB$KIEgG9!s8?Z@i$w*5o9r(8H#eLMzh$bh`+^8W{>ccq-(h#%7~|DFy9F7j7BsyRw<8p$?M%6Bape3IQqo^4d|U|%B$fLg-*9}rOp?*D&uY=m$Iyd zVKr9P@sOV_j^euQPUwXEYm zrQ*vTmu1=^^NMG$nO?|>9<<<`J;Ar9pB}_XSUOsEUL?KC9;1&OLqj2h&v{<0MWlKt zjoU8yoWi&BMo8cTZsKr##;#ZGP7aZZ>kiGO4fn#ThL))P&O7?(!67^4AuOJSQnLdW zJY5wn6X}YurfK-#5`LF9hV4#eDumAKmW=VWcBk7gdvpDRFTJmIj1Bl{)Yumz<=F4k z8kBNh9Kn5QWu;g=G5)-@J)rY3uzK5lLBHQzG|34Z4Q38nmzd!MX zqrpJ|;wbfuvtg^(tvD$6&`AS7URsyzxRE= z8O7@XB~Ec|CsU*Fy^_oK-OZVZGiEN|(c626eb2ZZsD~@2mS*rjQ^-tM&pvIQc!SJ^ zkbj!JRjy9!?z#=neOWNGR6flzX5==<7#WFQ+?PEw^vpz4J<^Q|hk%e!%_+K-O)j|} zv!=~XfOqU}EcLCpFiN|kGV@sD%~kpOU<@l(N~henLU(Q+RCWDllB?yXwTH%V*m77! z68YgE=wmj-dx1P0$3)7FG;{Eic@`-P3*Pg`1MmJ*Jsv&O0w1$Q^_!_oW)Xf{i>1}W z7$wi_NDs?wP#8^rDTE3|>qJif{_&VCZ1_ck`vtMMc3yP1NG|pPdkyRI(4n8`_iuVb zt089GPx{AjKM3*)#VLu=r68s6oh&>sj_hS^eP_Bk@VJ}l0S%E?w0(H^wttS3*1B~M zJ|f@=K6?1z!zmyLR0U|T7-ye1$6X?GIa5ynN1Iw&TFP!Pu zBv_mrI9ot?iR)ch&_NoNFL1df>3LSf=49eVXEcx}d1aoED~|z>jcGtsdcHUL2ArZ> znq;vQ)q<^x#lY+xBtq$-7ri8lyQp`h?wA_Bi<#0BISE4&&2!gVLVR?Kjtg74!}8F3 zb{aT%>c(KiiAp2C9SB#qcN?HcOu}3zI&C~D0lD0@lcDcWULU`H9&#FxyS|B=j+{diMdlAwq#`SJt&?=aPYVavgvU*w$8NkGf#vYb5b$kmZWZju zN#8|0oiN}lw6)CPR5Opu^Xv%A%Ti&C2xGzO#(-P*u;4C7$B+wY9Q%6mv9D;avA2H` z?{ahaU1C&}7B2l_uZcV4@mW0C2I@#b3Y=v|#1JUsJ=war*eY()>p^&MuOfN0`LtIi zLn1D1;-s(qmih8O$S_@n7W)^QXrblu4R3Q;xrFSs(B^(^R)<)7g$b?uj8GYB?2?9` zUvRY}KXd>JVL7*MZd=KSQOpOFtuFZxI=13~bA`x~n6p@Y7$<{uMMQXc$HLrb-4B(N zj7UJ=@D}GyT1#^pIp6*#Q!JVs*;ObFGuV;cbeVVT)jG;z9V?)I#UaRN$p&aL8P?=T zgc;2J&)jPfg6b6Ua0(HEY>Baf_>K4X_sH1~a!!%*Q1^Vv4DVUxdSODD3jDF!SqxZ7 z84)nc<^WZ1{pobu=S@xPvPlB1`|xY$vhPCzxn3((l>*593q1p=#Rq~3uk_%<3$gOCyKDKJh@xqw0dEQP<$oG$`^BM%NNSr?OUh%!)!F+K3~RQUrtHss^4QMRx8Gee!)Jd_e4qU7fLEtB z?9ckR&G;Q9$mF)K(KiLHHA$U*YqFHJ(iYEC9DlE&JL*NO?!m78YZpkz`FTz^#dj(0 zdrU8WKS|+By0Y_OozFTmSA=;^dZ^a(s9C(_{PUg%;gWkkcvu^}JY>@9usx@`rc-Wp z`5Z&hGMzn5I%}Hk_r+w_>-bE-G;OZFk^ANG>Q;UF>*GIXJrQy|+c}0AAoIKZ!wl1@ zHczbYcwU}u{j}wgjC0AxDpO|kx9G#?j*W%jd>{m|3pI6Ji368p&U9owJ*j#2{V(Dd{k~H-%`NGd!f+e5E`}EBk zKlAp*IJuxw4Q1S}z&=w**F|{Ro!5W+wAjZj3*TbB>#pTLk6p{}nA~PQeO}$+8DDPH zJGSI@T)J#lyjRVYXJ0l!abH^|U+i{BoEa!|U_WtV@lGxKG?_TmyW3Lm#-76YS@hoT zDT2p3uHT@Ko4ZK`Nqv3zYr@ku-J)A5_8*suh1NXJd13{57eBnP?_G_e+x`AqU(b$O;z zShkHugJi|6x4F8aF=Hq+jZ&9e>VLPi&fU)UfdnZ>}$$V?9GJb(*xU zx|GMnn_q1F%X~XM^)8#a*2*t`ITIM8x5^2X$@?Ue;4mHEPJ zqYN$u?Y+SW#a%twyUlr*eA!*Alxe zSEKV4rj)&^F7A$snSC*H2d{t+)3rvQ;aUG(5CJXTz<=_~|Qjj&2ua#wSqxrkAg3 zaWT-(?+S1ApIqF$RqE`{YE{SRI$Xd1y~x&cMi(8;4y|-~>@fFgMAeSlUsCV;8-Kli zVBwL)Cm&k&?YJ6m;eOxlQ|a-b>)!b)I*#SDaw2CmcRjrS<9l@Ko#j13mnN%=UXXW- za83{3{He$wcBUG>QgY_lEzip=k|)nexgvM~FZTbGHMMw+WB9x#dvlEm2_+h5lJ-0f z)|wb^Tpw442s9MhnN^>C-mJ9#M)|Bg7OlbE5;9kR_u-cdyEa-z(#v0E?6(laul$)K2kz03nVsl`oH(N5Wga-^ggXS;@7Ra zi_8x#IxSY`06)&lRG@$FpVi(M$b5gV++BRh>DZkL4{BEIRH%!$va)gLe3kI5zcaK> z?)tkU;OhduZbZNK2aLCTv}>QRcxKGrv4^fy`7OBgw(U$nwDr==)bxH~_qI1FWlhls z_4*U@_guI!p+qg_`A_Y3$1<4`_?m#P(LI&kU9BOs-sF89Zs)K-Z`Vq#+pRGH>4DX1 zaT9*m?CJ9E*gcur*)Owj-Hunaoo$j)Pr9c}eYj&muY2C{RnJQ2JwqP8+PY8yqvucm zUbu0xY#-&xV%=hP{_i4$TqHfgf3N>W;QzT1$k7u5n?`WhwWJEUX>=hsM&N_!t{vyx zvQ{5_?xN+@WXBXo=Rbd-_n<^AXS`|NaphA@%;pO*!lZ2$DZDz>!2<8s^^rI)z|zT0;QeLb{tC$ zXp%K6V|^Gpym_+X)lXGVOLi?}GCdnJnp$1(-kcvHCyeFdmK;$T=bQ?OM?_&qD#Vsl zw9k7gQ~oG4fm-T7$X)v4_f$VU5xKKi_@nC^Nw+#ZsRjfqS~;7NJ0Zi=X5A0(R}=T< zwfCJ=+tpH8kZYjsD6i|K!#o&SkiV&AIpNe&xw_vJJn3oRM|HmIXY1FRRmc&Cj}w{T z@8{(b@#J%2*PXh0ermQj6&?tfoGhTVE~si+*-5F49OlcPAKN@lH(%Xw{lkQNalb>b z-pR~2bLq4Lop*Uv%=Ow3y7f1f$tY;qxaRfPB{u$I}{DTR$OsK_eWpVPHh zTjSA6s!`>smwg#0SQrLC$TUrMCTH-^e<=9K#-NpO$ zk`uO`8vEs7Wm(`?^Lk^dLYv}WV*6GowMbizTd~@wp-U~@&Ejb3r(co|ZhjhnrLNqa z71^|KnN$D6jdK&CFK<5PId<;lWBC&GHFw^|u3kX2?x<^*Zjh-}EA&|~{);;E=SIV6 zd*-Cub*xR*IdN5vUIs_!voSc+#vF>B?nrU8QX5+&zuWmJQSHIJu zbzQl)IXvCU?5LJNrMmQwa!JoGPJOZhjgtO5HSL_9ZLKPr-f*%xfOuv!!Nd1`!?TcQ z_bQI&sqC$zzF?L%>mPNONVPb)#AhAi&ouod7SwjDbA+9`oBj&sr;zK0V8XmT|dz z`(FYF4^2vp70kTypWUPM5K>H`n)?ydUH0Vhtn zUM}xFP-Wig?yFV4D!gs4&vM6(C;I|#^mrbx9oL$hxyagUjHuO;27d)>ck|i^ICY?jJUVex<)RarqDzwINE~ zw?OM~;D=*B9kc7NsOEhzmOpW2e1Qy9_rUR|5Og|$SY)%+=!!~r_QB{ot2Y`>*%aUW zXyVx5>K4WjCryHIy?2q{>ObM%taqI-pzeTGiU^VdewBd$;{HW z{{1b9iuWD;vXwPYCz*%sI}!PP7qq}YC~>Dp?dl_|Oq_kP=}}U$JDbW6TBV+&?`+da z`xGGYqg=L^dZV&_wH-C!yyD|BDYrGJ;-1XEn$n%RXG(kEv7#^QqwZE@Hz({c|Jf(I z5KjGczm8_H{pGjn{WbJ^Rb_@2**}W^mQT2`Ks5cC++4*e`B`FFX+-ORd<_$q6YFk= zbncOyJ)v#A*XAs@rt24;IY;INR$HEvGZNf=>imP2mUrpC4&6%v&r+A$io{3~$oYH) zx>D4tT+-XSO-`&|X(VQ@B3^L*gHT@R-;WtH{E!uAzMqn%n%lH?%;{ZLu20ihEhjF! z(Ct%l3H|W3-)8n#51s9kh_#UIT@rUK-&*5%*BYhyzjym6&YCAH+n`jt;N%rib*!W( zKjKuxwb;MMOjy&H?a-h4_c*(ITXoXUrcOHTqR8-1J6p1>Si&y-YHnY7l~L_V3EDx8 z%AZ~bayRE0IT~+5ooww)SKeJQ{LoYY~ap|)Tpl}2UCdWDgKemPW7c{W-a(S zBksz_>rYnP$XXCQzfhf7(63V7t#w8Gy7MD+On~9IP4~jK?fyxEvoJK(egx6X#2?($MZTxuFSVP(*0ne*^#rie`nTEdgdkG^!6*7*)Dy* z@pqcsg-yhV{F^&l4jaUY#4p=F*6u>?Y0b)SHN`>qCbWvhD(29>dYzZZ&q+E_@X=|N z!I?>4-Q2_rB{UVQUn*aaxMs6j`plmF4bK9yWPKa@#x+)pDKtb>e9bS;eR!%s?_zIY z)}1q*VksF)^+!&9`n`-|03XgZPFJe`TB&HB;5TVkYt+4z&u@Ys)HI|%eb*AzPyK#g zYvu37pFYky*1Bf5{n8Y_FWDZEE|pZ54cl9*JAB(D;=^R^m8CGBT&Z6-W^CJ773!*W zH7@p~22->%*uQpV+S7OXas3*LR?*y&ZuM+AInxHe);spw*Mx?g2}OzhhC5F;QZb!h zW@6sN{iT5F!)>r}Q+N~gI} zb%!7Q^>NEar|k0XunRt09=*`k(5L>;UTpn{!ixXFVZ-GA|2JO+8NwKJXg&lPE2bCS z4t$*Q@TA1jZy|)Z@a4{Vk3myk$Y}&NbdONQ>)H(^t`_D zvIbJ!&KQ@$xLj9Zg9VnXcdFAb+C->KJQ@^`mZLZOnQ(-#r=cZT1K^b~C{&`d7`XJY^NBs9%_^9g`t&)Ew`N5vTKiDL{|Z0FI@4kHEyw-`Thq!1y@?q z=3bf-dK0^~P}erNQ^MJ;^4PXH7u6}YIlTdt;+tPXByL!DJZPZ*#|A|F>N zho9eia<*oBV~K>Yy4_9jn3t{PLdRt6(VtI?G-@rE^xbpaR`GW8p%uxmeX1YnG%j1F z=PYCEj0WfF22Y6DP`F#*oJ8QX_KMl2Q-g?NMWL6e4l+hl<=SR6Zf%axS9dR)__J-5 ze9b&%O~aOD@YiLlo3`al$P|3yn>Oj_9`#Oz%*_*$@2KROU;8d%_xjqHrMhF2$0v9n zbt*0OI(7bp(KFYRfuD`yP1NsZM@;faRIyJ$VzQRXtW;9{`LZC{VD^c&m0ss#o@OLb zmaC@R42qbxHz3pN$nNN#qC4N-V5k3jWqzxh)@xk!GV%V_P1G~@KgcJ;_x4CGofE6* zZmwC8q!*B1RCsDDH6-J+(&vwAZ43+j%rPbX{?~Js9aj2uH4%IeSts4R(271qD(ozLj+a(iW%v68M7+>ja_##b*R6joH9X># zyT(^3!?x!wes+y|`eGI7_kVlpucjMzzgon2P(Sg|7scfbNjqjDJ8!;Fdt__f-eo(f z%jf(phQ)H!Xk5)xBd?2ZAC8;){ajJbr{-tay|uSvYgRQGfgKa1Lh@f6a)i)UbTLXp z4Ol0DFc4|@8e9a&!CKIJ=oqvDR2cPTAx?qRt%P9pw4`wG&BJq;iIGf3O3L7A8B{8- zLYNoM7)ycV4TWHN&Uce@w;YrS50;F@D3G$55Uk9RcxNPmZ-N~-nuAK^77w-}>sX8# zxK2(DuT)xU8o%DyiowQgXdyb#oXLn!oX_xP(h^d@`5#<8^D2aS;S7<1+l*&~N7KlI zskvGX%7h0?n!*%FR$mB~jZR2OrGZ06xTzt z9UrYQADOElk2P?-2Ms(}8h>j%+5u}kGFJ+ZHO`qQ{H^h52dwePECdFg0zHmFV{#q> z_e11W2=hW~oC0au2*H~4fumQzrGm3dc-r%7gooAC#0H)VN6tOI15F3pOh&;&mluMe z!AgS#VIPD7>G}!5rb{?CICw(K2mzHkvXW4EY9e#Sh^iVe1=7|AU5?O<5D1a{9|HwI z=wUP+^+fuStH>I}57B~a;Si`F+6z?wdoNd63S?|71lw>P5a*l|D%Ho+m9G#TE_IA% z#D!}y64K&*r%)gp@X+{J<2ak)jj2?QW)!=@G8D)eu!fIajy=+EaLPmXz>$#JQS1j! zra%r3quO`2=hzx)-PwK=+ewos(A>GB+U8hf4dkD@;i)!Ck7^Sskd_vhSi?;X$Ec1p z1u_I49pX8oX5a)KelpyA0`Tczq?CbMOd`+8okL5F;yrf+-|CI#G+I=FS-_Phu)lmr(H z=%K!3&>ajG0M!S}!YqmpLU#!;t}a5bA$tMkjQfaXjGua7(dBJJ@?RK=fWSF_-pEg+ z2r-A-;aqqII0GDfwa5RdSEwolasijkk7iM6@nH$H=s0J3Vgl#dI1`de_2yQOGBv|h zD3H55-yUp|lH#K2tYZ=Q_c5%(D7^$JQ=pkM`S#+)V9t-GGx+zwr5we&@3cQUIg$`w z(V2W45l1tc-Kl@H>lPi);P2o#no;ZqEB(=VdNNWH)0lMjnc18$$(DW46_v`Z9mRf- z;vYxbJ~|~Sj+VhXcYB0+F6AiJ{S_#XogLq2=?z8&L|pMneC8uZHHu|l`9F^Lz&UJu zTs}uLid|1R3S?oy_lnsLVC3bp<)heSum8>vIQ>r#d5+{Evk@uy0lX8AgjJzu&^pNZ zf9L~j4S@d!E2&lrn+PG%eEH0+MY)02d>Ye39|SJI8ykboLn@7#8j_Nhl$6L!WrUBs zvk_I$5faj*gB}G^1)fJ6XjwBdBmo?Q&ez$dl;#Mg`nj zU}UJOkq!tM!TO|}G_W-qc?BE|$|;cjnregS5lm9mB-R0bA<=wBVo-$+mdK{YGuTb1 zvJbgSWLk{ub5MnHN?MF$Q>}qM$( zTN4Bs9$<;1lUts+(dNML8t8BV%bv!7J=)MZ@Q2Acyaqa4K-!B?r$8Ry`uMD6p6qGs z_2*eTyv8WZ3|IT(ie|?enNhkKR$-K0*!zDia{pg~`lGVQBP1V*Lu}ypa6Oz2TSI-& zB`6uvVtD~u@ZC)6faB^B-~`H)D9(K1{AM3FNTu>>1$d!{-9W^}NT7wqF=i*GMn?>+ z&MCtU@u?!fM`mO@5d6_uTVJn?1p07GLmGjhqOHxq?XX4mi3<|q5@~}B$!5;a()k92ai^OJ=Zyvrda|TWYozKuv_sW0S}7- z2fKu$;6z%(F^EBji%?c5I$Wx5PJyIBE=GDjEiR3ZV`Yg^*1xJ|6i5ohyfSIbxZ!3% zhKL!5f*+D%4%7jsojS0#|G^9Ks0R-(WmP84Sea6wsUTX@9IVIBeR3&>Ohkv1224!` zJYgzl)%P9|Yz(T(|(lMeylfbI42$n>Us~UL) zY&pvQMYhl|q(I|MLEb2ZZ^TGSQSu+ME_?k~hS2>e9i4(aM7AP^fcvN5L|6)Hf|4L* zz1B(%u7FwwT z6Dh?mik1*L6yR{I4%Z6|7wEf!xd~FPLpjso7dF^psI7y`zzA`41G%q1H62h78W_Oz zSro`BLErq2TjOI@y2hW$LrbDueb zG9;nUf~Dud-t_|c7jAN;9_@E1D- zf>{LiB;+(4ni~8K^Hf22kW&Cy55UtKHFV+(0&m2G@In`VFr7fsSaT?lahN~Cb#hD% ztAq^0etsYt156%x*MJk%{HsBpiUUS@WDH*l6aoxS(Bm0AOi@^2JF9pgd-Td3#LN9ph_qKi21%uqQGXB zOx4D-PkkTsK11B6QaL&br$9y4J_pj zoN?vu+HUaT_+J{go-)$F&>J6Nbav*HZ!ca^G$zBxnaq@rv_YkEsYmT2IEm<+1cmjlN!-ASmNtsN;OHov0&7K!9azy)M)$>BY6@4GG+`YBlBQtL`R10nFPJ-_ zOyLHm(d>0>WU80DIVZ(yLE)4@vX|ul0?!abr9l8q5LNn16G#-sWL(u@#3v~sjFI%Ces2(~URYv8}iKrwhg5t<;+Awh@_;*K~Wwul*G zh|ECL5Jf}=8Hb1=6a<@duF0egp2^+(@um(I0mW8EZaab6fdh~06)Yt-42>c=Wd=!QeGb{}N zGdz_9R4fGmD$XQpo`G}(8WVZpo4_~po0gKKpUF}fHodPf*IIc z0A}EUB+$YF0MNqyNiZGr17JGtO9D;I2LMgnn*)Ad8s-Ad8!jUX#hm=2_z7~#seUNk0XIFCIx^nE=d9*OacHQT$}`g z*jNAraWN85urUBoa8VKnU?Knr;KC%pF(CkOT#y79MgaiB1xSEmH~=V)kpRI^01ym8 zVIlB?3b8)_6AQhB&>v_I+J(MCpQ88Cf6ylM5_$$b2H3v`-H8^W8_?AtKahbk(HM{? zoQrw`<~yJks1Z5?Rb}yB92G)g@CkxXfb}oHy9ljFGjbU@iyTJ|BYTlu$lu6D!1!fI zCX#~0f_(M^{0qYgTk?Ks7(p_Sh7&9b zhGGQC!BCuFkuU@!NEU|R1dE2j7(wzd7$;anoQDx46X)Rsi;6)QL2@w&Cs<^hixDIn z=i&s5j)53K@-Yx6ScD9~2$GQjIKiT%KSq$8^v4MnDg7{lWThWYuxROv5hO2tae_rm zAB-TG>4Ot2YI5IKiUm9E>12 zItM3MBz4CKlBMoA!J_GGj39YB8z)#qb;AgfsctyIqN*!KkX&`e2^LvhFoI;O3r?`; zItwF6zRto47Ga$+f@G{SPOvEJgb^fXop6Fh+L;(ZvUVm;uxRUu5hQONae_r$2aF(@ z>wpt1>e^!j$z6M#V3F4jBS`kz;RK7mwirS3*A^!Ld11r`BLIbA8=QbhXpJoe$QoZl z0xN7W09N=S5?Epj0kFg~Nnn9x0APWqlfax@|1tDA$^Vb&TTuA#_1_5mHv<13jQ~zW XkW5d(2nOJN3QmNRkckm=0Ga;_uU(~h literal 0 HcmV?d00001 diff --git a/doc/html/transferengine.qhp b/doc/html/transferengine.qhp new file mode 100644 index 0000000..f0e3d55 --- /dev/null +++ b/doc/html/transferengine.qhp @@ -0,0 +1,144 @@ + + + Transfer.Engine.100 + transferengine + + 1.0.0 + transferengine + + + 1.0.0 + transferengine + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transferengineclient.html + transferdbrecord.html + imageoperation.html + index.html + transferengine.html + transfermethodinfo.html + transferplugininterface.html + callbackinterface.html + dbmanager.html + + + diff --git a/doc/html/transferengineclient-members.html b/doc/html/transferengineclient-members.html new file mode 100644 index 0000000..a98e74e --- /dev/null +++ b/doc/html/transferengineclient-members.html @@ -0,0 +1,23 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for TransferEngineClient +
  • Modules
  • +
  • TransferEngineClient
  • +

    List of All Members for TransferEngineClient

    +

    This is the complete list of members for TransferEngineClient, including inherited members.

    + + + diff --git a/doc/html/transferengineclient.html b/doc/html/transferengineclient.html new file mode 100644 index 0000000..fa0b3f8 --- /dev/null +++ b/doc/html/transferengineclient.html @@ -0,0 +1,155 @@ + + + + + + + Nemo TransferEngine 1.0: TransferEngineClient Class Reference +
  • Modules
  • +
  • TransferEngineClient
  • + +

    TransferEngineClient Class Reference

    + +

    The TransferEngineClient class is a simple client API for creating Download and Sync events to TransferEngine. More...

    + +
     #include <TransferEngineClient>
    + +

    Public Types

    + + +
    enum Status { TransferFinished, TransferCanceled, TransferInterrupted }
    + +

    Public Functions

    + + + + + + + + +
    TransferEngineClient ( QObject * parent = 0 )
    ~TransferEngineClient ()
    int createDownloadEvent ( const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const QUrl & url, const QString & mimeType, qlonglong expectedFileSize, const CallbackInterface & callback = CallbackInterface() )
    int createSyncEvent ( const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const CallbackInterface & callback = CallbackInterface() )
    void finishTransfer ( int transferId, Status status, const QString & reason = QString() )
    void startTransfer ( int transferId )
    void updateTransferProgress ( int transferId, qreal progress )
    + + +
    +

    Detailed Description

    +

    The TransferEngineClient class is a simple client API for creating Download and Sync events to TransferEngine.

    +

    TransferEngineClient is a convenience API for create and updating Download and Sync entries to the Nemo TransferEngine. For Upload entries, it is required to create share plugins by implementing required interfaces provided by this TransferEngine library.

    +

    If the client using this interface wants to enable cancel and restart functionality, it means that the client process must provide DBus API, which Nemo Transfer Engine can call in a case of canceling or restarting the operation. In order to do that client must provide CallbackInterface object with properly set dbus information. See the example below.

    +

    For share plugin implementation:

    +

    To use this API to create e.g. Sync entry see the example below:

    +
     // Create the instance of the client
    + TransferEngineClient *client = new TransferEngineClient(this);
    +
    + // Setup callback information. This is dbus interface
    + CallbackInterface callback("com.jolla.myapp", "/com/jolla/myapp", "com.jolla.myapp",
    +                            "cancel", "restart");
    +
    + // Create the sync event
    + int transferId = client->createSyncEvent("Syncing data from my service",
    +                                        QUrl("image://theme/icon-launcher-my-app"),
    +                                        QUrl("image://theme/icon-s-service-icon"),
    +                                        callback);
    +
    + // Start the actual transfer i.e. sync
    + client->startTransfer(transferId)
    +
    + // Update sync progress. Usually this is done e.g. in a slot which receives sync
    + // progress from a signal.
    + bool ok;
    + qreal progress = 0;
    + while (progress <= 1) {
    + client->updateProgress(transferId, progress);
    + progress = getProgressFoo(&ok);
    +
    + if (!ok)
    +     break;
    + }
    +
    + // End the sync
    + TransferEngineClient status;
    + QString reason;
    + if (ok) {
    +  status = TransferEngineClient::TransferFinished;
    + } else {
    +  status = TnrasferEngineClient::TransferInterrupted;
    +  reason = "Something went wrong";
    + }
    +
    + client->finishTransfer(transferId, status, reason);
    +
    +

    See also TransferPluginInterface, MediaTransferInterface, and TransferPluginInfo.

    + +
    +

    Member Type Documentation

    + +

    enum TransferEngineClient::Status

    +

    This enum type describes different values for the Status.

    + + + + +
    ConstantValueDescription
    TransferEngineClient::TransferFinishedTransferEngineData::TransferFinishedTransfer finished successfully
    TransferEngineClient::TransferCanceledTransferEngineData::TransferCanceledTransfer canceled usually due user actions
    TransferEngineClient::TransferInterruptedTransferEngineData::TransferInterruptedTransfer interrupted because of an error
    + +
    +
    +

    Member Function Documentation

    + +

    TransferEngineClient::TransferEngineClient ( QObject * parent = 0 )

    +

    Construct an instance of TransferEngineClient with optional parent argument.

    + + +

    TransferEngineClient::~TransferEngineClient ()

    +

    Destructor.

    + + +

    int TransferEngineClient::createDownloadEvent ( const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const QUrl & url, const QString & mimeType, qlonglong expectedFileSize, const CallbackInterface & callback = CallbackInterface() )

    +

    Creates a download event to the TransferEngine. This method requires the following parameters displayName, a human readable name for the entry. applicationIcon is the QUrl to the icon of the application, who's calling this method. Usually it can be in format "image://theme/icon-s-something". serviceIcon is a service specific icon such as DropBox. url is the url to the media to be downloaded. mimeType is the mimeType of the media.

    +

    Client can define callback functions for canceling and restarting download. For that client can provide optional parameter callback, which is CallbackInterface object containing information about the dbus service.

    +

    Returns transfer id of the download event.

    +

    Create a download event to the TransferEngine. This only creates and entry, and client needs still call:

    +
      +
    • TransferEngineClient::startTransfer(int transferId)
    • +
    • TransferEngineClient::updateTransferProgress(int transferId, qreal progress)
    • +
    • TransferEngineClient::finishTransfer(int transferId, Status status, const QString &reason)
    • +
    +

    See also createSyncEvent(), startTransfer(), updateTransferProgress(), and finishTransfer().

    + + +

    int TransferEngineClient::createSyncEvent ( const QString & displayName, const QUrl & applicationIcon, const QUrl & serviceIcon, const CallbackInterface & callback = CallbackInterface() )

    +

    Create a sync event to the TransferEngine. This method is very similar to

    +

    displayName, a human readable name for the entry. applicationIcon is the QUrl to the icon of the application, who's calling this method. Usually it can be in format "image://theme/icon-s-something". serviceIcon is a service specific icon such as email account.

    +

    Client can define callback functions for canceling and restarting sync. For that client can provide optional parameter callback, which is CallbackInterface object containing information about the dbus service.

    +

    Returns transfer id of the sync event.

    +

    See also createDownload(), except, createSyncEvent(), takes, less, parameters, ., createSyncEvent(), startTransfer(), updateTransferProgress(), and finishTransfer().

    + + +

    void TransferEngineClient::finishTransfer ( int transferId, Status status, const QString & reason = QString() )

    +

    Finalize the transfer with transferId. There are three options for finalizing the transfer by setting the status parameter value:

    + +

    If the client wants to provide reason for finishing the transfer, it's possible to provide reason parameter.

    + + +

    void TransferEngineClient::startTransfer ( int transferId )

    +

    Start the transfer for the existing transfer entry with transferId. This changes the status of the transfer from idle to started.These status changes are handled by Nemo TransferEngine internally, but after this method has been called, the transfer is possible to cancel, interrupt or finish.

    + + +

    void TransferEngineClient::updateTransferProgress ( int transferId, qreal progress )

    +

    Update the progress of the existing transfer with transferId. The progress must be a qreal value between 0 to 1.

    + +
    + + diff --git a/doc/html/transfermethodinfo-members.html b/doc/html/transfermethodinfo-members.html new file mode 100644 index 0000000..3be6006 --- /dev/null +++ b/doc/html/transfermethodinfo-members.html @@ -0,0 +1,28 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for TransferMethodInfo +
  • Modules
  • +
  • TransferMethodInfo
  • +

    List of All Members for TransferMethodInfo

    +

    This is the complete list of members for TransferMethodInfo, including inherited members.

    + + + diff --git a/doc/html/transfermethodinfo.html b/doc/html/transfermethodinfo.html new file mode 100644 index 0000000..d4850da --- /dev/null +++ b/doc/html/transfermethodinfo.html @@ -0,0 +1,95 @@ + + + + + + + Nemo TransferEngine 1.0: TransferMethodInfo Class Reference +
  • Modules
  • +
  • TransferMethodInfo
  • + +

    TransferMethodInfo Class Reference

    + +

    The TransferMethodInfo class encapsulate information of a single transfer method. More...

    + +
     #include <TransferMethodInfo>
    + +

    Public Types

    + + +
    enum TransferMethodInfoField { DisplayName, UserName, MethodId, AccountId, ShareUIPath, Capabilities }
    + +

    Public Functions

    + + + + + + +
    TransferMethodInfo ()
    TransferMethodInfo ( const TransferMethodInfo & other )
    ~TransferMethodInfo ()
    QVariant value ( int index ) const
    TransferMethodInfo & operator= ( const TransferMethodInfo & other )
    + +

    Static Public Members

    + + +
    void registerType ()
    + + +
    +

    Detailed Description

    +

    The TransferMethodInfo class encapsulate information of a single transfer method.

    +

    Share plugin must create a list of instances of TransferMethodInfo class to encapsulate information about the plugin for example filling information for the Bluetooth sharing plugin:

    +
     QList<TransferMethodInfo> infoList;
    + TransferMethodInfo info;
    +
    + QStringList capabilities;
    + capabilities << QLatin1String("*");
    +
    + info.displayName     = QLatin1String("Bluetooth");
    + info.userName        = "";
    + info.accountId       = "";
    + info.methodId        = QLatin1String("bluetooth");
    + info.shareUIPath     = SHARE_UI_PATH + QLatin1String("/BluetoothShareUI.qml");
    + info.capabilitities  = capabilities;
    + infoList << info;
    +
    + +
    +

    Member Type Documentation

    + +

    enum TransferMethodInfo::TransferMethodInfoField

    + +
    +
    +

    Member Function Documentation

    + +

    TransferMethodInfo::TransferMethodInfo ()

    + + +

    TransferMethodInfo::TransferMethodInfo ( const TransferMethodInfo & other )

    + + +

    TransferMethodInfo::~TransferMethodInfo ()

    + + +

    void TransferMethodInfo::registerType () [static]

    + + +

    QVariant TransferMethodInfo::value ( int index ) const

    +

    Returns the value using the index. Actually the index is enum TransferMethodInfoField.

    + + +

    TransferMethodInfo & TransferMethodInfo::operator= ( const TransferMethodInfo & other )

    + +
    + + diff --git a/doc/html/transferplugininterface-members.html b/doc/html/transferplugininterface-members.html new file mode 100644 index 0000000..03c1ad6 --- /dev/null +++ b/doc/html/transferplugininterface-members.html @@ -0,0 +1,19 @@ + + + + + + + Nemo TransferEngine 1.0: List of All Members for TransferPluginInterface +
  • Modules
  • +
  • TransferPluginInterface
  • +

    List of All Members for TransferPluginInterface

    +

    This is the complete list of members for TransferPluginInterface, including inherited members.

    + + + diff --git a/doc/html/transferplugininterface.html b/doc/html/transferplugininterface.html new file mode 100644 index 0000000..4804651 --- /dev/null +++ b/doc/html/transferplugininterface.html @@ -0,0 +1,66 @@ + + + + + + + Nemo TransferEngine 1.0: TransferPluginInterface Class Reference +
  • Modules
  • +
  • TransferPluginInterface
  • + +

    TransferPluginInterface Class Reference

    + +

    The TransferPluginInterface class defines an abstract interface for each TransferEngine share plugins to implement. More...

    + +
     #include <TransferPluginInterface>
    + +

    Public Functions

    + + + + + +
    virtual bool enabled () const = 0
    virtual TransferPluginInfo * infoObject () = 0
    virtual QString pluginId () const = 0
    virtual MediaTransferInterface * transferObject () = 0
    + + +
    +

    Detailed Description

    +

    The TransferPluginInterface class defines an abstract interface for each TransferEngine share plugins to implement.

    +

    TransferEngine supports C++ share plugins. Each share plugin must implement couple of well defined interfaces:

    +
      +
    • TransferPluginInterface Provides interfaces to access required objects to start sharing.
    • +
    • MediaTransferInterface Implements the actual sharing functionality
    • +
    • TransferPluginInfo Provides information about plugin status such as is it ready.
    • +
    +

    TransferPluginInterface provides information to the TransferEngine via this interface.

    +
    + +
    +

    Member Function Documentation

    + +

    bool TransferPluginInterface::enabled () const [pure virtual]

    +

    Return true or false depending if the plugin is enabled or not

    + + +

    TransferPluginInfo * TransferPluginInterface::infoObject () [pure virtual]

    +

    Return TransferPluginInfo object

    + + +

    QString TransferPluginInterface::pluginId () const [pure virtual]

    +

    Return a plugin id e.g. Facebook, Twitter, etc.

    + + +

    MediaTransferInterface * TransferPluginInterface::transferObject () [pure virtual]

    +

    Return MediaTransferInterface object

    + +
    + + diff --git a/doc/src/index.qdoc b/doc/src/index.qdoc new file mode 100644 index 0000000..7268443 --- /dev/null +++ b/doc/src/index.qdoc @@ -0,0 +1,90 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of BSD license as follows: +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the Jolla Ltd nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************************/ + +/*! +\contentspage {Nemo Transfer Engine Contents} +\page index.html + +\title Nemo Transfer Engine + +The Nemo Transfer Engine is a daemon process which takes care of tracking sharing, sync and downloads. +In addition to just tracking those operations, it provides an API to create new share plugins and different +functionality related these operations.The Nemo Transfer Engine doesn't provide any UI components, but the +plugin interface expects sharing UIs to be written as QML. + +The Nemo Transfer Engine can be understood as a front end to the database which contain all the information +about sharing, syncs and downloads. For syncs and downloads it acts only as storage manager so clients can +use Nemo Transfer Engine client API to create and update sync and download events. For sharing, Nemo Transfer +Engine provides own API and supports share plugins. + +See TransferEngine DbManager + + +\section2 Nemo Transfer Engine API + +The API can be divided in two different parts: the share plugin API and the client API. + +\section3 Share Plugin API + +Share plugin is a Qt plugin, which must be implemented using C++ interfaces defined by Nemo Transfer Engine. +The plugins must be installed to the specific location where Nemo Transfer Engine loads them. The actual +share functionality implementation depends on the client e.g. if it's HW specific like NFC or online service +such as Facebook. Each plugin must implement or use the following interface: + +\list + \o \l {TransferPluginInterface} Share plugin must implement this interface + \o \l {MediaTransferInterface} Share plugin must implement this interface + \o \l {TransferPluginInfo} Share plugin must provide information about plugin using this class + \o \l {TransferMethodInfo} Share plugin must provide information about e.g. accounts using this class +\endlist + +\section3 Client API + +Client API can also be divided in two sections: full features DBus API and TransferEngineClient Interface. +The first one supports all the features Nemo Transfer Engine provides and makes possible to implement for +example Transfer UI and client side sharing interface on top of it. The TransferEngineClient is meant to +be used by clients who want to inform Nemo Transfer Engine of ongoing Sync or Downloads. + +\list + \o DBus API - see org.nemomobile.transferengine.xml. For the client side it will generate TransferEngineInterface + class which can be used directly. + \o TransferEngineClient - The convenience API to create Sync and Download events. +\endlist + +\section3 Reference +\list + \o \l {Nemo Transfer Engine Reference} +\endlist + +*/ diff --git a/doc/src/mediaplugininterface.qdoc b/doc/src/mediaplugininterface.qdoc new file mode 100644 index 0000000..f6c5422 --- /dev/null +++ b/doc/src/mediaplugininterface.qdoc @@ -0,0 +1,76 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of BSD license as follows: +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the Jolla Ltd nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************************/ + +/*! + \class TransferPluginInterface + \brief The TransferPluginInterface class defines an abstract interface for each TransferEngine share plugins to implement. + + \ingroup transfer-engine-lib + + TransferEngine supports C++ share plugins. Each share plugin must implement couple of well defined interfaces: + + \list + \o \l TransferPluginInterface Provides interfaces to access required objects to start sharing. + \o \l MediaTransferInterface Implements the actual sharing functionality + \o \l TransferPluginInfo Provides information about plugin status such as is it ready. + \endlist + + TransferPluginInterface provides information to the TransferEngine via this interface. +*/ + +/*! + \fn MediaTransferInterface * TransferPluginInterface::transferObject() = 0 + + Return MediaTransferInterface object + */ + +/*! + \fn virtual TransferPluginInfo *TransferPluginInterface::infoObject() = 0 + + Return TransferPluginInfo object + */ + +/*! + \fn virtual QString TransferPluginInterface::pluginId() const = 0 + + Return a plugin id e.g. Facebook, Twitter, etc. + */ + +/*! + \fn virtual bool TransferPluginInterface::enabled() const = 0 + + Return true or false depending if the plugin is enabled or not + */ + + diff --git a/doc/src/transfer-engine-all.qdoc b/doc/src/transfer-engine-all.qdoc new file mode 100644 index 0000000..dda9f8b --- /dev/null +++ b/doc/src/transfer-engine-all.qdoc @@ -0,0 +1,54 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of BSD license as follows: +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the Jolla Ltd nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************************/ + +/*! + +\page transfer-engine-all.html +\title Nemo Transfer Engine Reference + +\section1 Nemo Transfer Engine + +Classes used in the engine side. + +\annotatedlist transfer-engine + + +\section1 Transfer Engine Lib + +Library components + +\annotatedlist transfer-engine-lib + +*/ + diff --git a/doc/src/transferplugininfo.qdoc b/doc/src/transferplugininfo.qdoc new file mode 100644 index 0000000..9fbe164 --- /dev/null +++ b/doc/src/transferplugininfo.qdoc @@ -0,0 +1,82 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of BSD license as follows: +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the Jolla Ltd nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************************/ + +/*! + \class TransferPluginInfo + \brief The TransferPluginInfo class is an abstract class encapsulates information about share plugin. + + \ingroup transfer-engine-lib + + TransferPluginInfo provides information about single share plugin via TransferMethodInfo + class. Because one plugin can support multiple accounts e.g. user can have one, two or + more Facebook accounts, this class provides a list of TransferMethodInfo object instances. +*/ + +/*! + \fn virtual QList TransferPluginInfo::info() const = 0 + + Subclass must implement this method and provide at least one TransferMethodInfo + object instance. If a plugin supports multiple accounts e.g. more than one Facebook + account, then list must contain one TransferMethodEntry per enabled account. + + Returns a list of TransferMethodInfo objects. +*/ + +/*! + \fn virtual void TransferPluginInfo::query() = 0 + + Subclass must implement this method and make sure that when info is available + infoReady() signal will be emitted. If TransferMethodInfo data is ready, calling this + method should just emit infoReady() signal. +*/ + +/*! + \fn virtual bool TransferPluginInfo::ready() const = 0 + + Deprecated. implment this, but it won't be used. +*/ + +/*! + \fn void TransferPluginInfo::infoReady() + + Subclass must emit this signal when info() method is ready to return + a list of TransferMethodInfo data. +*/ + +/*! + \fn void TransferPluginInfo::infoError(const QString &msg) + + Subclass must emit this signal with an error \a msg if there's an error i.e. info() method + can't return a list of TransferMethodInfo objects. +*/ diff --git a/doc/transfer-engine-project.qdocconf b/doc/transfer-engine-project.qdocconf new file mode 100644 index 0000000..8c5da07 --- /dev/null +++ b/doc/transfer-engine-project.qdocconf @@ -0,0 +1,64 @@ +include(config/compat.qdocconf) +include(config/macros.qdocconf) +include(config/qt-cpp-ignore.qdocconf) +include(config/qt-defines.qdocconf) + +indexes = src/qt.index + +language = Cpp + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = en_US + +project = Nemo TransferEngine +description = Nemo TransferEngine Library Reference Documentation +versionsym = +version = 1.0 +url = + +sources.fileextensions = "*.cpp *.qdoc *.mm *.qml" +headers.fileextensions = "*.ch *.h *.h++ *.hh *.hpp *.hxx" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml" +examples.imageextensions = "*.png *.jpeg *.jpg *.gif *.mng" + +# don't include ../../components/*.qml in sourcedirs, that causes qdoc3 to parse the +# .qml files, not find any docs, and conclude they are internal + +sourcedirs = ../../src ../../lib +headerdirs = ../../src ../../lib + +#excludedirs = + +#exampledirs = ../../examples + +#imagedirs = images \ +# ../src/images + +#outputformats = HTML +outputdir = html +tagfile = html/transfer-engine.tags +base = file:../html + +#outputprefixes = QML +#outputprefixes.QML = qml-transfer-engine- + +qhp.projects = TransferEngine + +qhp.TransferEngine.file = transferengine.qhp +qhp.TransferEngine.namespace = Transfer.Engine.100 +qhp.TransferEngine.virtualFolder = transferengine +qhp.TransferEngine.indexTitle = Nemo Transfer Engine Reference Documentation +qhp.TransferEngine.indexRoot = + +qhp.TransferEngine.filterAttributes = transferengine 1.0.0 +qhp.TransferEngine.customFilters.TransferEngine.name = Nemo TransferEngine 1.0.0 +qhp.TransferEngine.customFilters.TransferEngine.filterAttributes = transferengine 1.0.0 +#qhp.TransferEngine.subprojects.examples.title = Examples +#qhp.TransferEngine.subprojects.examples.indexTitle = Nemo Transfer Engine Examples +#qhp.TransferEngine.subprojects.examples.selectors = fake:example +#qhp.TransferEngine.subprojects.examples.sortPages = true +#qhp.TransferEngine.subprojects.tutorials.title = Tutorials +#qhp.TransferEngine.subprojects.tutorials.indexTitle = Nemo TransferEngine Tutorials +#qhp.TransferEngine.subprojects.tutorials.selectors = fake:tutorial +#qhp.TransferEngine.subprojects.tutorials.sortPages = true diff --git a/lib/imageoperation.cpp b/lib/imageoperation.cpp new file mode 100644 index 0000000..d018f4b --- /dev/null +++ b/lib/imageoperation.cpp @@ -0,0 +1,202 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "imageoperation.h" +#include + +#include +#include +#include +#include + +/*! + \class ImageOperation + \brief The ImageOperation class is a helper class to manipulate images. + + This class is meant to be used by share plugins. It can be used for: + \list + \o Removing image metadata + \o Scaling image + \o Create a temp files from the image paths + \endlist +*/ + +/*! + Creates a file path from the \a sourceFilePath to the \a path location. + If the path is not given it uses system default temp path e.g. '/var/tmp'. + This function uses sourceFilePath as a template to generate a temp file name. + + NOTE: This function doesn't create the file, it only generates the file path to + the temporary file. + + Temporary file will be e.g: + + Source file: "/home/nemo/Pictures/img_001.jpg" + Temporary file: "/var/tmp/img_001_0.jpg" + */ +QString ImageOperation::uniqueFilePath(const QString &sourceFilePath, const QString &path) +{ + if (sourceFilePath.isEmpty() || !QFile::exists(sourceFilePath)) { + qWarning() << Q_FUNC_INFO << sourceFilePath << "Doesn't exist or then the path is empty!"; + return QString(); + } + + if (path.isEmpty()) { + qWarning() << Q_FUNC_INFO << "'path' argument is empty!"; + return QString(); + } + + QFileInfo fileInfo(sourceFilePath); + + + // Construct target temp file path first: + QDir dir(path); + QStringList prevFiles = dir.entryList(QStringList() << fileInfo.baseName() + QLatin1String("*"), QDir::Files); + int count = prevFiles.count(); + + // Create temp file with increasing index in a file name e.g. + // /var/temp/img_001_0.jpg, /var/temp/img_001_1.jpg + // In a case there already is a file with the same filename + QString filePath = dir.absolutePath() + QDir::separator(); + QString fileName = fileInfo.baseName() + + QLatin1String("_") + + QString::number(count) + + QLatin1String(".") + + fileInfo.suffix(); + + // This makes sure that we don't generate a file name which already exists. E.g. there are files: + // img_001_0, img_001_1, img_001_2 and img_001 gets deleted. Then this code would generate a + // filename img_001_2 which already exists + while(prevFiles.contains(fileName)) { + ++count; + fileName = fileInfo.baseName() + + QLatin1String("_") + + QString::number(count) + + QLatin1String(".") + + fileInfo.suffix(); + } + + return filePath + fileName; +} + +/*! + Helper method to remove metadata from jpeg files. Only author and location related + metadata will be removed. \a sourceFile is the path to the original file. + + Returns a path to the copy of the image with metadata removed. + */ +QString ImageOperation::removeImageMetadata(const QString &sourceFile) +{ + + if (!QuillMetadata::canRead(sourceFile)) { + qWarning() << Q_FUNC_INFO << "Can't read the source: " << sourceFile; + return QString(); + } + + QString targetFile = uniqueFilePath(sourceFile); + + // Copy image content first + if (!QFile::copy(sourceFile, targetFile)) { + qWarning() << Q_FUNC_INFO << "Failed to copy content!"; + return QString(); + } + + // Get metadata and remove it + QuillMetadata md(sourceFile); + if(!md.isValid()) { + qWarning() << Q_FUNC_INFO << "Invalid metadata"; + return QString(); + } + + // Remove bunch of metadata entries + md.removeEntry(QuillMetadata::Tag_Creator); + md.removeEntry(QuillMetadata::Tag_Subject); + md.removeEntry(QuillMetadata::Tag_Title); + md.removeEntry(QuillMetadata::Tag_City); + md.removeEntry(QuillMetadata::Tag_Country); + md.removeEntry(QuillMetadata::Tag_Location); + md.removeEntry(QuillMetadata::Tag_Description); + md.removeEntry(QuillMetadata::Tag_Regions); + md.removeEntry(QuillMetadata::Tag_Timestamp); + md.removeEntries(QuillMetadata::TagGroup_GPS); + + // Write modified metadata to the target file + if (!md.write(targetFile)) { + qWarning() << Q_FUNC_INFO << "Failed to clear metadata!"; + return QString(); + } + // Return new file with removed metadata + return targetFile; +} + +/*! + Scale image \a sourceFile using \a scaleFactor. The scaled image is stored to the \a targetFile or + if \a targetFile is not given, then a temporary file is created for saving. + + The \a scaleFactor argument must be greater than 0 and less than 1. This function returns path to the + scaled image. Note that if user doesn't specify \a targetFile the scaled image is stored under temp + directory. Nothing guarantees that created file will remain in that diretory forewer so the caller is + reponsible of copying file for more permanent storing. + + Returns a path to the scaled image. + + It is also recommended that if the caller doesn't use the scaled file, which is stored to the temp + directory later, the caller should remove the file. + */ +QString ImageOperation::scaleImage(const QString &sourceFile, qreal scaleFactor, const QString &targetFile) +{ + if ( scaleFactor <= 0.0 || 1.0 <= scaleFactor) { + qWarning() << Q_FUNC_INFO << "Argument scaleFactor needs to be 0 < scale factor < 1"; + return QString(); + } + + if (!QFile::exists(sourceFile)) { + qWarning() << Q_FUNC_INFO << sourceFile << "doesn't exist!"; + return QString(); + } + + QString tmpFile = targetFile; + if (tmpFile.isEmpty()) { + tmpFile = uniqueFilePath(sourceFile); + } + + // Using just basic QImage scale here. We can easily replace this implementation later, if we notice + // performance bottlenecks here. + QImage tmpImg(sourceFile); + if (tmpImg.isNull()) { + qWarning() << Q_FUNC_INFO << "Null source image!"; + return QString(); + } + + QImage scaled = tmpImg.scaled(tmpImg.size() * scaleFactor, Qt::KeepAspectRatio, Qt::SmoothTransformation); + + if (!scaled.save(tmpFile)) { + qWarning() << Q_FUNC_INFO << "Failed to save scaled image to temp file!"; + return QString(); + } + + return tmpFile; +} diff --git a/lib/imageoperation.h b/lib/imageoperation.h new file mode 100644 index 0000000..b8b34b5 --- /dev/null +++ b/lib/imageoperation.h @@ -0,0 +1,41 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef IMAGEOPERATION_H +#define IMAGEOPERATION_H + +#include +#include + +class ImageOperation +{ +public: + static QString uniqueFilePath(const QString &sourceFilePath, const QString &path = QDir::tempPath()); + static QString removeImageMetadata(const QString &sourceFile); + static QString scaleImage(const QString &sourceFile, qreal scaleFactor, const QString &targetFile=QString()); +}; + +#endif // IMAGEOPERATION_H diff --git a/lib/lib.pro b/lib/lib.pro new file mode 100644 index 0000000..fbec10d --- /dev/null +++ b/lib/lib.pro @@ -0,0 +1,53 @@ +TEMPLATE = lib +TARGET = nemotransferengine +DEPENDPATH += . +INCLUDEPATH += . +CONFIG += shared link_pkgconfig +QT += dbus +CONFIG += quillmetadata + +system(qdbusxml2cpp -v -c TransferEngineInterface -p transferengineinterface.h:transferengineinterface.cpp -i metatypedeclarations.h ../dbus/org.nemo.transferengine.xml) + +HEADERS += \ + transferdbrecord.h \ + metatypedeclarations.h \ + transfertypes.h \ + mediatransferinterface.h \ + transferplugininterface.h \ + mediaitem.h \ + transfermethodinfo.h \ + transferplugininfo.h \ + transferengineclient.h \ + imageoperation.h + +SOURCES += \ + transferdbrecord.cpp \ + mediatransferinterface.cpp \ + mediaitem.cpp \ + transfermethodinfo.cpp \ + transferengineclient.cpp \ + imageoperation.cpp + +# generated files +HEADERS += \ + transferengineinterface.h + + +SOURCES += \ + transferengineinterface.cpp + +OTHER_FILES += nemotransfernegine.pc nemotransferengine-plugin.prf + +headers.files = $$HEADERS +headers.path = /usr/include/TransferEngine + +target.path = /usr/lib + +pkgconfigpc.path = /usr/lib/pkgconfig/ +pkgconfigpc.files = nemotransferengine.pc + +prf.path = $$[QT_INSTALL_DATA]/mkspecs/features +prf.files = nemotransferengine-plugin.prf + + +INSTALLS += target headers prf pkgconfigpc diff --git a/lib/mediaitem.cpp b/lib/mediaitem.cpp new file mode 100644 index 0000000..ae4df71 --- /dev/null +++ b/lib/mediaitem.cpp @@ -0,0 +1,127 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "mediaitem.h" +#include + +class MediaItemPrivate +{ +public: + MediaItemPrivate() + {} + + QMap m_values; +}; + +/*! + \class MediaItem + \brief The MediaItem class is a container for all the media item related data needed for sharing. + + \ingroup transfer-engine-lib + + MediaItem is used internally by Nemo Transfer Engine, but MediaItem object instance is + passed to each share plugin via MediaTransferInterface and it is meant to be a read-only object. + + MediaItem can be accessed via MediaTransferInterface::mediaItem() method. MediaItem stores internal + data as key-value pairs. Data can be accessed via value() method using pre-defined ValueKey keys. + + Note: Depending on the use case (sharing, download, sync) MediaItem may not contain data for all + the keys. For example when MediaItem is created for the sync event, it doesn't contain Url or + MimeType values or if plugin doesn't require account, then AccountId won't be defined for this + MediaItem. + + Depending on the share UI which plugins provides, the content of the MediaItem varies. Bluetooth or + NFC sharing doesn't need account or descriptio, but then again Facebook sharing needs that information. + + \sa value() MediaTransferInterface::MediaItem() + */ + +/*! + \enum MediaItem::ValueKey + + The following enum values can be used for accessing MediaItem data. Modifying MediaItem data is not + allowed for the plugins. + + \value TransferType Type of the transfer + \value Timestamp Time stamp when event has been created + \value Status Transfer status + \value DisplayName Name of the share plugin or for sync and download event + \value Url URL of the media item to be shared or downloaded + \value MimeType Mimetype of the media item to be shared or downloaded + \value FileSize Filesize of the media item + \value PluginId Id of the share plugin + \value MetadataStripped Flag to indicate if metadata should be stripped or not + \value Title Title for the media item to be transfered + \value Description Description for the media item to be transfered + \value ServiceIcon Service icon URL e.g. email service + \value ApplicationIcon Application icon url + \value AccountId, Account Id + \value UserData User specific data that is passed from the UI + \value Callback Callback service, path, interface packed to QStringList + \value CancelCBMethod Cancel callback method name + \value RestartCBMethod Restart callback method name + \value CancelSupported Bool to indicate if cancel is supported by the share plugin + \value RestartSupported Bool to indicate if restart is supported by the share plugin +*/ + +/*! + Create MediaItem object. + */ +MediaItem::MediaItem(QObject *parent): + QObject(parent), + d_ptr(new MediaItemPrivate) +{ +} + +/*! + Destructor. + */ +MediaItem::~MediaItem() +{ + delete d_ptr; + d_ptr = 0; +} + +/*! + Set \a value for the \a key. + */ +void MediaItem::setValue(ValueKey key, const QVariant &value) +{ + Q_D(MediaItem); + d->m_values.insert(key, value); +} + +/*! + Returns the value of the \a key. +*/ +QVariant MediaItem::value(ValueKey key) const +{ + Q_D(const MediaItem); + if (!d->m_values.contains(key)) { + return QVariant(); + } + return d->m_values.value(key); +} diff --git a/lib/mediaitem.h b/lib/mediaitem.h new file mode 100644 index 0000000..32a8649 --- /dev/null +++ b/lib/mediaitem.h @@ -0,0 +1,89 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef MEDIAITEM_H +#define MEDIAITEM_H +#include +#include + +// Originally this was meant to be exposed to QML side, but not anymore. +class MediaItemPrivate; +class MediaItem: public QObject +{ + +public: + + enum ValueKey { + TransferType, + Timestamp, + Status, + DisplayName, + Url, + ContentData, + ResourceName, + MimeType, + FileSize, + PluginId, + MetadataStripped, + ScalePercent, + Title, + Description, + ServiceIcon, + ApplicationIcon, + ThumbnailIcon, + AccountId, + UserData, + + // Callback methods comes from the API, not from the plugins + Callback, + CancelCBMethod, + RestartCBMethod, + + // These come from plugins. + CancelSupported, + RestartSupported + + }; + + explicit MediaItem(QObject *parent = 0); + ~MediaItem(); + + QVariant value(ValueKey key) const; + +protected: + void setValue(ValueKey key, const QVariant &value); + + +private: + MediaItemPrivate *d_ptr; + Q_DECLARE_PRIVATE(MediaItem) + friend class TransferEngine; + friend class TransferEnginePrivate; + friend class DbManager; + friend class ut_mediatransferinterface; +}; + +#endif // MEDIAITEM_H diff --git a/lib/mediatransferinterface.cpp b/lib/mediatransferinterface.cpp new file mode 100644 index 0000000..cc0d97b --- /dev/null +++ b/lib/mediatransferinterface.cpp @@ -0,0 +1,291 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "mediatransferinterface.h" +#include "mediaitem.h" +#include + +// Update progress (to dbus) only in every 5% progress changes +#define PROGRESS_THRESHOLD 0.05 + +class MediaTransferInterfacePrivate +{ +public: + MediaTransferInterfacePrivate(): + m_mediaItem(0), + m_status(MediaTransferInterface::NotStarted), + m_progress(0), + m_prevProgress(0) + {} + + MediaItem *m_mediaItem; + MediaTransferInterface::TransferStatus m_status; + qreal m_progress; + qreal m_prevProgress; +}; + + + + +/*! + \class MediaTransferInterface + \brief The MediaTransferInterface class is responsible of implementing + + \ingroup transfer-engine-lib + + MediaTransferInterface is an abstract class which must be implemented by + each share plugin. The subclass of this class is resposible of providing: + + \list + \o Status information of the sharing + \o Progress of the sharing + \o Information, if cancel and restart actions are supported + \o Starting and/or canceling the sharing + \endlist + + + The flow: + The instance of this class is created when SailfishShare::start() method is + called. +*/ + +/*! + \enum MediaTransferInterface::TransferStatus + + Transfers status + + \value NotStarted Transfer not started + \value TransferStarted Transfer is ongoing + \value TransferCanceled Transfer is canceled usually via user actions + \value TransferFinished Transfer is finished successfully + \value TransferInterrupted Transfer failed +*/ + +/*! + \fn virtual QString MediaTransferInterface::displayName() const = 0 + + Subclass must implement this method. Return a human readable display + name for the service e.g. "Facebook". + */ + +/*! + \fn virtual QUrl MediaTransferInterface::serviceIcon() const = 0 + + Subclass must implement this method. Return the URL to the service + icon. Service icon can be e.g. Facebook or BT icon. + + */ + + +/*! + \fn virtual bool MediaTransferInterface::cancelEnabled() const = 0 + + Subclass must implement this method. Return true if cancel is supported + or false otherwise. + */ + +/*! + \fn virtual bool MediaTransferInterface::restartEnabled() const = 0 + + Subclass must implement this method. Return true if restart is supported + or false otherwise. + */ + +/*! + \fn virtual void MediaTransferInterface::start() = 0 + + Subclass must implement this to start the actual sharing operation. This + same method is called when sharing is restarted. + */ + +/*! + \fn virtual void MediaTransferInterface::cancel() = 0 + + Subclass must implement this to cancel the ongoing share operation. +*/ + + +/*! + \fn void MediaTransferInterface::statusChanged(MediaTransferInterface::TransferStatus status) + + This signal with changed \a status is emitted when setStatus() is called. + + Note that this signal is NOT meant to be emitted by the subclass. Instead of + emitting it manually the subclass should use setStatus() method, which causes + this signal to be emitted automatically. +*/ + +/*! + \fn void MediaTransferInterface::progressUpdated(qreal progress) + + This signal is emitted when the \a progress changes. Progress is changed when the + subclass calls setProgress() method. + + Note that, like the statusChanged() signal, also this signal is not to meant to be + emitted by the subclass. It's emitted automatically when subclass calls setProgress(). +*/ + + + +/*! + Construct MediaTransferInterface object with optional \a parent object. + */ +MediaTransferInterface::MediaTransferInterface(QObject *parent): + QObject(parent), + d_ptr(new MediaTransferInterfacePrivate) +{} + +/*! + Destructor. + */ +MediaTransferInterface::~MediaTransferInterface() +{ + delete d_ptr; + d_ptr = 0; +} + +/*! + Set MediaItem for this object. MediaItem is a container for all the information related + to the \a mediaItem (image, video, vcard,..) which is going to be shared. This information + must contain e.g. url to the media item. For more details all the available values, + see MediaItem::ValueKey. + + NOTE: That the values set to this media item depends on the related Share UI. For example + BT share UI won't provide information related to the accounts because "accountId" or "description" + are not required for the Bluetooh. But then again Facebook share UI provides this information. + This means that because plugin provides the Share UI, it knows which fields are set for the + MediaItem instance. + + MediaItem is passed to this item by TransferEngine. + + */ +void MediaTransferInterface::setMediaItem(MediaItem *mediaItem) +{ + Q_D(MediaTransferInterface); + if (d->m_mediaItem) { + qWarning() << "MediaTransferInterface::setMediaItem: MediaItem is not null. Old media item will be deleted!"; + delete d->m_mediaItem; + } + d->m_mediaItem = mediaItem; + d->m_mediaItem->setParent(this); +} + +/*! + Return the MediaItem instance or 0, if it hasn't been set. + */ +MediaItem *MediaTransferInterface::mediaItem() +{ + Q_D(MediaTransferInterface); + return d->m_mediaItem; +} + + +/*! + Returns the status of the media transfer. +*/ +MediaTransferInterface::TransferStatus MediaTransferInterface::status() const +{ + Q_D(const MediaTransferInterface); + return d->m_status; +} + +/*! + Returns the current progress of the ongoing media transfer. +*/ +qreal MediaTransferInterface::progress() const +{ + Q_D(const MediaTransferInterface); + return d->m_progress; +} + + +/*! + Sets the \a status for the media transfer. Note that this method also + sets the progress if status changes to MediaTransferInterface::TransferFinished. + If status changes to MediaTransferInterface::TransferCanceled or + MediaTransferInterface::TransferInterrupted, the progress is set to 0. + + This method emits statusChanged() and progressUpdated() signals automatically based + on status changes and if this method marks progress to 1 or to 0. +*/ +void MediaTransferInterface::setStatus(TransferStatus status) +{ + Q_D(MediaTransferInterface); + + // Make sure that progress is 1 if we are really finished + if (status == MediaTransferInterface::TransferFinished && + d->m_prevProgress < 1 ) { + d->m_progress = 1; + d->m_prevProgress = 1; + emit progressUpdated(1); + } + + // Make sure that progress is set to 0 if transfer is canceled or + // interrupted + if (status == MediaTransferInterface::TransferCanceled || + status == MediaTransferInterface::TransferInterrupted) { + d->m_progress = 0; + d->m_prevProgress = 0; + emit progressUpdated(0); + } + + // And update the status + if (d->m_status != status) { + d->m_status = status; + emit statusChanged(d->m_status); + } + +} + +/*! + Set the \a progress for the on going media transfer. + + Note that progressUpdated() signal might not be emitted in every call of this method + because it might pollute dbus if progress changes too many times. + */ +void MediaTransferInterface::setProgress(qreal progress) +{ + Q_D(MediaTransferInterface); + if (progress < 0 || 1 < progress) { + qWarning() << "MediaTransferInterface::setProgress: progress must be in between 0 and 1"; + // Just show the warning and let the progress update. Sometimes there might be some + // decimals which may not match exactly with 1, like 1.0001 + } + + if (d->m_progress == progress) { + return; + } + + d->m_progress = progress; + + // To avoid dbus overload let's not emit this signal in every progress change + if (qAbs(d->m_progress - d->m_prevProgress) >= PROGRESS_THRESHOLD) { + emit progressUpdated(progress); + d->m_prevProgress = progress; + } +} + + diff --git a/lib/mediatransferinterface.h b/lib/mediatransferinterface.h new file mode 100644 index 0000000..a61fe81 --- /dev/null +++ b/lib/mediatransferinterface.h @@ -0,0 +1,86 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef MEDIATRANSFERINTERFACE_H +#define MEDIATRANSFERINTERFACE_H +#include +#include +#include "transfertypes.h" + + +class MediaItem; +class MediaTransferInterfacePrivate; + +class MediaTransferInterface: public QObject +{ + Q_OBJECT +public: + + enum TransferStatus { + NotStarted = TransferEngineData::NotStarted, + TransferStarted = TransferEngineData::TransferStarted, + TransferCanceled = TransferEngineData::TransferCanceled, + TransferFinished = TransferEngineData::TransferFinished, + TransferInterrupted = TransferEngineData::TransferInterrupted + }; + + + explicit MediaTransferInterface(QObject *parent = 0); + virtual ~MediaTransferInterface(); + + MediaItem *mediaItem(); + + + virtual QString displayName() const = 0; + virtual QUrl serviceIcon() const = 0; + virtual bool cancelEnabled() const = 0; + virtual bool restartEnabled() const = 0; + + MediaTransferInterface::TransferStatus status() const; + qreal progress() const; + +protected: + void setMediaItem(MediaItem *mediaItem); + void setStatus(MediaTransferInterface::TransferStatus status); + void setProgress(qreal progress); + +public Q_SLOTS: + virtual void start() = 0; + virtual void cancel() = 0; + +Q_SIGNALS: + void statusChanged(MediaTransferInterface::TransferStatus status); + void progressUpdated(qreal progress); + +private: + MediaTransferInterfacePrivate *d_ptr; + Q_DECLARE_PRIVATE(MediaTransferInterface) + friend class TransferEngine; + friend class TransferEnginePrivate; + friend class DbManager; +}; + +#endif // MEDIATRANSFERINTERFACE_H diff --git a/lib/metatypedeclarations.h b/lib/metatypedeclarations.h new file mode 100644 index 0000000..5abb866 --- /dev/null +++ b/lib/metatypedeclarations.h @@ -0,0 +1,40 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef METATYPEDECLARATIONS_H +#define METATYPEDECLARATIONS_H + +#include "transferdbrecord.h" +#include "transfermethodinfo.h" +#include + +Q_DECLARE_METATYPE(TransferDBRecord) +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(TransferMethodInfo) +Q_DECLARE_METATYPE(QList) + + +#endif // METATYPEDECLARATIONS_H diff --git a/lib/nemotransferengine-plugin.prf b/lib/nemotransferengine-plugin.prf new file mode 100644 index 0000000..f545014 --- /dev/null +++ b/lib/nemotransferengine-plugin.prf @@ -0,0 +1,26 @@ +################################################################### +# transferengine plugin feature +################################################################### + +!contains(DEFINES, BUILD_LIBTRANSFERENGINE) { + + CONFIG += qt plugin + QT += network + + LIBTRANSFERENGINE_INC_DIR = /usr/include/TransferEngine + + INCLUDEPATH += $${LIBTRANSFERENGINE_INC_DIR} + DEPENDPATH += $${LIBTRANSFERENGINE_INC_DIR} + + # We need to include these for MOC. + HEADERS += $${INCLUDEPATH}/transferplugininterface.h + HEADERS += $${INCLUDEPATH}/mediatransferinterface.h + + LIBTRANSFERENGINE_LIB_DIR = /usr/lib + unix: QMAKE_FLAGS += $${QMAKE_LFLAGS_RPATH}$${LIBTRANSFERENGINE_LIB_DIR} + LIBS += -L$${LIBTRANSFERENGINE_LIB_DIR} + qtAddLibrary(nemotransferengine) +} + + + diff --git a/lib/nemotransferengine.pc b/lib/nemotransferengine.pc new file mode 100644 index 0000000..3ee0d53 --- /dev/null +++ b/lib/nemotransferengine.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include/TransferEngine + +Name: libnemotransferengine +Description: Nemo transfer engine library for share plugins and transfer engine API +Version: 0.0.1 +Requires: QtCore QtDBus +Libs: -L${libdir} -lnemotransferengine +Cflags: -I${includedir} diff --git a/lib/transferdbrecord.cpp b/lib/transferdbrecord.cpp new file mode 100644 index 0000000..367ccfa --- /dev/null +++ b/lib/transferdbrecord.cpp @@ -0,0 +1,253 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "transferdbrecord.h" +#include "metatypedeclarations.h" + +#include + +/*! + \class TransferDBRecord + \brief The TransferDBRecord class is a wrapper class for TransferEngine DBus message. + + \ingroup transfer-engine-lib + + This class wraps transfer method related information and is used to pass that information + over the DBus to the any client who is interested in about it. + + A single instance of TransferDBRecord contains information of a one transfer record in TransferEngine + database. Usually clients don't need to fill any data to this class, instead they can request a list + of TransferDBRecords from the TransferEngine and access its data via value() method. + */ + +/*! + \enum TransferDBRecord::TransferDBRecordField + + An enum for accessing TrasnferDBRecord values using value() method + + \value TransferID Id of the transfer + \value TransferType Type of the transfer (Upload, Download, Sync + \value Progress Progress of the transfer + \value URL Url of the media related to the transfer + \value Status The status of the transfer + \value PluginID The id of the plugin which is handling the transfer + \value Timestamp The timestamp for the transfer + \value DisplayName The display name for the transfer + \value ResourceName The name of the resource + \value MimeType MimeType information of the media being transfered + \value FileSize File size of the media being transfered + \value ServiceIcon Icon url for a service related to the transfer + \value ApplicationIcon Application icon url which has created e.g. sync or download transfer + \value ThumbnailIcon Thumbnail url + \value CancelSupported Boolean to indicate if cancel is supported + \value RestartSupported Boolean to indicate if cancel is supported +*/ + +/*! + Default constructor. + */ +TransferDBRecord::TransferDBRecord() +{ + +} + + +/*! + Assigns \a other to this transfer db record and returns a reference to this transfer db record. + */ +TransferDBRecord &TransferDBRecord::operator=(const TransferDBRecord &other) +{ + transfer_id = other.transfer_id; + transfer_type = other.transfer_type; + status = other.status; + size = other.size; + progress = other.progress; + plugin_id = other.plugin_id; + url = other.url; + timestamp = other.timestamp; + display_name = other.display_name; + resource_name = other.resource_name; + mime_type = other.mime_type; + service_icon = other.service_icon; + application_icon= other.application_icon; + thumbnail_icon = other.thumbnail_icon; + cancel_supported = other.cancel_supported; + restart_supported = other.restart_supported; + return *this; +} + +/*! + Constructs a copy of \a other. + */ +TransferDBRecord::TransferDBRecord(const TransferDBRecord &other): + transfer_id(other.transfer_id), + transfer_type(other.transfer_type), + status(other.status), + size(other.size), + progress(other.progress), + plugin_id(other.plugin_id), + url(other.url), + timestamp(other.timestamp), + display_name(other.display_name), + resource_name(other.resource_name), + mime_type(other.mime_type), + service_icon(other.service_icon), + application_icon(other.application_icon), + thumbnail_icon(other.thumbnail_icon), + cancel_supported(other.cancel_supported), + restart_supported(other.restart_supported) +{ +} + +/*! + Destroys the transfer db record. + */ +TransferDBRecord::~TransferDBRecord() +{ +} + +/*! + Writes the given \a record to specified \a argument. +*/ +QDBusArgument &operator<<(QDBusArgument &argument, const TransferDBRecord &record) +{ + argument.beginStructure(); + + argument << record.transfer_id + << record.transfer_type + << record.status + << record.size + << record.progress + << record.plugin_id + << record.url + << record.timestamp + << record.display_name + << record.resource_name + << record.mime_type + << record.service_icon + << record.application_icon + << record.thumbnail_icon + << record.cancel_supported + << record.restart_supported; + argument.endStructure(); + return argument; +} + + +/*! + Reads the given \a argument and stores it to the specified \a record. +*/ +const QDBusArgument &operator>>(const QDBusArgument &argument, TransferDBRecord &record) +{ + argument.beginStructure(); + argument >> record.transfer_id + >> record.transfer_type + >> record.status + >> record.size + >> record.progress + >> record.plugin_id + >> record.url + >> record.timestamp + >> record.display_name + >> record.resource_name + >> record.mime_type + >> record.service_icon + >> record.application_icon + >> record.thumbnail_icon + >> record.cancel_supported + >> record.restart_supported; + argument.endStructure(); + return argument; +} + +/*! + Registers TransferDBRecord and QList as DBus types. + */ +void TransferDBRecord::registerType() +{ + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); +} + +/*! + Returns any of the TransferDBRecord values based on the index. As an \a index it's recommended to use + TransferDBRecord::TransferDBRecordField enum. +*/ +QVariant TransferDBRecord::value(int index) const +{ + switch(index) { + case TransferID: + return transfer_id; + + case TransferType: + return transfer_type; + + case Progress: + return progress; + + case URL: + return url; + + case Status: + return status; + + case PluginID: + return plugin_id; + + case Timestamp: + return timestamp; + + case DisplayName: + return display_name; + + case ResourceName: + return resource_name; + + case MimeType: + return mime_type; + + case FileSize: + return size; + + case ServiceIcon: + return service_icon; + + case ApplicationIcon: + return application_icon; + + case ThumbnailIcon: + return thumbnail_icon; + + case CancelSupported: + return cancel_supported; + + case RestartSupported: + return restart_supported; + + default: + return QVariant(); + } +} diff --git a/lib/transferdbrecord.h b/lib/transferdbrecord.h new file mode 100644 index 0000000..71fd05e --- /dev/null +++ b/lib/transferdbrecord.h @@ -0,0 +1,92 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERDBRECORD_H +#define TRANSFERDBRECORD_H + +#include +#include + +class TransferDBRecord +{ + +public: + + enum TransferDBRecordField { + TransferID = 0, + TransferType, + Progress, + URL, + Status, + PluginID, + Timestamp, + DisplayName, + ResourceName, + MimeType, + FileSize, + ServiceIcon, + ApplicationIcon, + ThumbnailIcon, + CancelSupported, + RestartSupported + }; + + TransferDBRecord(); + TransferDBRecord &operator=(const TransferDBRecord &other); + TransferDBRecord(const TransferDBRecord &other); + ~TransferDBRecord(); + + + friend QDBusArgument &operator<<(QDBusArgument &argument, const TransferDBRecord &record); + friend const QDBusArgument &operator>>(const QDBusArgument &argument, TransferDBRecord &record); + + static void registerType(); + + QVariant value(int index) const; + +// TODO: Maybe this could use QVariantList internally to ease of pain of keeping thigs up to date +// when database structure / fields change + int transfer_id; + int transfer_type; + int status; + qint64 size; + double progress; + QString plugin_id; + QString url; + QString timestamp; + QString display_name; + QString resource_name; + QString mime_type; + QString service_icon; + QString application_icon; + QString thumbnail_icon; + bool cancel_supported; + bool restart_supported; +}; + + + +#endif // DBUSTYPES_H diff --git a/lib/transferengineclient.cpp b/lib/transferengineclient.cpp new file mode 100644 index 0000000..a6cfbfc --- /dev/null +++ b/lib/transferengineclient.cpp @@ -0,0 +1,341 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "transferengineclient.h" +#include "transferengineinterface.h" + + +class CallbackInterfacePrivate { +public: + CallbackInterfacePrivate() + { + } + + CallbackInterfacePrivate(const QString &server, const QString &path, const QString &interface, + const QString &cancelMethod, const QString &restartMethod) + { + callback << server << path << interface; + m_cancelMethod = cancelMethod; + m_restartMethod = restartMethod; + } + + QStringList callback; + QString m_cancelMethod; + QString m_restartMethod; +}; + + +/*! + \class CallbackInterface + \brief The CallbackInterface class is a convenience class to wrap DBus callback infromation for + TransferEngineClient API. + + \ingroup transfer-engine-lib + + This class should be used with TransferEngineClient API. + + NOTE: If creating an instance of this class to the heap, the caller is responsible of freeing + the allocated memory. + + \sa TransferEngineClient::createSyncEvent() TransferEngineClient::createDownloadEvent() + */ + + +/*! + Construct an empty CallbackInterface. This can be used if client doesn't want to provide callback + interface to the Sync or Download events. + */ +CallbackInterface::CallbackInterface() + : d_ptr(new CallbackInterfacePrivate()) +{ +} + + +/*! + Construct CallbackInterface instance to provide callback information to the TransferEngineClient. Setup + arguments as: + \list + \o \a server e.g. "com.jolla.myapp" + \o \a path e.g. "/com/jolla/myapp" + \o \a interface e.g. "com.jolla.myapp" + \o \a cancelMethod Cancel method name e.g. "cancelSync" + \o \a restartMethod Restart method name e.g. "restartSync" + \endlist + */ +CallbackInterface::CallbackInterface(const QString &server, const QString &path, const QString &interface, + const QString &cancelMethod, const QString &restartMethod) + : d_ptr(new CallbackInterfacePrivate(server, path, interface, cancelMethod, restartMethod)) +{ +} + +/*! + Destroys CallbackInterface object. + */ +CallbackInterface::~CallbackInterface() +{ + delete d_ptr; +} + + +class TransferEngineClientPrivate +{ +public: + TransferEngineInterface *m_client; +}; + +/*! + \class TransferEngineClient + \brief The TransferEngineClient class is a simple client API for creating Download and + Sync events to TransferEngine. + + TransferEngineClient is a convenience API for create and updating Download and + Sync entries to the Nemo TransferEngine. For Upload entries, it is required to + create share plugins by implementing required interfaces provided by this TransferEngine + library. + + If the client using this interface wants to enable cancel and restart functionality, it + means that the client process must provide DBus API, which Nemo Transfer Engine can call + in a case of canceling or restarting the operation. In order to do that client must provide + CallbackInterface object with properly set dbus information. See the example below. + + For share plugin implementation: + \sa TransferPluginInterface, MediaTransferInterface, TransferPluginInfo + + To use this API to create e.g. Sync entry see the example below: + + \code + + // Create the instance of the client + TransferEngineClient *client = new TransferEngineClient(this); + + // Setup callback information. This is dbus interface + CallbackInterface callback("com.jolla.myapp", "/com/jolla/myapp", "com.jolla.myapp", + "cancel", "restart"); + + // Create the sync event + int transferId = client->createSyncEvent("Syncing data from my service", + QUrl("image://theme/icon-launcher-my-app"), + QUrl("image://theme/icon-s-service-icon"), + callback); + + // Start the actual transfer i.e. sync + client->startTransfer(transferId) + + // Update sync progress. Usually this is done e.g. in a slot which receives sync + // progress from a signal. + bool ok; + qreal progress = 0; + while (progress <= 1) { + client->updateProgress(transferId, progress); + progress = getProgressFoo(&ok); + + if (!ok) + break; + } + + // End the sync + TransferEngineClient status; + QString reason; + if (ok) { + status = TransferEngineClient::TransferFinished; + } else { + status = TnrasferEngineClient::TransferInterrupted; + reason = "Something went wrong"; + } + + client->finishTransfer(transferId, status, reason); + + \endcode +*/ +/*! + \enum TransferEngineClient::Status + + This enum type describes different values for the Status. + + \value TransferFinished Transfer finished successfully + \value TransferCanceled Transfer canceled usually due user actions + \value TransferInterrupted Transfer interrupted because of an error +*/ + +/*! + Construct an instance of TransferEngineClient with optional \a parent argument. + */ +TransferEngineClient::TransferEngineClient(QObject *parent) : + QObject(parent), + d_ptr(new TransferEngineClientPrivate) +{ + Q_D(TransferEngineClient); + d->m_client = new TransferEngineInterface("org.nemo.transferengine", + "/org/nemo/transferengine", + QDBusConnection::sessionBus(), + this); +} + + +/*! + Destructor. + */ +TransferEngineClient::~TransferEngineClient() +{ + Q_D(TransferEngineClient); + delete d->m_client; + delete d_ptr; + d_ptr = 0; +} + +/*! + Creates a download event to the TransferEngine. This method requires the following parameters + \a displayName, a human readable name for the entry. \a applicationIcon is the \c QUrl to the icon + of the application, who's calling this method. Usually it can be in format "image://theme/icon-s-something". + \a serviceIcon is a service specific icon such as DropBox. \a url is the url to the media to be downloaded. + \a mimeType is the mimeType of the media and \a expectedFileSize is the file size of the file to be downloaded. + + Client can define callback functions for canceling and restarting download. For that client can provide + optional parameter \a callback, which is \c CallbackInterface object containing information about the dbus + service. + + Returns transfer id of the download event. + + Create a download event to the TransferEngine. This only creates and entry, and client + needs still call: + \list + \o \l TransferEngineClient::startTransfer() + \o \l TransferEngineClient::updateTransferProgress() + \o \l TransferEngineClient::finishTransfer() + \endlist + + \sa createSyncEvent(), startTransfer(), updateTransferProgress(), finishTransfer() + */ +int TransferEngineClient::createDownloadEvent(const QString &displayName, + const QUrl &applicationIcon, + const QUrl &serviceIcon, + const QUrl &url, + const QString &mimeType, + qlonglong expectedFileSize, + const CallbackInterface &callback) +{ + Q_D(const TransferEngineClient); + QDBusPendingReply reply = d->m_client->createDownload(displayName, + applicationIcon.toString(), + serviceIcon.toString(), + url.toString(), + mimeType, + expectedFileSize, + callback.d_func()->callback, + callback.d_func()->m_cancelMethod, + callback.d_func()->m_restartMethod); + reply.waitForFinished(); + + if (reply.isError()) { + qWarning() << "TransferEngineClient::createDownloadEvent: failed to get transfer ID!"; + return false; + } + + return reply.value(); +} + +/*! + Create a sync event to the TransferEngine. This method is very similar to createDownload(), + except createSyncEvent() takes less parameters. + + \a displayName, a human readable name for the entry. \a applicationIcon is the \c QUrl to the icon + of the application, who's calling this method. Usually it can be in format "image://theme/icon-s-something". + \a serviceIcon is a service specific icon such as email account. + + Client can define callback functions for canceling and restarting sync. For that client can provide + optional parameter \a callback, which is \c CallbackInterface object containing information about the dbus + service. + + Returns transfer id of the sync event. + + \sa startTransfer(), updateTransferProgress(), finishTransfer() + */ +int TransferEngineClient::createSyncEvent(const QString &displayName, + const QUrl &applicationIcon, + const QUrl &serviceIcon, + const CallbackInterface &callback) +{ + Q_D(const TransferEngineClient); + QDBusPendingReply reply = d->m_client->createSync(displayName, + applicationIcon.toString(), + serviceIcon.toString(), + callback.d_func()->callback, + callback.d_func()->m_cancelMethod, + callback.d_func()->m_restartMethod); + reply.waitForFinished(); + + if (reply.isError()) { + qWarning() << "TransferEngineClient::createSyncEvent: failed to get transfer ID!"; + return false; + } + + return reply.value(); +} + +/*! + Start the transfer for the existing transfer entry with \a transferId. This changes the status of the + transfer from idle to started.These status changes are handled by Nemo TransferEngine internally, but + after this method has been called, the transfer is possible to cancel, interrupt or finish. + */ +void TransferEngineClient::startTransfer(int transferId) +{ + Q_D(const TransferEngineClient); + d->m_client->startTransfer(transferId); +} + +/*! + Update the progress of the existing transfer with \a transferId. The \a progress must be a \c qreal value + between 0 to 1. + + */ +void TransferEngineClient::updateTransferProgress(int transferId, qreal progress) +{ + if (progress < 0 || 1 < progress) { + qWarning() << Q_FUNC_INFO << "Progress must be between 0 and 1!"; + return; + } + Q_D(const TransferEngineClient); + d->m_client->updateTransferProgress(transferId, progress); +} + +/*! + Finalize the transfer with \a transferId. There are three options for finalizing the transfer by setting + the \a status parameter value: + \list + \o \l TransferEngineClient::TransferFinished - success + \o \l TransferEngineClient::TransferCanceled - user cancelation + \o \l TransferEngineClient::TransferInterrupted - an error + \endlist + + If the client wants to provide reason for finishing the transfer, it's possible to provide \a reason + parameter. + */ +void TransferEngineClient::finishTransfer(int transferId, Status status, const QString &reason) +{ + Q_D(const TransferEngineClient); + d->m_client->finishTransfer(transferId, static_cast(status), reason); +} + diff --git a/lib/transferengineclient.h b/lib/transferengineclient.h new file mode 100644 index 0000000..031773a --- /dev/null +++ b/lib/transferengineclient.h @@ -0,0 +1,89 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERENGINECLIENT_H +#define TRANSFERENGINECLIENT_H + +#include +#include +#include "transfertypes.h" + + +class CallbackInterfacePrivate; +class CallbackInterface { +public: + CallbackInterface(); + CallbackInterface(const QString &server, const QString &path, const QString &interface, + const QString &cancelMethod, const QString &restartMethod); + ~CallbackInterface(); + +private: + CallbackInterfacePrivate *d_ptr; + Q_DECLARE_PRIVATE(CallbackInterface) + friend class TransferEngineClient; +}; + +class TransferEngineClientPrivate; +class TransferEngineClient : public QObject +{ + Q_OBJECT +public: + + enum Status { + TransferFinished = TransferEngineData::TransferFinished, + TransferCanceled = TransferEngineData::TransferCanceled, + TransferInterrupted = TransferEngineData::TransferInterrupted + }; + + explicit TransferEngineClient(QObject *parent = 0); + ~TransferEngineClient(); + + + + int createDownloadEvent(const QString &displayName, + const QUrl &applicationIcon, + const QUrl &serviceIcon, + const QUrl &url, + const QString &mimeType, + qlonglong expectedFileSize, + const CallbackInterface &callback = CallbackInterface()); + + + int createSyncEvent(const QString &displayName, + const QUrl &applicationIcon, + const QUrl &serviceIcon, + const CallbackInterface &callback = CallbackInterface()); + + void startTransfer(int transferId); + void updateTransferProgress(int transferId, qreal progress); + void finishTransfer(int transferId, Status status, const QString &reason = QString()); + +private: + TransferEngineClientPrivate *d_ptr; + Q_DECLARE_PRIVATE(TransferEngineClient) +}; + +#endif // TRANSFERENGINECLIENT_H diff --git a/lib/transfermethodinfo.cpp b/lib/transfermethodinfo.cpp new file mode 100644 index 0000000..564159c --- /dev/null +++ b/lib/transfermethodinfo.cpp @@ -0,0 +1,182 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "transfermethodinfo.h" +#include "metatypedeclarations.h" + +/*! + \class TransferMethodInfo + \brief The TransferMethodInfo class encapsulate information of a single transfer method. + + \ingroup transfer-engine-lib + + Share plugin must create a list of instances of TransferMethodInfo class to encapsulate + information about the plugin for example filling information for the Bluetooth sharing plugin: + + \code + QList infoList; + TransferMethodInfo info; + + QStringList capabilities; + capabilities << QLatin1String("*"); + + info.displayName = QLatin1String("Bluetooth"); + info.userName = ""; + info.accountId = ""; + info.methodId = QLatin1String("bluetooth"); + info.shareUIPath = SHARE_UI_PATH + QLatin1String("/BluetoothShareUI.qml"); + info.capabilitities = capabilities; + infoList << info; + \endcode +*/ + +/*! + \enum TransferMethodInfo::TransferMethodInfoField + + This enum can be used for accessing different values using value() method + + \value DisplayName The name that will be visible e.g. Facebook or Bluetooth + \value UserName User name e.g. mike.myers@gmail.com + \value MethodId The plugin Id of the share plugin e.g. "bluetooth" + \value AccountId The Id the account, needed in a case of multiple accounts + \value ShareUIPath The path to the share ui QML plugin. This QML file will be loaded by the share UI + \value Capabilities A list of supported mimetypes +*/ + +/*! + Creates an instance of TransferMethodInfo. + */ +TransferMethodInfo::TransferMethodInfo(): + displayName(), + userName(), + methodId(), + shareUIPath(), + capabilitities(), + accountId() +{ +} + +/*! + Assigns \a other object to this. +*/ +TransferMethodInfo &TransferMethodInfo::operator=(const TransferMethodInfo &other) +{ + displayName = other.displayName; + userName = other.userName; + methodId = other.methodId; + shareUIPath = other.shareUIPath; + capabilitities = other.capabilitities; + accountId = other.accountId; + return *this; +} + +/*! + Copies \a other to this instance. +*/ +TransferMethodInfo::TransferMethodInfo(const TransferMethodInfo &other): + displayName(other.displayName), + userName(other.userName), + methodId(other.methodId), + shareUIPath(other.shareUIPath), + capabilitities(other.capabilitities), + accountId(other.accountId) +{ + +} + +/*! + Destroys TransferMethodInfo instance. +*/ +TransferMethodInfo::~TransferMethodInfo() +{ + +} + +/*! + Writes data from \a info to \a argument. +*/ +QDBusArgument &operator<<(QDBusArgument &argument, const TransferMethodInfo &info) +{ + argument.beginStructure(); + argument << info.displayName + << info.userName + << info.methodId + << info.shareUIPath + << info.capabilitities + << info.accountId; + + argument.endStructure(); + return argument; +} + +/*! + Reads data from \a argument to \a info. +*/ +const QDBusArgument &operator>>(const QDBusArgument &argument, TransferMethodInfo &info) +{ + argument.beginStructure(); + argument >> info.displayName + >> info.userName + >> info.methodId + >> info.shareUIPath + >> info.capabilitities + >> info.accountId; + + argument.endStructure(); + return argument; +} + +/*! + Registers TransferMethodInfo and QList as DBus types. +*/ +void TransferMethodInfo::registerType() +{ + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); +} + +/*! + Returns the value using the \a index. Actually the index is enum TransferMethodInfoField. + */ +QVariant TransferMethodInfo::value(int index) const +{ + switch(index) { + case DisplayName: + return displayName; + case UserName: + return userName; + case MethodId: + return methodId; + case ShareUIPath: + return shareUIPath; + case Capabilities: + return capabilitities; + case AccountId: + return accountId; + default: + return QVariant(); + } +} diff --git a/lib/transfermethodinfo.h b/lib/transfermethodinfo.h new file mode 100644 index 0000000..dbc96ee --- /dev/null +++ b/lib/transfermethodinfo.h @@ -0,0 +1,69 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERMETHODINFO_H +#define TRANSFERMETHODINFO_H + +#include +#include + + +class TransferMethodInfo +{ +public: + + // Used internally only + enum TransferMethodInfoField { + DisplayName, // e.g. Facebook + UserName, // e.g. mike.myers@gmail.com + MethodId, // Id of the plugin + AccountId, // Id the account, needed in a case of multiple accounts + ShareUIPath, // path to the share ui QML plugin + Capabilities // list of supported mimetypes + }; + + TransferMethodInfo(); + TransferMethodInfo &operator=(const TransferMethodInfo &other); + TransferMethodInfo(const TransferMethodInfo &other); + ~TransferMethodInfo(); + + friend QDBusArgument &operator<<(QDBusArgument &argument, const TransferMethodInfo &record); + friend const QDBusArgument &operator>>(const QDBusArgument &argument, TransferMethodInfo &record); + + static void registerType(); + + QVariant value(int index) const; + + + QString displayName; + QString userName; + QString methodId; + QString shareUIPath; + QStringList capabilitities; + quint32 accountId; +}; + +#endif // TRANSFERMETHODINFO_H diff --git a/lib/transferplugininfo.h b/lib/transferplugininfo.h new file mode 100644 index 0000000..0e649cd --- /dev/null +++ b/lib/transferplugininfo.h @@ -0,0 +1,45 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERPLUGININFO_H +#define TRANSFERPLUGININFO_H +#include +#include "transfermethodinfo.h" + +class TransferPluginInfo: public QObject +{ + Q_OBJECT +public: + virtual QList info() const = 0; + virtual void query() = 0; + virtual bool ready() const = 0; + +Q_SIGNALS: + void infoReady(); + void infoError(const QString &msg); +}; + +#endif // TRANSFERPLUGINSTATUS_H diff --git a/lib/transferplugininterface.h b/lib/transferplugininterface.h new file mode 100644 index 0000000..c9d869b --- /dev/null +++ b/lib/transferplugininterface.h @@ -0,0 +1,48 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERPLUGININTERFACE_H +#define TRANSFERPLUGININTERFACE_H + +#include +#include "transferplugininfo.h" + + +class MediaTransferInterface; +class TransferPluginInterface +{ +public: + virtual MediaTransferInterface * transferObject() = 0; + + virtual TransferPluginInfo *infoObject() = 0; + + virtual QString pluginId() const = 0; + + virtual bool enabled() const = 0; +}; + +Q_DECLARE_INTERFACE(TransferPluginInterface, "org.nemo.TransferPluginInterface/1.0") +#endif // TRANSFERPLUGININTERFACE_H diff --git a/lib/transfertypes.h b/lib/transfertypes.h new file mode 100644 index 0000000..cc89b5e --- /dev/null +++ b/lib/transfertypes.h @@ -0,0 +1,50 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERTYPES_H +#define TRANSFERTYPES_H + +namespace TransferEngineData +{ + + enum TransferStatus { + Unknown, + NotStarted, + TransferStarted, + TransferCanceled, + TransferFinished, + TransferInterrupted + }; + + enum TransferType { + Undefined, + Upload, + Download, + Sync + }; + +} +#endif // TRANSFERTYPES_H diff --git a/license.lgpl b/license.lgpl new file mode 100644 index 0000000..0c063d3 --- /dev/null +++ b/license.lgpl @@ -0,0 +1,514 @@ + GNU LESSER GENERAL PUBLIC LICENSE + + Nemo Transfer Engine + Copyright (C) 2013 Jolla Ltd. + Contact: info@jolla.com + + You may use, distribute and copy the Nemo Transfer Engine + under the terms of GNU Lesser General Public License version 2.1. + +------------------------------------------------------------------------- + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation + and appearing in the file license.lgpl included in the packaging + of this file. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/nemo-transfer-engine.conf b/nemo-transfer-engine.conf new file mode 100644 index 0000000..a68d894 --- /dev/null +++ b/nemo-transfer-engine.conf @@ -0,0 +1,5 @@ +[transfers] +service=com.jolla.settings +path=/com/jolla/settings/ui +interface=com.jolla.settings.ui +method=showTransfers diff --git a/rpm/transfer-engine.spec b/rpm/transfer-engine.spec new file mode 100644 index 0000000..66a9e14 --- /dev/null +++ b/rpm/transfer-engine.spec @@ -0,0 +1,120 @@ +Name: nemo-transferengine +Version: 0.0.14 +Release: 0 +Summary: Transfer Engine for uploading media content and tracking transfers. +Group: System Environment/Daemon +License: LGPLv2.1 +URL: https://github.com/nemomobile/transfer-engine +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(QtCore) +BuildRequires: pkgconfig(accounts-qt) +BuildRequires: pkgconfig(qmsystem2) +BuildRequires: pkgconfig(QtSystemInfo) +BuildRequires: desktop-file-utils +BuildRequires: pkgconfig(mlite) +BuildRequires: pkgconfig(accounts-qt) +BuildRequires: pkgconfig(quillmetadata) + +%description +%{summary}. + +%files +%defattr(-,root,root,-) +%{_libdir}/*.so* +%{_bindir}/nemo-transfer-engine +%{_datadir}/dbus-1/services/org.nemo.transferengine.service +%{_datadir}/translations/nemo-transfer-engine_eng_en.qm +/home/nemo/.config/nemomobile/*.conf + + +%package -n nemo-transferengine-devel +Summary: Development headers for transfer engine library. +Group: Development/Libraries +Requires: nemo-transferengine = %{version} + +%description -n nemo-transferengine-devel +%{summary}. + +%files -n nemo-transferengine-devel +%defattr(-,root,root,-) +%{_includedir}/TransferEngine/*.h +%{_qt_datadir}/mkspecs/features/nemotransferengine-plugin.prf +%{_libdir}/pkgconfig/nemotransferengine.pc + +%package ts-devel +Summary: Translation source for Nemo TransferEngine +License: LGPLv2.1 +Group: System Environment/Daemon + +%description ts-devel +Translation source for Nemo TransferEngine + +%files ts-devel +%defattr(-,root,root,-) +%{_datadir}/translations/source/nemo-transfer-engine.ts + +%package tests +Summary: Unit tests for Nemo TransferEngine +License: LGPLv2.1 +Group: System Environment/Daemon + +%description tests +Unit tests for Nemo TransferEngine + +%files tests +%defattr(-,root,root,-) +/opt/tests/nemo-transfer-engine/* + +%package doc +Summary: Documentation for Nemo TransferEngine +License: BSD +Group: System Environment/Daemon + +%description doc +Documentation for Nemo TransferEngine + +%files doc +%defattr(-,root,root,-) +/usr/share/doc/nemo-transfer-engine/* + + + +%prep +%setup -q -n %{name}-%{version} + +%build + +%qmake + +make %{?jobs:-j%jobs} +make docs + +%install +rm -rf %{buildroot} +%qmake_install + +%define def_uid $(grep "^UID_MIN" /etc/login.defs | tr -s " " | cut -d " " -f2) +%define def_user $(getent passwd %def_uid | sed 's/:.*//') +%define db_file /home/%{def_user}/.local/nemo-transferengine/transferdb.sqlite +%define te_pid $(pgrep -f nemo-transfer-engine) + +%post -n nemo-transferengine +/sbin/ldconfig +if [ -n "%{te_pid}" ] +then + kill -s 10 %{te_pid} +fi + +chown nemo:nemo -R /home/%{def_user}/.config/nemomobile +chmod u+rw -R /home/%{def_user}/.config/nemomobile + +exit 0 + +%postun -n nemo-transferengine +/sbin/ldconfig + +if [ -f "%{db_file}" ] +then + rm %{db_file} +fi +exit 0 diff --git a/src/dbmanager.cpp b/src/dbmanager.cpp new file mode 100644 index 0000000..cd4abde --- /dev/null +++ b/src/dbmanager.cpp @@ -0,0 +1,778 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "dbmanager.h" +#include "transfertypes.h" +#include "mediaitem.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DB_PATH ".local/nemo-transferengine" +#define DB_NAME "transferdb.sqlite" + +// Table for metadata +#define DROP_METADATA "DROP TABLE metadata;" +#define TABLE_METADATA "CREATE TABLE metadata (metadata_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" \ + "title TEXT,\n" \ + "description TEXT,\n" \ + "transfer_id INTEGER NOT NULL,\n" \ + "FOREIGN KEY(transfer_id) REFERENCES transfers(transfer_id) ON DELETE CASCADE\n" \ + ");\n" + +// Table for callbacks. In practice there are dbus interfaces +#define DROP_CALLBACK "DROP TABLE callback;" +#define TABLE_CALLBACK "CREATE TABLE callback (callback_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" \ + "service TEXT,\n" \ + "path TEXT,\n" \ + "interface TEXT,\n"\ + "cancel_method TEXT,\n"\ + "restart_method TEXT,\n"\ + "transfer_id INTEGER NOT NULL,\n"\ + "FOREIGN KEY(transfer_id) REFERENCES transfers(transfer_id) ON DELETE CASCADE\n"\ + ");\n" + +// Table for all the transfers +#define DROP_TRANSFERS "DROP TABLE transfers;" +#define TABLE_TRANSFERS "CREATE TABLE transfers (transfer_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" \ + "transfer_type INTEGER,\n" \ + "timestamp TEXT,\n" \ + "status INTEGER,\n" \ + "progress REAL,\n" \ + "display_name TEXT,\n" \ + "application_icon TEXT,\n"\ + "thumbnail_icon TEXT,\n"\ + "service_icon TEXT,\n" \ + "url TEXT,\n" \ + "resource_name TEXT,\n" \ + "mime_type TEXT,\n" \ + "file_size INTEGER,\n" \ + "plugin_id TEXT,\n" \ + "account_id TEXT,\n"\ + "strip_metadata INTEGER,\n" \ + "scale_percent REAL,\n" \ + "cancel_supported INTEGER,\n" \ + "restart_supported INTEGER\n" \ + ");\n" + +// Cascade trigger i.e. when transfer is removed and it has metadata or callbacks, this +// trigger make sure that they are also removed +#define DROP_TRIGGER "DROP TRIGGER delete_cascade;" +#define TRIGGER "CREATE TRIGGER delete_cascade\n" \ + "BEFORE DELETE ON transfers\n" \ + "FOR EACH ROW BEGIN\n" \ + " DELETE FROM metadata WHERE transfer_id = OLD.transfer_id;\n" \ + " DELETE FROM callback WHERE transfer_id = OLD.transfer_id;\n" \ + "END;\n" + +// Update the following version if database schema changes. +#define USER_VERSION 1 +#define PRAGMA_USER_VERSION QString("PRAGMA user_version=%1").arg(USER_VERSION) + +class DbManagerPrivate { +public: + + QString currentDateTime() + { + // TODO: Make sure this can handle time correctly + // Let's use ISO8601 strings + QDateTime dt = QDateTime::currentDateTime(); + return dt.toString("yyyy-MM-ddThh:mm:ss"); + } + + bool createDatabaseSchema() + { + bool ok = true; + QSqlQuery query; + if (!query.exec(TABLE_METADATA)) { + qWarning() << "DbManagerPrivate::createDatabase: create metadata table: " + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(TABLE_CALLBACK)) { + qWarning() << "DbManagerPrivate::createDatabase: create callback table: " + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(TABLE_TRANSFERS)) { + qWarning() << "DbManagerPrivate::createDatabase: create transfer table: " + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(TRIGGER)) { + qWarning() << "DbManagerPrivate::createDatabase: create cascade trigger: " + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(PRAGMA_USER_VERSION)) { + qWarning() << "DbManagerPrivate::createDatabase: pragma user_version: " + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + query.finish(); + return ok; + } + + bool deleteOldTables() + { + bool ok = true; + QSqlQuery query; + if (!query.exec(DROP_TRIGGER)) { + qWarning() << Q_FUNC_INFO << "Drop trigger:" + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(DROP_METADATA)) { + qWarning() << Q_FUNC_INFO << "Drop metadata:" + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(DROP_CALLBACK)) { + qWarning() << Q_FUNC_INFO << "Drop callback:" + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + if (!query.exec(DROP_TRANSFERS)) { + qWarning() << Q_FUNC_INFO << "Drop transfers:" + << query.lastError().text() << ":" << query.lastError().databaseText(); + ok = false; + } + + query.finish(); + return ok; + } + + int userVersion() + { + const QString queryStr = QString("PRAGMA user_version"); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::callback: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return -1; + } + QSqlRecord rec = query.record(); + if (query.isActive() && query.isSelect()) { + query.first(); + QString v = query.value(rec.indexOf("user_version")).toString(); + if (v.isEmpty()) { + return -1; + } + return v.toInt(); + } + return -1; + } + + QSqlDatabase m_db; +}; + +/*! \class DbManager + \brief The DbManager class is a singleton class to read and write transfers database. + + \ingroup transfer-engine + + DbManager class takes care of reading and writing transfer database used by Nemo Transfer + Engine. It's a singleton class and it can be instantiated using DbManager::instance() method. +*/ + + +/*! + Returns a singleton instance of this DbManager. Note that caller is NOT responsible of + deleting the instance. It will be deleted automatically when application stack is cleaned. + */ +DbManager * DbManager::instance() +{ + static DbManager instance; + return &instance; +} + +/*! + Private constructor. + */ +DbManager::DbManager(): + d_ptr(new DbManagerPrivate) +{ + Q_D(DbManager); + const QString absDbPath = QDir::homePath() + QDir::separator() + + DB_PATH + QDir::separator() + + DB_NAME; + + bool dbExists = QFile::exists(absDbPath); + + if (!dbExists) { + if (!QDir().mkpath(QDir::homePath() + QDir::separator() + DB_PATH)) { + qWarning() << "DbManager::DbManager: failed to create directory for db!"; + return; + } + } + + d->m_db = QSqlDatabase::addDatabase("QSQLITE"); + d->m_db.setDatabaseName(absDbPath); + d->m_db.setConnectOptions("foreign_keys = ON"); // sanity check + d->m_db.open(); + + // Create database schema if db didn't exist + if (!dbExists) { + if(!d->createDatabaseSchema()) { + qCritical("DbManager::DbManager: Failed to create DB schema. Can't continue!"); + } + } else { + // Database exists, check the schema version + if (d->userVersion() != USER_VERSION) { + d->deleteOldTables(); + d->createDatabaseSchema(); + } + } + + TransferDBRecord::registerType(); +} + +/*! + Destroys the DbManager. Clients should not call this, instead the created DbManager instance + will be destroyed automatically. + */ +DbManager::~DbManager() +{ + Q_D(DbManager); + if (d->m_db.isOpen()) { + d->m_db.close(); + } + + delete d_ptr; + d_ptr = 0; +} + +/*! + Returns a DBus callback interface and method names for the transfer with \a key. + If there is no callback for the \a key then an empty QStringList is returned. + + In a case there is a DBus callback, then QStringList contains the following items: + \list + \o service + \o path + \o interface + \o cancel method name + \o restart method name + \endlist + */ +QStringList DbManager::callback(int key) const +{ + QString queryStr = QString("SELECT service, path, interface, cancel_method, restart_method FROM callback WHERE transfer_id='%1';") + .arg(QString::number(key)); + + QStringList result; + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::callback: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return result; + } + + QSqlRecord rec = query.record(); + if (query.isActive() && query.isSelect()) { + query.first(); + result << query.value(rec.indexOf("service")).toString() + << query.value(rec.indexOf("path")).toString() + << query.value(rec.indexOf("interface")).toString() + << query.value(rec.indexOf("cancel_method")).toString() + << query.value(rec.indexOf("restart_method")).toString(); + } + return result; +} + +/*! + Creates a metadata entry for the existing transfer with \a key. Metadata can contain only + \a title and/or \a description. + + Metadata entry will be created to the metadata table. Argument \a key must point to the + existing entry in transfers table. + + This method returns a key of the created record in metadata table or -1 on failure. + + NOTE: Deleting the record from the transfer which has a \a key, also deletes related + metadata entry. + */ +int DbManager::createMetadataEntry(int key, const QString &title, const QString &description) +{ + QSqlQuery query; + query.prepare("INSERT INTO metadata (title, description, transfer_id)" + "VALUES (:title, :description, :transfer_id)"); + query.bindValue(":title", title); + query.bindValue(":description", description); + query.bindValue(":transfer_id", key); + + if (!query.exec()) { + qWarning() << "DbManager::createMetadataEntry: Failed to execute SQL query. Couldn't create an entry!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return -1; + } + + // Return the id of the last record + QVariant rowId = query.lastInsertId(); + query.finish(); + return rowId.isValid()? rowId.toInt() : -1; +} + +/*! + Creates a callback entry to the callback table for the existing transfer with a \a key. + + The callback is a dbus interface so it must contain the following attributes: + \list + \o \a service e.g. com.jolla.myapp + \o \a path e.g. /com/jolla/myapp + \o \a interface e.g. com.jolla.myapp + \o \a cancelMethod The name of the cancel method + \o \a restartMethod The name of the restart method + \endlist + + This method returns a key of the created callback record in a callback table or -1 on + failure. + + NOTE: Deleting the record from the transfer which has a \a key, also deletes related + callback entry. + + */ +int DbManager::createCallbackEntry(int key, + const QString &service, + const QString &path, + const QString &interface, + const QString &cancelMethod, + const QString &restartMethod) +{ + QSqlQuery query; + query.prepare("INSERT INTO callback (service, path, interface, cancel_method, restart_method, transfer_id)" + "VALUES (:service, :path, :interface, :cancel_method, :restart_method, :transfer_id)"); + query.bindValue(":service", service); + query.bindValue(":path", path); + query.bindValue(":interface", interface); + query.bindValue(":cancel_method", cancelMethod); + query.bindValue(":restart_method", restartMethod); + query.bindValue(":transfer_id", key); + + if (!query.exec()) { + qWarning() << "DbManager::createCallbackEntry: Failed to execute SQL query. Couldn't create an entry!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return -1; + } + + // Return the id of the last record + QVariant rowId = query.lastInsertId(); + query.finish(); + return rowId.isValid()? rowId.toInt() : -1; +} + +/*! + Creates a transfer entry to the transfers table bsaed on \a mediaItem content. + + MediaItem instance contains all the required information for the single Upload, + Download or a Sync item. Based on this information, DbManager creates a record + to the transfers table, but also to the callback and metadata tables if these + are defined. + + This method returns a key of the created transfer or -1 on failure. +*/ +int DbManager::createTransferEntry(MediaItem *mediaItem) +{ + Q_D(DbManager); + QSqlQuery query; + query.prepare("INSERT INTO transfers (transfer_type, timestamp, status, progress, display_name, application_icon, thumbnail_icon, " + "service_icon, url, resource_name, mime_type, file_size, plugin_id, account_id, strip_metadata, scale_percent, cancel_supported, restart_supported)" + "VALUES (:transfer_type, :timestamp, :status, :progress, :display_name, :application_icon, :thumbnail_icon, :service_icon, " + ":url, :resource_name, :mime_type, :file_size, :plugin_id, :account_id, :strip_metadata, :scale_percent, :cancel_supported, :restart_supported)"); + query.bindValue(":transfer_type", mediaItem->value(MediaItem::TransferType)); + query.bindValue(":status", TransferEngineData::NotStarted); + query.bindValue(":timestamp", d->currentDateTime()); + query.bindValue(":progress", 0); + query.bindValue(":display_name", mediaItem->value(MediaItem::DisplayName)); + query.bindValue(":application_icon", mediaItem->value(MediaItem::ApplicationIcon)); + query.bindValue(":thumbnail_icon", mediaItem->value(MediaItem::ThumbnailIcon)); + query.bindValue(":service_icon", mediaItem->value(MediaItem::ServiceIcon)); + query.bindValue(":url", mediaItem->value(MediaItem::Url)); + query.bindValue(":resource_name", mediaItem->value(MediaItem::ResourceName)); + query.bindValue(":mime_type", mediaItem->value(MediaItem::MimeType)); + query.bindValue(":file_size", mediaItem->value(MediaItem::FileSize)); + query.bindValue(":plugin_id", mediaItem->value(MediaItem::PluginId)); + query.bindValue(":account_id", mediaItem->value(MediaItem::AccountId)); + query.bindValue(":strip_metadata", mediaItem->value(MediaItem::MetadataStripped)); + query.bindValue(":scale_percent", mediaItem->value(MediaItem::ScalePercent)); + query.bindValue(":cancel_supported", mediaItem->value(MediaItem::CancelSupported)); + query.bindValue(":restart_supported", mediaItem->value(MediaItem::RestartSupported)); + + if (!query.exec()) { + qWarning() << "DbManager::createTransfereEntry: Failed to execute SQL query. Couldn't create an entry!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return -1; + } + + // Return the id of the last record + QVariant rowId = query.lastInsertId(); + query.finish(); + + if (!rowId.isValid()) { + qWarning() << "DbManager::createShareEntry: Invalid row ID!"; + return -1; + } + + // Create a metadata entry if user has passed any + const QString title = mediaItem->value(MediaItem::Title).toString(); + const QString desc = mediaItem->value(MediaItem::Description).toString(); + if (!title.isEmpty() && !desc.isEmpty()) { + if (createMetadataEntry(rowId.toInt(), title, desc) < 0){ + qWarning() << "DbManager::createTransferEntry: Failed to create metadata entry"; + return -1; + } + } + + // Create a callback entry if it's been provided + const QStringList callback = mediaItem->value(MediaItem::Callback).toStringList(); + const QString cancelMethod = mediaItem->value(MediaItem::CancelCBMethod).toString(); + const QString restartMethod = mediaItem->value(MediaItem::RestartCBMethod).toString(); + + // One of the methods must exist if the callback has been provided + if (callback.count() == 3 && (!cancelMethod.isEmpty() || !restartMethod.isEmpty())){ + const int res = createCallbackEntry(rowId.toInt(), callback.at(0), callback.at(1), callback.at(2), + cancelMethod, restartMethod); + if (res < 0) { + qWarning() << "DbManager::createTransferEntry: Failed to create callback entry"; + return -1; + } + } + + return rowId.toInt(); +} + +/*! + Updates transfer \a status of the existing transfer with \a key. Changing the status updates + the timestamp too. + + This method returns true on success, false on failure. + */ +bool DbManager::updateTransferStatus(int key, TransferEngineData::TransferStatus status) +{ + Q_D(DbManager); + QString queryStr; + switch(status) { + case TransferEngineData::TransferStarted: + queryStr = QString("UPDATE transfers SET status='%1', progress='0', timestamp='%2' WHERE transfer_id='%3';") + .arg(QString::number(status)) + .arg(d->currentDateTime()) + .arg(QString::number(key)); + break; + + case TransferEngineData::NotStarted: + case TransferEngineData::TransferFinished: + case TransferEngineData::TransferInterrupted: + case TransferEngineData::TransferCanceled: + queryStr = QString("UPDATE transfers SET status='%1', timestamp='%2' WHERE transfer_id='%3';") + .arg(QString::number(status)) + .arg(d->currentDateTime()) + .arg(QString::number(key)); + break; + case TransferEngineData::Unknown: + qWarning() << "Unknown transfer status!"; + return false; + } + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "Failed to execute SQL query. Couldn't update a record!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return false; + } + query.finish(); + return true; +} + +/*! + Updates transfer \a progress of the existing transfer with \a key. + + This method returns true on success, false on failure. + */ +bool DbManager::updateProgress(int key, qreal progress) +{ + QString queryStr = QString("UPDATE transfers SET progress='%1' WHERE transfer_id='%2';") + .arg(QString::number(progress)) + .arg(QString::number(key)); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return false; + } + query.finish(); + return true; +} + +/*! + Removes an existing transfer with a \a key from the transfers table. If this transfer has + metadata or callback defined, they will be removed too. + + This method returns true on success, false on failure. + */ +bool DbManager::removeTransfer(int key) +{ + QString queryStr = QString("DELETE FROM transfers WHERE transfer_id='%1' AND (status='%2' OR status='%3' OR status='%4');") + .arg(key) + .arg(TransferEngineData::TransferFinished) + .arg(TransferEngineData::TransferCanceled) + .arg(TransferEngineData::TransferInterrupted); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "Failed to execute SQL query. Couldn't delete the transfer with key " << key; + return false; + } + + query.finish(); + return true; +} + +/*! + Clears all finished, canceled or failed transfers from the database. + + This method returns true on success, false on failure. +*/ +bool DbManager::clearTransfers() +{ + QString queryStr = QString("DELETE FROM transfers WHERE status='%1' OR status='%2' OR status='%3';") + .arg(TransferEngineData::TransferFinished) + .arg(TransferEngineData::TransferCanceled) + .arg(TransferEngineData::TransferInterrupted); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "Failed to execute SQL query. Couldn't delete the list finished transfers!"; + return false; + } + + query.finish(); + return true; +} + +/*! + Returns all the transfers from the database. This method doesn't fetch all the fields from all the + tables, instead it returns what is required to fill fields in TransferDBRecord class. + */ +QList DbManager::transfers() const +{ + // TODO: This should order the result based on timestamp + QList records; + QSqlQuery query; + if (!query.exec("SELECT * FROM transfers ORDER BY transfer_id DESC")) { + qWarning() << "DbManager::transfers: Failed to execute SQL query. Couldn't get list of transfers!"; + return records; + } + + // The record could actually contain eg. QVariantList instead of hardcoded and + // typed members. + QSqlRecord rec = query.record(); + while (query.next()) { + TransferDBRecord record; + record.transfer_id = query.value(rec.indexOf("transfer_id")).toInt(); + record.transfer_type = query.value(rec.indexOf("transfer_type")).toInt(); + record.progress = query.value(rec.indexOf("progress")).toDouble(); + record.url = query.value(rec.indexOf("url")).toString(); + record.status = query.value(rec.indexOf("status")).toInt(); + record.plugin_id = query.value(rec.indexOf("plugin_id")).toString(); + record.display_name = query.value(rec.indexOf("display_name")).toString(); + record.resource_name = query.value(rec.indexOf("resource_name")).toString(); + record.mime_type = query.value(rec.indexOf("mime_type")).toString(); + record.timestamp = query.value(rec.indexOf("timestamp")).toString(); + record.size = query.value(rec.indexOf("file_size")).toInt(); + record.application_icon = query.value(rec.indexOf("application_icon")).toString(); + record.thumbnail_icon = query.value(rec.indexOf("thumbnail_icon")).toString(); + record.service_icon = query.value(rec.indexOf("service_icon")).toString(); + record.cancel_supported = query.value(rec.indexOf("cancel_supported")).toBool(); + record.restart_supported = query.value(rec.indexOf("restart_supported")).toBool(); + records << record; + } + query.finish(); + return records; +} + +/*! + Returns the transfer type e.g. Sync, Download or Upload of the transfer with a \a key. + + If there is no transfer record with key or error occurs, this method returns TransferEngineData::Undefined. + */ +TransferEngineData::TransferType DbManager::transferType(int key) const +{ + QString queryStr = QString("SELECT transfer_type FROM transfers WHERE transfer_id='%1';") + .arg(QString::number(key)); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::transferType: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return TransferEngineData::Undefined; + } + + + if (query.isActive() && query.isSelect()) { + query.first(); + return static_cast(query.value(0).toInt()); + } else { + return TransferEngineData::Undefined; + } +} + +/*! + Returns the transfer status of the transfer with \a key. In a case of error + the TransferEngineData::Unknown is returned. + */ +TransferEngineData::TransferStatus DbManager::transferStatus(int key) const +{ + + QString queryStr = QString("SELECT status FROM transfers WHERE transfer_id='%1';") + .arg(QString::number(key)); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::transferStatus: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return TransferEngineData::Unknown; + } + + + if (query.isActive() && query.isSelect()) { + query.first(); + return static_cast(query.value(0).toInt()); + } else { + return TransferEngineData::Unknown; + } +} +/*! + Reads the callback method names from the database for the transfer with \a key. The method names are set to the + output arguments \a cancelMethod and \a restartMethod. + + This method returns true on success, false on failure. +*/ +bool DbManager::callbackMethods(int key, QString &cancelMethod, QString &restartMethod) const +{ + QString queryStr = QString("SELECT cancel_method, restart_method FROM callback WHERE transfer_id='%1';") + .arg(QString::number(key)); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::callbackMethods: Failed to execute SQL query. Couldn't get callback methods!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return false; + } + + + if (query.isActive() && query.isSelect()) { + query.first(); + cancelMethod = query.value(0).toString(); + restartMethod = query.value(1).toString(); + return true; + } else { + return false; + } +} + +// Used only for Sharing atm. If this is needed for Sync and download add fetching the callback too. +/*! + Returns a MediaItem instance from the transfer data with a \a key. +*/ +MediaItem * DbManager::mediaItem(int key) const +{ + QString queryStr = QString("SELECT * FROM transfers WHERE transfer_id='%1';") + .arg(QString::number(key)); + + QSqlQuery query; + if (!query.exec(queryStr)) { + qWarning() << "DbManager::mediaItem: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + return 0; + } + + MediaItem *item = new MediaItem; + QSqlRecord rec = query.record(); + if (query.next()) { + item->setValue(MediaItem::Url, query.value(rec.indexOf("url"))); + item->setValue(MediaItem::MetadataStripped,query.value(rec.indexOf("strip_metadata"))); + item->setValue(MediaItem::ScalePercent, query.value(rec.indexOf("scale_percent"))); + item->setValue(MediaItem::ResourceName, query.value(rec.indexOf("resource_name"))); + item->setValue(MediaItem::MimeType, query.value(rec.indexOf("mime_type"))); + item->setValue(MediaItem::TransferType, query.value(rec.indexOf("transfer_type"))); + item->setValue(MediaItem::FileSize, query.value(rec.indexOf("file_size"))); + item->setValue(MediaItem::PluginId, query.value(rec.indexOf("plugin_id"))); + item->setValue(MediaItem::AccountId, query.value(rec.indexOf("account_id"))); + item->setValue(MediaItem::DisplayName, query.value(rec.indexOf("display_name"))); + item->setValue(MediaItem::ServiceIcon, query.value(rec.indexOf("service_icon"))); + } else { + qWarning() << "DbManager::mediaItem: Failed to get media item data from database!"; + delete item; + return 0; + } + + query.finish(); + + // Get metadata part title, description + queryStr = QString("SELECT title, description FROM metadata WHERE transfer_id='%1';") + .arg(QString::number(key)); + + if (!query.exec(queryStr)) { + qWarning() << "DbManager::mediaItem: Failed to execute SQL query. Couldn't update the progress!" + << query.lastError().text() << ": " + << query.lastError().databaseText(); + delete item; + return 0; + } + rec = query.record(); + // NOTE: There might be that user hasn't set any title or description so let the flow just pass + // this point if there isn't anything... + if (query.next()) { + item->setValue(MediaItem::Title, query.value(rec.indexOf("title"))); + item->setValue(MediaItem::Title, query.value(rec.indexOf("description"))); + } + + query.finish(); + return item; +} + + + + diff --git a/src/dbmanager.h b/src/dbmanager.h new file mode 100644 index 0000000..bdbd63b --- /dev/null +++ b/src/dbmanager.h @@ -0,0 +1,80 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef DBMANAGER_H +#define DBMANAGER_H +#include + +#include "transferdbrecord.h" +#include "mediatransferinterface.h" + +class MediaItem; +class DbManagerPrivate; +class DbManager +{ +public: + static DbManager *instance(); + + ~DbManager(); + + int createMetadataEntry(int key, const QString &title, const QString &description); + + QStringList callback(int key) const; + + int createCallbackEntry(int key, + const QString &service, + const QString &path, + const QString &interface, + const QString &cancelMethod, + const QString &restartMethod); + + int createTransferEntry(MediaItem *mediaItem); + + bool updateTransferStatus(int key, TransferEngineData::TransferStatus status); + + bool updateProgress(int key, qreal progress); + + bool removeTransfer(int key); + + bool clearTransfers(); + + QList transfers() const; + + TransferEngineData::TransferType transferType(int key) const; + + TransferEngineData::TransferStatus transferStatus(int key) const; + + bool callbackMethods(int key, QString &cancelMethod, QString &restartMethod) const; + + MediaItem * mediaItem(int key) const; + +private: + DbManager(); + DbManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(DbManager) +}; + +#endif // DBMANAGER_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..bca8c5f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,51 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include +#include +#include +#include "transferengine.h" + + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + QCoreApplication::setOrganizationName("nemomobile"); + QCoreApplication::setApplicationName("nemo-transfer-engine"); + + QString translationPath("/usr/share/translations/"); + QTranslator engineeringEnglish; + engineeringEnglish.load("nemo-transfer-engine_eng_en", translationPath); + qApp->installTranslator(&engineeringEnglish); + + QTranslator translator; + translator.load(QLocale(), "nemo-transfer-engine", "-", translationPath); + app.installTranslator(&translator); + + + TransferEngine engine; + return app.exec(); +} diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..24c9677 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,68 @@ +TEMPLATE = app +TARGET = nemo-transfer-engine +DEPENDPATH += . +INCLUDEPATH += . ../lib + +QT += dbus sql + +LIBS += -L../lib -lnemotransferengine + +# generate adaptor code +system(qdbusxml2cpp -c TransferEngineAdaptor -a transferengineadaptor.h:transferengineadaptor.cpp -i metatypedeclarations.h ../dbus/org.nemo.transferengine.xml) + +CONFIG += link_pkgconfig +PKGCONFIG += mlite +PKGCONFIG += accounts-qt + +# translations +TS_FILE = $$OUT_PWD/nemo-transfer-engine.ts +EE_QM = $$OUT_PWD/nemo-transfer-engine_eng_en.qm + +ts.commands += lupdate $$PWD -ts $$TS_FILE +ts.CONFIG += no_check_exist +ts.output = $$TS_FILE +ts.input = . + +ts_install.files = $$TS_FILE +ts_install.path = /usr/share/translations/source +ts_install.CONFIG += no_check_exist + +# should add -markuntranslated "-" when proper translations are in place (or for testing) +engineering_english.commands += lrelease -idbased $$TS_FILE -qm $$EE_QM +engineering_english.CONFIG += no_check_exist +engineering_english.depends = ts +engineering_english.input = $$TS_FILE +engineering_english.output = $$EE_QM + +engineering_english_install.path = /usr/share/translations +engineering_english_install.files = $$EE_QM +engineering_english_install.CONFIG += no_check_exist + +QMAKE_EXTRA_TARGETS += ts engineering_english + +PRE_TARGETDEPS += ts engineering_english + +# Input +SOURCES += main.cpp \ + transferengineadaptor.cpp \ + dbmanager.cpp \ + transferengine.cpp + +HEADERS += \ + transferengineadaptor.h \ + dbmanager.h \ + transferengine.h \ + transferengine_p.h + +SERVICE_FILE += ../dbus/org.nemo.transferengine.service +OTHER_FILES += $$SERVICE_FILE \ + ../dbus/org.nemo.transferengine.xml + + +service.files = $$SERVICE_FILE +service.path = /usr/share/dbus-1/services/ +target.path = /usr/bin + +INSTALLS += service target ts_install engineering_english_install + + diff --git a/src/transferengine.cpp b/src/transferengine.cpp new file mode 100644 index 0000000..8af11c3 --- /dev/null +++ b/src/transferengine.cpp @@ -0,0 +1,1170 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include "transferengine.h" +#include "transferengine_p.h" +#include "transferplugininterface.h" +#include "mediaitem.h" +#include "dbmanager.h" +#include "transferengineadaptor.h" +#include "transfertypes.h" +#include "transferplugininfo.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#define SHARE_PLUGINS_PATH "/usr/lib/nemo-transferengine/plugins" +#define FILE_WATCHER_TIMEOUT 5000 + + +TransferEngineSignalHandler * TransferEngineSignalHandler::instance() +{ + static TransferEngineSignalHandler instance; + return &instance; +} + +void TransferEngineSignalHandler::signalHandler(int signal) +{ + if(signal == SIGUSR1) { + QMetaObject::invokeMethod(TransferEngineSignalHandler::instance(), + "exitSafely", + Qt::AutoConnection); + } +} + +TransferEngineSignalHandler::TransferEngineSignalHandler() +{ + signal(SIGUSR1, TransferEngineSignalHandler::signalHandler); +} + + +// ---------------------------- + +TransferEnginePrivate::TransferEnginePrivate(TransferEngine *parent): + m_notificationsEnabled(true), + q_ptr(parent) +{ + m_fileWatcherTimer = new QTimer(this); + m_fileWatcherTimer->setSingleShot(true); + connect(m_fileWatcherTimer, SIGNAL(timeout()), this, SLOT(enabledPluginsCheck())); + + m_fileWatcher = new QFileSystemWatcher(this); + m_fileWatcher->addPath(SHARE_PLUGINS_PATH); + connect(m_fileWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(pluginDirChanged())); + + m_accountManager = new Accounts::Manager("sharing", this); + connect(m_accountManager, SIGNAL(accountCreated(Accounts::AccountId)), this, SLOT(enabledPluginsCheck())); + connect(m_accountManager, SIGNAL(accountRemoved(Accounts::AccountId)), this, SLOT(enabledPluginsCheck())); + connect(m_accountManager, SIGNAL(accountUpdated(Accounts::AccountId)), this, SLOT(enabledPluginsCheck())); + connect(m_accountManager, SIGNAL(enabledEvent(Accounts::AccountId)), this, SLOT(enabledPluginsCheck())); + + m_transfersInProgressCount = 0; + connect(TransferEngineSignalHandler::instance(), SIGNAL(exitSafely()), this, SLOT(exitSafely())); + Q_Q(TransferEngine); + connect(q, SIGNAL(statusChanged(int,int)), this, SLOT(inProgressTransfersCheck())); +} + +void TransferEnginePrivate::pluginDirChanged() +{ + // We need to check our plugins, but only after a short period of time + // because some operations may cause calling this slot over 10 times. + // E.g. reinstallation of plugins from the RPM package + m_fileWatcherTimer->start(FILE_WATCHER_TIMEOUT); +} + +void TransferEnginePrivate::exitSafely() +{ + if (m_transfersInProgressCount == 0) { + qDebug() << Q_FUNC_INFO; + qApp->exit(); + } +} + +void TransferEnginePrivate::inProgressTransfersCheck() +{ + int count = 0; + // Just read the statuses from the DB. + QList records = DbManager::instance()->transfers(); + Q_FOREACH(TransferDBRecord record, records) { + if (record.status == TransferEngineData::TransferStarted || + record.status == TransferEngineData::NotStarted) { + ++count; + } + } + m_transfersInProgressCount = count; + if (m_transfersInProgressCount == 0) { + qApp->exit(); + } +} + +void TransferEnginePrivate::enabledPluginsCheck() +{ + Q_Q(TransferEngine); + if (m_fileWatcherTimer->isActive()) { + m_fileWatcherTimer->stop(); + } + + // First clear old data + m_enabledPlugins.clear(); + qDeleteAll(m_infoObjects); + m_infoObjects.clear(); + + QPluginLoader loader; + loader.setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint); + + // Handle the case if all the plugins have been removed. + QStringList plugins = pluginList(); + if (plugins.isEmpty()) { + emit q->transferMethodListChanged(); + return; + } + + // We have plugins + Q_FOREACH(QString plugin, plugins) { + loader.setFileName(plugin); + TransferPluginInterface *interface = + qobject_cast(loader.instance()); + + if (interface && interface->enabled()) { + + TransferPluginInfo *info = interface->infoObject(); + if (!info) { + qWarning() << Q_FUNC_INFO << "NULL Info object!"; + continue; + } + + // Put info object to temporary container to wait that query result + // is returned. These object will be cleaned in pluginInfoReady() slot. + m_infoObjects << info; + connect(info, SIGNAL(infoReady()), this, SLOT(pluginInfoReady())); + connect(info, SIGNAL(infoError(QString)), this, SLOT(pluginInfoError(QString))); + info->query(); + } + + if (!interface) { + qWarning() << Q_FUNC_INFO << loader.errorString(); + } + } + + +} + +void TransferEnginePrivate::recoveryCheck() +{ + QList records = DbManager::instance()->transfers(); + // Check all transfer which are not properly finished and mark those as + // interrupted + Q_FOREACH(TransferDBRecord record, records) { + if (record.status == TransferEngineData::TransferStarted || + record.status == TransferEngineData::NotStarted) { + DbManager::instance()->updateTransferStatus(record.transfer_id, TransferEngineData::TransferInterrupted); + } + } +} + +void TransferEnginePrivate::sendNotification(TransferEngineData::TransferType type, + TransferEngineData::TransferStatus status, + const QUrl &url) +{ + if (!m_notificationsEnabled || !url.isValid()) { + return; + } + + QStringList split; + QString fileName; + + if (type != TransferEngineData::Sync) { + split = url.toString().split(QDir::separator()); + fileName = split.at(split.length()-1); + } + + QString msgGSummary; + QString msgNBody; + QString eventType; + bool bannerOnly = false; + + if (status == TransferEngineData::TransferFinished) { + switch(type) { + case TransferEngineData::Upload: + //: Notification for successful file upload + //% "File uploaded" + msgNBody = qtTrId("transferengine-no-file-upload-success"); + msgGSummary.clear(); + eventType = MNotification::TransferEvent; // Use "generic" transfer event for uploads + bannerOnly = true; + break; + case TransferEngineData::Download: + //: Notification for successful file download + //% "File downloaded" + msgNBody = qtTrId("transferengine-no-file-download-success"); + //: NotificationGroup summary for successful download + //% "%1 file(s) downloaded" + msgGSummary = qtTrId("%1 file(s) downloaded"); + eventType = MNotification::TransferCompleteEvent; + break; + case TransferEngineData::Sync: + // Ok exit + return; + default: + qWarning() << "TransferEnginePrivate::sendNotification: unknown state"; + return; + } + } else { + if (status == TransferEngineData::TransferInterrupted) { + switch (type) { + case TransferEngineData::Upload: + //: Notification for failed file upload + //% "Upload failed!" + msgNBody = qtTrId("transferengine-no-file-upload-failure"); + //% "%1 upload(s) failed" + msgGSummary = qtTrId("%1 file upload(s) failed"); + break; + case TransferEngineData::Download: + //: Notification for successful file download + //% "Download failed!" + msgNBody = qtTrId("transferengine-no-file-download-failure"); + //% "%1 download(s) failed" + msgGSummary = qtTrId("%1 download(s) failed"); + break; + case TransferEngineData::Sync: + //: Notification for sync failure + //% "Sync failed!" + msgNBody = qtTrId("transferengine-no-sync-failure"); + //% "%1 sync(s) failed" + msgGSummary = qtTrId("%1 sync(s) failed"); + break; + default: + qWarning() << "TransferEnginePrivate::sendNotification: unknown state"; + return; + } + + eventType = MNotification::TransferErrorEvent; + } else { + if (status == TransferEngineData::TransferCanceled) { + // Exit, no banners or events when user has canceled a transfer + return; + }}} + + // Notification & Banner rules: + // + // Show Banner: + // - For succesfull uploads and for downloads + // - For failed Uploads, Downloads, Syncs + // + // Show an event in the EventView: + // - For downloads + // - For failed uploads, downloads and syncs + // + // Use grouping always + // + // TODO: Add MRemoteAction for e.g. opening a file. + // - Open a file, when there is only a one notification in that group + // - Open The Settings with Transfer UI when there are more than one notifications + if (!(msgNBody.isEmpty() && eventType.isEmpty())) { + // First create the notification + MNotification notification(eventType); + notification.setSummary(fileName); + notification.setBody(msgNBody); + notification.setImage("icon-l-share"); + + QList nList = MNotification::notifications(); + QMultiMap nMap; + + // Get the existing notifications and sort them based on their event types + foreach(MNotification *n, nList) { + nMap.insert(n->eventType(), n); + } + + // Get the number of existing events of this same type + this event + const int eventCount = nMap.values(eventType).count() + 1; + + // Check if we have existing group and use that instead of creating a new one. + QList groups = MNotificationGroup::notificationGroups(); + MNotificationGroup *group = 0; + if (groups.count() > 0) { + foreach(MNotificationGroup *g, groups) { + if (g->eventType() == eventType) { + group = g; + break; + } + } + } + + // No existing groups, create a new one from the scratch + if (group == 0){ + group = new MNotificationGroup(eventType); + group->setImage("icon-l-share"); + // Add to the groups, it will be deleted when the list is cleaned + groups.append(group); + } + + if (bannerOnly) { + // This makes notifications to appear banners only + group->setSummary(QString()); + } else { + // This is the summary text which is shown when notifications are grouped + group->setSummary(msgGSummary.arg(eventCount)); + group->setBody(fileName); + } + + // Set default action for groups + MRemoteAction rAct = createRemoteActionForGroup(); + if (!rAct.toString().isEmpty()) { + group->setAction(rAct); + } + + // always publish the group to make updates appear + group->publish(); + + notification.setGroup(*group); + notification.publish(); + + // Cleanup + if (groups.count()) { + qDeleteAll(groups); + } + + if (nList.count()) { + qDeleteAll(nList); + } + } +} + +int TransferEnginePrivate::uploadMediaItem(MediaItem *mediaItem, + MediaTransferInterface *muif, + const QVariantMap &userData) +{ + Q_Q(TransferEngine); + + if (muif == 0) { + qWarning() << "TransferEngine::uploadMediaItem invalid MediaItem"; + return -1; + } + if (muif == 0) { + qWarning() << "TransferEngine::uploadMediaItem Failed to get MediaTransferInterface"; + return -1; + } + + mediaItem->setValue(MediaItem::TransferType, TransferEngineData::Upload); + mediaItem->setValue(MediaItem::DisplayName, muif->displayName()); + mediaItem->setValue(MediaItem::ServiceIcon, muif->serviceIcon()); + mediaItem->setValue(MediaItem::CancelSupported, muif->cancelEnabled()); + mediaItem->setValue(MediaItem::RestartSupported, muif->restartEnabled()); + + // Get and set data from user data if that's set. The following user data values + // are stored to the database so that's why they are set to the media item too. + // If the user data is fully custom for plugin it won't be stored to the database and + // it's up to the plugin to handle or ignore it. + QString title = userData.value("title").toString(); + QString desc = userData.value("description").toString(); + qint64 accId = userData.value("accountId").toInt(); + qreal scale = userData.value("scalePercent").toReal(); + + mediaItem->setValue(MediaItem::Title, title); + mediaItem->setValue(MediaItem::Description, desc); + mediaItem->setValue(MediaItem::AccountId, accId); + mediaItem->setValue(MediaItem::ScalePercent, scale); + muif->setMediaItem(mediaItem); + + connect(muif, SIGNAL(statusChanged(MediaTransferInterface::TransferStatus)), + this, SLOT(uploadItemStatusChanged(MediaTransferInterface::TransferStatus))); + connect(muif, SIGNAL(progressUpdated(qreal)), + this, SLOT(updateProgress(qreal))); + + // Let's create an entry into Transfer DB + const int key = DbManager::instance()->createTransferEntry(mediaItem); + m_keyTypeCache.insert(key, TransferEngineData::Upload); + + if (key < 0) { + qWarning() << "TransferEngine::uploadMediaItem: Failed to create an entry to transfer database!"; + delete muif; + return key; + } + + emit q->transfersChanged(); + emit q->statusChanged(key, TransferEngineData::NotStarted); + + // For now, we just store our uploader to a map. It'll be removed from it when + // the upload has finished. + m_plugins.insert(muif, key); + muif->start(); + return key; +} + +QStringList TransferEnginePrivate::pluginList() const +{ + QDir dir(SHARE_PLUGINS_PATH); + QStringList plugins = dir.entryList(QStringList() << "*.so", + QDir::Files, + QDir::NoSort); + QStringList filePaths; + Q_FOREACH(QString plugin, plugins) { + filePaths << dir.absolutePath() + QDir::separator() + plugin; + } + + return filePaths; +} + +QList TransferEnginePrivate::enabledPlugins() const +{ + return m_enabledPlugins; +} + + +MediaTransferInterface *TransferEnginePrivate::loadPlugin(const QString &pluginId) const +{ + QPluginLoader loader; + loader.setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint); + Q_FOREACH(QString plugin, pluginList()) { + loader.setFileName(plugin); + TransferPluginInterface *interface = + qobject_cast(loader.instance()); + + + if (interface && interface->enabled() && interface->pluginId() == pluginId) { + return interface->transferObject(); + } + + if (!interface) { + qWarning() << "TransferEngine::loadPlugin: " + loader.errorString(); + } + + if (loader.isLoaded()) { + loader.unload(); + } + } + + return 0; +} + +void TransferEnginePrivate::uploadItemStatusChanged(MediaTransferInterface::TransferStatus status) +{ + MediaTransferInterface *muif = qobject_cast(sender()); + const int key = m_plugins.value(muif); + const QUrl filePath = muif->mediaItem()->value(MediaItem::Url).toString(); + const TransferEngineData::TransferType type = + static_cast(muif->mediaItem()->value(MediaItem::TransferType).toInt()); + + TransferEngineData::TransferStatus tStatus = static_cast(status); + + bool ok = false; + switch(tStatus) { + case TransferEngineData::TransferStarted: + ok = DbManager::instance()->updateTransferStatus(key, tStatus); + break; + + case TransferEngineData::TransferInterrupted: + case TransferEngineData::TransferCanceled: + case TransferEngineData::TransferFinished: + { + // If the flow ends up here, we are not interested in any signals the same object + // might emit. Let's just disconnect them. + muif->disconnect(); + sendNotification(type, tStatus, filePath); + ok = DbManager::instance()->updateTransferStatus(key, tStatus); + if (m_plugins.remove(muif) == 0) { + qWarning() << "TransferEnginePrivate::uploadItemStatusChanged: Failed to remove media upload object from the map!"; + // What to do here.. Let's just delete it.. + } + muif->deleteLater(); + muif = 0; + } break; + + default: + qWarning() << "TransferEnginePrivate::uploadItemStatusChanged: unhandled status: " << tStatus; + break; + } + + if (!ok) { + qWarning() << "TransferEnginePrivate::uploadItemStatusChanged: Failed update share status for the item: " + key; + return; + } + + Q_Q(TransferEngine); + emit q->statusChanged(key, tStatus); +} + +void TransferEnginePrivate::updateProgress(qreal progress) +{ + MediaTransferInterface *muif = qobject_cast(sender()); + const int key = m_plugins.value(muif); + + if (!DbManager::instance()->updateProgress(key, progress)) { + qWarning() << "TransferEnginePrivate::updateProgress: Failed to update progress"; + return; + } + + Q_Q(TransferEngine); + emit q->progressChanged(key, progress); +} + +void TransferEnginePrivate::pluginInfoReady() +{ + TransferPluginInfo *infoObj = qobject_cast(sender()); + m_enabledPlugins << infoObj->info(); + + m_infoObjects.removeOne(infoObj); + delete infoObj; + + if (m_infoObjects.isEmpty()) { + Q_Q(TransferEngine); + emit q->transferMethodListChanged(); + } +} + +void TransferEnginePrivate::pluginInfoError(const QString &msg) +{ + qWarning() << "TransferEnginePrivate::pluginInfoError:" << msg; + TransferPluginInfo *infoObj = qobject_cast(sender()); + m_infoObjects.removeOne(infoObj); + delete infoObj; + + if (m_infoObjects.isEmpty()) { + Q_Q(TransferEngine); + emit q->transferMethodListChanged(); + } +} + + +TransferEngineData::TransferType TransferEnginePrivate::transferType(int transferId) +{ + if (!m_keyTypeCache.contains(transferId)) { + TransferEngineData::TransferType type = DbManager::instance()->transferType(transferId); + m_keyTypeCache.insert(transferId, type); + return type; + } else { + return m_keyTypeCache.value(transferId); + } +} + + +void TransferEnginePrivate::callbackCall(int transferId, CallbackMethodType method) +{ + // Get DBus callback information. Callback list must contain at least + // service, path, interface and one callback method name. Note that even + // if the cancel or restart method is missing, it'll be indicated as an + // empty string. So the list length is always 5. + QStringList callback = DbManager::instance()->callback(transferId); + if (callback.length() != 5) { + qWarning() << "TransferEnginePrivate:callbackCall: Invalid callback interface"; + return; + } + + QDBusInterface remoteInterface(callback.at(Service), + callback.at(Path), + callback.at(Interface)); + + if (!remoteInterface.isValid()) { + qWarning() << "TransferEnginePrivate::callbackCall: DBus interface is not valid!"; + return; + } + + if (method >= callback.size()) { + qWarning() << "TransferEnginePrivate::callbackCall: method index out of range!"; + return; + } + + const QString methodName = callback.at(method); + if (methodName.isEmpty()) { + qWarning() << "TransferEnginePrivate::callbackCall: Failed to get callback method name!"; + return; + } + + remoteInterface.call(methodName, transferId); +} + + +MRemoteAction TransferEnginePrivate::createRemoteActionForGroup() +{ + if (m_settings.status() != QSettings::NoError) { + qWarning() << Q_FUNC_INFO << "Failed to read settings!" << m_settings.status(); + return MRemoteAction(); + } + + m_settings.beginGroup("transfers"); + const QString service = m_settings.value("service").toString(); + const QString path = m_settings.value("path").toString(); + const QString iface = m_settings.value("interface").toString(); + const QString method = m_settings.value("method").toString(); + m_settings.endGroup(); + + return MRemoteAction(service, path, iface, method); +} + +/*! + \class TransferEngine + \brief The TransferEngine class implements the functionality for different transfer types. + + \ingroup transfer-engine + + TransferEngine is the central place for: + \list + \o Sharing - Provides requires plugin interfaces for share plugins + \o Downloads - Provides an API to create Download entries + \o Syncs - Provides an API to create Sync entries + \endlist + + For Downloads and Syncs, the Transfer Engine acts only a place to keep track of these operations. + The actual Download and Sync is executed by a client using TransferEngine API. For sharing + the TransferEngine provides an API containing a few interaces, which a share plugin must implement. + TransferEngine also takes care of loading and executing the sharing, based on the API it defines. + + The most essential thing to remember is that Transfer Engine provides share plugin API, DBus API e.g. + for creating Transfer UI or Share UIs, it stores data to the local sqlite database using DbManager + and that's it. + + How to implement a share plugin see: TransferPluginInterface, MediaTransferInterface, MediaItem, + TransferPluginInfo + + TransferEngine provides DBus API, but instead of using it directly, it's recommended to use + TransferEngineClient. If there is a need to create UI to display e.g. transfer statuses, then + the DBus API is the recommend way to implement it. + + */ + +/*! + \fn void TransferEngine::progressChanged(int transferId, double progress) + + The signal is emitted when \a progress for a transfer with a \a transferId has changed. +*/ + +/*! + \fn void TransferEngine::statusChanged(int transferId, int status) + + The signal is emitted when \a status for a transfer with a \a transferId has changed. +*/ + +/*! + \fn void TransferEngine::transferMethodListChanged() + + The signal is emitted when transfer methods have changed. Usually tranfer methods change + when a new plugin is installed to the system or an account has been enabled or disabled. +*/ + +/*! + \fn void TransferEngine::transfersChanged() + + The signal is emitted when there is a new transfer or a transfer has been removed from the + database. +*/ + +/*! + Constructor with optional \a parent arguement. + */ +TransferEngine::TransferEngine(QObject *parent) : + QObject(parent), + d_ptr(new TransferEnginePrivate(this)) +{ + TransferMethodInfo::registerType(); + TransferDBRecord::registerType(); + + QDBusConnection connection = QDBusConnection::sessionBus(); + if (!connection.registerService("org.nemo.transferengine")) { + qFatal("DBUS service already taken. Kill the other instance first."); + } + + if (!connection.registerObject("/org/nemo/transferengine", this)) { + qFatal("Could not register object \'/org/nemo/transferengine\'"); + } + + + // Let's make sure that db is open by creating + // DbManager singleton instance. + DbManager::instance(); + Q_D(TransferEngine); + d->recoveryCheck(); + d->enabledPluginsCheck(); + + new TransferEngineAdaptor(this); +} + +/*! + Destroys the TransferEngine object. + */ +TransferEngine::~TransferEngine() +{ + Q_D(TransferEngine); + d->recoveryCheck(); + delete d_ptr; + d_ptr = 0; + + QDBusConnection connection = QDBusConnection::sessionBus(); + connection.unregisterObject("/org/nemo/transferengine"); + + if (!connection.unregisterService("org.nemo.transferengine")) { + qWarning() << "Failed to unregister org.nemo.tranferengine service"; + } +} + + +/*! + DBus adaptor calls this method to start uploading a media item. The minimum information + needed to start an upload and to create an entry to the transfer database is: + \a source the path to the media item to be downloaded. \a serviceId the ID of the share + plugin. See TransferPluginInterface::pluginId() for more details. \a mimeType is the MimeType + of the media item e.g. "image/jpeg". \a metadataStripped boolean to indicate if the metadata + should be kept or removed before uploading. \a userData is various kind of data which share UI + may provide to the engine. UserData is QVariant map i.e. the data must be provided as key-value + pairs, where the keys must be QStrings. + + TransferEngine handles the following user defined data automatically and stores them to the database: + \list + \o "title" Title for the media + \o "description" Description for the media + \o "accountId" The ID of the account which is used for sharing. See qt-accounts for more details. + \o "scalePercent" The scale percent e.g. downscale image to 50% from original before uploading. + \endlist + + In practice this method instantiates a share plugin with \a serviceId and passes a MediaItem instance filled + with required data to it. When the plugin has been loaded, the MediaTransferInterface::start() method is called + and the actual sharing starts. + + This method returns a transfer ID which can be used later to fetch information of this specific transfer. + */ +int TransferEngine::uploadMediaItem(const QString &source, + const QString &serviceId, + const QString &mimeType, + bool metadataStripped, + const QVariantMap &userData) +{ + Q_D(TransferEngine); + MediaTransferInterface *muif = d->loadPlugin(serviceId); + if (muif == 0) { + qWarning() << "TransferEngine::uploadMediaItem Failed to get MediaTransferInterface"; + return -1; + } + + QUrl filePath(source); + QFileInfo fileInfo(filePath.toLocalFile()); + if (!fileInfo.exists()) { + qWarning() << "TransferEnginePrivate::uploadMediaItem file " << source << " doesn't exist!"; + } + + MediaItem *mediaItem = new MediaItem(muif); + mediaItem->setValue(MediaItem::Url, filePath); + mediaItem->setValue(MediaItem::MetadataStripped, metadataStripped); + mediaItem->setValue(MediaItem::ResourceName, fileInfo.fileName()); + mediaItem->setValue(MediaItem::MimeType, mimeType); + mediaItem->setValue(MediaItem::FileSize, fileInfo.size()); + mediaItem->setValue(MediaItem::PluginId, serviceId); + mediaItem->setValue(MediaItem::UserData, userData); + return d->uploadMediaItem(mediaItem, muif, userData); +} + +/*! + DBus adaptor calls this method to start uploading media item content. Sometimes the content + to be shared is not a file, but data e.g. contact information in vcard format. In order to + avoid serializing data to a file, pass url to the file, reading the data, deleting the file, + TransferEngine provides this convenience API. + + \a content is the media item content to be shared. \a serviceId is the id of the share plugin. See + TransferPluginInterface::pluginId() for more details. \a userData is a QVariantMap containing + share plugin specific data. See TransferEngine::uploadMediaItem for more details. + + This method returns a transfer ID which can be used later to fetch information of this specific transfer. +*/ +int TransferEngine::uploadMediaItemContent(const QVariantMap &content, + const QString &serviceId, + const QVariantMap &userData) +{ + Q_D(TransferEngine); + MediaTransferInterface *muif = d->loadPlugin(serviceId); + if (muif == 0) { + qWarning() << "TransferEngine::uploadMediaItemContent Failed to get MediaTransferInterface"; + return -1; + } + + MediaItem *mediaItem = new MediaItem(muif); + mediaItem->setValue(MediaItem::ContentData, content.value("data")); + mediaItem->setValue(MediaItem::ResourceName, content.value("name")); + mediaItem->setValue(MediaItem::MimeType, content.value("type")); + mediaItem->setValue(MediaItem::ThumbnailIcon, content.value("icon")); + mediaItem->setValue(MediaItem::PluginId, serviceId); + mediaItem->setValue(MediaItem::UserData, userData); + return d->uploadMediaItem(mediaItem, muif, userData); +} + +/*! + DBus adaptor calls this method to create a download entry. Note that this is purely write-only + method and doesn't involve anything else from TransferEngine side than creating a new DB record + of type 'Download'. + + \list + \o \a displayName The name for Download which may be used by the UI displaying the download + \o \a applicationIcon The application icon of the application created the download + \o \a serviceIcon The service icon, which provides the file to be downloaded + \o \a filePath The filePath e.g. url to the file to be downloaded + \o \a mimeType the MimeType of the file to be downloaded + \o \a expectedFileSize The file size of the file to be downloaded + \o \a callback QStringList containing DBus callback information such as: service, path and interface + \o \a cancelMethod The name of the cancel callback method, which DBus callback provides + \o \a restartMethod The name of the restart callback method, which DBus callback provides + \endlist + + This method returns the transfer id of the created Download transfer. Note that this method only + creates an entry to the database. To start the actual transfer, the startTransfer() method must + be called. + + \sa startTransfer(), restartTransfer(), finishTransfer(), updateTransferProgress() + */ +int TransferEngine::createDownload(const QString &displayName, + const QString &applicationIcon, + const QString &serviceIcon, + const QString &filePath, + const QString &mimeType, + qlonglong expectedFileSize, + const QStringList &callback, + const QString &cancelMethod, + const QString &restartMethod) +{ + Q_D(TransferEngine); + QUrl url(filePath); + QFileInfo fileInfo(filePath); + + MediaItem *mediaItem = new MediaItem(); + mediaItem->setValue(MediaItem::Url, url); + mediaItem->setValue(MediaItem::ResourceName, fileInfo.fileName()); + mediaItem->setValue(MediaItem::MimeType, mimeType); + mediaItem->setValue(MediaItem::TransferType, TransferEngineData::Download); + mediaItem->setValue(MediaItem::FileSize, expectedFileSize); + mediaItem->setValue(MediaItem::DisplayName, displayName); + mediaItem->setValue(MediaItem::ApplicationIcon, applicationIcon); + mediaItem->setValue(MediaItem::ServiceIcon, serviceIcon); + mediaItem->setValue(MediaItem::Callback, callback); + mediaItem->setValue(MediaItem::CancelCBMethod, cancelMethod); + mediaItem->setValue(MediaItem::RestartCBMethod, restartMethod); + mediaItem->setValue(MediaItem::CancelSupported, !cancelMethod.isEmpty()); + mediaItem->setValue(MediaItem::RestartSupported,!restartMethod.isEmpty()); + + const int key = DbManager::instance()->createTransferEntry(mediaItem); + d->m_keyTypeCache.insert(key, TransferEngineData::Download); + emit transfersChanged(); + emit statusChanged(key, TransferEngineData::NotStarted); + return key; +} + +/*! + DBus adaptor calls this method to create a Sync entry. Note that this is purely write-only + method and doesn't involve anything else from TransferEngine side than creating a new DB record + of type 'Download'. + + \list + \o \a displayName The name for download which may be used by the UI displaying the download + \o \a applicationIcon The application icon of the application created the download + \o \a serviceIcon The service icon, which provides the file to be downloaded + \o \a callback QStringList containing DBus callback information such as: service, path and interface + \o \a cancelMethod The name of the cancel callback method, which DBus callback provides + \o \a restartMethod The name of the restart callback method, which DBus callback provides + \endlist + + This method returns the transfer id of the created Download transfer. Note that this method only + creates an entry to the database. To start the actual transfer, the startTransfer() method must + be called. + + \sa startTransfer(), restartTransfer(), finishTransfer(), updateTransferProgress() + */ +int TransferEngine::createSync(const QString &displayName, + const QString &applicationIcon, + const QString &serviceIcon, + const QStringList &callback, + const QString &cancelMethod, + const QString &restartMethod) +{ + MediaItem *mediaItem = new MediaItem(); + mediaItem->setValue(MediaItem::TransferType, TransferEngineData::Sync); + mediaItem->setValue(MediaItem::DisplayName, displayName); + mediaItem->setValue(MediaItem::ApplicationIcon, applicationIcon); + mediaItem->setValue(MediaItem::ServiceIcon, serviceIcon); + mediaItem->setValue(MediaItem::Callback, callback); + mediaItem->setValue(MediaItem::CancelCBMethod, cancelMethod); + mediaItem->setValue(MediaItem::RestartCBMethod, restartMethod); + mediaItem->setValue(MediaItem::CancelSupported, !cancelMethod.isEmpty()); + mediaItem->setValue(MediaItem::RestartSupported,!restartMethod.isEmpty()); + + const int key = DbManager::instance()->createTransferEntry(mediaItem); + Q_D(TransferEngine); + d->m_keyTypeCache.insert(key, TransferEngineData::Sync); + emit transfersChanged(); + emit statusChanged(key, TransferEngineData::NotStarted); + return key; +} + +/*! + DBus adaptor calls this method to start the actual transfer. This method changes the transfer + status of the existing transfer with a \a transferId to TransferEngineData::TransferStarted. This + method can only be called for Sync and Download transfers. + + Calling this method causes the corresponding statusChanged() signal to be emitted. +*/ +void TransferEngine::startTransfer(int transferId) +{ + Q_D(TransferEngine); + TransferEngineData::TransferType type = d->transferType(transferId); + if (type == TransferEngineData::Undefined) { + qWarning() << "TransferEngine::startTransfer: failed to get transfer type"; + return; + } + + if (type == TransferEngineData::Upload) { + qWarning() << "TransferEngine::startTransfer: starting upload isn't supported"; + return; + } + + TransferEngineData::TransferStatus status = DbManager::instance()->transferStatus(transferId); + // First check if this is a new transfer + if (status == TransferEngineData::NotStarted || + status == TransferEngineData::TransferCanceled || + status == TransferEngineData::TransferInterrupted) { + DbManager::instance()->updateTransferStatus(transferId, TransferEngineData::TransferStarted); + emit statusChanged(transferId, TransferEngineData::TransferStarted); + } else { + qWarning() << "TransferEngine::startTransfer: could not start transfer"; + } +} + +/*! + DBus adaptor calls this method to restart a canceled or failed transfer with a \a transferId. In + a case of Upload, this method creates MediaItem instance of the existing transfer and instantiates + the required share plugin. The MediaItem instance is passed to the plugin and sharing is restarted. + + For Sync and Download entries, this method calls their callbacks methods, if a callback interface + has been defined by the client originally created the Sync or Download entry. +*/ +void TransferEngine::restartTransfer(int transferId) +{ + + Q_D(TransferEngine); + TransferEngineData::TransferType type = d->transferType(transferId); + if (type == TransferEngineData::Undefined) { + qWarning() << "TransferEngine::restartTransfer: failed to get transfer type"; + return; + } + + if (type == TransferEngineData::Upload) { + + MediaItem * item = DbManager::instance()->mediaItem(transferId); + if (!item) { + qWarning() << "TransferEngine::restartTransfer: failed to reload media item from db!"; + return; + } + + Q_D(TransferEngine); + MediaTransferInterface *muif = d->loadPlugin(item->value(MediaItem::PluginId).toString()); + muif->setMediaItem(item); + + connect(muif, SIGNAL(statusChanged(MediaTransferInterface::TransferStatus)), + d, SLOT(uploadItemStatusChanged(MediaTransferInterface::TransferStatus))); + connect(muif, SIGNAL(progressUpdated(qreal)), + d, SLOT(updateProgress(qreal))); + + d->m_keyTypeCache.insert(transferId, TransferEngineData::Upload); + d->m_plugins.insert(muif, transferId); + muif->start(); + return; + } + + TransferEngineData::TransferStatus status = DbManager::instance()->transferStatus(transferId); + // Check if this is canceled or interrupted transfer + // and make a callback call to the client. It's client's + // responsibility to update states properly + if (status == TransferEngineData::TransferCanceled || + status == TransferEngineData::TransferInterrupted) { + DbManager::instance()->updateProgress(transferId, 0); + d->callbackCall(transferId, TransferEnginePrivate::RestartCallback); + } +} + +/*! + Finishes an existing Sync or Download transfer with a \a transferId. Transfer can be finished + with different \a status e.g for successfully finish status can be set to + TransferEngineData::TransferFinished, for canceling TransferEngineData::Canceled and for + failure with TransferEngineData::TransferInterrupted. In a case of failure, the client can + also provide a \a reason. + + This method causes statusChanged() signal to be emitted. If a sync has been successfully + finished, then it will also be removed from the database automatically which causes + transferChanged() signal to be emitted. + */ +void TransferEngine::finishTransfer(int transferId, int status, const QString &reason) +{ + Q_UNUSED(reason); + Q_D(TransferEngine); + TransferEngineData::TransferType type = d->transferType(transferId); + if (type == TransferEngineData::Undefined || type == TransferEngineData::Upload) { + return; // We don't handle plugins here + } + + QUrl filePath; + // Read the file path from the database for download + if (type == TransferEngineData::Download) { + MediaItem *mediaItem = DbManager::instance()->mediaItem(transferId); + if (!mediaItem) { + qWarning() << "TransferEngine::finishTransfer: Failed to fetch MediaItem"; + return; + } + filePath = mediaItem->value(MediaItem::Url).toUrl(); + } + + + TransferEngineData::TransferStatus transferStatus = static_cast(status); + if (transferStatus == TransferEngineData::TransferFinished || + transferStatus == TransferEngineData::TransferCanceled || + transferStatus == TransferEngineData::TransferInterrupted) { + DbManager::instance()->updateTransferStatus(transferId, transferStatus); + + d->sendNotification(type, transferStatus, filePath); + emit statusChanged(transferId, status); + + // We don't want to leave successfully finished syncs to populate the database, just remove it. + if (type == TransferEngineData::Sync && + transferStatus == TransferEngineData::TransferFinished) { + if (DbManager::instance()->removeTransfer(transferId)) { + emit transfersChanged(); + } + } + } +} + +/*! + DBus adaptor calls this method to update transfer progress of the transfer with a \a transferId and + with a new \a progress. +*/ +void TransferEngine::updateTransferProgress(int transferId, double progress) +{ + Q_D(TransferEngine); + TransferEngineData::TransferType type = d->transferType(transferId); + + if (type == TransferEngineData::Undefined || type == TransferEngineData::Upload) { + return; + } + + + if (DbManager::instance()->updateProgress(transferId, progress)) { + emit progressChanged(transferId, progress); + } else { + qWarning() << "TransferEngine::updateTransferProgress: Failed to update progress for " << transferId; + } +} + +/*! + DBus adaptor calls this method to fetch a list of transfers. This method returns QList. + */ +QList TransferEngine::transfers() +{ + return DbManager::instance()->transfers(); +} + +/*! + DBus adaptor calls this method to fetch a list of transfer methods. This method returns QList. + + Transfer methods are basically a list of share plugins installed to the system. + */ +QList TransferEngine::transferMethods() +{ + Q_D(TransferEngine); + return d->enabledPlugins(); +} + +/*! + DBus adaptor calls this method to clear all the finished, canceled or interrupted transfers in the database. + */ +void TransferEngine::clearTransfers() +{ + if (DbManager::instance()->clearTransfers()) { + emit transfersChanged(); + } else { + qWarning() << "TransferEngine::clearTransfers: Failed to clear finished transfers!"; + } +} + +/*! + DBus adaptor calls this method to cancel an existing transfer with a \a transferId. + + If the transfer is Upload, then this method calls MediaTransferInterface instance's + cancel method. In a case of Sync or Download this method calls client's cancel callback + method, if the one exists. + + Calling this method causes statusChanged() signal to be emitted. + */ +void TransferEngine::cancelTransfer(int transferId) +{ + + Q_D(TransferEngine); + TransferEngineData::TransferType type = d->transferType(transferId); + + // Handle canceling of Download or Sync + if (type == TransferEngineData::Download || type == TransferEngineData::Sync) { + d->callbackCall(transferId, TransferEnginePrivate::CancelCallback); + return; + } + + // Let plugin handle canceling of up upload + if (type == TransferEngineData::Upload) { + MediaTransferInterface *muif = d->m_plugins.key(transferId); + if (muif == 0) { + qWarning() << "TransferEngine::cancelTransfer: Failed to get MediaTransferInterface!"; + return; + } + + muif->cancel(); + } +} +/*! + DBus adaptor calls this method to enable or disable transfer speicific notifications + based on \a enable argument. +*/ +void TransferEngine::enableNotifications(bool enable) +{ + Q_D(TransferEngine); + if (d->m_notificationsEnabled != enable) { + d->m_notificationsEnabled = enable; + } +} + +/*! + DBus adaptor calls this method. + Returns true or false depending if notifications are enabled or disabled. +*/ +bool TransferEngine::notificationsEnabled() +{ + Q_D(TransferEngine); + return d->m_notificationsEnabled; +} + + + + + + diff --git a/src/transferengine.h b/src/transferengine.h new file mode 100644 index 0000000..0659555 --- /dev/null +++ b/src/transferengine.h @@ -0,0 +1,112 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERENGINE_H +#define TRANSFERENGINE_H + +#include +#include +#include + +#include "mediatransferinterface.h" +#include "transferdbrecord.h" +#include "transfermethodinfo.h" + +class MediaTransferInterface; +class TransferEnginePrivate; +class TransferEngine : public QObject +{ + Q_OBJECT +public: + + explicit TransferEngine(QObject *parent = 0); + ~TransferEngine(); + +public Q_SLOTS: + int uploadMediaItem( const QString &source, + const QString &serviceId, + const QString &mimeType, + bool metadataStripped, + const QVariantMap &userData); + + int uploadMediaItemContent(const QVariantMap &content, + const QString &serviceId, + const QVariantMap &userData); + + int createDownload(const QString &displayName, + const QString &applicationIcon, + const QString &serviceIcon, + const QString &filePath, + const QString &mimeType, + qlonglong expectedFileSize, + const QStringList &callback, + const QString &cancelMethod, + const QString &restartMethod); + + int createSync(const QString &displayName, + const QString &applicationIcon, + const QString &serviceIcon, + const QStringList &callback, + const QString &cancelMethod, + const QString &restartMethod); + + void startTransfer(int transferId); + + void restartTransfer(int transferId); + + void finishTransfer(int transferId, int status, const QString &reason); + + void updateTransferProgress(int transferId, double progress); + + QList transfers(); + + QList transferMethods(); + + void clearTransfers(); + + void cancelTransfer(int transferId); + + void enableNotifications(bool enable); + + bool notificationsEnabled(); + +Q_SIGNALS: + void progressChanged(int transferId, double progress); + + void statusChanged(int transferId, int status); + + void transferMethodListChanged(); + + void transfersChanged(); + + +private: + TransferEnginePrivate *d_ptr; + Q_DECLARE_PRIVATE(TransferEngine) +}; + + +#endif // TRANSFERENGINE_H diff --git a/src/transferengine_p.h b/src/transferengine_p.h new file mode 100644 index 0000000..8aaa23a --- /dev/null +++ b/src/transferengine_p.h @@ -0,0 +1,123 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#ifndef TRANSFERENGINE_P_H +#define TRANSFERENGINE_P_H + +#include +#include +#include +#include + +#include "mediatransferinterface.h" +#include "transfermethodinfo.h" + +#include + +class QFileSystemWatcher; +class QTimer; +class QUrl; +class TransferEngine; +class TransferPluginInfo; + +class TransferEngineSignalHandler: public QObject +{ + Q_OBJECT +public: + static TransferEngineSignalHandler * instance(); + static void signalHandler(int signal); + +Q_SIGNALS: + void exitSafely(); + +private: + TransferEngineSignalHandler(); +}; + + +class TransferEnginePrivate: QObject +{ + Q_OBJECT +public: + // CallbackElement enum is used as an accessor to DBus callback + // information from a list. Enums are used as an indeces. + enum CallbackElements { + Service = 0, + Path, + Interface + }; + + // CallbackMethodType enum is used as an accessor to the list where + // method names starts from the index 3. + enum CallbackMethodType { + CancelCallback = 3, + RestartCallback = 4 + }; + + TransferEnginePrivate(TransferEngine *parent); + void recoveryCheck(); + void sendNotification(TransferEngineData::TransferType type, + TransferEngineData::TransferStatus status, + const QUrl &filePath); + int uploadMediaItem(MediaItem *mediaItem, + MediaTransferInterface *muif, + const QVariantMap &userData); + inline TransferEngineData::TransferType transferType(int transferId); + void callbackCall(int transferId, CallbackMethodType method); + MRemoteAction createRemoteActionForGroup(); + +public Q_SLOTS: + void exitSafely(); + void inProgressTransfersCheck(); + void enabledPluginsCheck(); + void pluginDirChanged(); + void uploadItemStatusChanged(MediaTransferInterface::TransferStatus status); + void updateProgress(qreal progress); + void pluginInfoReady(); + void pluginInfoError(const QString &msg); + +public: + QStringList pluginList() const; + QList enabledPlugins() const; + MediaTransferInterface *loadPlugin(const QString &pluginId) const; + + + QMap m_plugins; + QMap m_keyTypeCache; + bool m_notificationsEnabled; + QList m_infoObjects; + QList m_enabledPlugins; + Accounts::Manager *m_accountManager; + QFileSystemWatcher *m_fileWatcher; + QTimer *m_fileWatcherTimer; + QSettings m_settings; + quint32 m_transfersInProgressCount; + TransferEngine *q_ptr; + Q_DECLARE_PUBLIC(TransferEngine) +}; + +#endif + diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000..40f113e --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd. +** Contact: Marko Mattila +** All rights reserved. +** +** This file is part of Nemo Transfer Engine package. +** +** You may use this file under the terms of the GNU Lesser General +** Public License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file license.lgpl included in the packaging +** of this file. +** +** This library 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 +** Lesser General Public License for more details. +** +****************************************************************************************/ + +#include +#include "ut_imageoperation.h" +#include "ut_mediatransferinterface.h" + +int main(int argc, char *argv[]) +{ + + ut_imageoperation t1; + int res = QTest::qExec(&t1); + + ut_mediatransferinterface t2; + res = QTest::qExec(&t2); + + return res; +} diff --git a/tests/testimage.jpg b/tests/testimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47bbb0f787b3ec7fa725c9ee6096e25761cb348e GIT binary patch literal 1202040 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Ν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%0Dk}Yl?#qr83}b=sSV_t1VSRKUH*%t( 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
    muw>#El$P3Zq!39Q@lgeR%m_Hh#z^L^ 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�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