From ca759b3fd3b64ad976c4917e93513b3d05999f13 Mon Sep 17 00:00:00 2001 From: Rodrigo Linfati Date: Fri, 28 Oct 2011 16:46:21 +0200 Subject: [PATCH] Migrated to: https://github.com/rlinfati/latitudeupdater --- README | 3 + deployment.pri | 123 ---- latitude.qml/MainPage.qml | 243 -------- latitude.qml/latitude.qml.pro | 25 - latitude.qml/main.cpp | 40 -- latitude.qml/main.qml | 12 - latitude.qml/qml.cpp | 18 - latitude.qml/qml.h | 55 -- latitude.qml/resouses.qrc | 6 - latitude.qt/latitude.qt.pro | 18 - latitude.qt/main.cpp | 16 - latitude.qt/widget.cpp | 116 ---- latitude.qt/widget.h | 149 ----- latituded/daemon.cpp | 17 - latituded/daemon.h | 54 -- latituded/latituded.conf | 34 - latituded/latituded.pro | 24 - latituded/main.cpp | 25 - latitudeupdater.pro | 43 -- latitudeupdater64.png | Bin 3646 -> 0 bytes latitudeupdater80.png | Bin 5280 -> 0 bytes latitudeupdater_fremantle.desktop | 11 - latitudeupdater_harmattan.desktop | 11 - libkqoauth/QtKOAuth | 5 - libkqoauth/kqoauthauthreplyserver.cpp | 104 ---- libkqoauth/kqoauthauthreplyserver.h | 47 -- libkqoauth/kqoauthauthreplyserver_p.h | 47 -- libkqoauth/kqoauthglobals.h | 44 -- libkqoauth/kqoauthmanager.cpp | 650 -------------------- libkqoauth/kqoauthmanager.h | 181 ------ libkqoauth/kqoauthmanager_p.h | 72 --- libkqoauth/kqoauthrequest.cpp | 589 ------------------ libkqoauth/kqoauthrequest.h | 145 ----- libkqoauth/kqoauthrequest_1.cpp | 5 - libkqoauth/kqoauthrequest_1.h | 12 - libkqoauth/kqoauthrequest_p.h | 93 --- libkqoauth/kqoauthrequest_xauth.cpp | 89 --- libkqoauth/kqoauthrequest_xauth.h | 49 -- libkqoauth/kqoauthrequest_xauth_p.h | 14 - libkqoauth/kqoauthutils.cpp | 79 --- libkqoauth/kqoauthutils.h | 33 - libkqoauth/libkqoauth.pro | 27 - libkqoauth/no_desktopservice.patch | 59 -- liblatitudeupdater/googlelatitude.cpp | 190 ------ liblatitudeupdater/googlelatitude.h | 59 -- liblatitudeupdater/gpscontrol.cpp | 131 ---- liblatitudeupdater/gpscontrol.h | 49 -- liblatitudeupdater/liblatitudeupdater.pro | 12 - liblocationmaemo5/gconfitem.cpp | 364 ----------- liblocationmaemo5/gconfitem_p.h | 166 ----- liblocationmaemo5/liblocationmaemo5.pro | 21 - liblocationmaemo5/liblocationwrapper.cpp | 379 ------------ liblocationmaemo5/liblocationwrapper_p.h | 121 ---- .../qgeopositioninfosource_maemo5.cpp | 370 ----------- .../qgeopositioninfosource_maemo5_p.h | 129 ---- .../qgeosatelliteinfosource_maemo5.cpp | 246 -------- .../qgeosatelliteinfosource_maemo5_p.h | 119 ---- qtc_packaging/debian_fremantle/README | 10 - qtc_packaging/debian_fremantle/changelog | 151 ----- qtc_packaging/debian_fremantle/compat | 1 - qtc_packaging/debian_fremantle/control | 20 - qtc_packaging/debian_fremantle/copyright | 34 - qtc_packaging/debian_fremantle/rules | 75 --- qtc_packaging/debian_fremantle/rules.real | 75 --- qtc_packaging/debian_harmattan/README | 10 - qtc_packaging/debian_harmattan/changelog | 151 ----- qtc_packaging/debian_harmattan/compat | 1 - qtc_packaging/debian_harmattan/control | 20 - qtc_packaging/debian_harmattan/copyright | 34 - .../debian_harmattan/latitudeupdater.aegis | 8 - .../debian_harmattan/latitudeupdater.postinst | 9 - .../debian_harmattan/latitudeupdater.prerm | 9 - qtc_packaging/debian_harmattan/rules | 75 --- qtc_packaging/debian_harmattan/rules.real | 76 --- qtc_packaging/formeego_screenshot.png | Bin 186613 -> 0 bytes qtc_packaging/icon.png | Bin 25671 -> 0 bytes qtc_packaging/ovi_screenshot.jpg | Bin 35923 -> 0 bytes 77 files changed, 3 insertions(+), 6499 deletions(-) create mode 100644 README delete mode 100644 deployment.pri delete mode 100644 latitude.qml/MainPage.qml delete mode 100644 latitude.qml/latitude.qml.pro delete mode 100644 latitude.qml/main.cpp delete mode 100644 latitude.qml/main.qml delete mode 100644 latitude.qml/qml.cpp delete mode 100644 latitude.qml/qml.h delete mode 100644 latitude.qml/resouses.qrc delete mode 100644 latitude.qt/latitude.qt.pro delete mode 100644 latitude.qt/main.cpp delete mode 100644 latitude.qt/widget.cpp delete mode 100644 latitude.qt/widget.h delete mode 100644 latituded/daemon.cpp delete mode 100644 latituded/daemon.h delete mode 100644 latituded/latituded.conf delete mode 100644 latituded/latituded.pro delete mode 100644 latituded/main.cpp delete mode 100644 latitudeupdater.pro delete mode 100644 latitudeupdater64.png delete mode 100644 latitudeupdater80.png delete mode 100644 latitudeupdater_fremantle.desktop delete mode 100644 latitudeupdater_harmattan.desktop delete mode 100644 libkqoauth/QtKOAuth delete mode 100644 libkqoauth/kqoauthauthreplyserver.cpp delete mode 100644 libkqoauth/kqoauthauthreplyserver.h delete mode 100644 libkqoauth/kqoauthauthreplyserver_p.h delete mode 100644 libkqoauth/kqoauthglobals.h delete mode 100644 libkqoauth/kqoauthmanager.cpp delete mode 100644 libkqoauth/kqoauthmanager.h delete mode 100644 libkqoauth/kqoauthmanager_p.h delete mode 100644 libkqoauth/kqoauthrequest.cpp delete mode 100644 libkqoauth/kqoauthrequest.h delete mode 100644 libkqoauth/kqoauthrequest_1.cpp delete mode 100644 libkqoauth/kqoauthrequest_1.h delete mode 100644 libkqoauth/kqoauthrequest_p.h delete mode 100644 libkqoauth/kqoauthrequest_xauth.cpp delete mode 100644 libkqoauth/kqoauthrequest_xauth.h delete mode 100644 libkqoauth/kqoauthrequest_xauth_p.h delete mode 100644 libkqoauth/kqoauthutils.cpp delete mode 100644 libkqoauth/kqoauthutils.h delete mode 100644 libkqoauth/libkqoauth.pro delete mode 100644 libkqoauth/no_desktopservice.patch delete mode 100644 liblatitudeupdater/googlelatitude.cpp delete mode 100644 liblatitudeupdater/googlelatitude.h delete mode 100644 liblatitudeupdater/gpscontrol.cpp delete mode 100644 liblatitudeupdater/gpscontrol.h delete mode 100644 liblatitudeupdater/liblatitudeupdater.pro delete mode 100644 liblocationmaemo5/gconfitem.cpp delete mode 100644 liblocationmaemo5/gconfitem_p.h delete mode 100644 liblocationmaemo5/liblocationmaemo5.pro delete mode 100644 liblocationmaemo5/liblocationwrapper.cpp delete mode 100644 liblocationmaemo5/liblocationwrapper_p.h delete mode 100644 liblocationmaemo5/qgeopositioninfosource_maemo5.cpp delete mode 100644 liblocationmaemo5/qgeopositioninfosource_maemo5_p.h delete mode 100644 liblocationmaemo5/qgeosatelliteinfosource_maemo5.cpp delete mode 100644 liblocationmaemo5/qgeosatelliteinfosource_maemo5_p.h delete mode 100644 qtc_packaging/debian_fremantle/README delete mode 100644 qtc_packaging/debian_fremantle/changelog delete mode 100644 qtc_packaging/debian_fremantle/compat delete mode 100644 qtc_packaging/debian_fremantle/control delete mode 100644 qtc_packaging/debian_fremantle/copyright delete mode 100755 qtc_packaging/debian_fremantle/rules delete mode 100755 qtc_packaging/debian_fremantle/rules.real delete mode 100644 qtc_packaging/debian_harmattan/README delete mode 100644 qtc_packaging/debian_harmattan/changelog delete mode 100644 qtc_packaging/debian_harmattan/compat delete mode 100644 qtc_packaging/debian_harmattan/control delete mode 100644 qtc_packaging/debian_harmattan/copyright delete mode 100644 qtc_packaging/debian_harmattan/latitudeupdater.aegis delete mode 100644 qtc_packaging/debian_harmattan/latitudeupdater.postinst delete mode 100644 qtc_packaging/debian_harmattan/latitudeupdater.prerm delete mode 100644 qtc_packaging/debian_harmattan/manifest.aegis delete mode 100755 qtc_packaging/debian_harmattan/rules delete mode 100755 qtc_packaging/debian_harmattan/rules.real delete mode 100644 qtc_packaging/formeego_screenshot.png delete mode 100644 qtc_packaging/icon.png delete mode 100644 qtc_packaging/ovi_screenshot.jpg diff --git a/README b/README new file mode 100644 index 0000000..0a524b1 --- /dev/null +++ b/README @@ -0,0 +1,3 @@ + +Migrated to: +https://github.com/rlinfati/latitudeupdater diff --git a/deployment.pri b/deployment.pri deleted file mode 100644 index d515c67..0000000 --- a/deployment.pri +++ /dev/null @@ -1,123 +0,0 @@ -# This file was generated by an application wizard of Qt Creator. -# The code below handles deployment to Symbian and Maemo, aswell as copying -# of the application data to shadow build directories on desktop. -# It is recommended not to modify this file, since newer versions of Qt Creator -# may offer an updated version of it. - -defineTest(qtcAddDeployment) { -for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemsources = $${item}.sources - $$itemsources = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath= $$eval($${deploymentfolder}.target) - export($$itemsources) - export($$itempath) - DEPLOYMENT += $$item -} - -MAINPROFILEPWD = $$PWD - -symbian { - isEmpty(ICON):exists($${TARGET}.svg):ICON = $${TARGET}.svg - isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 -} else:win32 { - copyCommand = - for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, /, \\) - sourcePathSegments = $$split(source, \\) - target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments) - target = $$replace(target, /, \\) - !isEqual(source,$$target) { - !isEmpty(copyCommand):copyCommand += && - isEqual(QMAKE_DIR_SEP, \\) { - copyCommand += $(COPY_DIR) \"$$source\" \"$$target\" - } else { - source = $$replace(source, \\\\, /) - target = $$OUT_PWD/$$eval($${deploymentfolder}.target) - target = $$replace(target, \\\\, /) - copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\" - } - } - } - !isEmpty(copyCommand) { - copyCommand = @echo Copying application data... && $$copyCommand - copydeploymentfolders.commands = $$copyCommand - first.depends = $(first) copydeploymentfolders - export(first.depends) - export(copydeploymentfolders.commands) - QMAKE_EXTRA_TARGETS += first copydeploymentfolders - } -} else:unix { - maemo5 { - desktopfile.files = $${TARGET}_fremantle.desktop - desktopfile.path = /usr/share/applications/hildon - icon.files = $${TARGET}64.png - icon.path = /usr/share/icons/hicolor/64x64/apps - } else:!isEmpty(MEEGO_VERSION_MAJOR) { - desktopfile.files = $${TARGET}_harmattan.desktop - desktopfile.path = /usr/share/applications - icon.files = $${TARGET}80.png - icon.path = /usr/share/icons/hicolor/80x80/apps - } else { # Assumed to be a Desktop Unix - copyCommand = - for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, \\\\, /) - macx { - target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target) - } else { - target = $$OUT_PWD/$$eval($${deploymentfolder}.target) - } - target = $$replace(target, \\\\, /) - sourcePathSegments = $$split(source, /) - targetFullPath = $$target/$$last(sourcePathSegments) - !isEqual(source,$$targetFullPath) { - !isEmpty(copyCommand):copyCommand += && - copyCommand += $(MKDIR) \"$$target\" - copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\" - } - } - !isEmpty(copyCommand) { - copyCommand = @echo Copying application data... && $$copyCommand - copydeploymentfolders.commands = $$copyCommand - first.depends = $(first) copydeploymentfolders - export(first.depends) - export(copydeploymentfolders.commands) - QMAKE_EXTRA_TARGETS += first copydeploymentfolders - } - } - installPrefix = /opt/linfati.com - for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemfiles = $${item}.files - $$itemfiles = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target) - export($$itemfiles) - export($$itempath) - INSTALLS += $$item - } - - !isEmpty(desktopfile.path) { - export(icon.files) - export(icon.path) - export(desktopfile.files) - export(desktopfile.path) - INSTALLS += icon desktopfile - } - - target.path = $${installPrefix}/bin - export(target.path) - INSTALLS += target -} - -export (ICON) -export (INSTALLS) -export (DEPLOYMENT) -export (TARGET.EPOCHEAPSIZE) -export (TARGET.CAPABILITY) -export (LIBS) -export (QMAKE_EXTRA_TARGETS) -} diff --git a/latitude.qml/MainPage.qml b/latitude.qml/MainPage.qml deleted file mode 100644 index 8916389..0000000 --- a/latitude.qml/MainPage.qml +++ /dev/null @@ -1,243 +0,0 @@ -import QtQuick 1.1 -import com.nokia.meego 1.0 -import QtWebKit 1.0 - -Page { - id: mainPage - orientationLock: PageOrientation.LockPortrait - Column { - spacing: 16 - Row { -// width: rootWindow.width - Button { - id: do_staff - width: rootWindow.width / 3 - text: "..." - enabled: false - onClicked: { - if (text.match("Start")) { - console.log("match start") - if (!demonio.demonio_start()) { - gps.startUpdates() - } - text = "Stop" - } else if (text.match("Stop")) { - console.log("match stop") - if (!demonio.demonio_stop()) { - gps.stopUpdates(true) - } - text = "Start" - } - } - } - } - Row { - Label { - id: method_label - text: "Method" - width: mainPage.width / 4 - anchors.verticalCenter: method_button.verticalCenter - } - ButtonColumn { - id: method_button - width: mainPage.width * 1 / 3 - Button { - id: method_cell - text: "Cell Tower" - checked: gps.getPositioningMethod() == "cell" ? true : false - onClicked: gps.setPositioningMethod("cell") - } - Button { - id: method_all - text: "Both" - checked: gps.getPositioningMethod() == "all" ? true : false - onClicked: gps.setPositioningMethod("all") - } - Button { - id: method_agps - text: "Only GPS" - checked: gps.getPositioningMethod() == "gps" ? true : false - onClicked: gps.setPositioningMethod("gps") - } - } - } - Row { - Label { - id: timeout_label - text: "Time Out" - width: rootWindow.width / 4 - anchors.verticalCenter: timeout_slider.verticalCenter - } - Slider { - id: timeout_slider - width: rootWindow.width / 4 - valueIndicatorVisible: true - minimumValue: 5 - maximumValue: 120 - stepSize: 5 - value: gps.getTimeOut() - } - Label { - id: timeout_value - text: timeout_slider.value + " seg." - width: rootWindow.width / 4 - anchors.verticalCenter: timeout_slider.verticalCenter - } - Connections { - target: timeout_slider - onValueChanged: { - timeout_value.text = timeout_slider.value + " seg." - gps.setTimeOut(timeout_slider.value) - } - } - } - Row { - Label { - id: interval_label - text: "Interval" - width: rootWindow.width / 4 - anchors.verticalCenter: interval_slider.verticalCenter - } - Slider { - id: interval_slider - width: rootWindow.width / 4 - valueIndicatorVisible: true - minimumValue: 5 - maximumValue: 60 - stepSize: 5 - value: gps.getInterval() / 60 - } - Label { - id: interval_value - text: interval_slider.value + " min." - width: rootWindow.width / 4 - anchors.verticalCenter: interval_slider.verticalCenter - } - Connections { - target: interval_slider - onValueChanged: { - interval_value.text = interval_slider.value + " min." - gps.setInterval(interval_slider.value*60) - } - } - } - Row { - Label { - id: connect_label - text: "Auto Connect" - width: rootWindow.width / 4 - anchors.verticalCenter: connect_switch.verticalCenter - } - Switch { - id: connect_switch - width: rootWindow.width / 4 - checked: latitude.getAutoConnect() ? true : false - onCheckedChanged: { - connect_value.text = checked - latitude.setAutoConnect(checked) - } - } - Label { - id: connect_value - text: connect_switch.checked - width: rootWindow.width / 4 - anchors.verticalCenter: connect_switch.verticalCenter - } - } - Row { - Label { - id: daemon_label - text: "Daemon at boot time" - width: rootWindow.width / 4 - anchors.verticalCenter: daemon_switch.verticalCenter - } - Switch { - id: daemon_switch - width: rootWindow.width / 4 - checked: latitude.getDaemonMode() ? true : false - onCheckedChanged: { - daemon_value.text = checked - latitude.setDaemonMode(checked) } - } - Label { - id: daemon_value - text: daemon_switch.checked - width: rootWindow.width / 4 - anchors.verticalCenter: daemon_switch.verticalCenter - } - } - - Connections { - target: latitude - onGotToken: { - if (demonio.demonio_status()) { - do_staff.text = "Stop" - do_staff.enabled = true; - } else { - do_staff.text = "Start" - do_staff.enabled = true; - } - pageStack.pop(login) - } - } - - Connections { - target: latitude - onNotToken: { - do_staff.text = "..." - do_staff.enabled = false; - if (!demonio.demonio_stop()) { - gps.stopUpdates(true) - } - latitude.getAccess() - } - } - Connections { - target: latitude - onNeedAuth: { - pageStack.push(login) - } - } - - Connections { - target: gps - onGotFix: { - latitude.setCurrentLocation(gps.getCurrentLatitude(), - gps.getCurrentLongitude(), - gps.getCurrentAccuracy()) - latitude.sendCurrentLocation() - } - } - } - - Component { - id: login - Page { - orientationLock: PageOrientation.LockPortrait - Flickable { - id: flickable - width: parent.width - height: parent.height - contentWidth: webView.width - contentHeight: webView.height - WebView { - id: webView - url: latitude.getUserAuthorization() - preferredWidth: parent.width - preferredHeight: parent.height - onLoadFinished: { - console.log(url) - flickable.contentY = 0; - if (url.toString().match("ServiceLogin")) { - console.log("* QML WebView go w/2,0") - flickable.contentX = width/2; - } else { - console.log("* QML WebView go 0,0") - flickable.contentX = 0; - } - } - } - } - } - } -} diff --git a/latitude.qml/latitude.qml.pro b/latitude.qml/latitude.qml.pro deleted file mode 100644 index 4f2b35f..0000000 --- a/latitude.qml/latitude.qml.pro +++ /dev/null @@ -1,25 +0,0 @@ -TEMPLATE = app -TARGET = latitude.qml - -QT += network -CONFIG += mobility -MOBILITY += location - -INCLUDEPATH += ../liblatitudeupdater -INCLUDEPATH += ../libkqoauth - -LIBS += ../liblatitudeupdater/liblatitudeupdater.a -LIBS += ../libkqoauth/libkqoauth.a - -QT += declarative -HEADERS += qml.h -SOURCES += qml.cpp main.cpp -RESOURCES += resouses.qrc -OTHER_FILES += main.qml MainPage.qml - -include(../deployment.pri) -qtcAddDeployment() - - - - diff --git a/latitude.qml/main.cpp b/latitude.qml/main.cpp deleted file mode 100644 index f430c4b..0000000 --- a/latitude.qml/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include "qml.h" - -class EventFilter : public QObject { -protected: - bool eventFilter(QObject *obj, QEvent *event) { - QInputContext *ic = qApp->inputContext(); - if (ic) { - if (ic->focusWidget() == 0 && prevFocusWidget) { - QEvent closeSIPEvent(QEvent::CloseSoftwareInputPanel); - ic->filterEvent(&closeSIPEvent); - } else if (prevFocusWidget == 0 && ic->focusWidget()) { - QEvent openSIPEvent(QEvent::RequestSoftwareInputPanel); - ic->filterEvent(&openSIPEvent); - } - prevFocusWidget = ic->focusWidget(); - } - return QObject::eventFilter(obj,event); - } - -private: - QWidget *prevFocusWidget; -}; - -int main(int argc, char *argv[]) { - qDebug() << "* Main QML"; - QCoreApplication::setOrganizationName("linfati.com"); - QCoreApplication::setOrganizationDomain("linfati.com"); - QCoreApplication::setApplicationName("latitudeupdater"); - - QApplication lu(argc, argv); - - LatitudeQML mygui; - EventFilter ef; - mygui.installEventFilter(&ef); - mygui.showFullScreen(); - - return lu.exec(); -} diff --git a/latitude.qml/main.qml b/latitude.qml/main.qml deleted file mode 100644 index 95f0dae..0000000 --- a/latitude.qml/main.qml +++ /dev/null @@ -1,12 +0,0 @@ -import QtQuick 1.1 -import com.nokia.meego 1.0 - -PageStackWindow { - id: rootWindow - initialPage: mainPage - MainPage { - id: mainPage - } - showToolBar: false - showStatusBar: true -} diff --git a/latitude.qml/qml.cpp b/latitude.qml/qml.cpp deleted file mode 100644 index 95981ec..0000000 --- a/latitude.qml/qml.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "qml.h" -#include - -LatitudeQML::LatitudeQML(QDeclarativeView *parent) : - QDeclarativeView(parent), - latitude(this), - gps(this), - demonio("/opt/linfati.com/bin/latituded"), - cli(this) { - qDebug() << "* LatitudeQML::LatitudeQML"; - - rootContext()->setContextProperty("latitude", &latitude); - rootContext()->setContextProperty("gps", &gps); - rootContext()->setContextProperty("demonio", this); - setSource(QUrl("qrc:/main.qml")); - - latitude.getAccess(); -} diff --git a/latitude.qml/qml.h b/latitude.qml/qml.h deleted file mode 100644 index a23d734..0000000 --- a/latitude.qml/qml.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef LatitudeQML_H -#define LatitudeQML_H - -#include -#include -#include -#include -#include -#include -#include "googlelatitude.h" -#include "gpscontrol.h" - -class LatitudeQML : public QDeclarativeView { - Q_OBJECT -public: - LatitudeQML(QDeclarativeView *parent = 0); - -signals: - -public slots: - bool demonio_status() { - qDebug() << "LatitudeQML::demonio_status"; - if (system("killall -0 latituded 2> /dev/null" )) { - return false; - } - return true; - } - bool demonio_start() { - qDebug() << "LatitudeQML::demonio_start"; - if (demonio.exists()) { - cli.startDetached(demonio.fileName()); - return true; - } - qDebug() << "LatitudeQML:: demonio none"; - return false; - } - bool demonio_stop() { - qDebug() << "LatitudeQML::demonio_stop"; - if (demonio.exists()) { - qDebug() << "LatitudeQML:: demonio kill" << system("killall latituded 2> /dev/null"); - return true; - } - return false; - } - -private slots: - -private: - GoogleLatitude latitude; - GpsControl gps; - QFile demonio; - QProcess cli; -}; - -#endif // LatitudeQML_H diff --git a/latitude.qml/resouses.qrc b/latitude.qml/resouses.qrc deleted file mode 100644 index 44f1eb8..0000000 --- a/latitude.qml/resouses.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - main.qml - MainPage.qml - - diff --git a/latitude.qt/latitude.qt.pro b/latitude.qt/latitude.qt.pro deleted file mode 100644 index 4cf4724..0000000 --- a/latitude.qt/latitude.qt.pro +++ /dev/null @@ -1,18 +0,0 @@ -TEMPLATE = app -TARGET = latitude.qt - -QT += network -CONFIG += mobility -MOBILITY += location - -INCLUDEPATH += ../liblatitudeupdater -INCLUDEPATH += ../libkqoauth - -LIBS += ../liblatitudeupdater/liblatitudeupdater.a -LIBS += ../libkqoauth/libkqoauth.a - -HEADERS += widget.h -SOURCES += widget.cpp main.cpp - -include(../deployment.pri) -qtcAddDeployment() diff --git a/latitude.qt/main.cpp b/latitude.qt/main.cpp deleted file mode 100644 index c403fbf..0000000 --- a/latitude.qt/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include "widget.h" - -int main(int argc, char *argv[]) { - qDebug() << "* Main Widget"; - QCoreApplication::setOrganizationName("linfati.com"); - QCoreApplication::setOrganizationDomain("linfati.com"); - QCoreApplication::setApplicationName("latitudeupdater"); - - QApplication lu(argc, argv); - - LatitudeGUI mygui; - mygui.showMaximized(); - - return lu.exec(); -} diff --git a/latitude.qt/widget.cpp b/latitude.qt/widget.cpp deleted file mode 100644 index 86d8e46..0000000 --- a/latitude.qt/widget.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "widget.h" - -LatitudeGUI::LatitudeGUI(QWidget *parent) : - QWidget(parent), - latitude(this), - gps(this), - demonio("/opt/linfati.com/bin/latituded"), - cli(this) { - qDebug() << "* LatitudeGUI::LatitudeGUI"; - setWindowTitle(tr("LatitudeUpdater")); - - // row 1 - layout_row1 = new QHBoxLayout(); - do_oauth = new QPushButton("Auth"); - do_start = new QPushButton("Start"); - do_stop = new QPushButton("Stop"); - layout_row1->addWidget(do_oauth); - layout_row1->addWidget(do_start); - layout_row1->addWidget(do_stop); - - do_oauth->setDisabled(true); - do_start->setDisabled(true); - do_stop->setDisabled(true); - - connect(do_oauth, SIGNAL(clicked()), this, SLOT(gl_webauth()) ); - connect(do_start, SIGNAL(clicked()), this, SLOT(gps_start()) ); - connect(do_stop, SIGNAL(clicked()), this, SLOT(gps_stop()) ); - - connect(&latitude, SIGNAL(gotToken()), this, SLOT(gl_GotToken()) ); - connect(&latitude, SIGNAL(notToken()), this, SLOT(gl_NotToken()) ); - connect(&latitude, SIGNAL(needAuth()), this, SLOT(gl_needAuth()) ); - - connect(&gps, SIGNAL(gotFix()), this, SLOT(set_latitude()) ); - - // row 2 - layout_row2 = new QHBoxLayout(); - gps_group = new QButtonGroup(); - gps_method = new QLabel("Method"); - gps_cell = new QRadioButton("Cell Tower"); - gps_both = new QRadioButton("Both"); - gps_agps = new QRadioButton("Only Gps"); - gps_group->addButton(gps_cell); - gps_group->addButton(gps_both); - gps_group->addButton(gps_agps); - layout_row2->addWidget(gps_method); - layout_row2->addWidget(gps_cell); - layout_row2->addWidget(gps_both); - layout_row2->addWidget(gps_agps); - - if ( gps.getPositioningMethod() == "gps" ) gps_agps->setChecked(true); - if ( gps.getPositioningMethod() == "cell" ) gps_cell->setChecked(true); - if ( gps.getPositioningMethod() == "all" ) gps_both->setChecked(true); - - connect(gps_cell, SIGNAL(clicked()), this, SLOT(set_method()) ); - connect(gps_both, SIGNAL(clicked()), this, SLOT(set_method()) ); - connect(gps_agps, SIGNAL(clicked()), this, SLOT(set_method()) ); - - // row 3 - layout_row3 = new QHBoxLayout(); - gps_to_label = new QLabel("Time Out"); - gps_to_slider = new QSlider(Qt::Horizontal); - gps_to_slider->setSingleStep(5); - gps_to_slider->setRange(5, 120); - gps_to_slider->setValue(gps.getTimeOut()); - gps_to_slider_value = new QLabel(QString("%1 sec.").arg(gps_to_slider->value())); - layout_row3->addWidget(gps_to_label); - layout_row3->addWidget(gps_to_slider); - layout_row3->addWidget(gps_to_slider_value); - - connect(gps_to_slider, SIGNAL(valueChanged(int)), this, SLOT(set_to(int)) ); - - // row 4 - layout_row4 = new QHBoxLayout(); - gps_i_label = new QLabel("Interval"); - - gps_i_slider = new QSlider(Qt::Horizontal); - gps_i_slider->setSingleStep(5); - gps_i_slider->setRange(5, 60); - gps_i_slider->setValue(gps.getInterval()/60); - gps_i_slider_value = new QLabel(QString("%1 min.").arg(gps_i_slider->value())); - layout_row4->addWidget(gps_i_label); - layout_row4->addWidget(gps_i_slider); - layout_row4->addWidget(gps_i_slider_value); - - connect(gps_i_slider, SIGNAL(valueChanged(int)), this, SLOT(set_i(int)) ); - - // row 5 - layout_row5 = new QHBoxLayout(); - gps_ac_group = new QButtonGroup(); - gps_ac_label = new QLabel("Auto Connect"); - gps_ac_yes = new QRadioButton("Yes"); - gps_ac_not = new QRadioButton("No"); - gps_ac_group->addButton(gps_ac_yes); - gps_ac_group->addButton(gps_ac_not); - layout_row5->addWidget(gps_ac_label); - layout_row5->addWidget(gps_ac_yes); - layout_row5->addWidget(gps_ac_not); - - if ( latitude.getAutoConnect() == true ) gps_ac_yes->setChecked(true); - if ( latitude.getAutoConnect() == false ) gps_ac_not->setChecked(true); - - connect(gps_ac_yes, SIGNAL(clicked()), this, SLOT(set_ac_yes()) ); - connect(gps_ac_not, SIGNAL(clicked()), this, SLOT(set_ac_not()) ); - - // gui - layout_gui = new QVBoxLayout(); - layout_gui->addLayout(layout_row1); - layout_gui->addLayout(layout_row2); - layout_gui->addLayout(layout_row3); - layout_gui->addLayout(layout_row4); - layout_gui->addLayout(layout_row5); - - setLayout(layout_gui); - latitude.getAccess(); -} - diff --git a/latitude.qt/widget.h b/latitude.qt/widget.h deleted file mode 100644 index eb1c3e3..0000000 --- a/latitude.qt/widget.h +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef LATITUDEGUI_H -#define LATITUDEGUI_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "googlelatitude.h" -#include "gpscontrol.h" - -class LatitudeGUI : public QWidget { - Q_OBJECT -public: - LatitudeGUI(QWidget *parent = 0); - -signals: - -public slots: - -private slots: - void gl_GotToken() { - qDebug() << "* LatitudeGUI::gl_GotToken"; - do_oauth->setDisabled(true); - if (system("killall -0 latituded 2> /dev/null" )) { - do_start->setEnabled(true); - do_stop->setDisabled(true); - } else { - do_start->setDisabled(true); - do_stop->setEnabled(true); - } - } - void gl_NotToken() { - qDebug() << "* LatitudeGUI::gl_NotToken"; - do_oauth->setEnabled(true); - do_start->setDisabled(true); - do_stop->setDisabled(true); - gps.stopUpdates(true); - } - void gl_needAuth() { - qDebug() << "* LatitudeGUI::gl_needAuth"; - do_oauth->setEnabled(true); - } - void gl_webauth() { - qDebug() << "* LatitudeGUI::gl_webauth"; - QDesktopServices::openUrl(latitude.getUserAuthorization()); - } - void gps_start() { - qDebug() << "* LatitudeGUI::gps_start"; - do_start->setDisabled(true); - do_stop->setEnabled(true); - if (demonio.exists()) { - qDebug() << "* LatitudeGUI:: demonio"; - cli.startDetached(demonio.fileName()); - return; - } - qDebug() << "* LatitudeGUI:: demonio none"; - gps.startUpdates(); - } - void gps_stop() { - qDebug() << "* LatitudeGUI::gps_stop"; - do_start->setEnabled(true); - do_stop->setDisabled(true); - if (demonio.exists()) { - qDebug() << "* LatitudeGUI:: demonio kill" << system("killall latituded 2> /dev/null"); - } else { - gps.stopUpdates(true); - } - } - void set_latitude() { - qDebug() << "* LatitudeGUI::set_latitude"; - latitude.setCurrentLocation(gps.getCurrentLatitude(), - gps.getCurrentLongitude(), - gps.getCurrentAccuracy()); - latitude.sendCurrentLocation(); - } - void set_method() { - qDebug() << "* LatitudeGUI::set_method"; - if (gps_cell->isChecked()) gps.setPositioningMethod("cell"); - if (gps_both->isChecked()) gps.setPositioningMethod("all"); - if (gps_agps->isChecked()) gps.setPositioningMethod("gps"); - } - void set_to(int value) { - qDebug() << "* LatitudeGUI::set_to()" << value; - gps.setTimeOut(value); - gps_to_slider_value->setText(QString("%1 sec.").arg(value)); - - } - void set_i(int value) { - qDebug() << "* LatitudeGUI::set_i()" << value; - gps.setInterval(value*60); - gps_i_slider_value->setText(QString("%1 min.").arg(value)); - } - void set_ac_yes() { - qDebug() << "* LatitudeGUI::set_ac_yes"; - latitude.setAutoConnect(true); - } - void set_ac_not() { - qDebug() << "* LatitudeGUI::set_ac_not"; - latitude.setAutoConnect(false); - } - -private: - GoogleLatitude latitude; - GpsControl gps; - QFile demonio; - QProcess cli; - - QHBoxLayout *layout_row1; - QPushButton *do_oauth; - QPushButton *do_start; - QPushButton *do_stop; - - QHBoxLayout *layout_row2; - QLabel *gps_method; - QButtonGroup *gps_group; - QRadioButton *gps_cell; - QRadioButton *gps_both; - QRadioButton *gps_agps; - - QHBoxLayout *layout_row3; - QLabel *gps_to_label; - QSlider *gps_to_slider; - QLabel *gps_to_slider_value; - - QHBoxLayout *layout_row4; - QLabel *gps_i_label; - QSlider *gps_i_slider; - QLabel *gps_i_slider_value; - - QHBoxLayout *layout_row5; - QLabel *gps_ac_label; - QButtonGroup *gps_ac_group; - QRadioButton *gps_ac_yes; - QRadioButton *gps_ac_not; - - QVBoxLayout *layout_gui; -}; - -#endif // LATITUDEGUI_H - diff --git a/latituded/daemon.cpp b/latituded/daemon.cpp deleted file mode 100644 index a2f6601..0000000 --- a/latituded/daemon.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "daemon.h" - -LatitudeDaemon::LatitudeDaemon(QObject *parent) : - QObject(parent), - latitude(this), - gps(this) { - qDebug() << "* LatitudeDaemon::LatitudeDaemon"; - - connect(&latitude, SIGNAL(gotToken()), this, SLOT(gl_GotToken()) ); - connect(&latitude, SIGNAL(notToken()), this, SLOT(gl_NotToken()) ); - connect(&latitude, SIGNAL(needAuth()), this, SLOT(gl_needAuth()) ); - - connect(&gps, SIGNAL(gotUpdate()), this, SLOT(get_gps()) ); - connect(&gps, SIGNAL(gotFix()), this, SLOT(set_latitude()) ); - - latitude.getAccess(); -} diff --git a/latituded/daemon.h b/latituded/daemon.h deleted file mode 100644 index d18a673..0000000 --- a/latituded/daemon.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef LATITUDEDAEMON_H -#define LATITUDEDAEMON_H - -#include -#include -#include "googlelatitude.h" -#include "gpscontrol.h" - -class LatitudeDaemon : public QObject { - Q_OBJECT -public: - LatitudeDaemon(QObject *parent = 0); -signals: - -public slots: - -private slots: - void gl_GotToken() { - qDebug() << "LatitudeDaemon::gl_GotToken()"; - gps.startUpdates(); - } - void gl_NotToken() { - qDebug() << "LatitudeDaemon::gl_NotToken()"; - QCoreApplication::exit(); - } - void gl_needAuth() { - qDebug() << "LatitudeDaemon::gl_needAuth()"; - QCoreApplication::exit(); - } - void get_gps() { - qDebug() << "LatitudeDaemon::get_gps()" - << gps.getCurrentLatitude() - << gps.getCurrentLongitude() - << gps.getCurrentAccuracy() - << gps.getCurrentTimestamp(); - } - void set_latitude() { - qDebug() << "LatitudeDaemon::set_latitude()" - << gps.getCurrentLatitude() - << gps.getCurrentLongitude() - << gps.getCurrentAccuracy() - << gps.getCurrentTimestamp(); - latitude.setCurrentLocation(gps.getCurrentLatitude(), - gps.getCurrentLongitude(), - gps.getCurrentAccuracy()); - latitude.sendCurrentLocation(); - } - -private: - GoogleLatitude latitude; - GpsControl gps; -}; - -#endif // LATITUDEDAEMON_H diff --git a/latituded/latituded.conf b/latituded/latituded.conf deleted file mode 100644 index 2865ad6..0000000 --- a/latituded/latituded.conf +++ /dev/null @@ -1,34 +0,0 @@ -# -# Example 3rd party application startup script. -# -# Install the startup script to /etc/init/apps. -# -# Applications are started after official stuff is done. -# -# The name of the script has to be unique, suffix .conf is mandatory. -# -# Applications are started in alphabetical order; note that -# 3rd party applications are not run in malfunction state. -# -# Only these tags ("stanzas") are allowed. -# -# During installation, application can be started by issuing command -# "start apps/myapp" in post-install script. Note that suffix .conf is -# not allowed. -# -# If your app does not get started, run command /etc/init/xsession/app-precheck.sh - -description "Google Latitude Updater" -author "rodrigo@linfati.cl" - -stop on stopping xsession - -console none - -# respawn -# respawn limit 3 30 -# nice 2 -# normal exit 0 - -exec /usr/bin/aegis-exec -s -u user -l "/opt/linfati.com/bin/latituded --init" - diff --git a/latituded/latituded.pro b/latituded/latituded.pro deleted file mode 100644 index b614f83..0000000 --- a/latituded/latituded.pro +++ /dev/null @@ -1,24 +0,0 @@ -TEMPLATE = app -TARGET = latituded - -QT += network -CONFIG += mobility -MOBILITY += location - -INCLUDEPATH += ../liblatitudeupdater -INCLUDEPATH += ../libkqoauth - -LIBS += ../liblatitudeupdater/liblatitudeupdater.a -LIBS += ../libkqoauth/libkqoauth.a - -HEADERS += daemon.h -SOURCES += daemon.cpp main.cpp - -OTHER_FILES += latituded.conf - -launcher.files = latituded.conf -launcher.path = /etc/init/apps/ -INSTALLS += launcher - -include(../deployment.pri) -qtcAddDeployment() diff --git a/latituded/main.cpp b/latituded/main.cpp deleted file mode 100644 index 25e1a04..0000000 --- a/latituded/main.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include "daemon.h" - -int main(int argc, char *argv[]) { - qDebug() << "* Main Daemon"; - QCoreApplication::setOrganizationName("linfati.com"); - QCoreApplication::setOrganizationDomain("linfati.com"); - QCoreApplication::setApplicationName("latitudeupdater"); - - QCoreApplication lu(argc, argv); - LatitudeDaemon mygui; - - Q_UNUSED(mygui) - - if ( lu.arguments().contains(QString("--init")) ) { - QSettings set; - if ( ! set.value("daemon",false).toBool() ) { - qDebug() << "No Daemon mode enable"; - return 0; - } - } - - return lu.exec(); -} diff --git a/latitudeupdater.pro b/latitudeupdater.pro deleted file mode 100644 index 89989bf..0000000 --- a/latitudeupdater.pro +++ /dev/null @@ -1,43 +0,0 @@ -TEMPLATE = subdirs -CONFIG += ordered - -SUBDIRS = \ - liblocationmaemo5 \ - libkqoauth \ - liblatitudeupdater \ - latituded \ - latitude.qt \ - latitude.qml - -contains(QT_CONFIG, maemo5): message(Maemo5) -contains(MEEGO_EDITION,harmattan): message(Maemo6) -linux-g++-maemo:!contains(MEEGO_EDITION,harmattan): { - MEEGO_VERSION_MAJOR = 1 - MEEGO_VERSION_MINOR = 2 - MEEGO_VERSION_PATCH = 0 - MEEGO_EDITION = harmattan - DEFINES += MEEGO_EDITION_HARMATTAN - message(Maemo6-beta) -} - -include(deployment.pri) -qtcAddDeployment() - -OTHER_FILES += \ - qtc_packaging/debian_harmattan/rules \ - qtc_packaging/debian_harmattan/rules.real \ - qtc_packaging/debian_harmattan/README \ - qtc_packaging/debian_harmattan/copyright \ - qtc_packaging/debian_harmattan/control \ - qtc_packaging/debian_harmattan/compat \ - qtc_packaging/debian_harmattan/changelog \ - qtc_packaging/debian_harmattan/latitudeupdater.aegis \ - qtc_packaging/debian_harmattan/latitudeupdater.postinst \ - qtc_packaging/debian_harmattan/latitudeupdater.prerm \ - qtc_packaging/debian_fremantle/rules \ - qtc_packaging/debian_fremantle/rules.real \ - qtc_packaging/debian_fremantle/README \ - qtc_packaging/debian_fremantle/copyright \ - qtc_packaging/debian_fremantle/control \ - qtc_packaging/debian_fremantle/compat \ - qtc_packaging/debian_fremantle/changelog diff --git a/latitudeupdater64.png b/latitudeupdater64.png deleted file mode 100644 index d98268f31e1c847a9b0e0d3fda477d7079f494d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3646 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 Qv;Y7A07*qoM6N<$f^%-)0RR91 diff --git a/latitudeupdater80.png b/latitudeupdater80.png deleted file mode 100644 index b581969e17ff539882b14e78a6dfbfe4a97f33dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5280 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. - */ -#include -#include -#include - -#include "kqoauthauthreplyserver.h" -#include "kqoauthauthreplyserver_p.h" - -KQOAuthAuthReplyServerPrivate::KQOAuthAuthReplyServerPrivate(KQOAuthAuthReplyServer *parent): - q_ptr(parent) -{ - -} - -KQOAuthAuthReplyServerPrivate::~KQOAuthAuthReplyServerPrivate() -{ - -} - -void KQOAuthAuthReplyServerPrivate::onIncomingConnection() { - Q_Q(KQOAuthAuthReplyServer); - - socket = q->nextPendingConnection(); - connect(socket, SIGNAL(readyRead()), - this, SLOT(onBytesReady()), Qt::UniqueConnection); -} - -void KQOAuthAuthReplyServerPrivate::onBytesReady() { - Q_Q(KQOAuthAuthReplyServer); - - QByteArray reply; - QByteArray content; - content.append(""); - - reply.append("HTTP/1.0 200 OK \r\n"); - reply.append("Content-Type: text/html; charset=\"utf-8\"\r\n"); - reply.append(QString("Content-Length: %1\r\n").arg(content.size())); - reply.append("\r\n"); - reply.append(content); - socket->write(reply); - - QByteArray data = socket->readAll(); - QMultiMap queryParams = parseQueryParams(&data); - - socket->disconnectFromHost(); - q->close(); - emit q->verificationReceived(queryParams); -} - -QMultiMap KQOAuthAuthReplyServerPrivate::parseQueryParams(QByteArray *data) { - QString splitGetLine = QString(*data).split("\r\n").first(); // Retrieve the first line with query params. - splitGetLine.remove("GET "); // Clean the line from GET - splitGetLine.remove("HTTP/1.1"); // From HTTP - splitGetLine.remove("\r\n"); // And from rest. - splitGetLine.prepend("http://localhost"); // Now, make it a URL - - QUrl getTokenUrl(splitGetLine); - QList< QPair > tokens = getTokenUrl.queryItems(); // Ask QUrl to do our work. - - QMultiMap queryParams; - QPair tokenPair; - foreach (tokenPair, tokens) { - queryParams.insert(tokenPair.first.trimmed(), tokenPair.second.trimmed()); - } - - return queryParams; -} - - - -KQOAuthAuthReplyServer::KQOAuthAuthReplyServer(QObject *parent) : - QTcpServer(parent), - d_ptr( new KQOAuthAuthReplyServerPrivate(this) ) -{ - Q_D(KQOAuthAuthReplyServer); - - connect(this, SIGNAL(newConnection()), - d, SLOT(onIncomingConnection())); -} - -KQOAuthAuthReplyServer::~KQOAuthAuthReplyServer() -{ - delete d_ptr; -} - - diff --git a/libkqoauth/kqoauthauthreplyserver.h b/libkqoauth/kqoauthauthreplyserver.h deleted file mode 100644 index 742de2a..0000000 --- a/libkqoauth/kqoauthauthreplyserver.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHAUTHREPLYSERVER_H -#define KQOAUTHAUTHREPLYSERVER_H - -#include - -#include "kqoauthglobals.h" - -class KQOAuthAuthReplyServerPrivate; -class KQOAUTH_EXPORT KQOAuthAuthReplyServer : public QTcpServer -{ - Q_OBJECT -public: - explicit KQOAuthAuthReplyServer(QObject *parent); - ~KQOAuthAuthReplyServer(); - -Q_SIGNALS: - void verificationReceived(QMultiMap); - - -private: - KQOAuthAuthReplyServerPrivate * const d_ptr; - Q_DECLARE_PRIVATE(KQOAuthAuthReplyServer); - Q_DISABLE_COPY(KQOAuthAuthReplyServer); - - -}; - -#endif // KQOAUTHAUTHREPLYSERVER_H diff --git a/libkqoauth/kqoauthauthreplyserver_p.h b/libkqoauth/kqoauthauthreplyserver_p.h deleted file mode 100644 index ab0ca9f..0000000 --- a/libkqoauth/kqoauthauthreplyserver_p.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -// Note this class shouldn't be copied or used and the implementation might change later. -#ifndef KQOAUTHAUTHREPLYSERVER_P_H -#define KQOAUTHAUTHREPLYSERVER_P_H - -#include "kqoauthauthreplyserver.h" -#include -#include - -class KQOAUTH_EXPORT KQOAuthAuthReplyServerPrivate: public QObject -{ - Q_OBJECT -public: - KQOAuthAuthReplyServerPrivate( KQOAuthAuthReplyServer * parent ); - ~KQOAuthAuthReplyServerPrivate(); - QMultiMap parseQueryParams(QByteArray *sdata); - -public Q_SLOTS: - void onIncomingConnection(); - void onBytesReady(); - -public: - KQOAuthAuthReplyServer * q_ptr; - Q_DECLARE_PUBLIC(KQOAuthAuthReplyServer); - QTcpSocket *socket; - -}; - -#endif // KQOAUTHAUTHREPLYSERVER_P_H diff --git a/libkqoauth/kqoauthglobals.h b/libkqoauth/kqoauthglobals.h deleted file mode 100644 index b48eccc..0000000 --- a/libkqoauth/kqoauthglobals.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHGLOBALS_H -#define KQOAUTHGLOBALS_H - -#include - -#if defined(KQOAUTH) -# define KQOAUTH_EXPORT Q_DECL_EXPORT -#else -# define KQOAUTH_EXPORT Q_DECL_IMPORT -#endif - -//////////// Static constant definitions /////////// -const QString OAUTH_KEY_CONSUMER("oauth_consumer"); -const QString OAUTH_KEY_CONSUMER_KEY("oauth_consumer_key"); -const QString OAUTH_KEY_TOKEN("oauth_token"); -const QString OAUTH_KEY_TOKEN_SECRET("oauth_token_secret"); -const QString OAUTH_KEY_SIGNATURE_METHOD("oauth_signature_method"); -const QString OAUTH_KEY_TIMESTAMP("oauth_timestamp"); -const QString OAUTH_KEY_NONCE("oauth_nonce"); -const QString OAUTH_KEY_SIGNATURE("oauth_signature"); -const QString OAUTH_KEY_CALLBACK("oauth_callback"); -const QString OAUTH_KEY_VERIFIER("oauth_verifier"); -const QString OAUTH_KEY_VERSION("oauth_version"); - -#endif // KQOAUTHGLOBALS_H diff --git a/libkqoauth/kqoauthmanager.cpp b/libkqoauth/kqoauthmanager.cpp deleted file mode 100644 index b133ff7..0000000 --- a/libkqoauth/kqoauthmanager.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#include - -#include "kqoauthmanager.h" -#include "kqoauthmanager_p.h" - - -////////////// Private d_ptr implementation //////////////// - -KQOAuthManagerPrivate::KQOAuthManagerPrivate(KQOAuthManager *parent) : - error(KQOAuthManager::NoError) , - r(0) , - opaqueRequest(new KQOAuthRequest) , - q_ptr(parent) , - callbackServer(new KQOAuthAuthReplyServer(parent)) , - isVerified(false) , - isAuthorized(false) , - autoAuth(false), - networkManager(new QNetworkAccessManager), - managerUserSet(false) -{ - -} - -KQOAuthManagerPrivate::~KQOAuthManagerPrivate() { - delete opaqueRequest; - opaqueRequest = 0; - - if (!managerUserSet) { - delete networkManager; - networkManager = 0; - } -} - -QList< QPair > KQOAuthManagerPrivate::createQueryParams(const KQOAuthParameters &requestParams) { - QList requestKeys = requestParams.keys(); - QList requestValues = requestParams.values(); - - QList< QPair > result; - for(int i=0; i KQOAuthManagerPrivate::createTokensFromResponse(QByteArray reply) { - QMultiMap result; - QString replyString(reply); - - QStringList parameterPairs = replyString.split('&', QString::SkipEmptyParts); - foreach (const QString ¶meterPair, parameterPairs) { - QStringList parameter = parameterPair.split('='); - result.insert(parameter.value(0), parameter.value(1)); - } - - return result; -} - -bool KQOAuthManagerPrivate::setSuccessfulRequestToken(const QMultiMap &request) { - if (currentRequestType == KQOAuthRequest::TemporaryCredentials) { - hasTemporaryToken = (!QString(request.value("oauth_token")).isEmpty() && !QString(request.value("oauth_token_secret")).isEmpty()); - } else { - return false; - } - - if (hasTemporaryToken) { - requestToken = QUrl::fromPercentEncoding( QString(request.value("oauth_token")).toLocal8Bit() ); - requestTokenSecret = QUrl::fromPercentEncoding( QString(request.value("oauth_token_secret")).toLocal8Bit() ); - } - - return hasTemporaryToken; -} - -bool KQOAuthManagerPrivate::setSuccessfulAuthorized(const QMultiMap &request ) { - if (currentRequestType == KQOAuthRequest::AccessToken) { - isAuthorized = (!QString(request.value("oauth_token")).isEmpty() && !QString(request.value("oauth_token_secret")).isEmpty()); - } else { - return false; - } - - if (isAuthorized) { - requestToken = QUrl::fromPercentEncoding( QString(request.value("oauth_token")).toLocal8Bit() ); - requestTokenSecret = QUrl::fromPercentEncoding( QString(request.value("oauth_token_secret")).toLocal8Bit() ); - } - - return isAuthorized; -} - -void KQOAuthManagerPrivate::emitTokens() { - Q_Q(KQOAuthManager); - - if (this->requestToken.isEmpty() || this->requestTokenSecret.isEmpty()) { - error = KQOAuthManager::RequestUnauthorized; - } - - if (currentRequestType == KQOAuthRequest::TemporaryCredentials) { - // Signal that we are ready to use the protected resources. - emit q->temporaryTokenReceived(this->requestToken, this->requestTokenSecret); - } - - if (currentRequestType == KQOAuthRequest::AccessToken) { - // Signal that we are ready to use the protected resources. - emit q->accessTokenReceived(this->requestToken, this->requestTokenSecret); - } - - emit q->receivedToken(this->requestToken, this->requestTokenSecret); -} - -bool KQOAuthManagerPrivate::setupCallbackServer() { - return callbackServer->listen(); -} - - -/////////////// Public implementation //////////////// - -KQOAuthManager::KQOAuthManager(QObject *parent) : - QObject(parent) , - d_ptr(new KQOAuthManagerPrivate(this)) -{ - -} - -KQOAuthManager::~KQOAuthManager() -{ - delete d_ptr; -} - -void KQOAuthManager::executeRequest(KQOAuthRequest *request) { - Q_D(KQOAuthManager); - - d->r = request; - - if (request == 0) { - qWarning() << "Request is NULL. Cannot proceed."; - d->error = KQOAuthManager::RequestError; - return; - } - - if (!request->requestEndpoint().isValid()) { - qWarning() << "Request endpoint URL is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; - return; - } - - if (!request->isValid()) { - qWarning() << "Request is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestValidationError; - return; - } - - d->currentRequestType = request->requestType(); - - QNetworkRequest networkRequest; - networkRequest.setUrl( request->requestEndpoint() ); - - if (d->autoAuth && d->currentRequestType == KQOAuthRequest::TemporaryCredentials) { - d->setupCallbackServer(); - connect(d->callbackServer, SIGNAL(verificationReceived(QMultiMap)), - this, SLOT( onVerificationReceived(QMultiMap))); - - QString serverString = "http://localhost:"; - serverString.append(QString::number(d->callbackServer->serverPort())); - request->setCallbackUrl(QUrl(serverString)); - } - - // And now fill the request with "Authorization" header data. - QList requestHeaders = request->requestParameters(); - QByteArray authHeader; - - bool first = true; - foreach (const QByteArray header, requestHeaders) { - if (!first) { - authHeader.append(", "); - } else { - authHeader.append("OAuth "); - first = false; - } - - authHeader.append(header); - } - networkRequest.setRawHeader("Authorization", authHeader); - - connect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onRequestReplyReceived(QNetworkReply *)), Qt::UniqueConnection); - disconnect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onAuthorizedRequestReplyReceived(QNetworkReply *))); - - if (request->httpMethod() == KQOAuthRequest::GET) { - // Get the requested additional params as a list of pairs we can give QUrl - QList< QPair > urlParams = d->createQueryParams(request->additionalParameters()); - - // Take the original URL and append the query params to it. - QUrl urlWithParams = networkRequest.url(); - urlWithParams.setQueryItems(urlParams); - networkRequest.setUrl(urlWithParams); - - // Submit the request including the params. - QNetworkReply *reply = d->networkManager->get(networkRequest); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), - this, SLOT(slotError(QNetworkReply::NetworkError))); - - } else if (request->httpMethod() == KQOAuthRequest::POST) { - - networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, request->contentType()); - - qDebug() << networkRequest.rawHeaderList(); - qDebug() << networkRequest.rawHeader("Authorization"); - qDebug() << networkRequest.rawHeader("Content-Type"); - - QNetworkReply *reply; - if (request->contentType() == "application/x-www-form-urlencoded") { - reply = d->networkManager->post(networkRequest, request->requestBody()); - } else { - reply = d->networkManager->post(networkRequest, request->rawData()); - } - - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), - this, SLOT(slotError(QNetworkReply::NetworkError))); - } - - d->r->requestTimerStart(); -} - -void KQOAuthManager::executeAuthorizedRequest(KQOAuthRequest *request, int id) { - Q_D(KQOAuthManager); - - d->r = request; - - if (request == 0) { - qWarning() << "Request is NULL. Cannot proceed."; - d->error = KQOAuthManager::RequestError; - return; - } - - if (!request->requestEndpoint().isValid()) { - qWarning() << "Request endpoint URL is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; - return; - } - - if (!request->isValid()) { - qWarning() << "Request is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestValidationError; - return; - } - - d->currentRequestType = request->requestType(); - - QNetworkRequest networkRequest; - networkRequest.setUrl( request->requestEndpoint() ); - - if ( d->currentRequestType != KQOAuthRequest::AuthorizedRequest){ - qWarning() << "Not Authorized Request. Cannot proceed"; - d->error = KQOAuthManager::RequestError; - return; - } - - - // And now fill the request with "Authorization" header data. - QList requestHeaders = request->requestParameters(); - QByteArray authHeader; - - bool first = true; - foreach (const QByteArray header, requestHeaders) { - if (!first) { - authHeader.append(", "); - } else { - authHeader.append("OAuth "); - first = false; - } - - authHeader.append(header); - } - networkRequest.setRawHeader("Authorization", authHeader); - - - disconnect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onRequestReplyReceived(QNetworkReply *))); - connect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onAuthorizedRequestReplyReceived(QNetworkReply*)), Qt::UniqueConnection); - - if (request->httpMethod() == KQOAuthRequest::GET) { - // Get the requested additional params as a list of pairs we can give QUrl - QList< QPair > urlParams = d->createQueryParams(request->additionalParameters()); - - // Take the original URL and append the query params to it. - QUrl urlWithParams = networkRequest.url(); - urlWithParams.setQueryItems(urlParams); - networkRequest.setUrl(urlWithParams); - - // Submit the request including the params. - QNetworkReply *reply = d->networkManager->get(networkRequest); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), - this, SLOT(slotError(QNetworkReply::NetworkError))); - - } else if (request->httpMethod() == KQOAuthRequest::POST) { - - networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, request->contentType()); - - /* - qDebug() << networkRequest.rawHeaderList(); - qDebug() << networkRequest.rawHeader("Authorization"); - qDebug() << networkRequest.rawHeader("Content-Type"); - */ - QNetworkReply *reply; - if (request->contentType() == "application/x-www-form-urlencoded") { - reply = d->networkManager->post(networkRequest, request->requestBody()); - } else { - reply = d->networkManager->post(networkRequest, request->rawData()); - } - - d->requestIds.insert(reply, id); - - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), - this, SLOT(slotError(QNetworkReply::NetworkError))); - } - - d->r->requestTimerStart(); -} - - -void KQOAuthManager::setHandleUserAuthorization(bool set) { - Q_D(KQOAuthManager); - - d->autoAuth = set; -} - -bool KQOAuthManager::hasTemporaryToken() { - Q_D(KQOAuthManager); - - return d->hasTemporaryToken; -} - -bool KQOAuthManager::isVerified() { - Q_D(KQOAuthManager); - - return d->isVerified; -} - -bool KQOAuthManager::isAuthorized() { - Q_D(KQOAuthManager); - - return d->isAuthorized; -} - -KQOAuthManager::KQOAuthError KQOAuthManager::lastError() { - Q_D(KQOAuthManager); - - return d->error; -} - -void KQOAuthManager::setNetworkManager(QNetworkAccessManager *manager) { - Q_D(KQOAuthManager); - - if (manager == 0) { - d->error = KQOAuthManager::ManagerError; - return; - } - - if (!d->managerUserSet) { - delete d->networkManager; - } - - d->managerUserSet = true; - d->networkManager = manager; -} - -QNetworkAccessManager * KQOAuthManager::networkManager() const { - Q_D(const KQOAuthManager); - - if (d->managerUserSet) { - return d->networkManager; - } else { - return NULL; - } - -} - - -//////////// Public convenience API ///////////// - -QUrl KQOAuthManager::getUserAuthorization(QUrl authorizationEndpoint) { - Q_D(KQOAuthManager); - - if (!d->hasTemporaryToken) { - qWarning() << "No temporary tokens retreieved. Cannot get user authorization."; - d->error = KQOAuthManager::RequestUnauthorized; - return QString(); - } - - if (!authorizationEndpoint.isValid()) { - qWarning() << "Authorization endpoint not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; - return QString(); - } - - d->error = KQOAuthManager::NoError; - - QPair tokenParam = qMakePair(QString("oauth_token"), QString(d->requestToken)); - QUrl openWebPageUrl(authorizationEndpoint.toString(), QUrl::StrictMode); - openWebPageUrl.addQueryItem(tokenParam.first, tokenParam.second); - - // Return the resource authorization page provided by the service. - qDebug() << "KQOAuthManager::getUserAuthorization " << openWebPageUrl; - return openWebPageUrl; -} - -void KQOAuthManager::getUserAccessTokens(QUrl accessTokenEndpoint) { - Q_D(KQOAuthManager); - - if (!d->isVerified) { - qWarning() << "Not verified. Cannot get access tokens."; - d->error = KQOAuthManager::RequestUnauthorized; - return; - } - - if (!accessTokenEndpoint.isValid()) { - qWarning() << "Endpoint for access token exchange is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; - return; - } - - d->error = KQOAuthManager::NoError; - - d->opaqueRequest->clearRequest(); - d->opaqueRequest->initRequest(KQOAuthRequest::AccessToken, accessTokenEndpoint); - d->opaqueRequest->setToken(d->requestToken); - d->opaqueRequest->setTokenSecret(d->requestTokenSecret); - d->opaqueRequest->setVerifier(d->requestVerifier); - d->opaqueRequest->setConsumerKey(d->consumerKey); - d->opaqueRequest->setConsumerSecretKey(d->consumerKeySecret); - - executeRequest(d->opaqueRequest); -} - -void KQOAuthManager::sendAuthorizedRequest(QUrl requestEndpoint, const KQOAuthParameters &requestParameters) { - Q_D(KQOAuthManager); - - if (!d->isAuthorized) { - qWarning() << "No access tokens retrieved. Cannot send authorized requests."; - d->error = KQOAuthManager::RequestUnauthorized; - return; - } - - if (!requestEndpoint.isValid()) { - qWarning() << "Endpoint for authorized request is not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; - return; - } - - d->error = KQOAuthManager::NoError; - - d->opaqueRequest->clearRequest(); - d->opaqueRequest->initRequest(KQOAuthRequest::AuthorizedRequest, requestEndpoint); - d->opaqueRequest->setAdditionalParameters(requestParameters); - d->opaqueRequest->setToken(d->requestToken); - d->opaqueRequest->setTokenSecret(d->requestTokenSecret); - d->opaqueRequest->setConsumerKey(d->consumerKey); - d->opaqueRequest->setConsumerSecretKey(d->consumerKeySecret); - - executeRequest(d->opaqueRequest); -} - - -/////////////// Private slots ////////////////// - -void KQOAuthManager::onRequestReplyReceived( QNetworkReply *reply ) { - Q_D(KQOAuthManager); - - QNetworkReply::NetworkError networkError = reply->error(); - switch (networkError) { - case QNetworkReply::NoError: - d->error = KQOAuthManager::NoError; - break; - - case QNetworkReply::ContentAccessDenied: - case QNetworkReply::AuthenticationRequiredError: - d->error = KQOAuthManager::RequestUnauthorized; - break; - - default: - d->error = KQOAuthManager::NetworkError; - break; - } - - // Let's disconnect this slot first - /* - disconnect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onRequestReplyReceived(QNetworkReply *))); - */ - - // Read the content of the reply from the network. - QByteArray networkReply = reply->readAll(); - - // Stop any timer we have set on the request. - d->r->requestTimerStop(); - - // Just don't do anything if we didn't get anything useful. - if(networkReply.isEmpty()) { - reply->deleteLater(); - return; - } - QMultiMap responseTokens; - - // We need to emit the signal even if we got an error. - if (d->error != KQOAuthManager::NoError) { - reply->deleteLater(); - emit requestReady(networkReply); - d->emitTokens(); - return; - } - - responseTokens = d->createTokensFromResponse(networkReply); - d->opaqueRequest->clearRequest(); - d->opaqueRequest->setHttpMethod(KQOAuthRequest::POST); // XXX FIXME: Convenient API does not support GET - if (!d->isAuthorized || !d->isVerified) { - if (d->setSuccessfulRequestToken(responseTokens)) { - qDebug() << "Successfully got request tokens."; - d->consumerKey = d->r->consumerKeyForManager(); - d->consumerKeySecret = d->r->consumerKeySecretForManager(); - d->opaqueRequest->setSignatureMethod(KQOAuthRequest::HMAC_SHA1); - d->opaqueRequest->setCallbackUrl(d->r->callbackUrlForManager()); - - d->emitTokens(); - - } else if (d->setSuccessfulAuthorized(responseTokens)) { - qDebug() << "Successfully got access tokens."; - d->opaqueRequest->setSignatureMethod(KQOAuthRequest::HMAC_SHA1); - - d->emitTokens(); - } else if (d->currentRequestType == KQOAuthRequest::AuthorizedRequest) { - emit authorizedRequestDone(); - } - } - - emit requestReady(networkReply); - - reply->deleteLater(); // We need to clean this up, after the event processing is done. -} - -void KQOAuthManager::onAuthorizedRequestReplyReceived( QNetworkReply *reply ) { - Q_D(KQOAuthManager); - - QNetworkReply::NetworkError networkError = reply->error(); - switch (networkError) { - case QNetworkReply::NoError: - d->error = KQOAuthManager::NoError; - break; - - case QNetworkReply::ContentAccessDenied: - case QNetworkReply::AuthenticationRequiredError: - d->error = KQOAuthManager::RequestUnauthorized; - break; - - default: - d->error = KQOAuthManager::NetworkError; - break; - } - - /* - disconnect(d->networkManager, SIGNAL(finished(QNetworkReply *)), - this, SLOT(onAuthorizedRequestReplyReceived(QNetworkReply *))); - */ - - // Read the content of the reply from the network. - QByteArray networkReply = reply->readAll(); - - // Stop any timer we have set on the request. - d->r->requestTimerStop(); - - // Just don't do anything if we didn't get anything useful. - if(networkReply.isEmpty()) { - reply->deleteLater(); - return; - } - - // We need to emit the signal even if we got an error. - if (d->error != KQOAuthManager::NoError) { - qWarning() << "Network reply error"; - return; - } - - - d->opaqueRequest->clearRequest(); - d->opaqueRequest->setHttpMethod(KQOAuthRequest::POST); // XXX FIXME: Convenient API does not support GET - if (d->currentRequestType == KQOAuthRequest::AuthorizedRequest) { - emit authorizedRequestDone(); - } - - int id = d->requestIds.take(reply); - emit authorizedRequestReady(networkReply, id); - reply->deleteLater(); -} - - -void KQOAuthManager::onVerificationReceived(QMultiMap response) { - Q_D(KQOAuthManager); - - QString token = response.value("oauth_token"); - QString verifier = response.value("oauth_verifier"); - if (verifier.isEmpty()) { - d->error = KQOAuthManager::RequestUnauthorized; - } - - verifier = QUrl::fromPercentEncoding(verifier.toUtf8()); // We get the raw URL response here so we need to convert it back - // to plain string so we can percent encode it again later in requests. - - if (d->error == KQOAuthManager::NoError) { - d->requestVerifier = verifier; - d->isVerified = true; - } - - emit authorizationReceived(token, verifier); -} - -void KQOAuthManager::slotError(QNetworkReply::NetworkError error) { - Q_UNUSED(error) - Q_D(KQOAuthManager); - - d->error = KQOAuthManager::NetworkError; - QByteArray emptyResponse; - emit requestReady(emptyResponse); - emit authorizedRequestDone(); - - QNetworkReply *reply = qobject_cast(sender()); - d->requestIds.remove(reply); - reply->deleteLater(); -} - diff --git a/libkqoauth/kqoauthmanager.h b/libkqoauth/kqoauthmanager.h deleted file mode 100644 index 1aaba17..0000000 --- a/libkqoauth/kqoauthmanager.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHMANAGER_H -#define KQOAUTHMANAGER_H - -#include -#include -#include - -#include "kqoauthrequest.h" - -class KQOAuthRequest; -class KQOAuthManagerThread; -class KQOAuthManagerPrivate; -class QNetworkAccessManager; -class QUrl; -class QByteArray; -class KQOAUTH_EXPORT KQOAuthManager : public QObject -{ - Q_OBJECT -public: - - enum KQOAuthError { - NoError, // No error - NetworkError, // Network error: timeout, cannot connect. - RequestEndpointError, // Request endpoint is not valid. - RequestValidationError, // Request is not valid: some parameter missing? - RequestUnauthorized, // Authorization error: trying to access a resource without tokens. - RequestError, // The given request to KQOAuthManager is invalid: NULL?, - ManagerError // Manager error, cannot use for sending requests. - }; - - explicit KQOAuthManager(QObject *parent = 0); - ~KQOAuthManager(); - - KQOAuthError lastError(); - - /** - * The manager executes the given request. It takes the HTTP parameters from the - * request and uses QNetworkAccessManager to submit the HTTP request to the net. - * When the request is done it will emit signal requestReady(QByteArray networkReply). - * NOTE: At the moment there is no timeout for the request. - */ - void executeRequest(KQOAuthRequest *request); - void executeAuthorizedRequest(KQOAuthRequest *request, int id); - /** - * Indicates to the user that KQOAuthManager should handle user authorization by - * opening the user's default browser and parsing the reply from the service. - * By setting the parameter to true, KQOAuthManager will store intermediate results - * of the OAuth 1.0 process in its own opaque request. This information is used in - * the user authorization process and also when calling sendAuthorizedRequest(). - * NOTE: You need to set this to true if you want to use getUserAccessTokens() or - * sendAuthorizedRequest(). - */ - void setHandleUserAuthorization(bool set); - - /** - * Returns true if the KQOAuthManager has retrieved the oauth_token value. Otherwise - * return false. - */ - bool hasTemporaryToken(); - /** - * Returns true if the user has authorized us to use the protected resources. Otherwise - * returns false. - * NOTE: In order for KQOAuthManager to know if the user has authorized us to use the - * protected resources, KQOAuthManager must be in control of the user authorization - * process. Hence, this returns true if setHandleUserAuthorization() is set to true - * and the user is authorized with getUserAuthorization(). - */ - bool isVerified(); - /** - * Returns true if KQOAuthManager has the access token and hence can access the protected - * resources. Otherwise returns false. - * NOTE: In order for KQOAuthManager to know if we have access to protected resource - * KQOAuthManager must be in control of the user authorization process and requesting - * the acess token. Hence, this returns true if setHandleUserAuthorization() is set to true - * and the user is authorized with getUserAuthorization() and the access token must be retrieved - * with getUserAccessTokens. - */ - bool isAuthorized(); - - /** - * This is a convenience API for authorizing the user. - * The call will open the user's default browser, setup a local HTTP server and parse the reply from the - * service after the user has authorized us to access protected resources. If the user authorizes - * us to access protected resources, the verifier token is stored in KQOAuthManager for further use. - * In order to use this method, you must set setHandleUserAuthorization() to true. - */ - QUrl getUserAuthorization(QUrl authorizationEndpoint); - /** - * This is a convenience API for retrieving the access token in exchange for the temporary token and the - * verifier. - * This call will create a KQOAuthRequest and use the previously stored temporary token and verifier to - * exchange for the access token, which will be used to access the protected resources. - * Note that in order to use this method, KQOAuthManager must be in control of the user authorization process. - * Set setHandleUserAuthorization() to true and retrieve user authorization with void getUserAuthorization. - */ - void getUserAccessTokens(QUrl accessTokenEndpoint); - /** - * Sends a request to the protected resources. Parameters for the request are service specific and - * are given to the 'requestParameters' as parameters. - * Note that in order to use this method, KQOAuthManager must be in control of the user authorization process. - * Set setHandleUserAuthorization() to true and retrieve user authorization with void getUserAuthorization. - */ - void sendAuthorizedRequest(QUrl requestEndpoint, const KQOAuthParameters &requestParameters); - - /** - * Sets a custom QNetworkAccessManager to handle network requests. This method can be useful if the - * application is using some proxy settings for example. - * The application is responsible for deleting this manager. KQOAuthManager will not delete any - * previously given manager. - * If the manager is NULL, the manager will not be set and the KQOAuthManager::Error. - * If no manager is given, KQOAuthManager will use the default one it will create by itself. - */ - void setNetworkManager(QNetworkAccessManager *manager); - - /** - * Returns the given QNetworkAccessManager. Returns NULL if none is given. - */ - QNetworkAccessManager* networkManager() const; - -Q_SIGNALS: - // This signal will be emitted after each request has got a reply. - // Parameter is the raw response from the service. - void requestReady(QByteArray networkReply); - - void authorizedRequestReady(QByteArray networkReply, int id); - - // This signal will be emited when we have an request tokens available - // (either temporary resource tokens, or authorization tokens). - void receivedToken(QString oauth_token, QString oauth_token_secret); // oauth_token, oauth_token_secret - - // This signal is emited when temporary tokens are returned from the service. - // Note that this signal is also emited in case temporary tokens are not available. - void temporaryTokenReceived(QString oauth_token, QString oauth_token_secret); // oauth_token, oauth_token_secret - - // This signal is emited when the user has authenticated the application to - // communicate with the protected resources. Next we need to exchange the - // temporary tokens for access tokens. - // Note that this signal is also emited if user denies access. - void authorizationReceived(QString oauth_token, QString oauth_verifier); // oauth_token, oauth_verifier - - // This signal is emited when access tokens are received from the service. We are - // ready to start communicating with the protected resources. - void accessTokenReceived(QString oauth_token, QString oauth_token_secret); // oauth_token, oauth_token_secret - - // This signal is emited when the authorized request is done. - // This ends the kQOAuth interactions. - void authorizedRequestDone(); - -private Q_SLOTS: - void onRequestReplyReceived( QNetworkReply *reply ); - void onAuthorizedRequestReplyReceived( QNetworkReply *reply ); - void onVerificationReceived(QMultiMap response); - void slotError(QNetworkReply::NetworkError error); - -private: - KQOAuthManagerPrivate *d_ptr; - Q_DECLARE_PRIVATE(KQOAuthManager); - Q_DISABLE_COPY(KQOAuthManager); - -}; - -#endif // KQOAUTHMANAGER_H diff --git a/libkqoauth/kqoauthmanager_p.h b/libkqoauth/kqoauthmanager_p.h deleted file mode 100644 index 6b849db..0000000 --- a/libkqoauth/kqoauthmanager_p.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHMANAGER_P_H -#define KQOAUTHMANAGER_P_H - -#include "kqoauthauthreplyserver.h" -#include "kqoauthrequest.h" - -class KQOAUTH_EXPORT KQOAuthManagerPrivate { - -public: - KQOAuthManagerPrivate(KQOAuthManager *parent); - ~KQOAuthManagerPrivate(); - - QList< QPair > createQueryParams(const KQOAuthParameters &requestParams); - QMultiMap createTokensFromResponse(QByteArray reply); - bool setSuccessfulRequestToken(const QMultiMap &request); - bool setSuccessfulAuthorized(const QMultiMap &request); - void emitTokens(); - bool setupCallbackServer(); - - KQOAuthManager::KQOAuthError error; - KQOAuthRequest *r; // This request is used to cache the user sent request. - KQOAuthRequest *opaqueRequest; // This request is used to creating opaque convenience requests for the user. - KQOAuthManager * const q_ptr; - - /** - * The items below are needed in order to store the state of the manager and - * by that be able to do convenience operations for the user. - */ - KQOAuthRequest::RequestType currentRequestType; - - // Variables we store here for opaque request handling. - // NOTE: The variables are labeled the same for both access token request - // and protected resource access. - QString requestToken; - QString requestTokenSecret; - QString consumerKey; - QString consumerKeySecret; - QString requestVerifier; - - KQOAuthAuthReplyServer *callbackServer; - - bool hasTemporaryToken; - bool isVerified; - bool isAuthorized; - bool autoAuth; - QNetworkAccessManager *networkManager; - bool managerUserSet; - QMap requestIds; - - Q_DECLARE_PUBLIC(KQOAuthManager); -}; - -#endif // KQOAUTHMANAGER_P_H diff --git a/libkqoauth/kqoauthrequest.cpp b/libkqoauth/kqoauthrequest.cpp deleted file mode 100644 index 1a7b8ca..0000000 --- a/libkqoauth/kqoauthrequest.cpp +++ /dev/null @@ -1,589 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#include -#include -#include -#include -#include - -#include -#include - -#include "kqoauthrequest.h" -#include "kqoauthrequest_p.h" -#include "kqoauthutils.h" -#include "kqoauthglobals.h" - - -//////////// Private d_ptr implementation ///////// - -KQOAuthRequestPrivate::KQOAuthRequestPrivate() : - timeout(0) -{ - -} - -KQOAuthRequestPrivate::~KQOAuthRequestPrivate() -{ - -} - -// This method will not include the "oauthSignature" paramater, since it is calculated from these parameters. -void KQOAuthRequestPrivate::prepareRequest() { - - // If parameter list is not empty, we don't want to insert these values by - // accident a second time. So giving up. - if( !requestParameters.isEmpty() ) { - return; - } - - switch ( requestType ) { - case KQOAuthRequest::TemporaryCredentials: - requestParameters.append( qMakePair( OAUTH_KEY_CALLBACK, oauthCallbackUrl.toString()) ); // This is so ugly that it is almost beautiful. - requestParameters.append( qMakePair( OAUTH_KEY_SIGNATURE_METHOD, oauthSignatureMethod) ); - requestParameters.append( qMakePair( OAUTH_KEY_CONSUMER_KEY, oauthConsumerKey )); - requestParameters.append( qMakePair( OAUTH_KEY_VERSION, oauthVersion )); - requestParameters.append( qMakePair( OAUTH_KEY_TIMESTAMP, this->oauthTimestamp() )); - requestParameters.append( qMakePair( OAUTH_KEY_NONCE, this->oauthNonce() )); - break; - - case KQOAuthRequest::AccessToken: - requestParameters.append( qMakePair( OAUTH_KEY_SIGNATURE_METHOD, oauthSignatureMethod )); - requestParameters.append( qMakePair( OAUTH_KEY_CONSUMER_KEY, oauthConsumerKey )); - requestParameters.append( qMakePair( OAUTH_KEY_VERSION, oauthVersion )); - requestParameters.append( qMakePair( OAUTH_KEY_TIMESTAMP, this->oauthTimestamp() )); - requestParameters.append( qMakePair( OAUTH_KEY_NONCE, this->oauthNonce() )); - requestParameters.append( qMakePair( OAUTH_KEY_VERIFIER, oauthVerifier )); - requestParameters.append( qMakePair( OAUTH_KEY_TOKEN, oauthToken )); - break; - - case KQOAuthRequest::AuthorizedRequest: - requestParameters.append( qMakePair( OAUTH_KEY_SIGNATURE_METHOD, oauthSignatureMethod )); - requestParameters.append( qMakePair( OAUTH_KEY_CONSUMER_KEY, oauthConsumerKey )); - requestParameters.append( qMakePair( OAUTH_KEY_VERSION, oauthVersion )); - requestParameters.append( qMakePair( OAUTH_KEY_TIMESTAMP, this->oauthTimestamp() )); - requestParameters.append( qMakePair( OAUTH_KEY_NONCE, this->oauthNonce() )); - requestParameters.append( qMakePair( OAUTH_KEY_TOKEN, oauthToken )); - break; - - default: - break; - } -} - -void KQOAuthRequestPrivate::signRequest() { - QString signature = this->oauthSignature(); - requestParameters.append( qMakePair( OAUTH_KEY_SIGNATURE, signature) ); -} - -QString KQOAuthRequestPrivate::oauthSignature() { - /** - * http://oauth.net/core/1.0/#anchor16 - * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] where the - * Signature Base String is the text and the key is the concatenated values (each first encoded per Parameter - * Encoding) of the Consumer Secret and Token Secret, separated by an ‘&’ character (ASCII code 38) even if empty. - **/ - QByteArray baseString = this->requestBaseString(); - - QString secret = QString(QUrl::toPercentEncoding(oauthConsumerSecretKey)) + "&" + QString(QUrl::toPercentEncoding(oauthTokenSecret)); - QString signature = KQOAuthUtils::hmac_sha1(baseString, secret); - - if (debugOutput) { - qDebug() << "========== KQOAuthRequest has the following signature:"; - qDebug() << " * Signature : " << QUrl::toPercentEncoding(signature) << "\n"; - } - return QString( QUrl::toPercentEncoding(signature) ); -} - -bool normalizedParameterSort(const QPair &left, const QPair &right) { - QString keyLeft = left.first; - QString valueLeft = left.second; - QString keyRight = right.first; - QString valueRight = right.second; - - if(keyLeft == keyRight) { - return (valueLeft < valueRight); - } else { - return (keyLeft < keyRight); - } -} -QByteArray KQOAuthRequestPrivate::requestBaseString() { - QByteArray baseString; - - // Every request has these as the commont parameters. - baseString.append( oauthHttpMethodString.toUtf8() + "&"); // HTTP method - baseString.append( QUrl::toPercentEncoding( oauthRequestEndpoint.toString(QUrl::RemoveQuery) ) + "&" ); // The path and query components - - QList< QPair > baseStringParameters; - baseStringParameters.append(requestParameters); - baseStringParameters.append(additionalParameters); - - // Sort the request parameters. These parameters have been - // initialized earlier. - qSort(baseStringParameters.begin(), - baseStringParameters.end(), - normalizedParameterSort - ); - - // Last append the request parameters correctly encoded. - baseString.append( encodedParamaterList(baseStringParameters) ); - - if (debugOutput) { - qDebug() << "========== KQOAuthRequest has the following base string:"; - qDebug() << baseString << "\n"; - } - - return baseString; -} - -QByteArray KQOAuthRequestPrivate::encodedParamaterList(const QList< QPair > ¶meters) { - QByteArray resultList; - - bool first = true; - QPair parameter; - - // Do the debug output. - if (debugOutput) { - qDebug() << "========== KQOAuthRequest has the following parameters:"; - } - foreach (parameter, parameters) { - if(!first) { - resultList.append( "&" ); - } else { - first = false; - } - - // Here we don't need to explicitely encode the strings to UTF-8 since - // QUrl::toPercentEncoding() takes care of that for us. - resultList.append( QUrl::toPercentEncoding(parameter.first) // Parameter key - + "=" - + QUrl::toPercentEncoding(parameter.second) // Parameter value - ); - if (debugOutput) { - qDebug() << " * " - << parameter.first - << " : " - << parameter.second; - } - } - if (debugOutput) { - qDebug() << "\n"; - } - - return QUrl::toPercentEncoding(resultList); -} - -QString KQOAuthRequestPrivate::oauthTimestamp() const { - // This is basically for unit tests only. In most cases we don't set the nonce beforehand. - if (!oauthTimestamp_.isEmpty()) { - return oauthTimestamp_; - } - -#if QT_VERSION >= 0x040700 - return QString::number(QDateTime::currentDateTimeUtc().toTime_t()); -#else - return QString::number(QDateTime::currentDateTime().toUTC().toTime_t()); -#endif - -} - -QString KQOAuthRequestPrivate::oauthNonce() const { - // This is basically for unit tests only. In most cases we don't set the nonce beforehand. - if (!oauthNonce_.isEmpty()) { - return oauthNonce_; - } - - return QString::number(qrand()); -} - -bool KQOAuthRequestPrivate::validateRequest() const { - switch ( requestType ) { - case KQOAuthRequest::TemporaryCredentials: - if (oauthRequestEndpoint.isEmpty() - || oauthConsumerKey.isEmpty() - || oauthNonce_.isEmpty() - || oauthSignatureMethod.isEmpty() - || oauthTimestamp_.isEmpty() - || oauthVersion.isEmpty()) - { - return false; - } - return true; - - case KQOAuthRequest::AccessToken: - if (oauthRequestEndpoint.isEmpty() - || oauthVerifier.isEmpty() - || oauthConsumerKey.isEmpty() - || oauthNonce_.isEmpty() - || oauthSignatureMethod.isEmpty() - || oauthTimestamp_.isEmpty() - || oauthToken.isEmpty() - || oauthTokenSecret.isEmpty() - || oauthVersion.isEmpty()) - { - return false; - } - return true; - - case KQOAuthRequest::AuthorizedRequest: - if (oauthRequestEndpoint.isEmpty() - || oauthConsumerKey.isEmpty() - || oauthNonce_.isEmpty() - || oauthSignatureMethod.isEmpty() - || oauthTimestamp_.isEmpty() - || oauthToken.isEmpty() - || oauthTokenSecret.isEmpty() - || oauthVersion.isEmpty()) - { - return false; - } - return true; - - default: - return false; - } - - // We should not come here. - return false; -} - -//////////// Public implementation //////////////// - -KQOAuthRequest::KQOAuthRequest(QObject *parent) : - QObject(parent), - d_ptr(new KQOAuthRequestPrivate) -{ - d_ptr->debugOutput = false; // No debug output by default. - qsrand(QTime::currentTime().msec()); // We need to seed the nonce random number with something. - // However, we cannot do this while generating the nonce since - // we might get the same seed. So initializing here should be fine. -} - -KQOAuthRequest::~KQOAuthRequest() -{ - delete d_ptr; -} - -void KQOAuthRequest::initRequest(KQOAuthRequest::RequestType type, const QUrl &requestEndpoint) { - Q_D(KQOAuthRequest); - - if (!requestEndpoint.isValid()) { - qWarning() << "Endpoint URL is not valid. Ignoring. This request might not work."; - return; - } - - if (type < 0 || type > KQOAuthRequest::AuthorizedRequest) { - qWarning() << "Invalid request type. Ignoring. This request might not work."; - return; - } - - // Clear the request - clearRequest(); - - // Set smart defaults. - d->requestType = type; - d->oauthRequestEndpoint = requestEndpoint; - d->oauthTimestamp_ = d->oauthTimestamp(); - d->oauthNonce_ = d->oauthNonce(); - this->setSignatureMethod(KQOAuthRequest::HMAC_SHA1); - this->setHttpMethod(KQOAuthRequest::POST); - d->oauthVersion = "1.0"; // Currently supports only version 1.0 - - d->contentType = "application/x-www-form-urlencoded"; -} - -void KQOAuthRequest::setConsumerKey(const QString &consumerKey) { - Q_D(KQOAuthRequest); - d->oauthConsumerKey = consumerKey; -} - -void KQOAuthRequest::setConsumerSecretKey(const QString &consumerSecretKey) { - Q_D(KQOAuthRequest); - d->oauthConsumerSecretKey = consumerSecretKey; -} - -void KQOAuthRequest::setCallbackUrl(const QUrl &callbackUrl) { - Q_D(KQOAuthRequest); - - d->oauthCallbackUrl = callbackUrl; -} - -void KQOAuthRequest::setSignatureMethod(KQOAuthRequest::RequestSignatureMethod requestMethod) { - Q_D(KQOAuthRequest); - QString requestMethodString; - - switch (requestMethod) { - case KQOAuthRequest::PLAINTEXT: - requestMethodString = "PLAINTEXT"; - break; - case KQOAuthRequest::HMAC_SHA1: - requestMethodString = "HMAC-SHA1"; - break; - case KQOAuthRequest::RSA_SHA1: - requestMethodString = "RSA-SHA1"; - break; - default: - // We should not come here - qWarning() << "Invalid signature method set."; - break; - } - - d->oauthSignatureMethod = requestMethodString; -} - -void KQOAuthRequest::setTokenSecret(const QString &tokenSecret) { - Q_D(KQOAuthRequest); - - d->oauthTokenSecret = tokenSecret; -} - -void KQOAuthRequest::setToken(const QString &token) { - Q_D(KQOAuthRequest); - - d->oauthToken = token; -} - -void KQOAuthRequest::setVerifier(const QString &verifier) { - Q_D(KQOAuthRequest); - - d->oauthVerifier = verifier; -} - - -void KQOAuthRequest::setHttpMethod(KQOAuthRequest::RequestHttpMethod httpMethod) { - Q_D(KQOAuthRequest); - - QString requestHttpMethodString; - - switch (httpMethod) { - case KQOAuthRequest::GET: - requestHttpMethodString = "GET"; - break; - case KQOAuthRequest::POST: - requestHttpMethodString = "POST"; - break; - default: - qWarning() << "Invalid HTTP method set."; - break; - } - - d->oauthHttpMethod = httpMethod; - d->oauthHttpMethodString = requestHttpMethodString; -} - -KQOAuthRequest::RequestHttpMethod KQOAuthRequest::httpMethod() const { - Q_D(const KQOAuthRequest); - - return d->oauthHttpMethod; -} - -void KQOAuthRequest::setAdditionalParameters(const KQOAuthParameters &additionalParams) { - Q_D(KQOAuthRequest); - - QList additionalKeys = additionalParams.keys(); - QList additionalValues = additionalParams.values(); - - int i=0; - foreach(QString key, additionalKeys) { - QString value = additionalValues.at(i); - d->additionalParameters.append( qMakePair(key, value) ); - i++; - } -} - -KQOAuthParameters KQOAuthRequest::additionalParameters() const { - Q_D(const KQOAuthRequest); - - QMultiMap additionalParams; - for(int i=0; iadditionalParameters.size(); i++) { - additionalParams.insert(d->additionalParameters.at(i).first, - d->additionalParameters.at(i).second); - } - - return additionalParams; -} - -KQOAuthRequest::RequestType KQOAuthRequest::requestType() const { - Q_D(const KQOAuthRequest); - return d->requestType; -} - -QUrl KQOAuthRequest::requestEndpoint() const { - Q_D(const KQOAuthRequest); - return d->oauthRequestEndpoint; -} - -QList KQOAuthRequest::requestParameters() { - Q_D(KQOAuthRequest); - - QList requestParamList; - - d->prepareRequest(); - if (!isValid() ) { - qWarning() << "Request is not valid! I will still sign it, but it will probably not work."; - } - d->signRequest(); - - QPair requestParam; - QString param; - QString value; - foreach (requestParam, d->requestParameters) { - param = requestParam.first; - value = requestParam.second; - requestParamList.append(QString(param + "=\"" + value +"\"").toUtf8()); - } - - return requestParamList; -} - -QString KQOAuthRequest::contentType() -{ - Q_D(const KQOAuthRequest); - return d->contentType; -} - -void KQOAuthRequest::setContentType(const QString &contentType) -{ - Q_D(KQOAuthRequest); - d->contentType = contentType; -} - -QByteArray KQOAuthRequest::rawData() -{ - Q_D(const KQOAuthRequest); - return d->postRawData; -} - -void KQOAuthRequest::setRawData(const QByteArray &rawData) -{ - Q_D(KQOAuthRequest); - d->postRawData = rawData; -} - -QByteArray KQOAuthRequest::requestBody() const { - Q_D(const KQOAuthRequest); - - QByteArray postBodyContent; - bool first = true; - for(int i=0; i < d->additionalParameters.size(); i++) { - if(!first) { - postBodyContent.append("&"); - } else { - first = false; - } - - QString key = d->additionalParameters.at(i).first; - QString value = d->additionalParameters.at(i).second; - - postBodyContent.append(QUrl::toPercentEncoding(key) + QString("=").toUtf8() + - QUrl::toPercentEncoding(value)); - } - return postBodyContent; -} - -bool KQOAuthRequest::isValid() const { - Q_D(const KQOAuthRequest); - - return d->validateRequest(); -} - -void KQOAuthRequest::setTimeout(int timeoutMilliseconds) { - Q_D(KQOAuthRequest); - d->timeout = timeoutMilliseconds; -} - -void KQOAuthRequest::clearRequest() { - Q_D(KQOAuthRequest); - - d->oauthRequestEndpoint = ""; - d->oauthHttpMethodString = ""; - d->oauthConsumerKey = ""; - d->oauthConsumerSecretKey = ""; - d->oauthToken = ""; - d->oauthTokenSecret = ""; - d->oauthSignatureMethod = ""; - d->oauthCallbackUrl = ""; - d->oauthVerifier = ""; - d->oauthTimestamp_ = ""; - d->oauthNonce_ = ""; - d->requestParameters.clear(); - d->additionalParameters.clear(); - d->timeout = 0; -} - -void KQOAuthRequest::setEnableDebugOutput(bool enabled) { - Q_D(KQOAuthRequest); - d->debugOutput = enabled; -} - -/** - * Protected implementations for inherited classes - */ -bool KQOAuthRequest::validateXAuthRequest() const { - Q_D(const KQOAuthRequest); - - if (d->oauthRequestEndpoint.isEmpty() - || d->oauthConsumerKey.isEmpty() - || d->oauthNonce_.isEmpty() - || d->oauthSignatureMethod.isEmpty() - || d->oauthTimestamp_.isEmpty() - || d->oauthVersion.isEmpty()) - { - return false; - } - return true; -} - - -/** - * Private implementations for friend classes - */ -QString KQOAuthRequest::consumerKeyForManager() const { - Q_D(const KQOAuthRequest); - return d->oauthConsumerKey; -} - -QString KQOAuthRequest::consumerKeySecretForManager() const { - Q_D(const KQOAuthRequest); - return d->oauthConsumerSecretKey; -} - -QUrl KQOAuthRequest::callbackUrlForManager() const { - Q_D(const KQOAuthRequest); - return d->oauthCallbackUrl; -} - -void KQOAuthRequest::requestTimerStart() -{ - Q_D(KQOAuthRequest); - if (d->timeout > 0) { - connect(&(d->timer), SIGNAL(timeout()), this, SIGNAL(requestTimedout())); - d->timer.start(d->timeout); - } -} - -void KQOAuthRequest::requestTimerStop() -{ - Q_D(KQOAuthRequest); - if (d->timeout > 0) { - disconnect(&(d->timer), SIGNAL(timeout()), this, SIGNAL(requestTimedout())); - d->timer.stop(); - } -} diff --git a/libkqoauth/kqoauthrequest.h b/libkqoauth/kqoauthrequest.h deleted file mode 100644 index 687daaf..0000000 --- a/libkqoauth/kqoauthrequest.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHREQUEST_H -#define KQOAUTHREQUEST_H - -#include -#include -#include - -#include "kqoauthglobals.h" - -typedef QMultiMap KQOAuthParameters; - -class KQOAuthRequestPrivate; -class KQOAUTH_EXPORT KQOAuthRequest : public QObject -{ - Q_OBJECT -public: - explicit KQOAuthRequest(QObject *parent = 0); - ~KQOAuthRequest(); - - enum RequestType { - TemporaryCredentials = 0, - AccessToken, - AuthorizedRequest - }; - - enum RequestSignatureMethod { - PLAINTEXT = 0, - HMAC_SHA1, - RSA_SHA1 - }; - - enum RequestHttpMethod { - GET = 0, - POST - }; - - /** - * These methods can be overridden in child classes which are different types of - * OAuth requests. - */ - // Validate the request of this type. - virtual bool isValid() const; - - /** - * These methods are OAuth request type specific and not overridden in child - * classes. - * NOTE: Refactorting still a TODO - */ - // Initialize the request of this type. - void initRequest(KQOAuthRequest::RequestType type, const QUrl &requestEndpoint); - - void setConsumerKey(const QString &consumerKey); - void setConsumerSecretKey(const QString &consumerSecretKey); - - // Mandatory methods for acquiring a request token - void setCallbackUrl(const QUrl &callbackUrl); - - // Mandator methods for acquiring a access token - void setTokenSecret(const QString &tokenSecret); - void setToken(const QString &token); - void setVerifier(const QString &verifier); - - // Request signature method to use - HMAC_SHA1 currently only supported - void setSignatureMethod(KQOAuthRequest::RequestSignatureMethod = KQOAuthRequest::HMAC_SHA1); - - // Request's HTTP method. - void setHttpMethod(KQOAuthRequest::RequestHttpMethod = KQOAuthRequest::POST); - KQOAuthRequest::RequestHttpMethod httpMethod() const; - - // Sets the timeout for this request. If the timeout expires, signal "requestTimedout" will be - // emitted from the manager. - // 0 = If set to zero, timeout is disabled. - // TODO: Do we need some request ID now? - void setTimeout(int timeoutMilliseconds); - - // Additional optional parameters to the request. - void setAdditionalParameters(const KQOAuthParameters &additionalParams); - KQOAuthParameters additionalParameters() const; - QList requestParameters(); // This will return all request's parameters in the raw format given - // to the QNetworkRequest. - QByteArray requestBody() const; // This will return the POST body as given to the QNetworkRequest. - - KQOAuthRequest::RequestType requestType() const; - QUrl requestEndpoint() const; - - void setContentType(const QString &contentType); - QString contentType(); - - void setRawData(const QByteArray &rawData); - QByteArray rawData(); - - void clearRequest(); - - // Enable verbose debug output for request content. - void setEnableDebugOutput(bool enabled); - -Q_SIGNALS: - // This signal is emited if the request is not completed before the request's timeout - // value has expired. - void requestTimedout(); - -protected: - bool validateXAuthRequest() const; - -private: - KQOAuthRequestPrivate * const d_ptr; - Q_DECLARE_PRIVATE(KQOAuthRequest); - Q_DISABLE_COPY(KQOAuthRequest); - - // These classes are only for the internal use of KQOAuthManager so it can - // work with the opaque request. - QString consumerKeyForManager() const; - QString consumerKeySecretForManager() const; - QUrl callbackUrlForManager() const; - - // This method is for timeout handling by the KQOAuthManager. - void requestTimerStart(); - void requestTimerStop(); - - friend class KQOAuthManager; -#ifdef UNIT_TEST - friend class Ut_KQOAuth; -#endif -}; - -#endif // KQOAUTHREQUEST_H diff --git a/libkqoauth/kqoauthrequest_1.cpp b/libkqoauth/kqoauthrequest_1.cpp deleted file mode 100644 index 85449cf..0000000 --- a/libkqoauth/kqoauthrequest_1.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "kqoauthrequest_1.h" - -KQOAuthRequest_1::KQOAuthRequest_1() -{ -} diff --git a/libkqoauth/kqoauthrequest_1.h b/libkqoauth/kqoauthrequest_1.h deleted file mode 100644 index aecf90f..0000000 --- a/libkqoauth/kqoauthrequest_1.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef KQOAUTHREQUEST_1_H -#define KQOAUTHREQUEST_1_H - -#include "kqoauthrequest.h" - -class KQOAUTH_EXPORT KQOAuthRequest_1 : public KQOAuthRequest -{ -public: - KQOAuthRequest_1(); -}; - -#endif // KQOAUTHREQUEST_1_H diff --git a/libkqoauth/kqoauthrequest_p.h b/libkqoauth/kqoauthrequest_p.h deleted file mode 100644 index cfbf82e..0000000 --- a/libkqoauth/kqoauthrequest_p.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHREQUEST_P_H -#define KQOAUTHREQUEST_P_H -#include "kqoauthglobals.h" -#include "kqoauthrequest.h" - -#include -#include -#include -#include -#include -#include - -class KQOAUTH_EXPORT KQOAuthRequestPrivate { - -public: - KQOAuthRequestPrivate(); - ~KQOAuthRequestPrivate(); - - // Helper methods to get the values for the OAuth request parameters. - QString oauthTimestamp() const; - QString oauthNonce() const; - QString oauthSignature(); - - // Utility methods for making the request happen. - void prepareRequest(); - void signRequest(); - bool validateRequest() const; - QByteArray requestBaseString(); - QByteArray encodedParamaterList(const QList< QPair > &requestParameters); - void insertAdditionalParams(); - void insertPostBody(); - - QUrl oauthRequestEndpoint; - KQOAuthRequest::RequestHttpMethod oauthHttpMethod; - QString oauthHttpMethodString; - QString oauthConsumerKey; - QString oauthConsumerSecretKey; - QString oauthToken; - QString oauthTokenSecret; - QString oauthSignatureMethod; - QUrl oauthCallbackUrl; - QString oauthVersion; - QString oauthVerifier; - - // These will be generated by the helper methods - QString oauthTimestamp_; - QString oauthNonce_; - - // User specified additional parameters needed for the request. - QList< QPair > additionalParameters; - - // The raw POST body content as given to the HTTP request. - QByteArray postBodyContent; - - // Protocol parameters. - // These parameters are used in the "Authorized" header of the HTTP request. - QList< QPair > requestParameters; - - KQOAuthRequest::RequestType requestType; - - //The Content-Type HTTP header - QString contentType; - - //Raw data to post if type is not url-encoded - QByteArray postRawData; - - // Timeout for this request in milliseconds. - int timeout; - QTimer timer; - - bool debugOutput; - -}; -#endif // KQOAUTHREQUEST_P_H diff --git a/libkqoauth/kqoauthrequest_xauth.cpp b/libkqoauth/kqoauthrequest_xauth.cpp deleted file mode 100644 index 92aab5f..0000000 --- a/libkqoauth/kqoauthrequest_xauth.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#include - -#include "kqoauthrequest_xauth_p.h" -#include "kqoauthrequest_xauth.h" - -/** - * Private d_ptr implementations. - */ -KQOAuthRequest_XAuthPrivate::KQOAuthRequest_XAuthPrivate() -{ - -} - -KQOAuthRequest_XAuthPrivate::~KQOAuthRequest_XAuthPrivate() -{ -} - -/** - * Public implementations. - */ -KQOAuthRequest_XAuth::KQOAuthRequest_XAuth(QObject *parent) : - KQOAuthRequest(parent), - d_ptr(new KQOAuthRequest_XAuthPrivate) -{ -} - -bool KQOAuthRequest_XAuth::isValid() const { - // An xAuth can never request temporary credentials. - if (requestType() == KQOAuthRequest::TemporaryCredentials) { - qWarning() << "XAuth request cannot be of type KQOAuthRequest::TemporaryCredentials. Aborting."; - return false; - } - - // Access token must always be retrieved using the POST HTTP method. - if (requestType() == KQOAuthRequest::AccessToken - && httpMethod() != KQOAuthRequest::POST) { - - qWarning() << "Access tokens must be fetched using the POST HTTP method. Aborting."; - - return false; - } - - if (!xauth_parameters_set) { - qWarning() << "No XAuth parameters set. Aborting."; - return false; - } - - // And then check the validity of the XAuth request. - // Provided by the base class as a protected method for us. - return validateXAuthRequest(); -} - -void KQOAuthRequest_XAuth::setXAuthLogin(const QString &username, - const QString &password) { - - if (username.isEmpty() || password.isEmpty()) { - qWarning() << "Username or password cannot be empty. Aborting."; - return; - } - - xauth_parameters_set = true; - - KQOAuthParameters xauthParams; - xauthParams.insert("x_auth_username", username); - xauthParams.insert("x_auth_password", password); - xauthParams.insert("x_auth_mode", "client_auth"); - - setAdditionalParameters(xauthParams); -} - diff --git a/libkqoauth/kqoauthrequest_xauth.h b/libkqoauth/kqoauthrequest_xauth.h deleted file mode 100644 index 4b12b70..0000000 --- a/libkqoauth/kqoauthrequest_xauth.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHREQUEST_XAUTH_H -#define KQOAUTHREQUEST_XAUTH_H - -#include "kqoauthrequest.h" -#include "kqoauthrequest_1.h" - -class KQOAuthRequest_XAuthPrivate; -class KQOAUTH_EXPORT KQOAuthRequest_XAuth : public KQOAuthRequest -{ - Q_OBJECT -public: - KQOAuthRequest_XAuth(QObject *parent = 0); - - /** - * These methods can be overridden in child classes which are different types of - * OAuth requests. - */ - // Validate the request of this type. - bool isValid() const; - - // Give the xAuth specific parameters. - void setXAuthLogin(const QString &username = "", - const QString &password = ""); - -private: - KQOAuthRequest_XAuthPrivate * const d_ptr; - bool xauth_parameters_set; -}; - -#endif // KQOAUTHREQUEST_XAUTH_H diff --git a/libkqoauth/kqoauthrequest_xauth_p.h b/libkqoauth/kqoauthrequest_xauth_p.h deleted file mode 100644 index bc3ac4f..0000000 --- a/libkqoauth/kqoauthrequest_xauth_p.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef KQOAUTHREQUEST_XAUTH_P_H -#define KQOAUTHREQUEST_XAUTH_P_H - -#include "kqoauthglobals.h" - -class KQOAuthRequest; -class KQOAUTH_EXPORT KQOAuthRequest_XAuthPrivate -{ -public: - KQOAuthRequest_XAuthPrivate(); - ~KQOAuthRequest_XAuthPrivate(); -}; - -#endif // KQOAUTHREQUEST_XAUTH_P_H diff --git a/libkqoauth/kqoauthutils.cpp b/libkqoauth/kqoauthutils.cpp deleted file mode 100644 index d6518a7..0000000 --- a/libkqoauth/kqoauthutils.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#include -#include -#include - -#include -#include "kqoauthutils.h" - -QString KQOAuthUtils::hmac_sha1(const QString &message, const QString &key) -{ - QByteArray keyBytes = key.toAscii(); - int keyLength; // Lenght of key word - const int blockSize = 64; // Both MD5 and SHA-1 have a block size of 64. - - keyLength = keyBytes.size(); - // If key is longer than block size, we need to hash the key - if (keyLength > blockSize) { - QCryptographicHash hash(QCryptographicHash::Sha1); - hash.addData(keyBytes); - keyBytes = hash.result(); - } - - /* http://tools.ietf.org/html/rfc2104 - (1) */ - // Create the opad and ipad for the hash function. - QByteArray ipad; - QByteArray opad; - - ipad.fill( 0, blockSize); - opad.fill( 0, blockSize); - - ipad.replace(0, keyBytes.length(), keyBytes); - opad.replace(0, keyBytes.length(), keyBytes); - - /* http://tools.ietf.org/html/rfc2104 - (2) & (5) */ - for (int i=0; i<64; i++) { - ipad[i] = ipad[i] ^ 0x36; - opad[i] = opad[i] ^ 0x5c; - } - - QByteArray workArray; - workArray.clear(); - - workArray.append(ipad, 64); - /* http://tools.ietf.org/html/rfc2104 - (3) */ - workArray.append(message.toAscii()); - - - /* http://tools.ietf.org/html/rfc2104 - (4) */ - QByteArray sha1 = QCryptographicHash::hash(workArray, QCryptographicHash::Sha1); - - /* http://tools.ietf.org/html/rfc2104 - (6) */ - workArray.clear(); - workArray.append(opad, 64); - workArray.append(sha1); - - sha1.clear(); - - /* http://tools.ietf.org/html/rfc2104 - (7) */ - sha1 = QCryptographicHash::hash(workArray, QCryptographicHash::Sha1); - return QString(sha1.toBase64()); -} diff --git a/libkqoauth/kqoauthutils.h b/libkqoauth/kqoauthutils.h deleted file mode 100644 index bb9edbb..0000000 --- a/libkqoauth/kqoauthutils.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * KQOAuth - An OAuth authentication library for Qt. - * - * Author: Johan Paul (johan.paul@d-pointer.com) - * http://www.d-pointer.com - * - * KQOAuth is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KQOAuth 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 KQOAuth. If not, see . - */ -#ifndef KQOAUTHUTILS_H -#define KQOAUTHUTILS_H - -#include "kqoauthglobals.h" - -class QString; -class KQOAUTH_EXPORT KQOAuthUtils -{ -public: - - static QString hmac_sha1(const QString &message, const QString &key); -}; - -#endif // KQOAUTHUTILS_H diff --git a/libkqoauth/libkqoauth.pro b/libkqoauth/libkqoauth.pro deleted file mode 100644 index 7a6cef9..0000000 --- a/libkqoauth/libkqoauth.pro +++ /dev/null @@ -1,27 +0,0 @@ -TEMPLATE = lib -CONFIG += staticlib -TARGET = kqoauth - -QT -= gui -QT += network - -HEADERS += kqoauthauthreplyserver.h \ - kqoauthauthreplyserver_p.h \ - kqoauthglobals.h \ - kqoauthmanager.h \ - kqoauthmanager_p.h \ - kqoauthrequest.h \ - kqoauthrequest_1.h \ - kqoauthrequest_p.h \ - kqoauthrequest_xauth.h \ - kqoauthrequest_xauth_p.h \ - kqoauthutils.h -SOURCES += kqoauthauthreplyserver.cpp \ - kqoauthmanager.cpp \ - kqoauthrequest.cpp \ - kqoauthrequest_1.cpp \ - kqoauthrequest_xauth.cpp \ - kqoauthutils.cpp - -target.path = /opt/linfati.com/lib -INSTALLS += target diff --git a/libkqoauth/no_desktopservice.patch b/libkqoauth/no_desktopservice.patch deleted file mode 100644 index 0f78b27..0000000 --- a/libkqoauth/no_desktopservice.patch +++ /dev/null @@ -1,59 +0,0 @@ -diff -up ../../kqoauth/src//kqoauthmanager.cpp ./kqoauthmanager.cpp ---- ../../kqoauth/src//kqoauthmanager.cpp 2011-10-22 22:23:12.391025442 +0200 -+++ ./kqoauthmanager.cpp 2011-10-22 22:44:06.897246201 +0200 -@@ -18,7 +18,6 @@ - * along with KQOAuth. If not, see . - */ - #include --#include - - #include "kqoauthmanager.h" - #include "kqoauthmanager_p.h" -@@ -401,19 +400,19 @@ QNetworkAccessManager * KQOAuthManager:: - - //////////// Public convenience API ///////////// - --void KQOAuthManager::getUserAuthorization(QUrl authorizationEndpoint) { -+QUrl KQOAuthManager::getUserAuthorization(QUrl authorizationEndpoint) { - Q_D(KQOAuthManager); - - if (!d->hasTemporaryToken) { - qWarning() << "No temporary tokens retreieved. Cannot get user authorization."; - d->error = KQOAuthManager::RequestUnauthorized; -- return; -+ return QString(); - } - - if (!authorizationEndpoint.isValid()) { - qWarning() << "Authorization endpoint not valid. Cannot proceed."; - d->error = KQOAuthManager::RequestEndpointError; -- return; -+ return QString(); - } - - d->error = KQOAuthManager::NoError; -@@ -422,9 +421,9 @@ void KQOAuthManager::getUserAuthorizatio - QUrl openWebPageUrl(authorizationEndpoint.toString(), QUrl::StrictMode); - openWebPageUrl.addQueryItem(tokenParam.first, tokenParam.second); - -- // Open the user's default browser to the resource authorization page provided -- // by the service. -- QDesktopServices::openUrl(openWebPageUrl); -+ // Return the resource authorization page provided by the service. -+ qDebug() << "KQOAuthManager::getUserAuthorization " << openWebPageUrl; -+ return openWebPageUrl; - } - - void KQOAuthManager::getUserAccessTokens(QUrl accessTokenEndpoint) { -diff -up ../../kqoauth/src//kqoauthmanager.h ./kqoauthmanager.h ---- ../../kqoauth/src//kqoauthmanager.h 2011-10-22 22:23:12.391025442 +0200 -+++ ./kqoauthmanager.h 2011-10-22 22:39:48.715965943 +0200 -@@ -103,7 +103,7 @@ public: - * us to access protected resources, the verifier token is stored in KQOAuthManager for further use. - * In order to use this method, you must set setHandleUserAuthorization() to true. - */ -- void getUserAuthorization(QUrl authorizationEndpoint); -+ QUrl getUserAuthorization(QUrl authorizationEndpoint); - /** - * This is a convenience API for retrieving the access token in exchange for the temporary token and the - * verifier. diff --git a/liblatitudeupdater/googlelatitude.cpp b/liblatitudeupdater/googlelatitude.cpp deleted file mode 100644 index 6312633..0000000 --- a/liblatitudeupdater/googlelatitude.cpp +++ /dev/null @@ -1,190 +0,0 @@ -#include "googlelatitude.h" -#include - -GoogleLatitude::GoogleLatitude(QObject *parent) : - QObject(parent), - OauthSettings(this), - OAuthGetRequestToken("https://www.google.com/accounts/OAuthGetRequestToken"), - OAuthAuthorizeToken("https://www.google.com/accounts/OAuthAuthorizeToken"), - OAuthGetAccessToken("https://www.google.com/accounts/OAuthGetAccessToken"), - CurrentLocation("https://www.googleapis.com/latitude/v1/currentLocation"), - UserAuthorization(""), - ConsumerKey("1062862865804.apps.googleusercontent.com"), - ConsumerSecretKey("EYQaRaUJ9Fznw8mPMor660Kx"), - CurrentLatitude(0), - CurrentLongitude(0), - CurrentAccuracy(0) { - qDebug() << "* GoogleLatitude::GoogleLatitude"; - OauthRequest = new KQOAuthRequest(this); - OauthManager = new KQOAuthManager(this); - GoogleOauthAdditional.insert("scope", "https://www.googleapis.com/auth/latitude"); - GoogleOauthAdditional.insert("xoauth_displayname", "LatitudeUpdater"); - - connect(OauthManager, SIGNAL(temporaryTokenReceived(QString,QString)), - this, SLOT(onTemporaryTokenReceived(QString, QString))); - - connect(OauthManager, SIGNAL(authorizationReceived(QString,QString)), - this, SLOT(onAuthorizationReceived(QString, QString))); - - connect(OauthManager, SIGNAL(accessTokenReceived(QString,QString)), - this, SLOT(onAccessTokenReceived(QString,QString))); - - connect(OauthManager, SIGNAL(requestReady(QByteArray)), - this, SLOT(onRequestReady(QByteArray))); - - connect(OauthManager, SIGNAL(authorizedRequestDone()), - this, SLOT(onAuthorizedRequestDone())); - - connect(this, SIGNAL(gotToken()), - this, SLOT(getCurrentLocation())); - - connect(this, SIGNAL(notToken()), - this, SLOT(onNotToken())); - - connect(this, SIGNAL(gotToken()), - this, SLOT(onGotToken())); - - connect(this, SIGNAL(needAuth()), - this, SLOT(onNeedAuth())); -} - -GoogleLatitude::~GoogleLatitude() { - qDebug() << "* GoogleLatitude::~GoogleLatitude"; - delete OauthManager; - delete OauthRequest; -} - -void GoogleLatitude::getAccess() { - qDebug() << "* GoogleLatitude::getAccess"; - if ( OauthSettings.value("oauth_token").isNull() || OauthSettings.value("oauth_token_secret").isNull() ) { - OauthRequest->clearRequest(); - OauthRequest->initRequest(KQOAuthRequest::TemporaryCredentials, OAuthGetRequestToken); - OauthRequest->setConsumerKey(ConsumerKey); - OauthRequest->setConsumerSecretKey(ConsumerSecretKey); - OauthRequest->setAdditionalParameters(GoogleOauthAdditional); - OauthManager->setHandleUserAuthorization(true); - OauthRequest->setHttpMethod(KQOAuthRequest::POST); - OauthManager->executeRequest(OauthRequest); - } else { - emit gotToken(); - } -} - -void GoogleLatitude::getCurrentLocation() { - qDebug() << "* GoogleLatitude::getCurrentLocation"; - if ( OauthSettings.value("oauth_token").isNull() || OauthSettings.value("oauth_token_secret").isNull() ) { - emit notToken(); - } else { - OauthRequest->clearRequest(); - OauthRequest->initRequest(KQOAuthRequest::AuthorizedRequest, CurrentLocation); - OauthRequest->setToken(OauthSettings.value("oauth_token").toString()); - OauthRequest->setTokenSecret(OauthSettings.value("oauth_token_secret").toString()); - OauthRequest->setConsumerKey(ConsumerKey); - OauthRequest->setConsumerSecretKey(ConsumerSecretKey); - OauthRequest->setHttpMethod(KQOAuthRequest::GET); - OauthManager->executeRequest(OauthRequest); - } -} - -void GoogleLatitude::sendCurrentLocation() { - qDebug() << "* GoogleLatitude::sendCurrentLocation"; - if (OauthSettings.value("oauth_token").isNull() || OauthSettings.value("oauth_token_secret").isNull()) { - emit notToken(); - } else { - if (abs(CurrentLatitude) <= 0.01) return; - if (abs(CurrentLongitude) <= 0.01) return; - if (abs(CurrentAccuracy) <= 0.01) return; - - QNetworkConfigurationManager mgr; - if (!OauthSettings.value("net_auto").toBool() && !mgr.isOnline()) { - qDebug() << "* GoogleLatitude::sendCurrentLocation" << "offline"; - return; - } - - QByteArray json_location; - json_location = "{\"data\": {\"kind\":\"latitude#location\","; - json_location += QString("\"latitude\":%1,").arg(CurrentLatitude); - json_location += QString("\"longitude\":%1,").arg(CurrentLongitude); - json_location += QString("\"accuracy\":%1").arg(CurrentAccuracy); - json_location += "}}"; - qDebug() << "json_location" << json_location; - - OauthRequest->clearRequest(); - OauthRequest->initRequest(KQOAuthRequest::AuthorizedRequest, CurrentLocation); - OauthRequest->setToken(OauthSettings.value("oauth_token").toString()); - OauthRequest->setTokenSecret(OauthSettings.value("oauth_token_secret").toString()); - OauthRequest->setConsumerKey(ConsumerKey); - OauthRequest->setConsumerSecretKey(ConsumerSecretKey); - OauthRequest->setHttpMethod(KQOAuthRequest::POST); - OauthRequest->setContentType("application/json"); - OauthRequest->setRawData(json_location); - OauthManager->executeRequest(OauthRequest); - } -} - -void GoogleLatitude::setCurrentLocation(double lat, double lon, double acc) { - qDebug() << "* GoogleLatitude::setCurrentLocation" << lat << lon << acc; - CurrentLatitude = lat; - CurrentLongitude = lon; - CurrentAccuracy = acc; -} - -QUrl GoogleLatitude::getUserAuthorization() { - qDebug() << "* GoogleLatitude::getUserAuthorization"; - return UserAuthorization; -} - -void GoogleLatitude::setAutoConnect(bool status) { - qDebug() << "* GoogleLatitude::setAutoConnect" << status; - OauthSettings.setValue("net_auto", status); -} - -bool GoogleLatitude::getAutoConnect() { - qDebug() << "* GoogleLatitude::getAutoConnect"; - return OauthSettings.value("net_auto", true).toBool(); -} - -void GoogleLatitude::setDaemonMode(bool status) { - qDebug() << "* GoogleLatitude::setDaemonMode" << status; - OauthSettings.setValue("daemon", status); -} - -bool GoogleLatitude::getDaemonMode() { - qDebug() << "* GoogleLatitude::getDaemonMode"; - return OauthSettings.value("daemon", true).toBool(); -} - -void GoogleLatitude::onTemporaryTokenReceived(QString temporaryToken, QString temporaryTokenSecret) { - qDebug() << "* GoogleLatitude::onTemporaryTokenReceived" << temporaryToken << temporaryTokenSecret; - if( OauthManager->lastError() == KQOAuthManager::NoError) { - UserAuthorization = OauthManager->getUserAuthorization(OAuthAuthorizeToken); - qDebug() << "* GoogleLatitude::onTemporaryTokenReceived" << "UserAuthorization" << UserAuthorization; - emit needAuth(); - } -} - -void GoogleLatitude::onAuthorizationReceived(QString token, QString verifier) { - qDebug() << "* GoogleLatitude::onAuthorizationReceived" << token << verifier; - OauthManager->getUserAccessTokens(OAuthGetAccessToken); - if(OauthManager->lastError() != KQOAuthManager::NoError) { - emit notToken(); - } -} - -void GoogleLatitude::onAccessTokenReceived(QString token, QString tokenSecret) { - qDebug() << "* GoogleLatitude::onAccessTokenReceived" << token << tokenSecret; - OauthSettings.setValue("oauth_token", token); - OauthSettings.setValue("oauth_token_secret", tokenSecret); - emit gotToken(); -} - -void GoogleLatitude::onRequestReady(QByteArray response) { - qDebug() << "* GoogleLatitude::onRequestReady" << response; - if (response.contains("Invalid Credentials") ) { - qDebug() << "* GoogleLatitude::onRequestReady" << "Invalid Credentials"; - OauthSettings.remove("oauth_token"); - OauthSettings.remove("oauth_token_secret"); - UserAuthorization.clear(); - emit notToken(); - } -} diff --git a/liblatitudeupdater/googlelatitude.h b/liblatitudeupdater/googlelatitude.h deleted file mode 100644 index 6b02e9a..0000000 --- a/liblatitudeupdater/googlelatitude.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef GOOGLELATITUDE_H -#define GOOGLELATITUDE_H - -#include -#include -#include -#include - -class GoogleLatitude : public QObject { - Q_OBJECT - -public: - GoogleLatitude(QObject *parent = 0); - ~GoogleLatitude(); - -public slots: - void getAccess(); - void getCurrentLocation(); - void sendCurrentLocation(); - void setCurrentLocation(double la, double lo, double ac); - QUrl getUserAuthorization(); - void setAutoConnect(bool status); - bool getAutoConnect(); - void setDaemonMode(bool status); - bool getDaemonMode(); - -private slots: - void onTemporaryTokenReceived(QString temporaryToken, QString temporaryTokenSecret); - void onAuthorizationReceived(QString token, QString verifier); - void onAccessTokenReceived(QString token, QString tokenSecret); - void onRequestReady(QByteArray response); - void onAuthorizedRequestDone() { qDebug() << "* GoogleLatitude::onAuthorizedRequestDone"; } - void onNotToken() { qDebug() << "* GoogleLatitude::onNotToken"; } - void onGotToken() { qDebug() << "* GoogleLatitude::onGotToken"; } - void onNeedAuth() { qDebug() << "* GoogleLatitude::onNeedAuth"; } - -signals: - void notToken(); - void gotToken(); - void needAuth(); - -private: - QSettings OauthSettings; - QUrl OAuthGetRequestToken; - QUrl OAuthAuthorizeToken; - QUrl OAuthGetAccessToken; - QUrl CurrentLocation; - QUrl UserAuthorization; - KQOAuthParameters GoogleOauthAdditional; - QString ConsumerKey; - QString ConsumerSecretKey; - double CurrentLatitude; - double CurrentLongitude; - double CurrentAccuracy; - KQOAuthManager *OauthManager; - KQOAuthRequest *OauthRequest; -}; - -#endif // GOOGLELATITUDE_H diff --git a/liblatitudeupdater/gpscontrol.cpp b/liblatitudeupdater/gpscontrol.cpp deleted file mode 100644 index 7b9addd..0000000 --- a/liblatitudeupdater/gpscontrol.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "gpscontrol.h" -#include - -GpsControl::GpsControl(QObject *parent) : - QObject(parent), - GpsSettings(this), - GpsSource(QGeoPositionInfoSource::createDefaultSource(this)), - GpsPosition(), - GpsTimeout(this), - GpsInterval(this) { - qDebug() << "* GpsControl::GpsControl"; - - GpsTimeout.setSingleShot(true); - GpsInterval.setSingleShot(true); - - setPositioningMethod(GpsSettings.value("gps_method", "all").toString()); - setTimeOut(GpsSettings.value("gps_timeout", 60).toInt()); - setInterval(GpsSettings.value("gps_interval", 15*60).toInt()); - - if (!GpsSource) qDebug() << "* GpsControl::GpsControl" << "Not GpsSource"; - - if (GpsSource) connect(GpsSource, SIGNAL(positionUpdated(QGeoPositionInfo)), - this, SLOT(setCurrentLocation(QGeoPositionInfo))); - - connect(this, SIGNAL(gotUpdate()), - this, SLOT(onGotUpdate())); - - connect(this, SIGNAL(gotFix()), - this, SLOT(onGotFix())); - -} - -void GpsControl::setTimeOut(int sec) { - qDebug() << "* GpsControl::setTimeOut" << sec; - GpsSettings.setValue("gps_timeout", sec); -} - -int GpsControl::getTimeOut() { - qDebug() << "* GpsControl::getTimeOut"; - return GpsSettings.value("gps_timeout").toInt(); -} - -void GpsControl::setInterval(int sec) { - qDebug() << "* GpsControl::setInterval" << sec; - GpsSettings.setValue("gps_interval", sec); -} - -int GpsControl::getInterval() { - qDebug() << "* GpsControl::getInterval"; - return GpsSettings.value("gps_interval").toInt(); -} - -void GpsControl::setPositioningMethod(QString method) { - qDebug() << "* GpsControl::setPositioningMethod" << method; - if (method == "gps") { - GpsSettings.setValue("gps_method", method); - if (GpsSource) GpsSource->setPreferredPositioningMethods( - QGeoPositionInfoSource::SatellitePositioningMethods); - } - if (method == "cell") { - GpsSettings.setValue("gps_method", method); - if (GpsSource) GpsSource->setPreferredPositioningMethods( - QGeoPositionInfoSource::NonSatellitePositioningMethods); - } - if (method == "all") { - GpsSettings.setValue("gps_method", method); - if (GpsSource) GpsSource->setPreferredPositioningMethods( - QGeoPositionInfoSource::AllPositioningMethods); - } -} - -void GpsControl::startUpdates() { - qDebug() << "* GpsControl::startUpdates"; - - GpsTimeout.singleShot(GpsSettings.value("gps_timeout").toInt()*1000, - this, SLOT(stopUpdates())); - GpsInterval.singleShot(GpsSettings.value("gps_interval").toInt()*1000, - this, SLOT(startUpdates())); - - QNetworkConfigurationManager mgr; - if (!GpsSettings.value("net_auto").toBool() && !mgr.isOnline()) { - qDebug() << "* GpsControl::startUpdates" << "offline"; - return; - } - - if (GpsSource) GpsSource->startUpdates(); -} - -void GpsControl::stopUpdates(bool force) { - qDebug() << "* GpsControl::stopUpdates" << force; - - if (GpsSource) GpsSource->stopUpdates(); - - if (force) { - GpsTimeout.stop(); - GpsInterval.stop(); - } else { - if (GpsSource && GpsSource->lastKnownPosition(GpsSettings.value("gps_method") - == "gps" ? true : false).isValid() ) { - emit gotFix(); - } - } -} - -double GpsControl::getCurrentLatitude() { - qDebug() << "* GpsControl::getCurrentLatitude"; - return GpsPosition.coordinate().latitude(); -} - -double GpsControl::getCurrentLongitude() { - qDebug() << "* GpsControl::getCurrentLongitude"; - return GpsPosition.coordinate().longitude(); -} - -double GpsControl::getCurrentAccuracy() { - qDebug() << "* GpsControl::getCurrentAccuracy"; - return GpsPosition.attribute(QGeoPositionInfo::HorizontalAccuracy); -} - -unsigned int GpsControl::getCurrentTimestamp() { - qDebug() << "* GpsControl::getCurrentTimestamp"; - return GpsPosition.timestamp().toTime_t(); -} - -void GpsControl::setCurrentLocation(QGeoPositionInfo pos) { - qDebug() << "* GpsControl::setCurrentLocation" << pos; - if (pos.isValid()) { - GpsPosition = pos; - emit gotUpdate(); - } -} diff --git a/liblatitudeupdater/gpscontrol.h b/liblatitudeupdater/gpscontrol.h deleted file mode 100644 index 7a7f6f5..0000000 --- a/liblatitudeupdater/gpscontrol.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef GPSCONTROL_H -#define GPSCONTROL_H - -#include -#include -#include -#include -#include -#include - -using namespace QtMobility; - -class GpsControl : public QObject { - Q_OBJECT -public: - GpsControl(QObject *parent = 0); - -signals: - void gotUpdate(); - void gotFix(); - -public slots: - void setTimeOut(int sec); - int getTimeOut(); - void setInterval(int sec); - int getInterval(); - void setPositioningMethod(QString method); - QString getPositioningMethod() {return GpsSettings.value("gps_method").toString();} - void startUpdates(); - void stopUpdates(bool force = false); - double getCurrentLatitude(); - double getCurrentLongitude(); - double getCurrentAccuracy(); - unsigned int getCurrentTimestamp(); - -private slots: - void setCurrentLocation(QGeoPositionInfo pos); - void onGotUpdate() { qDebug() << "* GpsControl::ongotUpdate"; } - void onGotFix() { qDebug() << "* GpsControl::ongotFix"; } - -private: - QSettings GpsSettings; - QGeoPositionInfoSource *GpsSource; - QGeoPositionInfo GpsPosition; - QTimer GpsTimeout; - QTimer GpsInterval; -}; - -#endif // GPSCONTROL_H diff --git a/liblatitudeupdater/liblatitudeupdater.pro b/liblatitudeupdater/liblatitudeupdater.pro deleted file mode 100644 index 0d097c8..0000000 --- a/liblatitudeupdater/liblatitudeupdater.pro +++ /dev/null @@ -1,12 +0,0 @@ -TEMPLATE = lib -CONFIG += staticlib -TARGET = latitudeupdater - -QT += network -CONFIG += mobility -MOBILITY += location - -INCLUDEPATH += ../libkqoauth - -HEADERS += googlelatitude.h gpscontrol.h -SOURCES += googlelatitude.cpp gpscontrol.cpp diff --git a/liblocationmaemo5/gconfitem.cpp b/liblocationmaemo5/gconfitem.cpp deleted file mode 100644 index 508d766..0000000 --- a/liblocationmaemo5/gconfitem.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include - -#include "gconfitem_p.h" - -#include -#include -#include - -struct GConfItemPrivate { - QString key; - QVariant value; - guint notify_id; - - static void notify_trampoline(GConfClient*, guint, GConfEntry *, gpointer); -}; - -#define withClient(c) for(GConfClient *c = (g_type_init(), gconf_client_get_default()); c; g_object_unref(c), c=NULL) - -static QByteArray convertKey(QString key) -{ - if (key.startsWith('/')) - return key.toUtf8(); - else { - qWarning() << "Using dot-separated key names with GConfItem is deprecated."; - qWarning() << "Please use" << '/' + key.replace('.', '/') << "instead of" << key; - return '/' + key.replace('.', '/').toUtf8(); - } -} - -static QString convertKey(const char *key) -{ - return QString::fromUtf8(key); -} - -static QVariant convertValue(GConfValue *src) -{ - if (!src) { - return QVariant(); - } else { - switch (src->type) { - case GCONF_VALUE_INVALID: - return QVariant(QVariant::Invalid); - case GCONF_VALUE_BOOL: - return QVariant((bool)gconf_value_get_bool(src)); - case GCONF_VALUE_INT: - return QVariant(gconf_value_get_int(src)); - case GCONF_VALUE_FLOAT: - return QVariant(gconf_value_get_float(src)); - case GCONF_VALUE_STRING: - return QVariant(QString::fromUtf8(gconf_value_get_string(src))); - case GCONF_VALUE_LIST: - switch (gconf_value_get_list_type(src)) { - case GCONF_VALUE_STRING: { - QStringList result; - for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next) - result.append(QString::fromUtf8(gconf_value_get_string((GConfValue *)elts->data))); - return QVariant(result); - } - default: { - QList result; - for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next) - result.append(convertValue((GConfValue *)elts->data)); - return QVariant(result); - } - } - case GCONF_VALUE_SCHEMA: - default: - return QVariant(); - } - } -} - -static GConfValue *convertString(const QString &str) -{ - GConfValue *v = gconf_value_new(GCONF_VALUE_STRING); - gconf_value_set_string(v, str.toUtf8().data()); - return v; -} - -static GConfValueType primitiveType(const QVariant &elt) -{ - switch (elt.type()) { - case QVariant::String: - return GCONF_VALUE_STRING; - case QVariant::Int: - return GCONF_VALUE_INT; - case QVariant::Double: - return GCONF_VALUE_FLOAT; - case QVariant::Bool: - return GCONF_VALUE_BOOL; - default: - return GCONF_VALUE_INVALID; - } -} - -static GConfValueType uniformType(const QList &list) -{ - GConfValueType result = GCONF_VALUE_INVALID; - - foreach(const QVariant &elt, list) { - GConfValueType elt_type = primitiveType(elt); - - if (elt_type == GCONF_VALUE_INVALID) - return GCONF_VALUE_INVALID; - - if (result == GCONF_VALUE_INVALID) - result = elt_type; - else if (result != elt_type) - return GCONF_VALUE_INVALID; - } - - if (result == GCONF_VALUE_INVALID) - return GCONF_VALUE_STRING; // empty list. - else - return result; -} - -static int convertValue(const QVariant &src, GConfValue **valp) -{ - GConfValue *v; - - switch (src.type()) { - case QVariant::Invalid: - v = NULL; - break; - case QVariant::Bool: - v = gconf_value_new(GCONF_VALUE_BOOL); - gconf_value_set_bool(v, src.toBool()); - break; - case QVariant::Int: - v = gconf_value_new(GCONF_VALUE_INT); - gconf_value_set_int(v, src.toInt()); - break; - case QVariant::Double: - v = gconf_value_new(GCONF_VALUE_FLOAT); - gconf_value_set_float(v, src.toDouble()); - break; - case QVariant::String: - v = convertString(src.toString()); - break; - case QVariant::StringList: { - GSList *elts = NULL; - v = gconf_value_new(GCONF_VALUE_LIST); - gconf_value_set_list_type(v, GCONF_VALUE_STRING); - foreach(const QString &str, src.toStringList()) - elts = g_slist_prepend(elts, convertString(str)); - gconf_value_set_list_nocopy(v, g_slist_reverse(elts)); - break; - } - case QVariant::List: { - GConfValueType elt_type = uniformType(src.toList()); - if (elt_type == GCONF_VALUE_INVALID) - v = NULL; - else { - GSList *elts = NULL; - v = gconf_value_new(GCONF_VALUE_LIST); - gconf_value_set_list_type(v, elt_type); - foreach(const QVariant &elt, src.toList()) { - GConfValue *val = NULL; - convertValue(elt, &val); // guaranteed to succeed. - elts = g_slist_prepend(elts, val); - } - gconf_value_set_list_nocopy(v, g_slist_reverse(elts)); - } - break; - } - default: - return 0; - } - - *valp = v; - return 1; -} - -void GConfItemPrivate::notify_trampoline(GConfClient*, - guint, - GConfEntry *, - gpointer data) -{ - GConfItem *item = (GConfItem *)data; - item->update_value(true); -} - -void GConfItem::update_value(bool emit_signal) -{ - QVariant new_value; - - withClient(client) { - GError *error = NULL; - QByteArray k = convertKey(priv->key); - GConfValue *v = gconf_client_get(client, k.data(), &error); - - if (error) { - qWarning() << error->message; - g_error_free(error); - new_value = priv->value; - } else { - new_value = convertValue(v); - if (v) - gconf_value_free(v); - } - } - - if (new_value != priv->value) { - priv->value = new_value; - if (emit_signal) - emit valueChanged(); - } -} - -QString GConfItem::key() const -{ - return priv->key; -} - -QVariant GConfItem::value() const -{ - return priv->value; -} - -QVariant GConfItem::value(const QVariant &def) const -{ - if (priv->value.isNull()) - return def; - else - return priv->value; -} - -void GConfItem::set(const QVariant &val) -{ - withClient(client) { - QByteArray k = convertKey(priv->key); - GConfValue *v; - if (convertValue(val, &v)) { - GError *error = NULL; - - if (v) { - gconf_client_set(client, k.data(), v, &error); - gconf_value_free(v); - } else { - gconf_client_unset(client, k.data(), &error); - } - - if (error) { - qWarning() << error->message; - g_error_free(error); - } else if (priv->value != val) { - priv->value = val; - emit valueChanged(); - } - - } else - qWarning() << "Can't store a" << val.typeName(); - } -} - -void GConfItem::unset() -{ - set(QVariant()); -} - -QList GConfItem::listDirs() const -{ - QList children; - - withClient(client) { - QByteArray k = convertKey(priv->key); - GSList *dirs = gconf_client_all_dirs(client, k.data(), NULL); - for (GSList *d = dirs; d; d = d->next) { - children.append(convertKey((char *)d->data)); - g_free(d->data); - } - g_slist_free(dirs); - } - - return children; -} - -QList GConfItem::listEntries() const -{ - QList children; - - withClient(client) { - QByteArray k = convertKey(priv->key); - GSList *entries = gconf_client_all_entries(client, k.data(), NULL); - for (GSList *e = entries; e; e = e->next) { - children.append(convertKey(((GConfEntry *)e->data)->key)); - gconf_entry_free((GConfEntry *)e->data); - } - g_slist_free(entries); - } - - return children; -} - -GConfItem::GConfItem(const QString &key, QObject *parent) - : QObject(parent) -{ - priv = new GConfItemPrivate; - priv->key = key; - withClient(client) { - update_value(false); - QByteArray k = convertKey(priv->key); - gconf_client_add_dir(client, k.data(), GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - priv->notify_id = gconf_client_notify_add(client, k.data(), - GConfItemPrivate::notify_trampoline, this, - NULL, NULL); - } -} - -GConfItem::~GConfItem() -{ - withClient(client) { - QByteArray k = convertKey(priv->key); - gconf_client_notify_remove(client, priv->notify_id); - gconf_client_remove_dir(client, k.data(), NULL); - } - delete priv; -} diff --git a/liblocationmaemo5/gconfitem_p.h b/liblocationmaemo5/gconfitem_p.h deleted file mode 100644 index ba4c8d6..0000000 --- a/liblocationmaemo5/gconfitem_p.h +++ /dev/null @@ -1,166 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef GCONFITEM_H -#define GCONFITEM_H - -#include -#include -#include - -/*! - - \brief GConfItem is a simple C++ wrapper for GConf. - - Creating a GConfItem instance gives you access to a single GConf - key. You can get and set its value, and connect to its - valueChanged() signal to be notified about changes. - - The value of a GConf key is returned to you as a QVariant, and you - pass in a QVariant when setting the value. GConfItem converts - between a QVariant and GConf values as needed, and according to the - following rules: - - - A QVariant of type QVariant::Invalid denotes an unset GConf key. - - - QVariant::Int, QVariant::Double, QVariant::Bool are converted to - and from the obvious equivalents. - - - QVariant::String is converted to/from a GConf string and always - uses the UTF-8 encoding. No other encoding is supported. - - - QVariant::StringList is converted to a list of UTF-8 strings. - - - QVariant::List (which denotes a QList) is converted - to/from a GConf list. All elements of such a list must have the - same type, and that type must be one of QVariant::Int, - QVariant::Double, QVariant::Bool, or QVariant::String. (A list of - strings is returned as a QVariant::StringList, however, when you - get it back.) - - - Any other QVariant or GConf value is essentially ignored. - - \warning GConfItem is as thread-safe as GConf. - -*/ - -class GConfItem : public QObject -{ - Q_OBJECT - -public: - /*! Initializes a GConfItem to access the GConf key denoted by - \a key. Key names should follow the normal GConf conventions - like "/myapp/settings/first". - - \param key The name of the key. - \param parent Parent object - */ - explicit GConfItem(const QString &key, QObject *parent = 0); - - /*! Finalizes a GConfItem. - */ - virtual ~GConfItem(); - - /*! Returns the key of this item, as given to the constructor. - */ - QString key() const; - - /*! Returns the current value of this item, as a QVariant. - */ - QVariant value() const; - - /*! Returns the current value of this item, as a QVariant. If - * there is no value for this item, return \a def instead. - */ - QVariant value(const QVariant &def) const; - - /*! Set the value of this item to \a val. If \a val can not be - represented in GConf or GConf refuses to accept it for other - reasons, the current value is not changed and nothing happens. - - When the new value is different from the old value, the - changedValue() signal is emitted on this GConfItem as part - of calling set(), but other GConfItem:s for the same key do - only receive a notification once the main loop runs. - - \param val The new value. - */ - void set(const QVariant &val); - - /*! Unset this item. This is equivalent to - - \code - item.set(QVariant(QVariant::Invalid)); - \endcode - */ - void unset(); - - /*! Return a list of the directories below this item. The - returned strings are absolute key names like - "/myapp/settings". - - A directory is a key that has children. The same key might - also have a value, but that is confusing and best avoided. - */ - QList listDirs() const; - - /*! Return a list of entries below this item. The returned - strings are absolute key names like "/myapp/settings/first". - - A entry is a key that has a value. The same key might also - have children, but that is confusing and is best avoided. - */ - QList listEntries() const; - -signals: - /*! Emitted when the value of this item has changed. - */ - void valueChanged(); - -private: - friend struct GConfItemPrivate; - struct GConfItemPrivate *priv; - - void update_value(bool emit_signal); -}; - -#endif // GCONFITEM_H diff --git a/liblocationmaemo5/liblocationmaemo5.pro b/liblocationmaemo5/liblocationmaemo5.pro deleted file mode 100644 index 8a7b82b..0000000 --- a/liblocationmaemo5/liblocationmaemo5.pro +++ /dev/null @@ -1,21 +0,0 @@ -TEMPLATE = lib -CONFIG += staticlib -TARGET = locationmaemo5 - -CONFIG += mobility -MOBILITY += location - -contains(QT_CONFIG, maemo5): { -QT += maemo5 -CONFIG += link_pkgconfig -PKGCONFIG += glib-2.0 liblocation - -HEADERS += gconfitem_p.h \ - liblocationwrapper_p.h \ - qgeopositioninfosource_maemo5_p.h \ - qgeosatelliteinfosource_maemo5_p.h -SOURCES += gconfitem.cpp \ - liblocationwrapper.cpp \ - qgeopositioninfosource_maemo5.cpp \ - qgeosatelliteinfosource_maemo5.cpp -} diff --git a/liblocationmaemo5/liblocationwrapper.cpp b/liblocationmaemo5/liblocationwrapper.cpp deleted file mode 100644 index 9d31299..0000000 --- a/liblocationmaemo5/liblocationwrapper.cpp +++ /dev/null @@ -1,379 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "liblocationwrapper_p.h" - -#include - -using namespace std; - -QTM_BEGIN_NAMESPACE - -Q_GLOBAL_STATIC(LiblocationWrapper, LocationEngine) - -LiblocationWrapper *LiblocationWrapper::instance() -{ - return LocationEngine(); -} - -LiblocationWrapper::LiblocationWrapper() - : file(NULL), - locationControl(NULL), - locationDevice(NULL), - errorHandlerId(0), - posChangedId(0), - origUpdateInterval(0), - startcounter(0), - validLastUpdate(false), - validLastSatUpdate(false), - locationState(LiblocationWrapper::Undefined) { - qDebug() << "* LiblocationWrapper Fremantle Backport"; -} - -LiblocationWrapper::~LiblocationWrapper() -{ - if (locationDevice) - g_object_unref(locationDevice); - if (locationControl) - g_object_unref(locationControl); -} - -bool LiblocationWrapper::inited() -{ - int retval = false; - if (!(locationState & LiblocationWrapper::Inited)) { - g_type_init(); - - locationControl = location_gpsd_control_get_default(); - - if (locationControl) { - g_object_set(G_OBJECT(locationControl), - "preferred-method", LOCATION_METHOD_USER_SELECTED, - "preferred-interval", LOCATION_INTERVAL_1S, - NULL); - locationDevice = - (LocationGPSDevice*)g_object_new(LOCATION_TYPE_GPS_DEVICE, - NULL); - - if (locationDevice) { - errorHandlerId = - g_signal_connect(G_OBJECT(locationControl), "error-verbose", - G_CALLBACK(&locationError), - static_cast(this)); - posChangedId = - g_signal_connect(G_OBJECT(locationDevice), "changed", - G_CALLBACK(&locationChanged), - static_cast(this)); - locationState = LiblocationWrapper::Inited; - retval = true; - startcounter = 0; - } - } - } else { - retval = true; - } - return retval; -} - -void LiblocationWrapper::locationError(LocationGPSDevice *device, - gint errorCode, gpointer data) -{ - Q_UNUSED(device); - QString locationError; - - switch (errorCode) { - case LOCATION_ERROR_USER_REJECTED_DIALOG: - locationError = "User didn't enable requested methods"; - break; - case LOCATION_ERROR_USER_REJECTED_SETTINGS: - locationError = "User changed settings, which disabled location."; - break; - case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE: - locationError = "Problems with BT GPS"; - break; - case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE: - locationError = "Requested method is not allowed in offline mode"; - break; - case LOCATION_ERROR_SYSTEM: - locationError = "System error."; - break; - default: - locationError = "Unknown error."; - } - - qDebug() << "Location error:" << locationError; - - LiblocationWrapper *object; - object = (LiblocationWrapper *)data; - emit object->error(); -} - -void LiblocationWrapper::locationChanged(LocationGPSDevice *device, - gpointer data) -{ - QGeoPositionInfo posInfo; - QGeoCoordinate coordinate; - QGeoSatelliteInfo satInfo; - int satellitesInUseCount = 0; - LiblocationWrapper *object; - - if (!data || !device) { - return; - } - - object = (LiblocationWrapper *)data; - - if (device) { - if (device->fix) { - if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { - posInfo.setTimestamp(QDateTime::fromTime_t(device->fix->time)); - } - - if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { - coordinate.setLatitude(device->fix->latitude); - coordinate.setLongitude(device->fix->longitude); - posInfo.setAttribute(QGeoPositionInfo::HorizontalAccuracy, - device->fix->eph / 100.0); - posInfo.setAttribute(QGeoPositionInfo::VerticalAccuracy, - device->fix->epv); - } - - if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) { - coordinate.setAltitude(device->fix->altitude); - } - - if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { - posInfo.setAttribute(QGeoPositionInfo::GroundSpeed, - device->fix->speed / 3.6); - } - - if (device->fix->fields & LOCATION_GPS_DEVICE_CLIMB_SET) { - posInfo.setAttribute(QGeoPositionInfo::VerticalSpeed, - device->fix->climb); - } - - if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { - posInfo.setAttribute(QGeoPositionInfo::Direction, - device->fix->track); - } - } - - if (device->satellites_in_view) { - QList satsInView; - QList satsInUse; - unsigned int i; - for (i = 0;i < device->satellites->len;i++) { - LocationGPSDeviceSatellite *satData = - (LocationGPSDeviceSatellite *)g_ptr_array_index(device->satellites, - i); - satInfo.setSignalStrength(satData->signal_strength); - satInfo.setPrnNumber(satData->prn); - satInfo.setAttribute(QGeoSatelliteInfo::Elevation, - satData->elevation); - satInfo.setAttribute(QGeoSatelliteInfo::Azimuth, - satData->azimuth); - - satsInView.append(satInfo); - if (satData->in_use) { - satellitesInUseCount++; - satsInUse.append(satInfo); - } - } - - if (!satsInView.isEmpty()) - object->satellitesInViewUpdated(satsInView); - - if (!satsInUse.isEmpty()) - object->satellitesInUseUpdated(satsInUse); - } - } - - posInfo.setCoordinate(coordinate); - - emit object->positionUpdated(posInfo); -} - -QGeoPositionInfo LiblocationWrapper::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const -{ - QGeoPositionInfo posInfo; - QGeoCoordinate coordinate; - double time; - double latitude; - double longitude; - double altitude; - double speed; - double track; - double climb; - - GConfItem lastKnownPositionTime("/system/nokia/location/lastknown/time"); - GConfItem lastKnownPositionLatitude("/system/nokia/location/lastknown/latitude"); - GConfItem lastKnownPositionLongitude("/system/nokia/location/lastknown/longitude"); - GConfItem lastKnownPositionAltitude("/system/nokia/location/lastknown/altitude"); - GConfItem lastKnownPositionSpeed("/system/nokia/location/lastknown/speed"); - GConfItem lastKnownPositionTrack("/system/nokia/location/lastknown/track"); - GConfItem lastKnownPositionClimb("/system/nokia/location/lastknown/climb"); - - if (validLastSatUpdate) - return lastSatUpdate; - - if (!fromSatellitePositioningMethodsOnly) - if (validLastUpdate) - return lastUpdate; - - time = lastKnownPositionTime.value().toDouble(); - latitude = lastKnownPositionLatitude.value().toDouble(); - longitude = lastKnownPositionLongitude.value().toDouble(); - altitude = lastKnownPositionAltitude.value().toDouble(); - speed = lastKnownPositionSpeed.value().toDouble(); - track = lastKnownPositionTrack.value().toDouble(); - climb = lastKnownPositionClimb.value().toDouble(); - - if (longitude && latitude) { - coordinate.setLongitude(longitude); - coordinate.setLatitude(latitude); - if (altitude) { - coordinate.setAltitude(altitude); - } - posInfo.setCoordinate(coordinate); - } - - if (speed) { - posInfo.setAttribute(QGeoPositionInfo::GroundSpeed, speed); - } - - if (track) { - posInfo.setAttribute(QGeoPositionInfo::Direction, track); - } - - if (climb) { - posInfo.setAttribute(QGeoPositionInfo::VerticalSpeed, climb); - } - - // Only positions with time (3D) are provided. - if (time) { - posInfo.setTimestamp(QDateTime::fromTime_t(time)); - return posInfo; - } - - return QGeoPositionInfo(); -} - -void LiblocationWrapper::satellitesInViewUpdated(const QList &satellites) -{ - satsInView = satellites; -} - -void LiblocationWrapper::satellitesInUseUpdated(const QList &satellites) -{ - satsInUse = satellites; -} - -QList LiblocationWrapper::satellitesInView() -{ - return satsInView; -} - -QList LiblocationWrapper::satellitesInUse() -{ - return satsInUse; -} - -void LiblocationWrapper::start() { - startcounter++; - - if ((locationState & LiblocationWrapper::Inited) && - !(locationState & LiblocationWrapper::Started)) { - if (!errorHandlerId) { - errorHandlerId = - g_signal_connect(G_OBJECT(locationControl), "error-verbose", - G_CALLBACK(&locationError), - static_cast(this)); - } - - if (!posChangedId) { - posChangedId = - g_signal_connect(G_OBJECT(locationDevice), "changed", - G_CALLBACK(&locationChanged), - static_cast(this)); - } - - location_gpsd_control_start(locationControl); - - locationState |= LiblocationWrapper::Started; - locationState &= ~LiblocationWrapper::Stopped; - } -} - -void LiblocationWrapper::stop() { - startcounter--; - - if (startcounter > 0) - return; - - if ((locationState & (LiblocationWrapper::Started | - LiblocationWrapper::Inited)) && - !(locationState & LiblocationWrapper::Stopped)) { - if (errorHandlerId) - g_signal_handler_disconnect(G_OBJECT(locationControl), - errorHandlerId); - if (posChangedId) - g_signal_handler_disconnect(G_OBJECT(locationDevice), - posChangedId); - errorHandlerId = 0; - posChangedId = 0; - startcounter = 0; - location_gpsd_control_stop(locationControl); - - locationState &= ~LiblocationWrapper::Started; - locationState |= LiblocationWrapper::Stopped; - } -} - -bool LiblocationWrapper::isActive() { - if (locationState & LiblocationWrapper::Started) - return true; - else - return false; -} - -#include "moc_liblocationwrapper_p.cpp" -QTM_END_NAMESPACE - diff --git a/liblocationmaemo5/liblocationwrapper_p.h b/liblocationmaemo5/liblocationwrapper_p.h deleted file mode 100644 index 287ff5d..0000000 --- a/liblocationmaemo5/liblocationwrapper_p.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef LIBLOCATIONWRAPPER_H -#define LIBLOCATINWRAPPER_H - -// INCLUDES -#include -#include - -#include "qgeocoordinate.h" -#include "qgeopositioninfo.h" -#include "qgeosatelliteinfo.h" - -#include "gconfitem_p.h" - -extern "C" { - #include - #include - #include - #include - #include -} - -QTM_BEGIN_NAMESPACE - -class LiblocationWrapper : public QObject -{ - Q_OBJECT - -public: - static LiblocationWrapper *instance(); - LiblocationWrapper(); - ~LiblocationWrapper(); - - void start(); - void stop(); - QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const; - bool inited(); - bool isActive(); - QList satellitesInView(); - QList satellitesInUse(); - -private: - QFile *file; - LocationGPSDControl *locationControl; - LocationGPSDevice *locationDevice; - - static void locationError(LocationGPSDevice *device, gint code, gpointer data); - static void locationChanged(LocationGPSDevice *device, gpointer data); - - int errorHandlerId; - int posChangedId; - int origUpdateInterval; - int startcounter; - QGeoPositionInfo lastUpdate; - QGeoPositionInfo lastSatUpdate; - bool validLastUpdate; - bool validLastSatUpdate; - bool fromSatellite; - - void satellitesInViewUpdated(const QList &satellites); - void satellitesInUseUpdated(const QList &satellites); - QList satsInView; - QList satsInUse; - - enum LocationState { - Undefined = 0, - Inited = 1, - Started = 2, - Stopped = 4, - RequestActive = 8, - RequestSingleShot = 16 - }; - int locationState; - -signals: - void positionUpdated(const QGeoPositionInfo &position); - void error(); -}; - -QTM_END_NAMESPACE -#endif // LIBLOCATIONWRAPPER_H diff --git a/liblocationmaemo5/qgeopositioninfosource_maemo5.cpp b/liblocationmaemo5/qgeopositioninfosource_maemo5.cpp deleted file mode 100644 index 60023d6..0000000 --- a/liblocationmaemo5/qgeopositioninfosource_maemo5.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgeopositioninfosource_maemo5_p.h" -#include "liblocationwrapper_p.h" -#include - -using namespace std; - -QTM_BEGIN_NAMESPACE - -QGeoPositionInfoSourceMaemo::QGeoPositionInfoSourceMaemo(QObject *parent) - : QGeoPositionInfoSource(parent) -{ - qDebug() << "* QGeoPositionInfoSourceMaemo Fremantle Backport"; - // default values - timerInterval = DEFAULT_UPDATE_INTERVAL; - updateTimer = new QTimer(this); - updateTimer->setSingleShot(true); - connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateTimeoutElapsed())); - - requestTimer = new QTimer(this); - requestTimer->setSingleShot(true); - connect(requestTimer, SIGNAL(timeout()), this, SLOT(requestTimeoutElapsed())); - - connect(LiblocationWrapper::instance(), SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(newPositionUpdate(QGeoPositionInfo))); - - errorOccurred = false; - errorSent = false; - - positionInfoState = QGeoPositionInfoSourceMaemo::Undefined; -} - -int QGeoPositionInfoSourceMaemo::init() -{ - if (LiblocationWrapper::instance()->inited()) { - connect(LiblocationWrapper::instance(), SIGNAL(error()), this, SLOT(error())); - return INIT_OK; - } else { - return INIT_FAILED; - } -} - -QGeoPositionInfo QGeoPositionInfoSourceMaemo::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const -{ - return (LiblocationWrapper::instance()->lastKnownPosition(fromSatellitePositioningMethodsOnly)); -} - -QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSourceMaemo::supportedPositioningMethods() const -{ - QGeoPositionInfoSource::PositioningMethods methods; - - if (!GConfItem("/system/nokia/location/gps-disabled").value().toBool()) - methods |= SatellitePositioningMethods; - if (!GConfItem("/system/nokia/location/network-disabled").value().toBool()) - methods |= NonSatellitePositioningMethods; - if (methods.testFlag(SatellitePositioningMethods) && methods.testFlag(NonSatellitePositioningMethods)) - methods |= AllPositioningMethods; - - return methods; -} - -void QGeoPositionInfoSourceMaemo::setUpdateInterval(int msec) -{ - bool updateTimerInterval = false; - - if (positionInfoState & QGeoPositionInfoSourceMaemo::PowersaveActive) - if (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped) - updateTimerInterval = true; - - if (!msec) { - timerInterval = MINIMUM_UPDATE_INTERVAL; - QGeoPositionInfoSource::setUpdateInterval(0); - } else { - timerInterval = (msec < MINIMUM_UPDATE_INTERVAL) ? MINIMUM_UPDATE_INTERVAL : msec; - QGeoPositionInfoSource::setUpdateInterval(timerInterval); - } - - if (timerInterval >= POWERSAVE_THRESHOLD) - positionInfoState |= QGeoPositionInfoSourceMaemo::PowersaveActive; - else - positionInfoState &= ~QGeoPositionInfoSourceMaemo::PowersaveActive; - - // If powersave has been active when new update interval has been set, - // ensure that timer is started. - if (updateTimerInterval) - startLocationDaemon(); - - // Ensure that new timer interval is taken into use immediately. - activateTimer(); -} - -void QGeoPositionInfoSourceMaemo::setPreferredPositioningMethods(PositioningMethods methods) -{ - QGeoPositionInfoSource::setPreferredPositioningMethods(methods); -} - -int QGeoPositionInfoSourceMaemo::minimumUpdateInterval() const -{ - return MINIMUM_UPDATE_INTERVAL; -} - -// public slots: -void QGeoPositionInfoSourceMaemo::startUpdates() -{ - startLocationDaemon(); - - // Ensure that powersave is selected, if stopUpdates() has been called, - // but selected update interval is still greater than POWERSAVE_THRESHOLD. - if (timerInterval >= POWERSAVE_THRESHOLD) - positionInfoState |= QGeoPositionInfoSourceMaemo::PowersaveActive; - - activateTimer(); -} - -void QGeoPositionInfoSourceMaemo::stopUpdates() -{ - positionInfoState &= ~QGeoPositionInfoSourceMaemo::PowersaveActive; - - if (!(positionInfoState & QGeoPositionInfoSourceMaemo::RequestActive)) { - updateTimer->stop(); - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - } - - errorOccurred = false; - errorSent = false; - - positionInfoState &= ~QGeoPositionInfoSourceMaemo::Started; - positionInfoState |= QGeoPositionInfoSourceMaemo::Stopped; -} - -void QGeoPositionInfoSourceMaemo::requestUpdate(int timeout) -{ - int timeoutForRequest = 0; - - if (!timeout) { - if (LiblocationWrapper::instance()->isActive()) - // If GPS is active, assume quick fix. - timeoutForRequest = DEFAULT_UPDATE_INTERVAL; - else - // Otherwise reserve longer time to get a fix. - timeoutForRequest = POWERSAVE_POWERON_PERIOD; - } else if (timeout < MINIMUM_UPDATE_INTERVAL) { - if (positionInfoState & QGeoPositionInfoSourceMaemo::RequestActive) - return; - - emit updateTimeout(); - return; - } else { - timeoutForRequest = timeout; - } - - positionInfoState |= QGeoPositionInfoSourceMaemo::RequestActive; - - if (!(LiblocationWrapper::instance()->isActive())) - LiblocationWrapper::instance()->start(); - - activateTimer(); - requestTimer->start(timeoutForRequest); -} - -void QGeoPositionInfoSourceMaemo::newPositionUpdate(const QGeoPositionInfo &position) -{ - /* - Invalid fixes have NaN for horizontal accuracy regardless of - whether they come from satellite or non-satellite position methods. - - Satellite fixes always have LOCATION_GPS_DEVICE_TIME_SET. - If this is not set and we have a numeric value for horizontal - accuracy then we are dealing with a non-satellite based positioning - method. - - Since QGeoPositionInfo instances are only considered valid if - they have a valid coordinate and a valid timestamp, we use - the current date and time as the timestamp for the network based - positioning. This will help in the case where someone wants to - reply a journey from a log file. - - Based on some logging it looks like satellite and non-satellite - methods can be distinguished (after the initial fix) by whether - the time has been set and / or whether the horizontal accuracy - is above or below around 500 metres. Using the timestamp - appears to be more definitive than using the accuracy. - */ - - const bool horizontalAccuracyDefined = !qIsNaN(position.attribute(QGeoPositionInfo::HorizontalAccuracy)); - const bool hasTimeStamp = !position.timestamp().isNull(); - - if (horizontalAccuracyDefined) { - if (hasTimeStamp) { - //Valid satellite fix - lastUpdateFromSatellite = position; - } else { - //Valid non-satellite fix - QGeoPositionInfo networkPosition(position); - networkPosition.setTimestamp(QDateTime::currentDateTime()); - lastUpdateFromNetwork = networkPosition; - } - } else { - //Invalid position update - if (hasTimeStamp) { - lastUpdateFromSatellite = QGeoPositionInfo(); - } else { - lastUpdateFromNetwork = QGeoPositionInfo(); - } - } -} - -void QGeoPositionInfoSourceMaemo::updateTimeoutElapsed() -{ - QGeoPositionInfo position; - - QGeoPositionInfoSource::PositioningMethods methods = preferredPositioningMethods(); - - if (methods.testFlag(AllPositioningMethods)) { - methods |= SatellitePositioningMethods; - methods |= NonSatellitePositioningMethods; - } - - if (methods.testFlag(SatellitePositioningMethods) && !methods.testFlag(NonSatellitePositioningMethods)) { - //only SatellitePositioningMethods preferred - position = lastUpdateFromSatellite; - } else if (methods.testFlag(NonSatellitePositioningMethods) && !methods.testFlag(SatellitePositioningMethods)) { - //only NonSatellitePositioningMethods preferred - position = lastUpdateFromNetwork; - } else { - //AllPositioningMethods or none preferred - if (lastUpdateFromSatellite.isValid()) - position = lastUpdateFromSatellite; - else - position = lastUpdateFromNetwork; - } - - if (position.isValid()) { - errorOccurred = false; - errorSent = false; - - if (positionInfoState & QGeoPositionInfoSourceMaemo::RequestActive) { - positionInfoState &= ~QGeoPositionInfoSourceMaemo::RequestActive; - requestTimer->stop(); - - if (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped) - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - - // Ensure that requested position fix is emitted even though - // powersave is active and GPS would normally be off. - if ((positionInfoState & QGeoPositionInfoSourceMaemo::PowersaveActive) && - (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped)) { - emit positionUpdated(position); - } - } - - // Make sure that if update is triggered when waking up, there - // is no false position update. - if (!((positionInfoState & QGeoPositionInfoSourceMaemo::PowersaveActive) && - (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped))) - emit positionUpdated(position); - } else { - // if an error occurs when we are updating periodically and we haven't - // sent an error since the last fix... - if (!(positionInfoState & QGeoPositionInfoSourceMaemo::RequestActive) && - errorOccurred && !errorSent) { - errorSent = true; - // we need to emit the updateTimeout signal - emit updateTimeout(); - } - } - activateTimer(); -} - -void QGeoPositionInfoSourceMaemo::requestTimeoutElapsed() -{ - updateTimer->stop(); - emit updateTimeout(); - - positionInfoState &= ~QGeoPositionInfoSourceMaemo::RequestActive; - - if (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped) - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - - activateTimer(); -} - -void QGeoPositionInfoSourceMaemo::error() -{ - errorOccurred = true; -} - -void QGeoPositionInfoSourceMaemo::activateTimer() -{ - if (positionInfoState & QGeoPositionInfoSourceMaemo::RequestActive) { - updateTimer->start(MINIMUM_UPDATE_INTERVAL); - return; - } - - if (positionInfoState & QGeoPositionInfoSourceMaemo::PowersaveActive) { - if (positionInfoState & QGeoPositionInfoSourceMaemo::Started) { - // Cannot call stopUpdates() here since we want to keep powersave - // active. - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - updateTimer->start(timerInterval - POWERSAVE_POWERON_PERIOD); - errorOccurred = false; - errorSent = false; - - positionInfoState &= ~QGeoPositionInfoSourceMaemo::Started; - positionInfoState |= QGeoPositionInfoSourceMaemo::Stopped; - } else if (positionInfoState & QGeoPositionInfoSourceMaemo::Stopped) { - startLocationDaemon(); - updateTimer->start(POWERSAVE_POWERON_PERIOD); - } - return; - } - - if (positionInfoState & QGeoPositionInfoSourceMaemo::Started) - updateTimer->start(timerInterval); -} - -void QGeoPositionInfoSourceMaemo::startLocationDaemon() -{ - if (!(LiblocationWrapper::instance()->isActive())) - LiblocationWrapper::instance()->start(); - positionInfoState |= QGeoPositionInfoSourceMaemo::Started; - positionInfoState &= ~QGeoPositionInfoSourceMaemo::Stopped; -} - -#include "moc_qgeopositioninfosource_maemo5_p.cpp" -QTM_END_NAMESPACE - diff --git a/liblocationmaemo5/qgeopositioninfosource_maemo5_p.h b/liblocationmaemo5/qgeopositioninfosource_maemo5_p.h deleted file mode 100644 index c7c022b..0000000 --- a/liblocationmaemo5/qgeopositioninfosource_maemo5_p.h +++ /dev/null @@ -1,129 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGEOPOSITIONINFOSOURCEMAEMO5_H -#define QGEOPOSITIONINFOSOURCEMAEMO5_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qgeopositioninfosource.h" - -#define INIT_OK 0 -#define INIT_FAILED -1 -#define MINIMUM_UPDATE_INTERVAL 1000 -#define DEFAULT_UPDATE_INTERVAL 5000 -#define POWERSAVE_THRESHOLD 180000 -#define POWERSAVE_POWERON_PERIOD 120000 - -QTM_BEGIN_NAMESPACE - -class LiblocationWrapper; - -class QGeoPositionInfoSourceMaemo : public QGeoPositionInfoSource -{ - Q_OBJECT - -public: - - QGeoPositionInfoSourceMaemo(QObject *parent = 0); - - int init(); - - virtual void setUpdateInterval(int interval); - virtual void setPreferredPositioningMethods(PositioningMethods methods); - virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const; - virtual PositioningMethods supportedPositioningMethods() const; - virtual int minimumUpdateInterval() const; - -private: - bool positionInited; - QTimer *updateTimer; - QTimer *requestTimer; - int timerInterval; - bool errorOccurred; - bool errorSent; - - void activateTimer(); - void startLocationDaemon(); - - enum PositionInfoState { - Undefined = 0, - Started = 1, - Stopped = 2, - RequestActive = 4, - PowersaveActive = 8 - }; - int positionInfoState; - - QGeoPositionInfo lastUpdateFromSatellite; - QGeoPositionInfo lastUpdateFromNetwork; - -signals: - void positionUpdated(const QGeoPositionInfo &update); - -public slots: - void startUpdates(); - void stopUpdates(); - void requestUpdate(int timeout = DEFAULT_UPDATE_INTERVAL); - -private slots: - void requestTimeoutElapsed(); - void error(); - void newPositionUpdate(const QGeoPositionInfo &position); - void updateTimeoutElapsed(); - -private: - Q_DISABLE_COPY(QGeoPositionInfoSourceMaemo) -}; - -QTM_END_NAMESPACE - -#endif // QGEOPOSITIONINFOSOURCEMAEMO5_H diff --git a/liblocationmaemo5/qgeosatelliteinfosource_maemo5.cpp b/liblocationmaemo5/qgeosatelliteinfosource_maemo5.cpp deleted file mode 100644 index 0074d28..0000000 --- a/liblocationmaemo5/qgeosatelliteinfosource_maemo5.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgeosatelliteinfosource_maemo5_p.h" -#include "liblocationwrapper_p.h" - -QTM_BEGIN_NAMESPACE - -QGeoSatelliteInfoSourceMaemo::QGeoSatelliteInfoSourceMaemo(QObject *parent) - : QGeoSatelliteInfoSource(parent) -{ - qDebug() << "* QGeoSatelliteInfoSourceMaemo Fremantle Backport"; - client_id_ = -1; - timerInterval = DEFAULT_UPDATE_INTERVAL; - updateTimer = new QTimer(this); - updateTimer->setSingleShot(true); - connect(updateTimer, SIGNAL(timeout()), this, SLOT(satelliteStatus())); - - requestTimer = new QTimer(this); - requestTimer->setSingleShot(true); - connect(requestTimer, SIGNAL(timeout()), this, SLOT(requestTimeoutElapsed())); - - satelliteInfoState = QGeoSatelliteInfoSourceMaemo::Undefined; -} - -int QGeoSatelliteInfoSourceMaemo::init() -{ - if (LiblocationWrapper::instance()->inited()) - return INIT_OK; - else - return INIT_FAILED; -} - -void QGeoSatelliteInfoSourceMaemo::setUpdateInterval(int msec) -{ - bool updateTimerInterval = false; - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::PowersaveActive) - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped) - updateTimerInterval = true; - - timerInterval = (msec < MINIMUM_UPDATE_INTERVAL) ? MINIMUM_UPDATE_INTERVAL : msec; - - if (timerInterval >= POWERSAVE_THRESHOLD) - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::PowersaveActive; - else - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::PowersaveActive; - - // If powersave has been active when new update interval has been set, - // ensure that timer is started. - if (updateTimerInterval) - startLocationDaemon(); - - // Ensure that new timer interval is taken into use immediately. - activateTimer(); -} - -void QGeoSatelliteInfoSourceMaemo::startUpdates() -{ - startLocationDaemon(); - - // Ensure that powersave is selected, if stopUpdates() has been called, - // but selected update interval is still greater than POWERSAVE_THRESHOLD. - if (timerInterval >= POWERSAVE_THRESHOLD) - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::PowersaveActive; - - activateTimer(); -} - -void QGeoSatelliteInfoSourceMaemo::stopUpdates() -{ - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::PowersaveActive; - - if (!(satelliteInfoState & QGeoSatelliteInfoSourceMaemo::RequestActive)) { - updateTimer->stop(); - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - } - - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::Started; - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::Stopped; -} - -void QGeoSatelliteInfoSourceMaemo::requestUpdate(int timeout) -{ - int timeoutForRequest = 0; - - if (!timeout) { - if (LiblocationWrapper::instance()->isActive()) - // If GPS is active, assume quick fix. - timeoutForRequest = DEFAULT_UPDATE_INTERVAL; - else - // Otherwise reserve longer time to get a fix. - timeoutForRequest = POWERSAVE_POWERON_PERIOD; - } else if (timeout < MINIMUM_UPDATE_INTERVAL) { - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::RequestActive) - return; - - emit requestTimeout(); - return; - } else { - timeoutForRequest = timeout; - } - - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::RequestActive; - - if (!(LiblocationWrapper::instance()->isActive())) - LiblocationWrapper::instance()->start(); - - activateTimer(); - requestTimer->start(timeoutForRequest); -} - -void QGeoSatelliteInfoSourceMaemo::satelliteStatus() -{ - QList satellitesInView = - LiblocationWrapper::instance()->satellitesInView(); - QList satellitesInUse = - LiblocationWrapper::instance()->satellitesInUse(); - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::RequestActive) { - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::RequestActive; - - requestTimer->stop(); - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped) { - if (LiblocationWrapper::instance()->isActive()) { - LiblocationWrapper::instance()->stop(); - } - } - - // Ensure that requested satellite info is emitted even though - // powersave is active and GPS would normally be off. - if ((satelliteInfoState & QGeoSatelliteInfoSourceMaemo::PowersaveActive) && - (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped)) { - if (satellitesInView.length()) { - emit satellitesInViewUpdated(satellitesInView); - emit satellitesInUseUpdated(satellitesInUse); - } - } - } - - // Make sure that if update is triggered when waking up, there - // is no false position update. - if (!((satelliteInfoState & QGeoSatelliteInfoSourceMaemo::PowersaveActive) && - (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped))) { - if (satellitesInView.length()) { - emit satellitesInViewUpdated(satellitesInView); - emit satellitesInUseUpdated(satellitesInUse); - } - } - - activateTimer(); -} - -void QGeoSatelliteInfoSourceMaemo::requestTimeoutElapsed() -{ - updateTimer->stop(); - emit requestTimeout(); - - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::RequestActive; - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped) - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - - activateTimer(); -} - -void QGeoSatelliteInfoSourceMaemo::activateTimer() -{ - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::RequestActive) { - updateTimer->start(MINIMUM_UPDATE_INTERVAL); - return; - } - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::PowersaveActive) { - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Started) { - // Cannot call stopUpdates() here since we want to keep powersave - // active. - if (LiblocationWrapper::instance()->isActive()) - LiblocationWrapper::instance()->stop(); - updateTimer->start(timerInterval - POWERSAVE_POWERON_PERIOD); - - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::Started; - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::Stopped; - } else if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Stopped) { - startLocationDaemon(); - updateTimer->start(POWERSAVE_POWERON_PERIOD); - } - return; - } - - if (satelliteInfoState & QGeoSatelliteInfoSourceMaemo::Started) - updateTimer->start(timerInterval); -} - -void QGeoSatelliteInfoSourceMaemo::startLocationDaemon() -{ - if (!(LiblocationWrapper::instance()->isActive())) - LiblocationWrapper::instance()->start(); - satelliteInfoState |= QGeoSatelliteInfoSourceMaemo::Started; - satelliteInfoState &= ~QGeoSatelliteInfoSourceMaemo::Stopped; -} - -#include "moc_qgeosatelliteinfosource_maemo5_p.cpp" -QTM_END_NAMESPACE - diff --git a/liblocationmaemo5/qgeosatelliteinfosource_maemo5_p.h b/liblocationmaemo5/qgeosatelliteinfosource_maemo5_p.h deleted file mode 100644 index 71c4c91..0000000 --- a/liblocationmaemo5/qgeosatelliteinfosource_maemo5_p.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Mobility Components. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used 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. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGEOSATELLITEINFOSOURCE_MAEMO5_H -#define QGEOSATELLITEINFOSOURCE_MAEMO5_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qgeosatelliteinfosource.h" -#include "qgeosatelliteinfo.h" - -#define INIT_OK 0 -#define INIT_FAILED -1 -#define MINIMUM_UPDATE_INTERVAL 1000 -#define DEFAULT_UPDATE_INTERVAL 5000 -#define POWERSAVE_THRESHOLD 180000 -#define POWERSAVE_POWERON_PERIOD 120000 - -QTM_BEGIN_NAMESPACE - -class LiblocationWrapper; - -class QGeoSatelliteInfoSourceMaemo : public QGeoSatelliteInfoSource -{ - Q_OBJECT - -public: - explicit QGeoSatelliteInfoSourceMaemo(QObject *parent = 0); - - int init(); - -private: - int client_id_; - void setUpdateInterval(int interval); - QTimer *updateTimer; - QTimer *requestTimer; - int timerInterval; - void activateTimer(); - void startLocationDaemon(); - - enum SatelliteInfoState { - Undefined = 0, - Started = 1, - Stopped = 2, - RequestActive = 4, - PowersaveActive = 8 - }; - int satelliteInfoState; - -public slots: - virtual void startUpdates(); - void stopUpdates(); - void requestUpdate(int timeout = 5000); - void satelliteStatus(); - -signals: - void satellitesInViewUpdated(const QList &satellites); - void satellitesInUseUpdated(const QList &satellites); - void requestTimeout(); - -private slots: - void requestTimeoutElapsed(); - -private: - Q_DISABLE_COPY(QGeoSatelliteInfoSourceMaemo) -}; - -QTM_END_NAMESPACE - -#endif // QGEOSATELLITEINFOSOURCE_MAEMO5_H - diff --git a/qtc_packaging/debian_fremantle/README b/qtc_packaging/debian_fremantle/README deleted file mode 100644 index cdce769..0000000 --- a/qtc_packaging/debian_fremantle/README +++ /dev/null @@ -1,10 +0,0 @@ -The Debian Package googlelatitude ----------------------------- - -Comments regarding the Package - - -- Rodrigo Linfati sab, 02 gen 2010 22:12:52 +0100 - -Thanks to: -Joppu http://talk.maemo.org/member.php?u=24013 -http://talk.maemo.org/showpost.php?p=449435&postcount=83 diff --git a/qtc_packaging/debian_fremantle/changelog b/qtc_packaging/debian_fremantle/changelog deleted file mode 100644 index c924625..0000000 --- a/qtc_packaging/debian_fremantle/changelog +++ /dev/null @@ -1,151 +0,0 @@ -googlelatitude (0.8.0) unstable; urgency=low - - * Ovi Store - - -- Rodrigo Linfati Sun, 11 Sep 2011 19:01:01 +0200 - -googlelatitude (0.7-1) unstable; urgency=low - - * Enable invoker - - -- Rodrigo Linfati Wed, 10 Aug 2011 19:48:00 +0200 - -googlelatitude (0.7-0) unstable; urgency=low - - * OAuth Support - * Google Latitude 1.0 API Support - * QtMobility Support - * QGeoPositionInfoSourceMaemo5 Backport from QtMobility 1.2 - * Qwidget gui for Fremantle - * QML gui for harmattan - - -- Rodrigo Linfati Thu, 21 Jul 2011 21:58:20 +0200 - -googlelatitude (0.6-2) unstable; urgency=low - - * enable use of gps+cell - * fix the "start daemon" bug - - -- Rodrigo Linfati Thu, 27 Jan 2011 16:07:22 +0100 - -googlelatitude (0.6-1) unstable; urgency=low - - * auto update setting for daemon, fix start at boot time, fix NaN in gps eph - - -- Rodrigo Linfati Wed, 26 Jan 2011 17:23:41 +0100 - -googlelatitude (0.6-0) unstable; urgency=low - - * Daemon at boot time (default off) - * If not network, do not try to update - * Use of gps - * Max 120s for a fix, min of 5 in cell-mode and 15 in gps-mode, default 30s - * Updates between 1800s, min 300, max 3600 - - -- Rodrigo Linfati Wed, 26 Jan 2011 16:32:34 +0100 - -googlelatitude (0.4-7) unstable; urgency=low - - * fix maximal accuracy - - -- Rodrigo Linfati Tue, 25 Jan 2011 00:48:01 +0100 - -googlelatitude (0.4-6) unstable; urgency=low - - * GUI for the daemon mode - - -- Rodrigo Linfati Sat, 22 Jan 2011 23:26:09 +0100 - -googlelatitude (0.4-5) unstable; urgency=low - - * New daemon mode - * bugs fix - - -- Rodrigo Linfati Sat, 22 Jan 2011 18:51:23 +0100 - -googlelatitude (0.4-0) unstable; urgency=low - - * Bump version - - -- Rodrigo Linfati Wed, 05 May 2010 16:14:00 +0200 - -googlelatitude (0.3-9) unstable; urgency=low - - * Cleanup, preparation for pr1.2 - * Now Google Location and Buzz - * TODO: geolocation on webkit - - -- Rodrigo Linfati Wed, 05 May 2010 16:05:51 +0200 - -googlelatitude (0.3-8) unstable; urgency=low - - * Testing, minor bugs fix - - -- Rodrigo Linfati Sat, 02 Jan 2010 03:53:51 +0100 - -googlelatitude (0.3-7) unstable; urgency=low - - * libqt4 -> diablo = OK, fremantle -> fail - * libqt4-maemo5 -> fremantle => OK - - -- Rodrigo Linfati Sat, 02 Jan 2010 03:40:22 +0100 - -googlelatitude (0.3-6) unstable; urgency=low - - * test libqt4 + libqt4-maemo5 - - -- Rodrigo Linfati Sat, 02 Jan 2010 02:44:33 +0100 - -googlelatitude (0.3-5) unstable; urgency=low - - * some fix, support to auto update, auto stop on real-fix - - -- Rodrigo Linfati Fri, 01 Jan 2010 23:32:32 +0100 - -googlelatitude (0.3-1) unstable; urgency=low - - * initial support to liblocation - - -- Rodrigo Linfati Fri, 01 Jan 2010 16:20:56 +0100 - -googlelatitude (0.2-2) unstable; urgency=low - - * minor change in gui - - -- Rodrigo Linfati Tue, 29 Dec 2009 23:23:46 +0100 - -googlelatitude (0.2-1) unstable; urgency=low - - * more fix... - - -- Rodrigo Linfati Tue, 29 Dec 2009 21:53:01 +0100 - -googlelatitude (0.2-0) unstable; urgency=low - - * Google Maps via WebKit - - -- Rodrigo Linfati Tue, 29 Dec 2009 12:58:25 +0100 - -googlelatitude (0.1-4) unstable; urgency=low - - * add libgconf2-dev depend... ¿why? - - -- Rodrigo Linfati Wed, 16 Dec 2009 19:08:20 +0100 - -googlelatitude (0.1-3) unstable; urgency=low - - * fix depend from libqt4-dev to libqt4-maemo5-dev - - -- Rodrigo Linfati Wed, 16 Dec 2009 16:35:12 +0100 - -googlelatitude (0.1-2) unstable; urgency=low - - * fix section - - -- Rodrigo Linfati Wed, 16 Dec 2009 15:34:52 +0100 - -googlelatitude (0.1-1) unstable; urgency=low - - * Initial release - - -- Rodrigo Linfati Tue, 15 Dec 2009 20:42:16 +0100 diff --git a/qtc_packaging/debian_fremantle/compat b/qtc_packaging/debian_fremantle/compat deleted file mode 100644 index 7ed6ff8..0000000 --- a/qtc_packaging/debian_fremantle/compat +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/qtc_packaging/debian_fremantle/control b/qtc_packaging/debian_fremantle/control deleted file mode 100644 index f3b0a58..0000000 --- a/qtc_packaging/debian_fremantle/control +++ /dev/null @@ -1,20 +0,0 @@ -Source: googlelatitude -Section: user/navigation -Priority: optional -Maintainer: Rodrigo Linfati -Build-Depends: debhelper (>= 5), libqt4-dev, libqtm-dev, liblocation-dev, libgconf2-dev -Standards-Version: 3.7.3 -Homepage: http://www.linfati.com/ -XSBC-Bugtracker: mailto:rodrigo@linfati.cl - -Package: googlelatitude -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Google Latitude Updater - Features: - - Retrieve location using Cell Tower and/or Gps and send to Google Latitude - - Run as Daemon - Note: This is an unofficial client -XB-Maemo-Display-Name: LatitudeUpdater -XB-Maemo-Icon-26: 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 - diff --git a/qtc_packaging/debian_fremantle/copyright b/qtc_packaging/debian_fremantle/copyright deleted file mode 100644 index 33b3d11..0000000 --- a/qtc_packaging/debian_fremantle/copyright +++ /dev/null @@ -1,34 +0,0 @@ -This package was debianized by Rodrigo Linfati on -sab, 02 gen 2010 22:12:52 +0100. - -It was downloaded from - -Upstream Author(s): - - Rodrigo Linfati - -Copyright: - - Copyright (C) 2009 Rodrigo Linfati - -License: - - This package is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian systems, the complete text of the GNU Lesser General -Public License can be found in `/usr/share/common-licenses/LGPL'. - -The Debian packaging is (C) 2010, Rodrigo Linfati and -is licensed under the GPL, see `/usr/share/common-licenses/GPL'. diff --git a/qtc_packaging/debian_fremantle/rules b/qtc_packaging/debian_fremantle/rules deleted file mode 100755 index e1b9481..0000000 --- a/qtc_packaging/debian_fremantle/rules +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -configure: configure-stamp -configure-stamp: - dh_testdir - # qmake latitudeupdater.pro PREFIX=/usr - touch configure-stamp - -build: build-stamp - -build-stamp: configure-stamp - dh_testdir - # $(MAKE) - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - -$(MAKE) clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/googlelatitude install - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_install -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/qtc_packaging/debian_fremantle/rules.real b/qtc_packaging/debian_fremantle/rules.real deleted file mode 100755 index 3b68019..0000000 --- a/qtc_packaging/debian_fremantle/rules.real +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -configure: configure-stamp -configure-stamp: - dh_testdir - qmake latitudeupdater.pro - touch configure-stamp - -build: build-stamp - -build-stamp: configure-stamp - dh_testdir - $(MAKE) - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - -$(MAKE) clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/googlelatitude install - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_install -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/qtc_packaging/debian_harmattan/README b/qtc_packaging/debian_harmattan/README deleted file mode 100644 index e67f568..0000000 --- a/qtc_packaging/debian_harmattan/README +++ /dev/null @@ -1,10 +0,0 @@ -The Debian Package latitudeupdater ----------------------------- - -Comments regarding the Package - - -- Rodrigo Linfati sab, 02 gen 2010 22:12:52 +0100 - -Thanks to: -Joppu http://talk.maemo.org/member.php?u=24013 -http://talk.maemo.org/showpost.php?p=449435&postcount=83 diff --git a/qtc_packaging/debian_harmattan/changelog b/qtc_packaging/debian_harmattan/changelog deleted file mode 100644 index 3ef27db..0000000 --- a/qtc_packaging/debian_harmattan/changelog +++ /dev/null @@ -1,151 +0,0 @@ -latitudeupdater (0.8.0) unstable; urgency=low - - * Ovi Store - - -- Rodrigo Linfati Sun, 11 Sep 2011 19:01:01 +0200 - -latitudeupdater (0.8.0) unstable; urgency=low - - * Enable invoker - - -- Rodrigo Linfati Wed, 10 Aug 2011 19:48:00 +0200 - -latitudeupdater (0.7-0) unstable; urgency=low - - * OAuth Support - * Google Latitude 1.0 API Support - * QtMobility Support - * QGeoPositionInfoSourceMaemo5 Backport from QtMobility 1.2 - * Qwidget gui for Fremantle - * QML gui for harmattan - - -- Rodrigo Linfati Thu, 21 Jul 2011 21:58:20 +0200 - -latitudeupdater (0.6-2) unstable; urgency=low - - * enable use of gps+cell - * fix the "start daemon" bug - - -- Rodrigo Linfati Thu, 27 Jan 2011 16:07:22 +0100 - -latitudeupdater (0.6-1) unstable; urgency=low - - * auto update setting for daemon, fix start at boot time, fix NaN in gps eph - - -- Rodrigo Linfati Wed, 26 Jan 2011 17:23:41 +0100 - -latitudeupdater (0.6-0) unstable; urgency=low - - * Daemon at boot time (default off) - * If not network, do not try to update - * Use of gps - * Max 120s for a fix, min of 5 in cell-mode and 15 in gps-mode, default 30s - * Updates between 1800s, min 300, max 3600 - - -- Rodrigo Linfati Wed, 26 Jan 2011 16:32:34 +0100 - -latitudeupdater (0.4-7) unstable; urgency=low - - * fix maximal accuracy - - -- Rodrigo Linfati Tue, 25 Jan 2011 00:48:01 +0100 - -latitudeupdater (0.4-6) unstable; urgency=low - - * GUI for the daemon mode - - -- Rodrigo Linfati Sat, 22 Jan 2011 23:26:09 +0100 - -latitudeupdater (0.4-5) unstable; urgency=low - - * New daemon mode - * bugs fix - - -- Rodrigo Linfati Sat, 22 Jan 2011 18:51:23 +0100 - -latitudeupdater (0.4-0) unstable; urgency=low - - * Bump version - - -- Rodrigo Linfati Wed, 05 May 2010 16:14:00 +0200 - -latitudeupdater (0.3-9) unstable; urgency=low - - * Cleanup, preparation for pr1.2 - * Now Google Location and Buzz - * TODO: geolocation on webkit - - -- Rodrigo Linfati Wed, 05 May 2010 16:05:51 +0200 - -latitudeupdater (0.3-8) unstable; urgency=low - - * Testing, minor bugs fix - - -- Rodrigo Linfati Sat, 02 Jan 2010 03:53:51 +0100 - -latitudeupdater (0.3-7) unstable; urgency=low - - * libqt4 -> diablo = OK, fremantle -> fail - * libqt4-maemo5 -> fremantle => OK - - -- Rodrigo Linfati Sat, 02 Jan 2010 03:40:22 +0100 - -latitudeupdater (0.3-6) unstable; urgency=low - - * test libqt4 + libqt4-maemo5 - - -- Rodrigo Linfati Sat, 02 Jan 2010 02:44:33 +0100 - -latitudeupdater (0.3-5) unstable; urgency=low - - * some fix, support to auto update, auto stop on real-fix - - -- Rodrigo Linfati Fri, 01 Jan 2010 23:32:32 +0100 - -latitudeupdater (0.3-1) unstable; urgency=low - - * initial support to liblocation - - -- Rodrigo Linfati Fri, 01 Jan 2010 16:20:56 +0100 - -latitudeupdater (0.2-2) unstable; urgency=low - - * minor change in gui - - -- Rodrigo Linfati Tue, 29 Dec 2009 23:23:46 +0100 - -latitudeupdater (0.2-1) unstable; urgency=low - - * more fix... - - -- Rodrigo Linfati Tue, 29 Dec 2009 21:53:01 +0100 - -latitudeupdater (0.2-0) unstable; urgency=low - - * Google Maps via WebKit - - -- Rodrigo Linfati Tue, 29 Dec 2009 12:58:25 +0100 - -latitudeupdater (0.1-4) unstable; urgency=low - - * add libgconf2-dev depend... ¿why? - - -- Rodrigo Linfati Wed, 16 Dec 2009 19:08:20 +0100 - -latitudeupdater (0.1-3) unstable; urgency=low - - * fix depend from libqt4-dev to libqt4-maemo5-dev - - -- Rodrigo Linfati Wed, 16 Dec 2009 16:35:12 +0100 - -latitudeupdater (0.1-2) unstable; urgency=low - - * fix section - - -- Rodrigo Linfati Wed, 16 Dec 2009 15:34:52 +0100 - -latitudeupdater (0.1-1) unstable; urgency=low - - * Initial release - - -- Rodrigo Linfati Tue, 15 Dec 2009 20:42:16 +0100 diff --git a/qtc_packaging/debian_harmattan/compat b/qtc_packaging/debian_harmattan/compat deleted file mode 100644 index 7f8f011..0000000 --- a/qtc_packaging/debian_harmattan/compat +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/qtc_packaging/debian_harmattan/control b/qtc_packaging/debian_harmattan/control deleted file mode 100644 index 46ba60e..0000000 --- a/qtc_packaging/debian_harmattan/control +++ /dev/null @@ -1,20 +0,0 @@ -Source: latitudeupdater -Section: user/location -Priority: optional -Maintainer: Rodrigo Linfati -Build-Depends: debhelper (>= 5), libqt4-dev, libqtm-dev, applauncherd-dev, aegis-builder, pkg-config -Standards-Version: 3.7.3 -Homepage: http://www.linfati.com/ -XSBC-Bugtracker: mailto:rodrigo@linfati.cl - -Package: latitudeupdater -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Google Latitude Updater - Features: - - Retrieve location using Cell Tower and/or Gps and send to Google Latitude - - Run as Daemon - Note: This is an unofficial client -XSBC-Maemo-Display-Name: LatitudeUpdater -XB-Maemo-Icon-26: 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 - diff --git a/qtc_packaging/debian_harmattan/copyright b/qtc_packaging/debian_harmattan/copyright deleted file mode 100644 index 33b3d11..0000000 --- a/qtc_packaging/debian_harmattan/copyright +++ /dev/null @@ -1,34 +0,0 @@ -This package was debianized by Rodrigo Linfati on -sab, 02 gen 2010 22:12:52 +0100. - -It was downloaded from - -Upstream Author(s): - - Rodrigo Linfati - -Copyright: - - Copyright (C) 2009 Rodrigo Linfati - -License: - - This package is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian systems, the complete text of the GNU Lesser General -Public License can be found in `/usr/share/common-licenses/LGPL'. - -The Debian packaging is (C) 2010, Rodrigo Linfati and -is licensed under the GPL, see `/usr/share/common-licenses/GPL'. diff --git a/qtc_packaging/debian_harmattan/latitudeupdater.aegis b/qtc_packaging/debian_harmattan/latitudeupdater.aegis deleted file mode 100644 index 8348682..0000000 --- a/qtc_packaging/debian_harmattan/latitudeupdater.aegis +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/qtc_packaging/debian_harmattan/latitudeupdater.postinst b/qtc_packaging/debian_harmattan/latitudeupdater.postinst deleted file mode 100644 index 852a94d..0000000 --- a/qtc_packaging/debian_harmattan/latitudeupdater.postinst +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -if [ ! -f /targets/links/scratchbox.config ] - then - echo "Starting latituded" - start apps/latituded - fi - -exit 0 diff --git a/qtc_packaging/debian_harmattan/latitudeupdater.prerm b/qtc_packaging/debian_harmattan/latitudeupdater.prerm deleted file mode 100644 index b9a70d6..0000000 --- a/qtc_packaging/debian_harmattan/latitudeupdater.prerm +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -if [ ! -f /targets/links/scratchbox.config ] - then - echo "Stoping latituded" - stop apps/latituded - fi - -exit 0 diff --git a/qtc_packaging/debian_harmattan/manifest.aegis b/qtc_packaging/debian_harmattan/manifest.aegis deleted file mode 100644 index e69de29..0000000 diff --git a/qtc_packaging/debian_harmattan/rules b/qtc_packaging/debian_harmattan/rules deleted file mode 100755 index 40675ed..0000000 --- a/qtc_packaging/debian_harmattan/rules +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -configure: configure-stamp -configure-stamp: - dh_testdir - # qmake latitudeupdater.pro PREFIX=/usr - touch configure-stamp - -build: build-stamp - -build-stamp: configure-stamp - dh_testdir - # $(MAKE) - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - -$(MAKE) clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/latitudeupdater install - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_install -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/qtc_packaging/debian_harmattan/rules.real b/qtc_packaging/debian_harmattan/rules.real deleted file mode 100755 index 5b1e3f0..0000000 --- a/qtc_packaging/debian_harmattan/rules.real +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -configure: configure-stamp -configure-stamp: - dh_testdir - qmake latitudeupdater.pro - touch configure-stamp - -build: build-stamp - -build-stamp: configure-stamp - dh_testdir - $(MAKE) - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - -$(MAKE) clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/latitudeupdater install - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_install -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - aegis-deb-add -control debian/latitudeupdater/DEBIAN/control .. debian/latitudeupdater.aegis=_aegis - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/qtc_packaging/formeego_screenshot.png b/qtc_packaging/formeego_screenshot.png deleted file mode 100644 index bf2ed78372668ab2d3f406ab8c1d73ae7651fea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186613 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 &sD^=#=!fG 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 Z(TLCx{9AKNYe86u^=VrRjQO?O{|AI_x3>TQ diff --git a/qtc_packaging/icon.png b/qtc_packaging/icon.png deleted file mode 100644 index d12a6137ca5043a3f7283c064831d27e3eeb1bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25671 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

+DixfkL%?$S0-2^ZwB* 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 vl!VM0dI*%LLZx#~#pfm(