From 6152d6277463c3abaf9e1ffe39a241d00be5b38f Mon Sep 17 00:00:00 2001 From: Yves Marcoz Date: Sun, 29 Jan 2012 23:19:44 -0800 Subject: [PATCH] psa: Moved harmattand code to Qt project with sync option --- FeedingIt-Sync/FeedingIt-Sync.pro | 164 + FeedingIt-Sync/FeedingIt-Sync.pro.user | 599 +++ FeedingIt-Sync/FeedingIt-Sync_global.h | 12 + FeedingIt-Sync/dbus/feedingit.service | 3 + FeedingIt-Sync/dbus/feedingit_status.service | 3 + FeedingIt-Sync/feedingit | 16 + FeedingIt-Sync/feedingit-sync.desktop | 19 + FeedingIt-Sync/feedingit.desktop | 8 + FeedingIt-Sync/feedingit.png | Bin 0 -> 5743 bytes FeedingIt-Sync/feedingitsync.cpp | 199 + FeedingIt-Sync/feedingitsync.h | 47 + FeedingIt-Sync/pysrc/BeautifulSoup.py | 2014 ++++++++++ FeedingIt-Sync/pysrc/BeautifulSoup.pyc | Bin 0 -> 77049 bytes FeedingIt-Sync/pysrc/XmlHandler.py | 196 + FeedingIt-Sync/pysrc/XmlHandler.pyc | Bin 0 -> 8040 bytes FeedingIt-Sync/pysrc/config.py | 370 ++ FeedingIt-Sync/pysrc/config.pyc | Bin 0 -> 18360 bytes FeedingIt-Sync/pysrc/debugging.py | 113 + FeedingIt-Sync/pysrc/debugging.pyc | Bin 0 -> 3286 bytes FeedingIt-Sync/pysrc/download.py | 18 + FeedingIt-Sync/pysrc/eventfeed.py | 195 + FeedingIt-Sync/pysrc/feedingit.py | 359 ++ FeedingIt-Sync/pysrc/feedingitdbus.py | 82 + FeedingIt-Sync/pysrc/feedparser.py | 3918 ++++++++++++++++++++ FeedingIt-Sync/pysrc/feedparser.pyc | Bin 0 -> 154327 bytes FeedingIt-Sync/pysrc/httpprogresshandler.py | 147 + FeedingIt-Sync/pysrc/httpprogresshandler.pyc | Bin 0 -> 6251 bytes FeedingIt-Sync/pysrc/jobmanager.py | 366 ++ FeedingIt-Sync/pysrc/jobmanager.pyc | Bin 0 -> 11680 bytes FeedingIt-Sync/pysrc/mainthread.py | 159 + FeedingIt-Sync/pysrc/mainthread.pyc | Bin 0 -> 5305 bytes FeedingIt-Sync/pysrc/opml.py | 293 ++ FeedingIt-Sync/pysrc/opml_lib.py | 65 + FeedingIt-Sync/pysrc/opml_lib.pyc | Bin 0 -> 2078 bytes FeedingIt-Sync/pysrc/rss_sqlite.py | 1435 +++++++ FeedingIt-Sync/pysrc/rss_sqlite.pyc | Bin 0 -> 50442 bytes FeedingIt-Sync/pysrc/update_feeds.py | 252 ++ FeedingIt-Sync/pysrc/updatedbus.py | 86 + FeedingIt-Sync/pysrc/updatedbus.pyc | Bin 0 -> 3444 bytes FeedingIt-Sync/pysrc/wc.py | 139 + FeedingIt-Sync/pysrc/wc.pyc | Bin 0 -> 5022 bytes FeedingIt-Sync/qml/AddFeed.qml | 220 ++ FeedingIt-Sync/qml/ArticleDelegate.qml | 102 + FeedingIt-Sync/qml/ArticleDisplay.qml | 67 + FeedingIt-Sync/qml/ArticleViewer.qml | 209 ++ FeedingIt-Sync/qml/Articles.qml | 332 ++ FeedingIt-Sync/qml/AutomaticUpdate.qml | 11 + FeedingIt-Sync/qml/Categories.qml | 120 + FeedingIt-Sync/qml/FeedingIt.qml | 421 +++ FeedingIt-Sync/qml/FeedingitUI.qmlproject | 18 + FeedingIt-Sync/qml/FeedingitUI.qmlproject.user | 50 + FeedingIt-Sync/qml/Feeds.qml | 138 + FeedingIt-Sync/qml/MainPage.qml | 20 + FeedingIt-Sync/qml/Settings.qml | 25 + FeedingIt-Sync/qml/SettingsPage.qml | 88 + FeedingIt-Sync/qml/SliderSetting.qml | 28 + FeedingIt-Sync/qml/SwitchSetting.qml | 26 + FeedingIt-Sync/qml/TestWebview.qml | 66 + FeedingIt-Sync/qml/TextInputClear.qml | 48 + FeedingIt-Sync/qml/common/AddCat.qml | 40 + FeedingIt-Sync/qml/common/AddFeed.qml | 54 + FeedingIt-Sync/qml/common/Button.qml | 54 + FeedingIt-Sync/qml/common/ConfirmationMessage.qml | 52 + FeedingIt-Sync/qml/common/LineInput.qml | 20 + FeedingIt-Sync/qml/common/ManageSubs.qml | 14 + FeedingIt-Sync/qml/common/Menu.qml | 117 + FeedingIt-Sync/qml/common/Slider.qml | 36 + FeedingIt-Sync/qml/common/Switch.qml | 76 + FeedingIt-Sync/qml/common/ToolBar.qml | 148 + FeedingIt-Sync/qml/common/images/.directory | 3 + .../qml/common/images/AppletCloseButton.png | Bin 0 -> 2959 bytes .../common/images/InputMethodShiftButtonNormal.png | Bin 0 -> 1613 bytes FeedingIt-Sync/qml/common/images/Zoom-In-icon.png | Bin 0 -> 3414 bytes FeedingIt-Sync/qml/common/images/checkmark.png | Bin 0 -> 1250 bytes FeedingIt-Sync/qml/common/images/delete.png | Bin 0 -> 5286 bytes FeedingIt-Sync/qml/common/images/feedingit.png | Bin 0 -> 3711 bytes FeedingIt-Sync/qml/common/images/lineedit.png | Bin 0 -> 1415 bytes FeedingIt-Sync/qml/common/images/lineedit.sci | 5 + FeedingIt-Sync/qml/common/images/loading.png | Bin 0 -> 1759 bytes FeedingIt-Sync/qml/common/images/loading2.png | Bin 0 -> 813 bytes FeedingIt-Sync/qml/common/images/plus.png | Bin 0 -> 2597 bytes FeedingIt-Sync/qml/common/images/rotate.png | Bin 0 -> 3174 bytes FeedingIt-Sync/qml/common/images/toolbutton.png | Bin 0 -> 2550 bytes FeedingIt-Sync/qml/common/images/toolbutton.sci | 5 + FeedingIt-Sync/qml/common/images/wmBackIcon.png | Bin 0 -> 3391 bytes FeedingIt-Sync/qml/common/images/wmCloseIcon.png | Bin 0 -> 2298 bytes FeedingIt-Sync/qml/common/images/wmEditIcon.png | Bin 0 -> 3643 bytes .../qml/common/images/wmTaskLauncherIcon.png | Bin 0 -> 5054 bytes FeedingIt-Sync/qml/feedSearch.js | 44 + FeedingIt-Sync/qml/i18n/FeedingIt.ts | 12 + FeedingIt-Sync/qml/i18n/qml_en.qm | Bin 0 -> 228 bytes FeedingIt-Sync/qml/i18n/qml_en.ts | 29 + FeedingIt-Sync/qml/main.qml | 424 +++ FeedingIt-Sync/qml/qml.qmlproject | 20 + FeedingIt-Sync/qml/qml.qmlproject.user | 150 + FeedingIt-Sync/qml/qml.qmlproject.user.2.3pre1 | 92 + FeedingIt-Sync/qml/qmlDev/AddFeed.qml | 135 + FeedingIt-Sync/qml/qmlDev/MainPage.qml | 23 + FeedingIt-Sync/qml/qmlDev/TextInputClear.qml | 48 + FeedingIt-Sync/qml/qmlDev/feedSearch.js | 43 + FeedingIt-Sync/qml/qmlDev/main.qml | 30 + .../qtc_packaging/debian_harmattan/README | 6 + .../qtc_packaging/debian_harmattan/changelog | 5 + .../qtc_packaging/debian_harmattan/compat | 1 + .../qtc_packaging/debian_harmattan/control | 18 + .../qtc_packaging/debian_harmattan/copyright | 40 + .../qtc_packaging/debian_harmattan/manifest.aegis | 70 + .../qtc_packaging/debian_harmattan/postinst | 6 + .../qtc_packaging/debian_harmattan/postrm | 9 + .../qtc_packaging/debian_harmattan/rules | 91 + FeedingIt-Sync/splash.jpg | Bin 0 -> 14882 bytes FeedingIt-Sync/xml/feedingitsync.xml | 3 + FeedingIt-Sync/xml/service/feedingitsync.xml | 6 + FeedingIt-Sync/xml/settings/feedingitsync.desktop | 19 + FeedingIt-Sync/xml/settings/feedingitsync.xml | 14 + FeedingIt-Sync/xml/sync/feedingitsync.xml | 18 + psa_harmattan/feedingit/MANIFEST.in | 4 - psa_harmattan/feedingit/README.assistant | 65 - psa_harmattan/feedingit/build-deb.log | 186 - .../deb_dist/feedingit-0.1.0/.pc/.quilt_patches | 1 - .../deb_dist/feedingit-0.1.0/.pc/.quilt_series | 1 - .../deb_dist/feedingit-0.1.0/.pc/.version | 1 - .../feedingit/deb_dist/feedingit-0.1.0/MANIFEST.in | 4 - .../deb_dist/feedingit-0.1.0/README.assistant | 65 - .../deb_dist/feedingit-0.1.0/build-deb.log | 186 - .../feedingit-0.1.0/build/scripts-2.6/feedingit | 16 - .../deb_dist/feedingit-0.1.0/debian/changelog | 5 - .../deb_dist/feedingit-0.1.0/debian/compat | 1 - .../deb_dist/feedingit-0.1.0/debian/control | 19 - .../feedingit-0.1.0/debian/feedingit.debhelper.log | 44 - .../debian/feedingit.postinst.debhelper | 7 - .../debian/feedingit.prerm.debhelper | 12 - .../feedingit-0.1.0/debian/feedingit.substvars | 4 - .../debian/feedingit/DEBIAN/control | 15 - .../debian/feedingit/DEBIAN/md5sums | 74 - .../debian/feedingit/DEBIAN/postinst | 9 - .../feedingit-0.1.0/debian/feedingit/DEBIAN/prerm | 14 - .../debian/feedingit/usr/bin/feedingit | 16 - .../dist-packages/feedingit-0.1.0.egg-info | 1 - .../usr/share/applications/feedingit.desktop | 8 - .../share/dbus-1/services/feedingit_status.service | 3 - .../usr/share/doc/feedingit/changelog.Debian.gz | Bin 162 -> 0 bytes .../feedingit/usr/share/feedingit/BeautifulSoup.py | 2014 ---------- .../feedingit/usr/share/feedingit/XmlHandler.py | 196 - .../debian/feedingit/usr/share/feedingit/config.py | 370 -- .../feedingit/usr/share/feedingit/debugging.py | 113 - .../feedingit/usr/share/feedingit/download.py | 18 - .../feedingit/usr/share/feedingit/feedingit.py | 336 -- .../feedingit/usr/share/feedingit/feedparser.py | 3918 -------------------- .../usr/share/feedingit/httpprogresshandler.py | 147 - .../feedingit/usr/share/feedingit/jobmanager.py | 366 -- .../feedingit/usr/share/feedingit/mainthread.py | 159 - .../debian/feedingit/usr/share/feedingit/opml.py | 293 -- .../usr/share/feedingit/qml/ArticleDisplay.qml | 67 - .../usr/share/feedingit/qml/ArticleViewer.qml | 209 -- .../feedingit/usr/share/feedingit/qml/Articles.qml | 332 -- .../usr/share/feedingit/qml/Categories.qml | 120 - .../usr/share/feedingit/qml/FeedingIt.qml | 421 --- .../feedingit/usr/share/feedingit/qml/Feeds.qml | 138 - .../feedingit/usr/share/feedingit/qml/MainPage.qml | 20 - .../usr/share/feedingit/qml/TestWebview.qml | 66 - .../usr/share/feedingit/qml/common/AddCat.qml | 40 - .../usr/share/feedingit/qml/common/AddFeed.qml | 54 - .../usr/share/feedingit/qml/common/Button.qml | 54 - .../feedingit/qml/common/ConfirmationMessage.qml | 52 - .../usr/share/feedingit/qml/common/LineInput.qml | 20 - .../usr/share/feedingit/qml/common/ManageSubs.qml | 14 - .../usr/share/feedingit/qml/common/Menu.qml | 117 - .../usr/share/feedingit/qml/common/Slider.qml | 36 - .../usr/share/feedingit/qml/common/Switch.qml | 76 - .../usr/share/feedingit/qml/common/ToolBar.qml | 148 - .../qml/common/images/AppletCloseButton.png | Bin 2959 -> 0 bytes .../common/images/InputMethodShiftButtonNormal.png | Bin 1613 -> 0 bytes .../feedingit/qml/common/images/Zoom-In-icon.png | Bin 3414 -> 0 bytes .../feedingit/qml/common/images/checkmark.png | Bin 1250 -> 0 bytes .../share/feedingit/qml/common/images/delete.png | Bin 5286 -> 0 bytes .../feedingit/qml/common/images/feedingit.png | Bin 3711 -> 0 bytes .../share/feedingit/qml/common/images/lineedit.png | Bin 1415 -> 0 bytes .../share/feedingit/qml/common/images/lineedit.sci | 5 - .../share/feedingit/qml/common/images/loading.png | Bin 1759 -> 0 bytes .../share/feedingit/qml/common/images/loading2.png | Bin 813 -> 0 bytes .../usr/share/feedingit/qml/common/images/plus.png | Bin 2597 -> 0 bytes .../share/feedingit/qml/common/images/rotate.png | Bin 3174 -> 0 bytes .../feedingit/qml/common/images/toolbutton.png | Bin 2550 -> 0 bytes .../feedingit/qml/common/images/toolbutton.sci | 5 - .../feedingit/qml/common/images/wmBackIcon.png | Bin 3391 -> 0 bytes .../feedingit/qml/common/images/wmCloseIcon.png | Bin 2298 -> 0 bytes .../feedingit/qml/common/images/wmEditIcon.png | Bin 3643 -> 0 bytes .../qml/common/images/wmTaskLauncherIcon.png | Bin 5054 -> 0 bytes .../usr/share/feedingit/qml/i18n/FeedingIt.ts | 12 - .../usr/share/feedingit/qml/i18n/qml_en.qm | Bin 228 -> 0 bytes .../usr/share/feedingit/qml/i18n/qml_en.ts | 29 - .../feedingit/usr/share/feedingit/qml/main.qml | 406 -- .../feedingit/usr/share/feedingit/rss_sqlite.py | 1416 ------- .../feedingit/usr/share/feedingit/update_feeds.py | 252 -- .../feedingit/usr/share/feedingit/updatedbus.py | 86 - .../debian/feedingit/usr/share/feedingit/wc.py | 139 - .../usr/share/pyshared/feedingit-0.1.0.egg-info | 15 - .../usr/share/python/runtime.d/feedingit.rtupdate | 5 - .../deb_dist/feedingit-0.1.0/debian/files | 1 - .../deb_dist/feedingit-0.1.0/debian/rules | 9 - .../deb_dist/feedingit-0.1.0/debian/source/format | 1 - .../feedingit/deb_dist/feedingit-0.1.0/feedingit | 16 - .../deb_dist/feedingit-0.1.0/feedingit.base64 | 130 - .../deb_dist/feedingit-0.1.0/feedingit.desktop | 8 - .../deb_dist/feedingit-0.1.0/feedingit.longdesc | 5 - .../deb_dist/feedingit-0.1.0/feedingit.png | Bin 5743 -> 0 bytes .../deb_dist/feedingit-0.1.0/feedingit.psa | 11 - .../feedingit-0.1.0/feedingit_status.service | 3 - .../feedingit-0.1.0/pysrc/BeautifulSoup.py | 2014 ---------- .../deb_dist/feedingit-0.1.0/pysrc/XmlHandler.py | 196 - .../deb_dist/feedingit-0.1.0/pysrc/config.py | 370 -- .../deb_dist/feedingit-0.1.0/pysrc/debugging.py | 113 - .../deb_dist/feedingit-0.1.0/pysrc/download.py | 18 - .../deb_dist/feedingit-0.1.0/pysrc/feedingit.py | 336 -- .../deb_dist/feedingit-0.1.0/pysrc/feedparser.py | 3918 -------------------- .../feedingit-0.1.0/pysrc/httpprogresshandler.py | 147 - .../deb_dist/feedingit-0.1.0/pysrc/jobmanager.py | 366 -- .../deb_dist/feedingit-0.1.0/pysrc/mainthread.py | 159 - .../deb_dist/feedingit-0.1.0/pysrc/opml.py | 293 -- .../deb_dist/feedingit-0.1.0/pysrc/opml_lib.py | 65 - .../deb_dist/feedingit-0.1.0/pysrc/rss_sqlite.py | 1416 ------- .../deb_dist/feedingit-0.1.0/pysrc/update_feeds.py | 252 -- .../deb_dist/feedingit-0.1.0/pysrc/updatedbus.py | 86 - .../feedingit/deb_dist/feedingit-0.1.0/pysrc/wc.py | 139 - .../feedingit-0.1.0/qml/ArticleDisplay.qml | 67 - .../deb_dist/feedingit-0.1.0/qml/ArticleViewer.qml | 209 -- .../deb_dist/feedingit-0.1.0/qml/Articles.qml | 332 -- .../deb_dist/feedingit-0.1.0/qml/Categories.qml | 120 - .../deb_dist/feedingit-0.1.0/qml/FeedingIt.qml | 421 --- .../feedingit-0.1.0/qml/FeedingitUI.qmlproject | 18 - .../qml/FeedingitUI.qmlproject.user | 50 - .../deb_dist/feedingit-0.1.0/qml/Feeds.qml | 138 - .../deb_dist/feedingit-0.1.0/qml/MainPage.qml | 20 - .../deb_dist/feedingit-0.1.0/qml/TestWebview.qml | 66 - .../deb_dist/feedingit-0.1.0/qml/common/AddCat.qml | 40 - .../feedingit-0.1.0/qml/common/AddFeed.qml | 54 - .../deb_dist/feedingit-0.1.0/qml/common/Button.qml | 54 - .../qml/common/ConfirmationMessage.qml | 52 - .../feedingit-0.1.0/qml/common/LineInput.qml | 20 - .../feedingit-0.1.0/qml/common/ManageSubs.qml | 14 - .../deb_dist/feedingit-0.1.0/qml/common/Menu.qml | 117 - .../deb_dist/feedingit-0.1.0/qml/common/Slider.qml | 36 - .../deb_dist/feedingit-0.1.0/qml/common/Switch.qml | 76 - .../feedingit-0.1.0/qml/common/ToolBar.qml | 148 - .../feedingit-0.1.0/qml/common/images/.directory | 3 - .../qml/common/images/AppletCloseButton.png | Bin 2959 -> 0 bytes .../common/images/InputMethodShiftButtonNormal.png | Bin 1613 -> 0 bytes .../qml/common/images/Zoom-In-icon.png | Bin 3414 -> 0 bytes .../qml/common/images/checkmark.png | Bin 1250 -> 0 bytes .../feedingit-0.1.0/qml/common/images/delete.png | Bin 5286 -> 0 bytes .../qml/common/images/feedingit.png | Bin 3711 -> 0 bytes .../feedingit-0.1.0/qml/common/images/lineedit.png | Bin 1415 -> 0 bytes .../feedingit-0.1.0/qml/common/images/lineedit.sci | 5 - .../feedingit-0.1.0/qml/common/images/loading.png | Bin 1759 -> 0 bytes .../feedingit-0.1.0/qml/common/images/loading2.png | Bin 813 -> 0 bytes .../feedingit-0.1.0/qml/common/images/plus.png | Bin 2597 -> 0 bytes .../feedingit-0.1.0/qml/common/images/rotate.png | Bin 3174 -> 0 bytes .../qml/common/images/toolbutton.png | Bin 2550 -> 0 bytes .../qml/common/images/toolbutton.sci | 5 - .../qml/common/images/wmBackIcon.png | Bin 3391 -> 0 bytes .../qml/common/images/wmCloseIcon.png | Bin 2298 -> 0 bytes .../qml/common/images/wmEditIcon.png | Bin 3643 -> 0 bytes .../qml/common/images/wmTaskLauncherIcon.png | Bin 5054 -> 0 bytes .../deb_dist/feedingit-0.1.0/qml/i18n/FeedingIt.ts | 12 - .../deb_dist/feedingit-0.1.0/qml/i18n/qml_en.qm | Bin 228 -> 0 bytes .../deb_dist/feedingit-0.1.0/qml/i18n/qml_en.ts | 29 - .../deb_dist/feedingit-0.1.0/qml/main.qml | 406 -- .../feedingit/deb_dist/feedingit-0.1.0/setup.py | 23 - .../feedingit/deb_dist/feedingit-0.1.0/stdeb.cfg | 5 - .../deb_dist/feedingit_0.1.0-1.debian.tar.gz | Bin 957 -> 0 bytes .../feedingit/deb_dist/feedingit_0.1.0-1.dsc | 17 - .../feedingit/deb_dist/feedingit_0.1.0-1_all.deb | Bin 196388 -> 0 bytes .../deb_dist/feedingit_0.1.0-1_i386.changes | 22 - .../feedingit/deb_dist/feedingit_0.1.0.orig.tar.gz | Bin 201086 -> 0 bytes psa_harmattan/feedingit/feedingit | 16 - psa_harmattan/feedingit/feedingit.base64 | 130 - psa_harmattan/feedingit/feedingit.desktop | 8 - psa_harmattan/feedingit/feedingit.longdesc | 5 - psa_harmattan/feedingit/feedingit.png | Bin 5743 -> 0 bytes psa_harmattan/feedingit/feedingit.psa | 11 - psa_harmattan/feedingit/feedingit_status.service | 3 - psa_harmattan/feedingit/pysrc/BeautifulSoup.py | 2014 ---------- psa_harmattan/feedingit/pysrc/XmlHandler.py | 196 - psa_harmattan/feedingit/pysrc/config.py | 370 -- psa_harmattan/feedingit/pysrc/debugging.py | 113 - psa_harmattan/feedingit/pysrc/download.py | 18 - psa_harmattan/feedingit/pysrc/eventfeed.py | 195 - psa_harmattan/feedingit/pysrc/feedingit.py | 351 -- psa_harmattan/feedingit/pysrc/feedparser.py | 3918 -------------------- .../feedingit/pysrc/httpprogresshandler.py | 147 - psa_harmattan/feedingit/pysrc/jobmanager.py | 366 -- psa_harmattan/feedingit/pysrc/mainthread.py | 159 - psa_harmattan/feedingit/pysrc/opml.py | 293 -- psa_harmattan/feedingit/pysrc/opml_lib.py | 65 - psa_harmattan/feedingit/pysrc/rss_sqlite.py | 1435 ------- psa_harmattan/feedingit/pysrc/update_feeds.py | 252 -- psa_harmattan/feedingit/pysrc/updatedbus.py | 86 - psa_harmattan/feedingit/pysrc/wc.py | 139 - psa_harmattan/feedingit/qml/AddFeed.qml | 220 -- psa_harmattan/feedingit/qml/ArticleDisplay.qml | 67 - psa_harmattan/feedingit/qml/ArticleViewer.qml | 209 -- psa_harmattan/feedingit/qml/Articles.qml | 332 -- psa_harmattan/feedingit/qml/AutomaticUpdate.qml | 11 - psa_harmattan/feedingit/qml/Categories.qml | 120 - psa_harmattan/feedingit/qml/FeedingIt.qml | 421 --- psa_harmattan/feedingit/qml/FeedingitUI.qmlproject | 18 - .../feedingit/qml/FeedingitUI.qmlproject.user | 50 - psa_harmattan/feedingit/qml/Feeds.qml | 138 - psa_harmattan/feedingit/qml/MainPage.qml | 20 - psa_harmattan/feedingit/qml/Settings.qml | 25 - psa_harmattan/feedingit/qml/SettingsPage.qml | 88 - psa_harmattan/feedingit/qml/SliderSetting.qml | 28 - psa_harmattan/feedingit/qml/SwitchSetting.qml | 26 - psa_harmattan/feedingit/qml/TestWebview.qml | 66 - psa_harmattan/feedingit/qml/TextInputClear.qml | 48 - psa_harmattan/feedingit/qml/common/AddCat.qml | 40 - psa_harmattan/feedingit/qml/common/AddFeed.qml | 54 - psa_harmattan/feedingit/qml/common/Button.qml | 54 - .../feedingit/qml/common/ConfirmationMessage.qml | 52 - psa_harmattan/feedingit/qml/common/LineInput.qml | 20 - psa_harmattan/feedingit/qml/common/ManageSubs.qml | 14 - psa_harmattan/feedingit/qml/common/Menu.qml | 117 - psa_harmattan/feedingit/qml/common/Slider.qml | 36 - psa_harmattan/feedingit/qml/common/Switch.qml | 76 - psa_harmattan/feedingit/qml/common/ToolBar.qml | 148 - .../feedingit/qml/common/images/.directory | 3 - .../qml/common/images/AppletCloseButton.png | Bin 2959 -> 0 bytes .../common/images/InputMethodShiftButtonNormal.png | Bin 1613 -> 0 bytes .../feedingit/qml/common/images/Zoom-In-icon.png | Bin 3414 -> 0 bytes .../feedingit/qml/common/images/checkmark.png | Bin 1250 -> 0 bytes .../feedingit/qml/common/images/delete.png | Bin 5286 -> 0 bytes .../feedingit/qml/common/images/feedingit.png | Bin 3711 -> 0 bytes .../feedingit/qml/common/images/lineedit.png | Bin 1415 -> 0 bytes .../feedingit/qml/common/images/lineedit.sci | 5 - .../feedingit/qml/common/images/loading.png | Bin 1759 -> 0 bytes .../feedingit/qml/common/images/loading2.png | Bin 813 -> 0 bytes psa_harmattan/feedingit/qml/common/images/plus.png | Bin 2597 -> 0 bytes .../feedingit/qml/common/images/rotate.png | Bin 3174 -> 0 bytes .../feedingit/qml/common/images/toolbutton.png | Bin 2550 -> 0 bytes .../feedingit/qml/common/images/toolbutton.sci | 5 - .../feedingit/qml/common/images/wmBackIcon.png | Bin 3391 -> 0 bytes .../feedingit/qml/common/images/wmCloseIcon.png | Bin 2298 -> 0 bytes .../feedingit/qml/common/images/wmEditIcon.png | Bin 3643 -> 0 bytes .../qml/common/images/wmTaskLauncherIcon.png | Bin 5054 -> 0 bytes psa_harmattan/feedingit/qml/feedSearch.js | 44 - psa_harmattan/feedingit/qml/i18n/FeedingIt.ts | 12 - psa_harmattan/feedingit/qml/i18n/qml_en.qm | Bin 228 -> 0 bytes psa_harmattan/feedingit/qml/i18n/qml_en.ts | 29 - psa_harmattan/feedingit/qml/main.qml | 420 --- psa_harmattan/feedingit/qml/qml.qmlproject | 20 - psa_harmattan/feedingit/setup.py | 23 - psa_harmattan/feedingit/splash.jpg | Bin 14882 -> 0 bytes psa_harmattan/feedingit/stdeb.cfg | 5 - 354 files changed, 15246 insertions(+), 39050 deletions(-) create mode 100644 FeedingIt-Sync/FeedingIt-Sync.pro create mode 100644 FeedingIt-Sync/FeedingIt-Sync.pro.user create mode 100644 FeedingIt-Sync/FeedingIt-Sync_global.h create mode 100644 FeedingIt-Sync/dbus/feedingit.service create mode 100644 FeedingIt-Sync/dbus/feedingit_status.service create mode 100644 FeedingIt-Sync/feedingit create mode 100644 FeedingIt-Sync/feedingit-sync.desktop create mode 100644 FeedingIt-Sync/feedingit.desktop create mode 100644 FeedingIt-Sync/feedingit.png create mode 100644 FeedingIt-Sync/feedingitsync.cpp create mode 100644 FeedingIt-Sync/feedingitsync.h create mode 100644 FeedingIt-Sync/pysrc/BeautifulSoup.py create mode 100644 FeedingIt-Sync/pysrc/BeautifulSoup.pyc create mode 100644 FeedingIt-Sync/pysrc/XmlHandler.py create mode 100644 FeedingIt-Sync/pysrc/XmlHandler.pyc create mode 100644 FeedingIt-Sync/pysrc/__init__.py create mode 100644 FeedingIt-Sync/pysrc/config.py create mode 100644 FeedingIt-Sync/pysrc/config.pyc create mode 100644 FeedingIt-Sync/pysrc/debugging.py create mode 100644 FeedingIt-Sync/pysrc/debugging.pyc create mode 100644 FeedingIt-Sync/pysrc/download.py create mode 100644 FeedingIt-Sync/pysrc/eventfeed.py create mode 100644 FeedingIt-Sync/pysrc/feedingit.py create mode 100644 FeedingIt-Sync/pysrc/feedingitdbus.py create mode 100644 FeedingIt-Sync/pysrc/feedparser.py create mode 100644 FeedingIt-Sync/pysrc/feedparser.pyc create mode 100644 FeedingIt-Sync/pysrc/httpprogresshandler.py create mode 100644 FeedingIt-Sync/pysrc/httpprogresshandler.pyc create mode 100644 FeedingIt-Sync/pysrc/jobmanager.py create mode 100644 FeedingIt-Sync/pysrc/jobmanager.pyc create mode 100644 FeedingIt-Sync/pysrc/mainthread.py create mode 100644 FeedingIt-Sync/pysrc/mainthread.pyc create mode 100644 FeedingIt-Sync/pysrc/opml.py create mode 100644 FeedingIt-Sync/pysrc/opml_lib.py create mode 100644 FeedingIt-Sync/pysrc/opml_lib.pyc create mode 100644 FeedingIt-Sync/pysrc/rss_sqlite.py create mode 100644 FeedingIt-Sync/pysrc/rss_sqlite.pyc create mode 100644 FeedingIt-Sync/pysrc/update_feeds.py create mode 100644 FeedingIt-Sync/pysrc/updatedbus.py create mode 100644 FeedingIt-Sync/pysrc/updatedbus.pyc create mode 100644 FeedingIt-Sync/pysrc/wc.py create mode 100644 FeedingIt-Sync/pysrc/wc.pyc create mode 100644 FeedingIt-Sync/qml/AddFeed.qml create mode 100644 FeedingIt-Sync/qml/ArticleDelegate.qml create mode 100644 FeedingIt-Sync/qml/ArticleDisplay.qml create mode 100644 FeedingIt-Sync/qml/ArticleViewer.qml create mode 100644 FeedingIt-Sync/qml/Articles.qml create mode 100644 FeedingIt-Sync/qml/AutomaticUpdate.qml create mode 100644 FeedingIt-Sync/qml/Categories.qml create mode 100644 FeedingIt-Sync/qml/FeedingIt.qml create mode 100644 FeedingIt-Sync/qml/FeedingitUI.qmlproject create mode 100644 FeedingIt-Sync/qml/FeedingitUI.qmlproject.user create mode 100644 FeedingIt-Sync/qml/Feeds.qml create mode 100644 FeedingIt-Sync/qml/MainPage.qml create mode 100644 FeedingIt-Sync/qml/Settings.qml create mode 100644 FeedingIt-Sync/qml/SettingsPage.qml create mode 100644 FeedingIt-Sync/qml/SliderSetting.qml create mode 100644 FeedingIt-Sync/qml/SwitchSetting.qml create mode 100644 FeedingIt-Sync/qml/TestWebview.qml create mode 100644 FeedingIt-Sync/qml/TextInputClear.qml create mode 100644 FeedingIt-Sync/qml/common/AddCat.qml create mode 100644 FeedingIt-Sync/qml/common/AddFeed.qml create mode 100644 FeedingIt-Sync/qml/common/Button.qml create mode 100644 FeedingIt-Sync/qml/common/ConfirmationMessage.qml create mode 100644 FeedingIt-Sync/qml/common/LineInput.qml create mode 100644 FeedingIt-Sync/qml/common/ManageSubs.qml create mode 100644 FeedingIt-Sync/qml/common/Menu.qml create mode 100644 FeedingIt-Sync/qml/common/Slider.qml create mode 100644 FeedingIt-Sync/qml/common/Switch.qml create mode 100644 FeedingIt-Sync/qml/common/ToolBar.qml create mode 100644 FeedingIt-Sync/qml/common/images/.directory create mode 100644 FeedingIt-Sync/qml/common/images/AppletCloseButton.png create mode 100644 FeedingIt-Sync/qml/common/images/InputMethodShiftButtonNormal.png create mode 100644 FeedingIt-Sync/qml/common/images/Zoom-In-icon.png create mode 100644 FeedingIt-Sync/qml/common/images/checkmark.png create mode 100644 FeedingIt-Sync/qml/common/images/delete.png create mode 100644 FeedingIt-Sync/qml/common/images/feedingit.png create mode 100644 FeedingIt-Sync/qml/common/images/lineedit.png create mode 100644 FeedingIt-Sync/qml/common/images/lineedit.sci create mode 100644 FeedingIt-Sync/qml/common/images/loading.png create mode 100644 FeedingIt-Sync/qml/common/images/loading2.png create mode 100644 FeedingIt-Sync/qml/common/images/plus.png create mode 100644 FeedingIt-Sync/qml/common/images/rotate.png create mode 100644 FeedingIt-Sync/qml/common/images/toolbutton.png create mode 100644 FeedingIt-Sync/qml/common/images/toolbutton.sci create mode 100644 FeedingIt-Sync/qml/common/images/wmBackIcon.png create mode 100644 FeedingIt-Sync/qml/common/images/wmCloseIcon.png create mode 100644 FeedingIt-Sync/qml/common/images/wmEditIcon.png create mode 100644 FeedingIt-Sync/qml/common/images/wmTaskLauncherIcon.png create mode 100644 FeedingIt-Sync/qml/debug.log create mode 100644 FeedingIt-Sync/qml/feedSearch.js create mode 100644 FeedingIt-Sync/qml/i18n/FeedingIt.ts create mode 100644 FeedingIt-Sync/qml/i18n/qml_en.qm create mode 100644 FeedingIt-Sync/qml/i18n/qml_en.ts create mode 100644 FeedingIt-Sync/qml/main.qml create mode 100644 FeedingIt-Sync/qml/qml.qmlproject create mode 100644 FeedingIt-Sync/qml/qml.qmlproject.user create mode 100644 FeedingIt-Sync/qml/qml.qmlproject.user.2.3pre1 create mode 100644 FeedingIt-Sync/qml/qmlDev/AddFeed.qml create mode 100644 FeedingIt-Sync/qml/qmlDev/MainPage.qml create mode 100644 FeedingIt-Sync/qml/qmlDev/TextInputClear.qml create mode 100644 FeedingIt-Sync/qml/qmlDev/feedSearch.js create mode 100644 FeedingIt-Sync/qml/qmlDev/main.qml create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/README create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/changelog create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/compat create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/control create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/copyright create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/manifest.aegis create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/postinst create mode 100644 FeedingIt-Sync/qtc_packaging/debian_harmattan/postrm create mode 100755 FeedingIt-Sync/qtc_packaging/debian_harmattan/rules create mode 100644 FeedingIt-Sync/splash.jpg create mode 100644 FeedingIt-Sync/xml/feedingitsync.xml create mode 100644 FeedingIt-Sync/xml/service/feedingitsync.xml create mode 100644 FeedingIt-Sync/xml/settings/feedingitsync.desktop create mode 100644 FeedingIt-Sync/xml/settings/feedingitsync.xml create mode 100644 FeedingIt-Sync/xml/sync/feedingitsync.xml create mode 100644 FeedingIt-Sync/xml/ui/feedingitsyncui.xml delete mode 100644 psa_harmattan/feedingit/MANIFEST.in delete mode 100644 psa_harmattan/feedingit/README.assistant delete mode 100644 psa_harmattan/feedingit/__init__.py delete mode 100644 psa_harmattan/feedingit/build-deb.log delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/.pc/.quilt_patches delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/.pc/.quilt_series delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/.pc/.version delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/MANIFEST.in delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/README.assistant delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/__init__.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/build-deb.log delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/build/scripts-2.6/feedingit delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/changelog delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/compat delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/control delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit.debhelper.log delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit.postinst.debhelper delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit.prerm.debhelper delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit.substvars delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/control delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/md5sums delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/postinst delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/prerm delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/bin/feedingit delete mode 120000 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/lib/python2.6/dist-packages/feedingit-0.1.0.egg-info delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/applications/feedingit.desktop delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/dbus-1/services/feedingit_status.service delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/doc/feedingit/changelog.Debian.gz delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/BeautifulSoup.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/XmlHandler.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/__init__.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/config.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/debugging.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/download.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/feedingit.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/feedparser.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/httpprogresshandler.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/jobmanager.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/mainthread.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/opml.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/ArticleDisplay.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/ArticleViewer.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/Articles.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/Categories.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/FeedingIt.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/Feeds.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/MainPage.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/TestWebview.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/AddCat.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/AddFeed.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/Button.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/ConfirmationMessage.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/LineInput.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/ManageSubs.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/Menu.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/Slider.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/Switch.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/ToolBar.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/AppletCloseButton.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/InputMethodShiftButtonNormal.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/Zoom-In-icon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/checkmark.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/delete.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/feedingit.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/lineedit.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/lineedit.sci delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/loading.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/loading2.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/plus.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/rotate.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/toolbutton.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/toolbutton.sci delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/wmBackIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/wmCloseIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/wmEditIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common/images/wmTaskLauncherIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/i18n/FeedingIt.ts delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/i18n/qml_en.qm delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/i18n/qml_en.ts delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/main.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/rss_sqlite.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/update_feeds.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/updatedbus.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/wc.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/pyshared/feedingit-0.1.0.egg-info delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/python/runtime.d/feedingit.rtupdate delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/files delete mode 100755 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/rules delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/source/format delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.aegis delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.base64 delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.desktop delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.longdesc delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit.psa delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/feedingit_status.service delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/BeautifulSoup.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/XmlHandler.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/__init__.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/config.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/debugging.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/download.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/feedingit.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/feedparser.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/httpprogresshandler.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/jobmanager.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/mainthread.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/opml.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/opml_lib.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/rss_sqlite.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/update_feeds.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/updatedbus.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/wc.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/ArticleDisplay.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/ArticleViewer.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/Articles.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/Categories.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/FeedingIt.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/FeedingitUI.qmlproject delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/FeedingitUI.qmlproject.user delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/Feeds.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/MainPage.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/TestWebview.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/AddCat.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/AddFeed.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/Button.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/ConfirmationMessage.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/LineInput.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/ManageSubs.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/Menu.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/Slider.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/Switch.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/ToolBar.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/.directory delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/AppletCloseButton.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/InputMethodShiftButtonNormal.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/Zoom-In-icon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/checkmark.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/delete.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/feedingit.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/lineedit.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/lineedit.sci delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/loading.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/loading2.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/plus.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/rotate.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/toolbutton.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/toolbutton.sci delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/wmBackIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/wmCloseIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/wmEditIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/common/images/wmTaskLauncherIcon.png delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/debug.log delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/i18n/FeedingIt.ts delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/i18n/qml_en.qm delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/i18n/qml_en.ts delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/main.qml delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/setup.py delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/stdeb.cfg delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.debian.tar.gz delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.dsc delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_all.deb delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_i386.changes delete mode 100644 psa_harmattan/feedingit/deb_dist/feedingit_0.1.0.orig.tar.gz delete mode 100644 psa_harmattan/feedingit/feedingit delete mode 100644 psa_harmattan/feedingit/feedingit.aegis delete mode 100644 psa_harmattan/feedingit/feedingit.base64 delete mode 100644 psa_harmattan/feedingit/feedingit.desktop delete mode 100644 psa_harmattan/feedingit/feedingit.longdesc delete mode 100644 psa_harmattan/feedingit/feedingit.png delete mode 100644 psa_harmattan/feedingit/feedingit.psa delete mode 100644 psa_harmattan/feedingit/feedingit_status.service delete mode 100644 psa_harmattan/feedingit/pysrc/BeautifulSoup.py delete mode 100644 psa_harmattan/feedingit/pysrc/XmlHandler.py delete mode 100644 psa_harmattan/feedingit/pysrc/__init__.py delete mode 100644 psa_harmattan/feedingit/pysrc/config.py delete mode 100644 psa_harmattan/feedingit/pysrc/debugging.py delete mode 100644 psa_harmattan/feedingit/pysrc/download.py delete mode 100644 psa_harmattan/feedingit/pysrc/eventfeed.py delete mode 100644 psa_harmattan/feedingit/pysrc/feedingit.py delete mode 100644 psa_harmattan/feedingit/pysrc/feedparser.py delete mode 100644 psa_harmattan/feedingit/pysrc/httpprogresshandler.py delete mode 100644 psa_harmattan/feedingit/pysrc/jobmanager.py delete mode 100644 psa_harmattan/feedingit/pysrc/mainthread.py delete mode 100644 psa_harmattan/feedingit/pysrc/opml.py delete mode 100644 psa_harmattan/feedingit/pysrc/opml_lib.py delete mode 100644 psa_harmattan/feedingit/pysrc/rss_sqlite.py delete mode 100644 psa_harmattan/feedingit/pysrc/update_feeds.py delete mode 100644 psa_harmattan/feedingit/pysrc/updatedbus.py delete mode 100644 psa_harmattan/feedingit/pysrc/wc.py delete mode 100644 psa_harmattan/feedingit/qml/AddFeed.qml delete mode 100644 psa_harmattan/feedingit/qml/ArticleDisplay.qml delete mode 100644 psa_harmattan/feedingit/qml/ArticleViewer.qml delete mode 100644 psa_harmattan/feedingit/qml/Articles.qml delete mode 100644 psa_harmattan/feedingit/qml/AutomaticUpdate.qml delete mode 100644 psa_harmattan/feedingit/qml/Categories.qml delete mode 100644 psa_harmattan/feedingit/qml/FeedingIt.qml delete mode 100644 psa_harmattan/feedingit/qml/FeedingitUI.qmlproject delete mode 100644 psa_harmattan/feedingit/qml/FeedingitUI.qmlproject.user delete mode 100644 psa_harmattan/feedingit/qml/Feeds.qml delete mode 100644 psa_harmattan/feedingit/qml/MainPage.qml delete mode 100644 psa_harmattan/feedingit/qml/Settings.qml delete mode 100644 psa_harmattan/feedingit/qml/SettingsPage.qml delete mode 100644 psa_harmattan/feedingit/qml/SliderSetting.qml delete mode 100644 psa_harmattan/feedingit/qml/SwitchSetting.qml delete mode 100644 psa_harmattan/feedingit/qml/TestWebview.qml delete mode 100644 psa_harmattan/feedingit/qml/TextInputClear.qml delete mode 100644 psa_harmattan/feedingit/qml/common/AddCat.qml delete mode 100644 psa_harmattan/feedingit/qml/common/AddFeed.qml delete mode 100644 psa_harmattan/feedingit/qml/common/Button.qml delete mode 100644 psa_harmattan/feedingit/qml/common/ConfirmationMessage.qml delete mode 100644 psa_harmattan/feedingit/qml/common/LineInput.qml delete mode 100644 psa_harmattan/feedingit/qml/common/ManageSubs.qml delete mode 100644 psa_harmattan/feedingit/qml/common/Menu.qml delete mode 100644 psa_harmattan/feedingit/qml/common/Slider.qml delete mode 100644 psa_harmattan/feedingit/qml/common/Switch.qml delete mode 100644 psa_harmattan/feedingit/qml/common/ToolBar.qml delete mode 100644 psa_harmattan/feedingit/qml/common/images/.directory delete mode 100644 psa_harmattan/feedingit/qml/common/images/AppletCloseButton.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/InputMethodShiftButtonNormal.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/Zoom-In-icon.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/checkmark.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/delete.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/feedingit.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/lineedit.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/lineedit.sci delete mode 100644 psa_harmattan/feedingit/qml/common/images/loading.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/loading2.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/plus.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/rotate.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/toolbutton.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/toolbutton.sci delete mode 100644 psa_harmattan/feedingit/qml/common/images/wmBackIcon.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/wmCloseIcon.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/wmEditIcon.png delete mode 100644 psa_harmattan/feedingit/qml/common/images/wmTaskLauncherIcon.png delete mode 100644 psa_harmattan/feedingit/qml/debug.log delete mode 100644 psa_harmattan/feedingit/qml/feedSearch.js delete mode 100644 psa_harmattan/feedingit/qml/i18n/FeedingIt.ts delete mode 100644 psa_harmattan/feedingit/qml/i18n/qml_en.qm delete mode 100644 psa_harmattan/feedingit/qml/i18n/qml_en.ts delete mode 100644 psa_harmattan/feedingit/qml/main.qml delete mode 100644 psa_harmattan/feedingit/qml/qml.qmlproject delete mode 100644 psa_harmattan/feedingit/setup.py delete mode 100644 psa_harmattan/feedingit/splash.jpg delete mode 100644 psa_harmattan/feedingit/stdeb.cfg diff --git a/FeedingIt-Sync/FeedingIt-Sync.pro b/FeedingIt-Sync/FeedingIt-Sync.pro new file mode 100644 index 0000000..4688f9b --- /dev/null +++ b/FeedingIt-Sync/FeedingIt-Sync.pro @@ -0,0 +1,164 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2012-01-15T12:50:44 +# +#------------------------------------------------- + +QT += network dbus + +QT -= gui + +TARGET = feedingitsync-client +TEMPLATE = lib + +DEFINES += FEEDINGITSYNC_LIBRARY + +SOURCES += feedingitsync.cpp + +HEADERS += feedingitsync.h\ + FeedingIt-Sync_global.h + +CONFIG += debug plugin meegotouchevents +#PKGCONFIG += gconf-2.0 glib-2.0 + +INCLUDEPATH += . \ + /usr/include/gq \ + /usr/include/libsynccommon \ + /usr/include/libsyncprofile + +LIBS += -lsyncpluginmgr -lsyncprofile -lgq-gconf + +#install +target.path = /usr/lib/sync/ + +client.path = /etc/sync/profiles/client +client.files = xml/feedingitsync.xml + +sync.path = /etc/sync/profiles/sync +sync.files = xml/sync/* + +service.path = /etc/sync/profiles/service +service.files = xml/service/* + +settingsdesktop.path = /usr/share/duicontrolpanel/desktops +settingsdesktop.files = xml/settings/feedingitsync.desktop + +settingsxml.path = /usr/share/duicontrolpanel/uidescriptions +settingsxml.files = xml/settings/feedingitsync.xml + +pysrc.path = /usr/share/feedingit +pysrc.files = pysrc/*.py splash.jpg + +qmlfiles.path = /usr/share/feedingit/qml +qmlfiles.files = qml/* + +dbusfiles.path = /usr/share/dbus-1/services +dbusfiles.files = dbus/* + +icon.path = /usr/share/icons/hicolor/80x80/apps +icon.files = feedingit.png + +desktopfiles.path = /usr/share/applications +desktopfiles.files = feedingit.desktop + +binfile.path = /usr/bin/ +binfile.files = feedingit + +INSTALLS += target client sync service settingsdesktop settingsxml pysrc qmlfiles dbusfiles icon desktopfiles binfile + + +OTHER_FILES += \ + qtc_packaging/debian_harmattan/rules \ + qtc_packaging/debian_harmattan/README \ + qtc_packaging/debian_harmattan/manifest.aegis \ + qtc_packaging/debian_harmattan/copyright \ + qtc_packaging/debian_harmattan/control \ + qtc_packaging/debian_harmattan/compat \ + qtc_packaging/debian_harmattan/changelog \ + xml/service/feedingitsync.xml \ + xml/sync/feedingitsync.xml \ + xml/settings/feedingitsync.xml \ + xml/settings/feedingitsync.desktop \ + xml/feedingitsync.xml \ + qtc_packaging/debian_harmattan/postinst \ + qtc_packaging/debian_harmattan/postrm \ + splash.jpg \ + feedingit \ + feedingit.desktop \ + feedingit.png \ + qml/qml.qmlproject.user.2.3pre1 \ + qml/FeedingitUI.qmlproject \ + qml/debug.log \ + qml/qml.qmlproject.user \ + qml/qml.qmlproject \ + qml/feedSearch.js \ + qml/FeedingitUI.qmlproject.user \ + qml/Articles.qml \ + qml/ArticleDisplay.qml \ + qml/ArticleDelegate.qml \ + qml/AddFeed.qml \ + qml/TextInputClear.qml \ + qml/TestWebview.qml \ + qml/SwitchSetting.qml \ + qml/SliderSetting.qml \ + qml/SettingsPage.qml \ + qml/Settings.qml \ + qml/FeedingIt.qml \ + qml/Categories.qml \ + qml/AutomaticUpdate.qml \ + qml/ArticleViewer.qml \ + qml/MainPage.qml \ + qml/main.qml \ + qml/Feeds.qml \ + qml/common/ToolBar.qml \ + qml/common/Switch.qml \ + qml/common/Slider.qml \ + qml/common/Menu.qml \ + qml/common/ManageSubs.qml \ + qml/common/LineInput.qml \ + qml/common/ConfirmationMessage.qml \ + qml/common/Button.qml \ + qml/common/AddFeed.qml \ + qml/common/AddCat.qml \ + qml/common/images/Zoom-In-icon.png \ + qml/common/images/wmTaskLauncherIcon.png \ + qml/common/images/wmEditIcon.png \ + qml/common/images/wmCloseIcon.png \ + qml/common/images/wmBackIcon.png \ + qml/common/images/toolbutton.sci \ + qml/common/images/toolbutton.png \ + qml/common/images/rotate.png \ + qml/common/images/plus.png \ + qml/common/images/loading2.png \ + qml/common/images/loading.png \ + qml/common/images/lineedit.sci \ + qml/common/images/lineedit.png \ + qml/common/images/InputMethodShiftButtonNormal.png \ + qml/common/images/feedingit.png \ + qml/common/images/delete.png \ + qml/common/images/checkmark.png \ + qml/common/images/AppletCloseButton.png \ + qml/i18n/qml_en.ts \ + qml/i18n/qml_en.qm \ + qml/i18n/FeedingIt.ts \ + pysrc/XmlHandler.py \ + pysrc/wc.py \ + pysrc/httpprogresshandler.py \ + pysrc/jobmanager.py \ + pysrc/mainthread.py \ + pysrc/opml.py \ + pysrc/opml_lib.py \ + pysrc/rss_sqlite.py \ + pysrc/update_feeds.py \ + pysrc/updatedbus.py \ + pysrc/feedparser.py \ + pysrc/feedingitdbus.py \ + pysrc/feedingit.py \ + pysrc/eventfeed.py \ + pysrc/download.py \ + pysrc/debugging.py \ + pysrc/config.py \ + pysrc/BeautifulSoup.py \ + pysrc/__init__.py \ + dbus/feedingit_status.service \ + dbus/feedingit.service diff --git a/FeedingIt-Sync/FeedingIt-Sync.pro.user b/FeedingIt-Sync/FeedingIt-Sync.pro.user new file mode 100644 index 0000000..c2f9efe --- /dev/null +++ b/FeedingIt-Sync/FeedingIt-Sync.pro.user @@ -0,0 +1,599 @@ + + + + + + ProjectExplorer.Project.ActiveTarget + 1 + + + ProjectExplorer.Project.EditorSettings + + true + false + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + true + 1 + true + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Qt4ProjectManager.Target.DesktopTarget + 0 + 0 + 0 + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-32bit.gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Qt in PATH Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + /home/ymarcoz/workspace/FeedingIt-Sync-build-desktop-Qt_in_PATH_Release + 4 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-32bit.gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Qt in PATH Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/ymarcoz/workspace/FeedingIt-Sync-build-desktop-Qt_in_PATH_Debug + 4 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-32bit.gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Desktop Qt for GCC (Qt SDK) Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + /home/ymarcoz/workspace/FeedingIt-Sync-build-desktop-Desktop_Qt_for_GCC__Qt_SDK__Release + 12 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-32bit.gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Desktop Qt for GCC (Qt SDK) Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/ymarcoz/workspace/FeedingIt-Sync-build-desktop-Desktop_Qt_for_GCC__Qt_SDK__Debug + 12 + true + + 4 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + No deployment + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + + + false + false + false + false + false + false + false + false + true + true + 0.01 + 0.01 + 10 + 10 + true + true + 25 + 25 + + + true + true + valgrind + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 2 + + false + + %{buildDir} + Custom Executable + + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + true + + 1 + + + + ProjectExplorer.Project.Target.1 + + Harmattan + Harmattan + Qt4ProjectManager.Target.HarmattanDeviceTarget + 0 + 0 + 0 + + Qt4ProjectManager.ToolChain.Maemo:/home/ymarcoz/QtSDK/Madde/targets/harmattan_10.2011.34-1/bin/gcc.arm-linux-generic-elf-32bit./home/ymarcoz/QtSDK/pythongdb/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Harmattan Target (Qt SDK) Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + /home/ymarcoz/workspace/FeedingIt-Sync-build-harmattan-Harmattan_Target__Qt_SDK__Release + 27 + true + + + Qt4ProjectManager.ToolChain.Maemo:/home/ymarcoz/QtSDK/Madde/targets/harmattan_10.2011.34-1/bin/gcc.arm-linux-generic-elf-32bit./home/ymarcoz/QtSDK/pythongdb/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Harmattan Target (Qt SDK) Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/ymarcoz/workspace/FeedingIt-Sync-build-harmattan-Harmattan_Target__Qt_SDK__Debug + 27 + true + + 2 + + + + Create Debian Package + + MaemoDebianPackageCreationStep + + + + Install Debian package to sysroot + MaemoInstallDebianPackageToSysrootStep + + + Deploy Debian package via SFTP upload + + MaemoUploadAndInstallDpkgPackageStep + + /home/ymarcoz/workspace/FeedingIt-Sync-build-harmattan-Harmattan_Target__Qt_SDK__Release/feedingit_0.2.0_armel.deb + /home/ymarcoz/workspace/FeedingIt-Sync-build-harmattan-Harmattan_Target__Qt_SDK__Release/feedingit-sync_0.0.1_armel.deb + + + 192.168.1.136 + 192.168.1.136 + + + + + + + 2012-01-29T23:04:37 + 2012-01-22T10:43:40 + + + 3 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Build Debian Package and Install to Harmattan Device + + DeployToHarmattan + 16 + + 1 + + true + true + + + false + false + false + false + false + false + false + false + true + true + 0.01 + 0.01 + 10 + 10 + true + true + 25 + 25 + + + true + true + valgrind + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 2 + + false + + %{buildDir} + Custom Executable + + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + + 1 + + + + ProjectExplorer.Project.TargetCount + 2 + + + ProjectExplorer.Project.Updater.EnvironmentId + {6449687d-a4d3-4afc-95ac-89e1027ef47e} + + + ProjectExplorer.Project.Updater.FileVersion + 10 + + diff --git a/FeedingIt-Sync/FeedingIt-Sync_global.h b/FeedingIt-Sync/FeedingIt-Sync_global.h new file mode 100644 index 0000000..823ed79 --- /dev/null +++ b/FeedingIt-Sync/FeedingIt-Sync_global.h @@ -0,0 +1,12 @@ +#ifndef FEEDINGITSYNC_GLOBAL_H +#define FEEDINGITSYNC_GLOBAL_H + +#include + +#if defined(FEEDINGITSYNC_LIBRARY) +# define FEEDINGITSYNCSHARED_EXPORT Q_DECL_EXPORT +#else +# define FEEDINGITSYNCSHARED_EXPORT Q_DECL_IMPORT +#endif + +#endif // FEEDINGITSYNC_GLOBAL_H diff --git a/FeedingIt-Sync/dbus/feedingit.service b/FeedingIt-Sync/dbus/feedingit.service new file mode 100644 index 0000000..1e47b05 --- /dev/null +++ b/FeedingIt-Sync/dbus/feedingit.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.maemo.feedingit +Exec=invoker --single-instance --splash=/usr/share/feedingit/splash.jpg --type=e /usr/bin/python /usr/share/feedingit/feedingit.py diff --git a/FeedingIt-Sync/dbus/feedingit_status.service b/FeedingIt-Sync/dbus/feedingit_status.service new file mode 100644 index 0000000..cef9213 --- /dev/null +++ b/FeedingIt-Sync/dbus/feedingit_status.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.marcoz.feedingit +Exec=/usr/bin/feedingit dbus diff --git a/FeedingIt-Sync/feedingit b/FeedingIt-Sync/feedingit new file mode 100644 index 0000000..698f459 --- /dev/null +++ b/FeedingIt-Sync/feedingit @@ -0,0 +1,16 @@ +#!/bin/sh + +case "$1" in +update) + dbus-send --print-reply --dest='org.marcoz.feedingit' --session /org/marcoz/feedingit/update org.marcoz.feedingit.UpdateAll + ;; +dbus) + nice python /usr/share/feedingit/update_feeds.py --daemon + ;; +*) + cd /usr/share/feedingit + python feedingit.py 2>&1 >/dev/null + ;; + +esac + diff --git a/FeedingIt-Sync/feedingit-sync.desktop b/FeedingIt-Sync/feedingit-sync.desktop new file mode 100644 index 0000000..f2c3ff6 --- /dev/null +++ b/FeedingIt-Sync/feedingit-sync.desktop @@ -0,0 +1,19 @@ +[Desktop Entry] +Type=ControlPanelApplet +Name=FeedingIt Updates +X-logical-id=feedingitsync +X-translation-catalog=feedingitsynccatalog +Icon= +X-Maemo-Service=com.nokia.DuiControlPanel +X-Maemo-Method=com.nokia.DuiControlPanelIf.appletPage +X-Maemo-Object-Path=/ +# this has to be identical to the value in Name +X-Maemo-Fixed-Args=FeedingIt Updates + +[DUI] +X-DUIApplet-Applet=libdeclarative.so + +[DCP] +Category=Events Feed +Order=100 +Part=feedingitsyncui.xml diff --git a/FeedingIt-Sync/feedingit.desktop b/FeedingIt-Sync/feedingit.desktop new file mode 100644 index 0000000..95bf65c --- /dev/null +++ b/FeedingIt-Sync/feedingit.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=1.0 +Type=Application +Name=FeedingIt RSS Reader +Exec=invoker --single-instance --splash=/usr/share/feedingit/splash.jpg --type=e /usr/bin/python /usr/share/feedingit/feedingit.py +Icon=/usr/share/icons/hicolor/80x80/apps/feedingit.png +Categories=Network;News; diff --git a/FeedingIt-Sync/feedingit.png b/FeedingIt-Sync/feedingit.png new file mode 100644 index 0000000000000000000000000000000000000000..efa8b66fc4012a0021f1afe9f120e4ac54e14da0 GIT binary patch literal 5743 zcmV-#7Le(QP)Wc4JY%4V5@UfQZZB zMlz2RUrF9blyRMyH;!*i-ei`gP8lDHH^r6ei^5ddxQw8qs2S8MXxP|${)HuM=opEmR< z#a1ui1wY{FuY8h@gH2MsuFp2lXOpjZ*$Y_neG|D-m0B?PeDaj~bOeeSqXz&8? z0`QAlrAO>m`!q{J#0JL>w~^4#y0STz_qlxY%a^iwr0!KSz;8W_g3s!c zZvg@|LOC2Evn@!)AQ?j!d^YstxfjE-n?FHKIUP2@ul%YG_lEU-!vXj&51NI|_2$03OG8f{f`jCmBW<>Xx;Vt6 zbnWgIi@$WKc;rC823 zyC?GTZ(Nc1)llaQ3Gk+S@?*!V^+Xy|*`uI*>`ruD0&zxN`RE`|7~1|A=z!2kUNWK(oc$IdQYf2fUT|EtWlU~Gfz z?r_I6{ogC7s?Y{0P^j)Dt{>EU2g`Mh!5ED;8lzR1jHZ87EyBMdj9W=*Bc+89GK^^* z1oJewzOEOldkNGpt2{OcV9fECWcv)G9;h}3tpftTKqj)DBT{QQuJIL)9J7tXGrLG7 z`%r;J5ZJiBgX=r&XdlNb?|zgmo%87mrefJqEGu$QKxX?OmGqYYRRF78_{L>Dlg7le zo8E0lj#fsD(Wt;fs18nP{t*jK{5j(??RcFj9M?t%7RHwt*TQ%f+LZ`lkVzLSRY25v zh_ zTzLGqm_O|qWMHGSDf~AlfD-r`C?-?f3JFFFRCk=9BMt$eAlll=q{B9_YP*NlVP!2X zCv@#mvYs3=W)*IMy3dsMRRN4z?nS$LG$Rer7){{jn3lPpt7d-}%XQGZ#u9juu&OIn zXC-hd{9IWJ8UwF@aio*wLTA43L&i#EsLi?E8TeAcRHusc|+r7r~v3l zZ*IXKS@mhHh^jyE&kH_7N=QVu84!r#T}=@l5`;EokfPXqGE_sv02b)+ef;GA-H0)8 z>Bq)kS)tnEu?UMUn#P$kcC+;UH_7`ANNJ5|BUA9fk={I@8lXjRdchqzfJQ4KYBRT9 z@>$Z@7%w%b%@-wrrqXo{rqp$zUvxG{#4f+8GuGBqWX_~{h}*LO9$g6L)8h8jTa*8=OAPZ z)w340^L|jl0M{)-G?Z0Wsw?%_ULN?}r;%0+g~jbZ-^0sl8x;>p?8)Pc40x{r~V=UEiQhjY(@fx0lb){Q`BifS?G^2D|lJ zIIaJN)wB@Va6Zn2uM(N^Ai{}&1;Q%AvOq{v+=jUn5@gaNhz7j0<8Lqslu}quoNXO- zeD&V#{P2<2stOyAMY#Ej=_ITyN(Hr-%@|zYAn{wP0519V&PJpCj2CFMt}Xd~p0kho zH;y@M7q(7^8n?k}oQKu;*X6?bzR$DIK8uQ+fYq`jgeUufQT$w))R z91#tWsRC=>{1htixoln?H~f#2_|l@oNr*0duYiyaFTde%>-S!)8c9t)W-N=&uE+QC zXsv37=z3aMxO4jfieOg3t5tmp-|gf2IbX*P(ip6;@K&h6%5K@ue)cok+S&kUYir}d zho2l$afo7)pc}G0^5Q%^UB}cT0xp<48GutxoWLD7&*ZdYe0(j2UzelmI!8*0UD!PLun2_X{Bh1ujROLJ3uA+;T5;qeZE|nGtM}ps&J=I z3;OFiQSHh?8icK|(m5X6{8@~Fh4YTAx;~YR@x?38br z3ND*}IDwlh1}%nPRxi*Pqgu-VF)FEQtp5Tp&nHj47e}Z1l_UDqWZb9Fxraj4oN@}w zmoI1W;>G;x;oF%$;qjrBS4<|=!>V;>kkc&)>G1XY-r&K>naBSTk5EICu#y1c$_iuaok)IOektm`ZF;3 zE6{ykKy_V*?)@Q{pqkqNkTTWB^P4Br>9&TCziAzIs;vlH-gEfU9c!yv-4l*KoO5T! z2|O31!%tSfTcy-lCr?EAZcU9zpftwlM1=xXLe&J&=hP$Dk+k~9o~HC?Kr$*!R6PGT z&%$%2apuXb+wxnw6 zR0n~^Xca31)LO-c?ZQeiv2hE%*+jM4DpY5R@EDLxg$hgmE=`BXXpXl#8rZVubhHXs zaMsvC@qmjzHW{s441zzuldn25DQGhmB`g5AqKPhEwO4q7Xk>SKfMU6+bsOG97`+jj+c zen7+t<0F%g8H-YXKv)jhJ{2}R#d~KO6KJgvdU%l&V?t)oufV9*24jYoBmog=s#RBl zSmC-uDX`?q<)lG41-c6nUfw<%Q|yWVa?M+V3i9ZhO}M@YyEa;M~a% zqTP0s3fQz=bL(ACv*nHV=(P`K^N6)7bWQ$trNqU$uv5wv~r$9N()5s$;+^>M(Db-sI1C9UPTLyp-Q!;H$}{f za>K`d%{Aw)VA<*gtlG4Yl`jUYd~q$7G-xcOjDRp0t!YXbGL8KJ|GaG{1rID+lZu1m z^ha}d?a3CEG&~m$=V&Y!iU74Xogo(^ zt(Cxd5v<-O9LMAOIjgw(oJU!<`mb2|`a%NINXteSUnVg+;P?sEb>#2=v@?tuYDGh` z`o_E3d(g%VyAG5xWCkUGhyq44yzeu-)p0b*x;&=6xW@>DWvW$H8q$@oVo-O-XweU` zxKHOI$ZUpK#N)cZe1fazKhE8&&gb#hFG0&9NTrz6+FX^ZO>cCBmAwi$dVDq9wmrS& zQO$5niXt;g0F|i$AoxL)-du#F3^2+r&S8jhG^HvqPKAq}wKc_w$BkjbpL@|pV3g17Q;)97?<<>j z*8~t*WJakDguJN%pfRv%dkbeYWKq2~rXn0=q^KSXS6#>uDx_M416pX+6G3!laN-`< z&3cM!&t1ixzdnZ*8!ln%dr7wK%<|X^-3V!iuY=)p)@jFOrltS53jri z@=$7p4LKP8Jb@7wzuqvDoa6R)T?Vwk`$|=#lgdtZ{pt&{>(M3 zy!l!#o_;?ZK$t{@XG7k@rwb67hl^-pDV-PYnbH?S&@TsBSNkg7Y4yof0)Bp z{`w)zo(4=H`xQ7a8dLrmE4BltH}~es1A%H#-4S>-gOm2S{>-Pj?z|`X?#lTrUw;uw z)Um5u^10hyAs$)FS<{>7?h7zj!*}0ep0%z3XbgR|xG+FLrTFdoW0*I7H~y}42%|AFgu|DA_F3fkE~MihxB`b5H=9!Iuu_=^Fk~`$8xzy~{Dsqtb!@HW)YwvEa9)6- z0)?GiV_U{(J!q_Oz}A+X$Q>(YbKSfbFs~OMwJ51@Q0WGAsQ1#CRH^U)O;73Mr8ma2 zV*PnYThvtdmCUw;5q5G76cxDqwi%s5I_-km2iQhf{NR~S@aK*?^ti5mCHecW{}^I_ z`SUQ!En9M!u`aj#nt7PUzleIBOuZa=kZ9Z?li+gHv|%={pv)dFQn9ux&&DS{g)j(_nxy`qIcK zupeTl+rlN^{2Xm5MQ~IXMwxzqL%4K#vS~PRwW67$vzV!!T(PhT6L=gA^#E zYX<=oPI8SUMi8J5rwDfUP2l{mf0>oev%9&@KY$DLO{La-x&{9^;g ztNlT65m8vjcN1;x;r3sg$#+(L0%W}UX{He}+k%PX5}i-~Xi-yXU)5dgSY~-@@Z3%9 zCIrHYux9gYX5RD_zW2(Bn7?SlK5ZAy*xcSb+50f7(WP)~7HiIXJoa`Ab8fkjJ62x? zR$^4(LAY#+9m_1Q+*hT*^KX24Qg_>Ho8H-@<*2P+VhqLvL}f3Z{K%7BIsYZb)EDq} zB#7s2RIh{XbO<0*)9X zb^W-LrmnpGwDKhMpqCBjEq?gbciY-e9{o2pP4O|afHA2(oHc0!=g#;&$F_8msn3&) z`^4h`N=v%35q5UQd24qA&uu=2XE#r0+nx!&CJC)w6+c>JUH*g*IVGM^rrKC4@xUqo}qaEENyg z4BS7cvWO&`|2>t6cUz@GJ?b zM7%qaY~DY>M{hepJMqkly7~ZH^lWu6*m`;p*<_>jB zCm`L>v~lcl=Uua}^Y#hwftxUq)c6HW^|9=SsXmN4&{QAGMpEM!>~AHv{nl`+?wIv< zG(B-qOD3BAFeovdfR;=&8%s}gn^jx_v>_esilmNM{N%EajqVbll{Wv{ zXIhlobz9(eT+o;I%8Sr`5LTfrEkc`&N4o83)1y|j;qRZgYxcoggtpS=Ub)h;EV)Fv z-Amkj_w?SpIi#0CPQ`_e#_Ko8X#Krf>1Au~J^#OE8RVht>}%Id(O%CNgF@#;p6eb` z3voxH(JnjIxLii+zWL-`a}S+`xc6pfU$f>!qrEvsxigJ&r)occRNxmfUV!j|P@$zI z-$!yO_=tnC?O3~X;@gB3-6X8&%R)xhJbCxrLw_mw{n`9$pJ^&Won>^;iqT19R1$O& ztrN!Rm@z7DjE-VdwDc~9kd}wATp^?@gq0UU7LYOrvQG%B4+PM literal 0 HcmV?d00001 diff --git a/FeedingIt-Sync/feedingitsync.cpp b/FeedingIt-Sync/feedingitsync.cpp new file mode 100644 index 0000000..ffee563 --- /dev/null +++ b/FeedingIt-Sync/feedingitsync.cpp @@ -0,0 +1,199 @@ +#include "feedingitsync.h" + +#include +#include +#include +#include +#include +#include +#include + +extern "C" EventsExample* createPlugin(const QString& aPluginName, + const Buteo::SyncProfile& aProfile, + Buteo::PluginCbInterface *aCbInterface) +{ + QFile file("/home/user/out.txt"); + file.open(QIODevice::WriteOnly | QIODevice::Text); + + QTextStream out(&file); + out << "create plugin \n"; + file.close(); + return new EventsExample(aPluginName, aProfile, aCbInterface); +} + +extern "C" void destroyPlugin(EventsExample*aClient) +{ + delete aClient; +} + +EventsExample::EventsExample(const QString& aPluginName, + const Buteo::SyncProfile& aProfile, + Buteo::PluginCbInterface *aCbInterface) : + ClientPlugin(aPluginName, aProfile, aCbInterface) +{ + FUNCTION_CALL_TRACE; +} + +EventsExample::~EventsExample() +{ + FUNCTION_CALL_TRACE; +} + +bool EventsExample::init() +{ + FUNCTION_CALL_TRACE; + QFile file("/home/user/out.txt"); + file.open(QIODevice::WriteOnly | QIODevice::Text); + + QTextStream out(&file); + out << "init plugin \n"; + file.close(); + //The sync profiles can have some specific key/value pairs this info + //can be accessed by this method. + iProperties = iProfile.allNonStorageKeys(); + + //return false - if error + //syncfw will call this method first if the plugin is able to initialize properly + //and its ready for sync it should return 'true' in case of any error return false. + return true; +} + +bool EventsExample::uninit() +{ + FUNCTION_CALL_TRACE; + // called before unloading the plugin , the plugin should clean up + return true; +} + +bool EventsExample::startSync() +{ + FUNCTION_CALL_TRACE; + + // This method is called after init(), the plugin is expected to return + // either true or false based on if the sync was started successfully or + // it failed for some reason + //call appropriate slots based on the status of operation success/failed... + + // Create a new GConfItem object + GConfItem *boolItem = new GConfItem("/apps/ControlPanel/FeedingIt/EnableUpdates"); + if (!boolItem->value().isValid()) { + boolItem->set(false); + } + + // Read value + if (boolItem->value().toBool()) { + GConfItem *updateFreq = new GConfItem("/apps/ControlPanel/FeedingIt/UpdateFrequency"); + + if (!updateFreq->value().isValid()) { + updateFreq->set(4); + } + GConfItem *runsItem = new GConfItem("/apps/ControlPanel/FeedingIt/NumberOfRuns"); + if (!runsItem->value().isValid()) { + runsItem->set(0); + } + runsItem->set(runsItem->value().toInt()+1); + if (runsItem->value().toInt() >= updateFreq->value().toInt()) { + QDBusInterface feedingitdbus("org.marcoz.feedingit", "/org/marcoz/feedingit/update", "org.marcoz.feedingit"); + feedingitdbus.call("UpdateAll"); + runsItem->set(0); + } + } + QTimer::singleShot(60000, this, SLOT(syncSuccess())); + + return true; +} + +void EventsExample::abortSync(Sync::SyncStatus aStatus) +{ + FUNCTION_CALL_TRACE; + Q_UNUSED(aStatus); + // This method is called if used cancels the + // sync in between , with the applet use case + // it should not ideally happen as there is no UI + // in case of device sync and accounts sync we have + // a cancel button +} + +bool EventsExample::cleanUp() +{ + FUNCTION_CALL_TRACE; + + // this method is called in case of account being deleted + // or the profile being deleted from UI in case of applet + // it will not be called ....need to check as if there + // can be any use case for this + return true; +} + +Buteo::SyncResults EventsExample::getSyncResults() const +{ + FUNCTION_CALL_TRACE; + return iResults; +} + +void EventsExample::connectivityStateChanged(Sync::ConnectivityType aType, + bool aState) +{ + FUNCTION_CALL_TRACE; + // This function notifies of the plugin of any connectivity related state changes + LOG_DEBUG("Received connectivity change event:" << aType << " changed to " << aState); + if ((aType == Sync::CONNECTIVITY_INTERNET) && (aState == false)) { + // Network disconnect!! + } +} + +void EventsExample::syncSuccess() +{ + FUNCTION_CALL_TRACE; + updateResults(Buteo::SyncResults(QDateTime::currentDateTime(), Buteo::SyncResults::SYNC_RESULT_SUCCESS, Buteo::SyncResults::NO_ERROR)); + //Notify Sync FW of result - Now sync fw will call uninit and then will unload plugin + emit success(getProfileName(), "Success!!"); +} + +void EventsExample::syncFailed() +{ + FUNCTION_CALL_TRACE; + //Notify Sync FW of result - Now sync fw will call uninit and then will unload plugin + updateResults(Buteo::SyncResults(QDateTime::currentDateTime(), + Buteo::SyncResults::SYNC_RESULT_FAILED, Buteo::SyncResults::ABORTED)); + emit error(getProfileName(), "Error!!", Buteo::SyncResults::SYNC_RESULT_FAILED); +} + +void EventsExample::updateResults(const Buteo::SyncResults &aResults) +{ + FUNCTION_CALL_TRACE; + iResults = aResults; + iResults.setScheduled(true); +} + +void EventsExample::updateFeed() +{ + FUNCTION_CALL_TRACE; + + GConfItem *boolItem = new GConfItem("/apps/ControlPanel/FeedingIt/EnableFeed"); + + // Read value + if (boolItem->value().toBool()) { + bool success = false; + //Ok assuming that we now have the data that needs to be updated to event feed + qlonglong id = MEventFeed::instance()->addItem(QString("icon-m-transfer-sync"), + QString("Update Started"), + QString("Event Feed updated"), + QStringList(), + QDateTime::currentDateTime(), + QString(), + false, + QUrl(), + QString("FeedingIt"), + QString("FeedingIt RSS Reader")); + if (id != -1) { + success = true; + } + if(success) + syncSuccess(); + else + syncFailed(); + } else { + syncSuccess(); + } +} diff --git a/FeedingIt-Sync/feedingitsync.h b/FeedingIt-Sync/feedingitsync.h new file mode 100644 index 0000000..aaafa3b --- /dev/null +++ b/FeedingIt-Sync/feedingitsync.h @@ -0,0 +1,47 @@ +#ifndef FEEDINGITSYNC_H +#define FEEDINGITSYNC_H + +#include "FeedingIt-Sync_global.h" + +#include +#include +#include + +class EventsExample : public Buteo::ClientPlugin +{ + Q_OBJECT; +public: + EventsExample( const QString& aPluginName, + const Buteo::SyncProfile& aProfile, + Buteo::PluginCbInterface *aCbInterface ); + + virtual ~EventsExample(); + virtual bool init(); + virtual bool uninit(); + virtual bool startSync(); + virtual void abortSync(Sync::SyncStatus aStatus = Sync::SYNC_ABORTED); + virtual Buteo::SyncResults getSyncResults() const; + virtual bool cleanUp(); + +public slots: + virtual void connectivityStateChanged( Sync::ConnectivityType aType, + bool aState ); + +protected slots: + void syncSuccess(); + void syncFailed(); + void updateFeed(); +private: + void updateResults(const Buteo::SyncResults &aResults); +private: + QMap iProperties; + Buteo::SyncResults iResults; +}; + +extern "C" EventsExample* createPlugin( const QString& aPluginName, + const Buteo::SyncProfile& aProfile, + Buteo::PluginCbInterface *aCbInterface ); + +extern "C" void destroyPlugin( EventsExample *aClient ); + +#endif // FEEDINGITSYNC_H diff --git a/FeedingIt-Sync/pysrc/BeautifulSoup.py b/FeedingIt-Sync/pysrc/BeautifulSoup.py new file mode 100644 index 0000000..4b17b85 --- /dev/null +++ b/FeedingIt-Sync/pysrc/BeautifulSoup.py @@ -0,0 +1,2014 @@ +"""Beautiful Soup +Elixir and Tonic +"The Screen-Scraper's Friend" +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup parses a (possibly invalid) XML or HTML document into a +tree representation. It provides methods and Pythonic idioms that make +it easy to navigate, search, and modify the tree. + +A well-formed XML/HTML document yields a well-formed data +structure. An ill-formed XML/HTML document yields a correspondingly +ill-formed data structure. If your document is only locally +well-formed, you can use this library to find and process the +well-formed part of it. + +Beautiful Soup works with Python 2.2 and up. It has no external +dependencies, but you'll have more success at converting data to UTF-8 +if you also install these three packages: + +* chardet, for auto-detecting character encodings + http://chardet.feedparser.org/ +* cjkcodecs and iconv_codec, which add more encodings to the ones supported + by stock Python. + http://cjkpython.i18n.org/ + +Beautiful Soup defines classes for two main parsing strategies: + + * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific + language that kind of looks like XML. + + * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid + or invalid. This class has web browser-like heuristics for + obtaining a sensible parse tree in the face of common HTML errors. + +Beautiful Soup also defines a class (UnicodeDammit) for autodetecting +the encoding of an HTML or XML document, and converting it to +Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: +http://www.crummy.com/software/BeautifulSoup/documentation.html + +Here, have some legalese: + +Copyright (c) 2004-2010, Leonard Richardson + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the the Beautiful Soup Consortium and All + Night Kosher Bakery nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT. + +""" +from __future__ import generators + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "3.2.0" +__copyright__ = "Copyright (c) 2004-2010 Leonard Richardson" +__license__ = "New-style BSD" + +from sgmllib import SGMLParser, SGMLParseError +import codecs +import markupbase +import types +import re +import sgmllib +try: + from htmlentitydefs import name2codepoint +except ImportError: + name2codepoint = {} +try: + set +except NameError: + from sets import Set as set + +#These hacks make Beautiful Soup able to parse XML with namespaces +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') +markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match + +DEFAULT_OUTPUT_ENCODING = "utf-8" + +def _match_css_class(str): + """Build a RE to match the given CSS class.""" + return re.compile(r"(^|.*\s)%s($|\s)" % str) + +# First, the classes that represent markup elements. + +class PageElement(object): + """Contains the navigational information for some part of the page + (either a tag or a piece of text)""" + + def setup(self, parent=None, previous=None): + """Sets up the initial relations between this element and + other elements.""" + self.parent = parent + self.previous = previous + self.next = None + self.previousSibling = None + self.nextSibling = None + if self.parent and self.parent.contents: + self.previousSibling = self.parent.contents[-1] + self.previousSibling.nextSibling = self + + def replaceWith(self, replaceWith): + oldParent = self.parent + myIndex = self.parent.index(self) + if hasattr(replaceWith, "parent")\ + and replaceWith.parent is self.parent: + # We're replacing this element with one of its siblings. + index = replaceWith.parent.index(replaceWith) + if index and index < myIndex: + # Furthermore, it comes before this element. That + # means that when we extract it, the index of this + # element will change. + myIndex = myIndex - 1 + self.extract() + oldParent.insert(myIndex, replaceWith) + + def replaceWithChildren(self): + myParent = self.parent + myIndex = self.parent.index(self) + self.extract() + reversedChildren = list(self.contents) + reversedChildren.reverse() + for child in reversedChildren: + myParent.insert(myIndex, child) + + def extract(self): + """Destructively rips this element out of the tree.""" + if self.parent: + try: + del self.parent.contents[self.parent.index(self)] + except ValueError: + pass + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + lastChild = self._lastRecursiveChild() + nextElement = lastChild.next + + if self.previous: + self.previous.next = nextElement + if nextElement: + nextElement.previous = self.previous + self.previous = None + lastChild.next = None + + self.parent = None + if self.previousSibling: + self.previousSibling.nextSibling = self.nextSibling + if self.nextSibling: + self.nextSibling.previousSibling = self.previousSibling + self.previousSibling = self.nextSibling = None + return self + + def _lastRecursiveChild(self): + "Finds the last element beneath this object to be parsed." + lastChild = self + while hasattr(lastChild, 'contents') and lastChild.contents: + lastChild = lastChild.contents[-1] + return lastChild + + def insert(self, position, newChild): + if isinstance(newChild, basestring) \ + and not isinstance(newChild, NavigableString): + newChild = NavigableString(newChild) + + position = min(position, len(self.contents)) + if hasattr(newChild, 'parent') and newChild.parent is not None: + # We're 'inserting' an element that's already one + # of this object's children. + if newChild.parent is self: + index = self.index(newChild) + if index > position: + # Furthermore we're moving it further down the + # list of this object's children. That means that + # when we extract this element, our target index + # will jump down one. + position = position - 1 + newChild.extract() + + newChild.parent = self + previousChild = None + if position == 0: + newChild.previousSibling = None + newChild.previous = self + else: + previousChild = self.contents[position-1] + newChild.previousSibling = previousChild + newChild.previousSibling.nextSibling = newChild + newChild.previous = previousChild._lastRecursiveChild() + if newChild.previous: + newChild.previous.next = newChild + + newChildsLastElement = newChild._lastRecursiveChild() + + if position >= len(self.contents): + newChild.nextSibling = None + + parent = self + parentsNextSibling = None + while not parentsNextSibling: + parentsNextSibling = parent.nextSibling + parent = parent.parent + if not parent: # This is the last element in the document. + break + if parentsNextSibling: + newChildsLastElement.next = parentsNextSibling + else: + newChildsLastElement.next = None + else: + nextChild = self.contents[position] + newChild.nextSibling = nextChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + newChildsLastElement.next = nextChild + + if newChildsLastElement.next: + newChildsLastElement.next.previous = newChildsLastElement + self.contents.insert(position, newChild) + + def append(self, tag): + """Appends the given tag to the contents of this tag.""" + self.insert(len(self.contents), tag) + + def findNext(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears after this Tag in the document.""" + return self._findOne(self.findAllNext, name, attrs, text, **kwargs) + + def findAllNext(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.nextGenerator, + **kwargs) + + def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears after this Tag in the document.""" + return self._findOne(self.findNextSiblings, name, attrs, text, + **kwargs) + + def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.nextSiblingGenerator, **kwargs) + fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x + + def findPrevious(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears before this Tag in the document.""" + return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) + + def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.previousGenerator, + **kwargs) + fetchPrevious = findAllPrevious # Compatibility with pre-3.x + + def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears before this Tag in the document.""" + return self._findOne(self.findPreviousSiblings, name, attrs, text, + **kwargs) + + def findPreviousSiblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.previousSiblingGenerator, **kwargs) + fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x + + def findParent(self, name=None, attrs={}, **kwargs): + """Returns the closest parent of this Tag that matches the given + criteria.""" + # NOTE: We can't use _findOne because findParents takes a different + # set of arguments. + r = None + l = self.findParents(name, attrs, 1) + if l: + r = l[0] + return r + + def findParents(self, name=None, attrs={}, limit=None, **kwargs): + """Returns the parents of this Tag that match the given + criteria.""" + + return self._findAll(name, attrs, None, limit, self.parentGenerator, + **kwargs) + fetchParents = findParents # Compatibility with pre-3.x + + #These methods do the real heavy lifting. + + def _findOne(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _findAll(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if isinstance(name, SoupStrainer): + strainer = name + # (Possibly) special case some findAll*(...) searches + elif text is None and not limit and not attrs and not kwargs: + # findAll*(True) + if name is True: + return [element for element in generator() + if isinstance(element, Tag)] + # findAll*('tag-name') + elif isinstance(name, basestring): + return [element for element in generator() + if isinstance(element, Tag) and + element.name == name] + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + # Build a SoupStrainer + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + results = ResultSet(strainer) + g = generator() + while True: + try: + i = g.next() + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These Generators can be used to navigate starting from both + #NavigableStrings and Tags. + def nextGenerator(self): + i = self + while i is not None: + i = i.next + yield i + + def nextSiblingGenerator(self): + i = self + while i is not None: + i = i.nextSibling + yield i + + def previousGenerator(self): + i = self + while i is not None: + i = i.previous + yield i + + def previousSiblingGenerator(self): + i = self + while i is not None: + i = i.previousSibling + yield i + + def parentGenerator(self): + i = self + while i is not None: + i = i.parent + yield i + + # Utility methods + def substituteEncoding(self, str, encoding=None): + encoding = encoding or "utf-8" + return str.replace("%SOUP-ENCODING%", encoding) + + def toEncoding(self, s, encoding=None): + """Encodes an object to a string in some encoding, or to Unicode. + .""" + if isinstance(s, unicode): + if encoding: + s = s.encode(encoding) + elif isinstance(s, str): + if encoding: + s = s.encode(encoding) + else: + s = unicode(s) + else: + if encoding: + s = self.toEncoding(str(s), encoding) + else: + s = unicode(s) + return s + +class NavigableString(unicode, PageElement): + + def __new__(cls, value): + """Create a new NavigableString. + + When unpickling a NavigableString, this method is called with + the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be + passed in to the superclass's __new__ or the superclass won't know + how to handle non-ASCII characters. + """ + if isinstance(value, unicode): + return unicode.__new__(cls, value) + return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) + + def __getnewargs__(self): + return (NavigableString.__str__(self),) + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) + + def __unicode__(self): + return str(self).decode(DEFAULT_OUTPUT_ENCODING) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + if encoding: + return self.encode(encoding) + else: + return self + +class CData(NavigableString): + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class ProcessingInstruction(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + output = self + if "%SOUP-ENCODING%" in output: + output = self.substituteEncoding(output, encoding) + return "" % self.toEncoding(output, encoding) + +class Comment(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Declaration(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Tag(PageElement): + + """Represents a found HTML tag with its attributes and contents.""" + + def _invert(h): + "Cheap function to invert a hash." + i = {} + for k,v in h.items(): + i[v] = k + return i + + XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'", + "quot" : '"', + "amp" : "&", + "lt" : "<", + "gt" : ">" } + + XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS) + + def _convertEntities(self, match): + """Used in a call to re.sub to replace HTML, XML, and numeric + entities with the appropriate Unicode characters. If HTML + entities are being converted, any unrecognized entities are + escaped.""" + x = match.group(1) + if self.convertHTMLEntities and x in name2codepoint: + return unichr(name2codepoint[x]) + elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS: + if self.convertXMLEntities: + return self.XML_ENTITIES_TO_SPECIAL_CHARS[x] + else: + return u'&%s;' % x + elif len(x) > 0 and x[0] == '#': + # Handle numeric entities + if len(x) > 1 and x[1] == 'x': + return unichr(int(x[2:], 16)) + else: + return unichr(int(x[1:])) + + elif self.escapeUnrecognizedEntities: + return u'&%s;' % x + else: + return u'&%s;' % x + + def __init__(self, parser, name, attrs=None, parent=None, + previous=None): + "Basic constructor." + + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected + self.parserClass = parser.__class__ + self.isSelfClosing = parser.isSelfClosingTag(name) + self.name = name + if attrs is None: + attrs = [] + elif isinstance(attrs, dict): + attrs = attrs.items() + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + self.containsSubstitutions = False + self.convertHTMLEntities = parser.convertHTMLEntities + self.convertXMLEntities = parser.convertXMLEntities + self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities + + # Convert any HTML, XML, or numeric entities in the attribute values. + convert = lambda(k, val): (k, + re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", + self._convertEntities, + val)) + self.attrs = map(convert, self.attrs) + + def getString(self): + if (len(self.contents) == 1 + and isinstance(self.contents[0], NavigableString)): + return self.contents[0] + + def setString(self, string): + """Replace the contents of the tag with a string""" + self.clear() + self.append(string) + + string = property(getString, setString) + + def getText(self, separator=u""): + if not len(self.contents): + return u"" + stopNode = self._lastRecursiveChild().next + strings = [] + current = self.contents[0] + while current is not stopNode: + if isinstance(current, NavigableString): + strings.append(current.strip()) + current = current.next + return separator.join(strings) + + text = property(getText) + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self._getAttrMap().get(key, default) + + def clear(self): + """Extract all children.""" + for child in self.contents[:]: + child.extract() + + def index(self, element): + for i, child in enumerate(self.contents): + if child is element: + return i + raise ValueError("Tag.index: element not in tag") + + def has_key(self, key): + return self._getAttrMap().has_key(key) + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the tag, + and throws an exception if it's not there.""" + return self._getAttrMap()[key] + + def __iter__(self): + "Iterating over a tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __nonzero__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self._getAttrMap() + self.attrMap[key] = value + found = False + for i in range(0, len(self.attrs)): + if self.attrs[i][0] == key: + self.attrs[i] = (key, value) + found = True + if not found: + self.attrs.append((key, value)) + self._getAttrMap()[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + for item in self.attrs: + if item[0] == key: + self.attrs.remove(item) + #We don't break because bad HTML can define the same + #attribute multiple times. + self._getAttrMap() + if self.attrMap.has_key(key): + del self.attrMap[key] + + def __call__(self, *args, **kwargs): + """Calling a tag like a function is the same as calling its + findAll() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return apply(self.findAll, args, kwargs) + + def __getattr__(self, tag): + #print "Getattr %s.%s" % (self.__class__, tag) + if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: + return self.find(tag[:-3]) + elif tag.find('__') != 0: + return self.find(tag) + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag) + + def __eq__(self, other): + """Returns true iff this tag has the same name, the same attributes, + and the same contents (recursively) as the given tag. + + NOTE: right now this will return false if two tags have the + same attributes in a different order. Should this be fixed?""" + if other is self: + return True + if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): + return False + for i in range(0, len(self.contents)): + if self.contents[i] != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this tag is not identical to the other tag, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): + """Renders this tag as a string.""" + return self.__str__(encoding) + + def __unicode__(self): + return self.__str__(None) + + BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" + + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)" + + ")") + + def _sub_entity(self, x): + """Used with a regular expression to substitute the + appropriate XML entity for an XML special character.""" + return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";" + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Returns a string or Unicode representation of this tag and + its contents. To get Unicode, pass None for encoding. + + NOTE: since Python's HTML parser consumes whitespace, this + method is not certain to reproduce the whitespace present in + the original string.""" + + encodedName = self.toEncoding(self.name, encoding) + + attrs = [] + if self.attrs: + for key, val in self.attrs: + fmt = '%s="%s"' + if isinstance(val, basestring): + if self.containsSubstitutions and '%SOUP-ENCODING%' in val: + val = self.substituteEncoding(val, encoding) + + # The attribute value either: + # + # * Contains no embedded double quotes or single quotes. + # No problem: we enclose it in double quotes. + # * Contains embedded single quotes. No problem: + # double quotes work here too. + # * Contains embedded double quotes. No problem: + # we enclose it in single quotes. + # * Embeds both single _and_ double quotes. This + # can't happen naturally, but it can happen if + # you modify an attribute value after parsing + # the document. Now we have a bit of a + # problem. We solve it by enclosing the + # attribute in single quotes, and escaping any + # embedded single quotes to XML entities. + if '"' in val: + fmt = "%s='%s'" + if "'" in val: + # TODO: replace with apos when + # appropriate. + val = val.replace("'", "&squot;") + + # Now we're okay w/r/t quotes. But the attribute + # value might also contain angle brackets, or + # ampersands that aren't part of entities. We need + # to escape those to XML entities too. + val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val) + + attrs.append(fmt % (self.toEncoding(key, encoding), + self.toEncoding(val, encoding))) + close = '' + closeTag = '' + if self.isSelfClosing: + close = ' /' + else: + closeTag = '' % encodedName + + indentTag, indentContents = 0, 0 + if prettyPrint: + indentTag = indentLevel + space = (' ' * (indentTag-1)) + indentContents = indentTag + 1 + contents = self.renderContents(encoding, prettyPrint, indentContents) + if self.hidden: + s = contents + else: + s = [] + attributeString = '' + if attrs: + attributeString = ' ' + ' '.join(attrs) + if prettyPrint: + s.append(space) + s.append('<%s%s%s>' % (encodedName, attributeString, close)) + if prettyPrint: + s.append("\n") + s.append(contents) + if prettyPrint and contents and contents[-1] != "\n": + s.append("\n") + if prettyPrint and closeTag: + s.append(space) + s.append(closeTag) + if prettyPrint and closeTag and self.nextSibling: + s.append("\n") + s = ''.join(s) + return s + + def decompose(self): + """Recursively destroys the contents of this tree.""" + self.extract() + if len(self.contents) == 0: + return + current = self.contents[0] + while current is not None: + next = current.next + if isinstance(current, Tag): + del current.contents[:] + current.parent = None + current.previous = None + current.previousSibling = None + current.next = None + current.nextSibling = None + current = next + + def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): + return self.__str__(encoding, True) + + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Renders the contents of this tag as a string in the given + encoding. If encoding is None, returns a Unicode string..""" + s=[] + for c in self: + text = None + if isinstance(c, NavigableString): + text = c.__str__(encoding) + elif isinstance(c, Tag): + s.append(c.__str__(encoding, prettyPrint, indentLevel)) + if text and prettyPrint: + text = text.strip() + if text: + if prettyPrint: + s.append(" " * (indentLevel-1)) + s.append(text) + if prettyPrint: + s.append("\n") + return ''.join(s) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, text=None, + **kwargs): + """Return only the first child of this Tag matching the given + criteria.""" + r = None + l = self.findAll(name, attrs, recursive, text, 1, **kwargs) + if l: + r = l[0] + return r + findChild = find + + def findAll(self, name=None, attrs={}, recursive=True, text=None, + limit=None, **kwargs): + """Extracts a list of Tag objects that match the given + criteria. You can specify the name of the Tag and any + attributes you want the Tag to have. + + The value of a key-value pair in the 'attrs' map can be a + string, a list of strings, a regular expression object, or a + callable that takes a string and returns whether or not the + string matches for some custom definition of 'matches'. The + same is true of the tag name.""" + generator = self.recursiveChildGenerator + if not recursive: + generator = self.childGenerator + return self._findAll(name, attrs, text, limit, generator, **kwargs) + findChildren = findAll + + # Pre-3.x compatibility methods + first = find + fetch = findAll + + def fetchText(self, text=None, recursive=True, limit=None): + return self.findAll(text=text, recursive=recursive, limit=limit) + + def firstText(self, text=None, recursive=True): + return self.find(text=text, recursive=recursive) + + #Private methods + + def _getAttrMap(self): + """Initializes a map representation of this tag's attributes, + if not already initialized.""" + if not getattr(self, 'attrMap'): + self.attrMap = {} + for (key, value) in self.attrs: + self.attrMap[key] = value + return self.attrMap + + #Generator methods + def childGenerator(self): + # Just use the iterator from the contents + return iter(self.contents) + + def recursiveChildGenerator(self): + if not len(self.contents): + raise StopIteration + stopNode = self._lastRecursiveChild().next + current = self.contents[0] + while current is not stopNode: + yield current + current = current.next + + +# Next, a couple classes to represent queries and their results. +class SoupStrainer: + """Encapsulates a number of ways of matching a markup element (tag or + text).""" + + def __init__(self, name=None, attrs={}, text=None, **kwargs): + self.name = name + if isinstance(attrs, basestring): + kwargs['class'] = _match_css_class(attrs) + attrs = None + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + self.attrs = attrs + self.text = text + + def __str__(self): + if self.text: + return self.text + else: + return "%s|%s" % (self.name, self.attrs) + + def searchTag(self, markupName=None, markupAttrs={}): + found = None + markup = None + if isinstance(markupName, Tag): + markup = markupName + markupAttrs = markup + callFunctionWithTagData = callable(self.name) \ + and not isinstance(markupName, Tag) + + if (not self.name) \ + or callFunctionWithTagData \ + or (markup and self._matches(markup, self.name)) \ + or (not markup and self._matches(markupName, self.name)): + if callFunctionWithTagData: + match = self.name(markupName, markupAttrs) + else: + match = True + markupAttrMap = None + for attr, matchAgainst in self.attrs.items(): + if not markupAttrMap: + if hasattr(markupAttrs, 'get'): + markupAttrMap = markupAttrs + else: + markupAttrMap = {} + for k,v in markupAttrs: + markupAttrMap[k] = v + attrValue = markupAttrMap.get(attr) + if not self._matches(attrValue, matchAgainst): + match = False + break + if match: + if markup: + found = markup + else: + found = markupName + return found + + def search(self, markup): + #print 'looking for %s in %s' % (self, markup) + found = None + # If given a list of items, scan it for a text element that + # matches. + if hasattr(markup, "__iter__") \ + and not isinstance(markup, Tag): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.text: + found = self.searchTag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isinstance(markup, basestring): + if self._matches(markup, self.text): + found = markup + else: + raise Exception, "I don't know how to match against a %s" \ + % markup.__class__ + return found + + def _matches(self, markup, matchAgainst): + #print "Matching %s against %s" % (markup, matchAgainst) + result = False + if matchAgainst is True: + result = markup is not None + elif callable(matchAgainst): + result = matchAgainst(markup) + else: + #Custom match methods take the tag as an argument, but all + #other ways of matching match the tag name as a string. + if isinstance(markup, Tag): + markup = markup.name + if markup and not isinstance(markup, basestring): + markup = unicode(markup) + #Now we know that chunk is either a string, or None. + if hasattr(matchAgainst, 'match'): + # It's a regexp object. + result = markup and matchAgainst.search(markup) + elif hasattr(matchAgainst, '__iter__'): # list-like + result = markup in matchAgainst + elif hasattr(matchAgainst, 'items'): + result = markup.has_key(matchAgainst) + elif matchAgainst and isinstance(markup, basestring): + if isinstance(markup, unicode): + matchAgainst = unicode(matchAgainst) + else: + matchAgainst = str(matchAgainst) + + if not result: + result = matchAgainst == markup + return result + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + def __init__(self, source): + list.__init__([]) + self.source = source + +# Now, some helper functions. + +def buildTagMap(default, *args): + """Turns a list of maps, lists, or scalars into a single map. + Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and + NESTING_RESET_TAGS maps out of lists and partial maps.""" + built = {} + for portion in args: + if hasattr(portion, 'items'): + #It's a map. Merge it. + for k,v in portion.items(): + built[k] = v + elif hasattr(portion, '__iter__'): # is a list + #It's a list. Map each item to the default. + for k in portion: + built[k] = default + else: + #It's a scalar. Map it to the default. + built[portion] = default + return built + +# Now, the parser classes. + +class BeautifulStoneSoup(Tag, SGMLParser): + + """This class contains the basic parser and search code. It defines + a parser that knows nothing about tag behavior except for the + following: + + You can't close a tag without closing all the tags it encloses. + That is, "" actually means + "". + + [Another possible explanation is "", but since + this class defines no SELF_CLOSING_TAGS, it will never use that + explanation.] + + This class is useful for parsing XML or made-up markup languages, + or when BeautifulSoup makes an assumption counter to what you were + expecting.""" + + SELF_CLOSING_TAGS = {} + NESTABLE_TAGS = {} + RESET_NESTING_TAGS = {} + QUOTE_TAGS = {} + PRESERVE_WHITESPACE_TAGS = [] + + MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), + lambda x: x.group(1) + ' />'), + (re.compile(']*)>'), + lambda x: '') + ] + + ROOT_TAG_NAME = u'[document]' + + HTML_ENTITIES = "html" + XML_ENTITIES = "xml" + XHTML_ENTITIES = "xhtml" + # TODO: This only exists for backwards-compatibility + ALL_ENTITIES = XHTML_ENTITIES + + # Used when determining whether a text node is all whitespace and + # can be replaced with a single space. A text node that contains + # fancy Unicode spaces (usually non-breaking) should be left + # alone. + STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, } + + def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, + markupMassage=True, smartQuotesTo=XML_ENTITIES, + convertEntities=None, selfClosingTags=None, isHTML=False): + """The Soup object is initialized as the 'root tag', and the + provided markup (which can be a string or a file-like object) + is fed into the underlying parser. + + sgmllib will process most bad HTML, and the BeautifulSoup + class has some tricks for dealing with some HTML that kills + sgmllib, but Beautiful Soup can nonetheless choke or lose data + if your data uses self-closing tags or declarations + incorrectly. + + By default, Beautiful Soup uses regexes to sanitize input, + avoiding the vast majority of these problems. If the problems + don't apply to you, pass in False for markupMassage, and + you'll get better performance. + + The default parser massage techniques fix the two most common + instances of invalid HTML that choke sgmllib: + +
(No space between name of closing tag and tag close) + (Extraneous whitespace in declaration) + + You can pass in a custom list of (RE object, replace method) + tuples to get Beautiful Soup to scrub your input the way you + want.""" + + self.parseOnlyThese = parseOnlyThese + self.fromEncoding = fromEncoding + self.smartQuotesTo = smartQuotesTo + self.convertEntities = convertEntities + # Set the rules for how we'll deal with the entities we + # encounter + if self.convertEntities: + # It doesn't make sense to convert encoded characters to + # entities even while you're converting entities to Unicode. + # Just convert it all to Unicode. + self.smartQuotesTo = None + if convertEntities == self.HTML_ENTITIES: + self.convertXMLEntities = False + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = True + elif convertEntities == self.XHTML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = False + elif convertEntities == self.XML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + else: + self.convertXMLEntities = False + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + + self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) + SGMLParser.__init__(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + self.markup = markup + self.markupMassage = markupMassage + try: + self._feed(isHTML=isHTML) + except StopParsing: + pass + self.markup = None # The markup can now be GCed + + def convert_charref(self, name): + """This method fixes a bug in Python's SGMLParser.""" + try: + n = int(name) + except ValueError: + return + if not 0 <= n <= 127 : # ASCII ends at 127, not 255 + return + return self.convert_codepoint(n) + + def _feed(self, inDocumentEncoding=None, isHTML=False): + # Convert the document to Unicode. + markup = self.markup + if isinstance(markup, unicode): + if not hasattr(self, 'originalEncoding'): + self.originalEncoding = None + else: + dammit = UnicodeDammit\ + (markup, [self.fromEncoding, inDocumentEncoding], + smartQuotesTo=self.smartQuotesTo, isHTML=isHTML) + markup = dammit.unicode + self.originalEncoding = dammit.originalEncoding + self.declaredHTMLEncoding = dammit.declaredHTMLEncoding + if markup: + if self.markupMassage: + if not hasattr(self.markupMassage, "__iter__"): + self.markupMassage = self.MARKUP_MASSAGE + for fix, m in self.markupMassage: + markup = fix.sub(m, markup) + # TODO: We get rid of markupMassage so that the + # soup object can be deepcopied later on. Some + # Python installations can't copy regexes. If anyone + # was relying on the existence of markupMassage, this + # might cause problems. + del(self.markupMassage) + self.reset() + + SGMLParser.feed(self, markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def __getattr__(self, methodName): + """This method routes method call requests to either the SGMLParser + superclass or the Tag superclass, depending on the method name.""" + #print "__getattr__ called on %s.%s" % (self.__class__, methodName) + + if methodName.startswith('start_') or methodName.startswith('end_') \ + or methodName.startswith('do_'): + return SGMLParser.__getattr__(self, methodName) + elif not methodName.startswith('__'): + return Tag.__getattr__(self, methodName) + else: + raise AttributeError + + def isSelfClosingTag(self, name): + """Returns true iff the given string is the name of a + self-closing tag according to this parser.""" + return self.SELF_CLOSING_TAGS.has_key(name) \ + or self.instanceSelfClosingTags.has_key(name) + + def reset(self): + Tag.__init__(self, self, self.ROOT_TAG_NAME) + self.hidden = 1 + SGMLParser.reset(self) + self.currentData = [] + self.currentTag = None + self.tagStack = [] + self.quoteStack = [] + self.pushTag(self) + + def popTag(self): + tag = self.tagStack.pop() + + #print "Pop", tag.name + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + #print "Push", tag.name + if self.currentTag: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + + def endData(self, containerClass=NavigableString): + if self.currentData: + currentData = u''.join(self.currentData) + if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and + not set([tag.name for tag in self.tagStack]).intersection( + self.PRESERVE_WHITESPACE_TAGS)): + if '\n' in currentData: + currentData = '\n' + else: + currentData = ' ' + self.currentData = [] + if self.parseOnlyThese and len(self.tagStack) <= 1 and \ + (not self.parseOnlyThese.text or \ + not self.parseOnlyThese.search(currentData)): + return + o = containerClass(currentData) + o.setup(self.currentTag, self.previous) + if self.previous: + self.previous.next = o + self.previous = o + self.currentTag.contents.append(o) + + + def _popToTag(self, name, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. If inclusivePop is false, pops the tag + stack up to but *not* including the most recent instqance of + the given tag.""" + #print "Popping to %s" % name + if name == self.ROOT_TAG_NAME: + return + + numPops = 0 + mostRecentTag = None + for i in range(len(self.tagStack)-1, 0, -1): + if name == self.tagStack[i].name: + numPops = len(self.tagStack)-i + break + if not inclusivePop: + numPops = numPops - 1 + + for i in range(0, numPops): + mostRecentTag = self.popTag() + return mostRecentTag + + def _smartPop(self, name): + + """We need to pop up to the previous tag of this type, unless + one of this tag's nesting reset triggers comes between this + tag and the previous tag of this type, OR unless this tag is a + generic nesting trigger and another generic nesting trigger + comes between this tag and the previous tag of this type. + + Examples: +

FooBar *

* should pop to 'p', not 'b'. +

FooBar *

* should pop to 'table', not 'p'. +

Foo

Bar *

* should pop to 'tr', not 'p'. + +

    • *
    • * should pop to 'ul', not the first 'li'. +
  • ** should pop to 'table', not the first 'tr' + tag should + implicitly close the previous tag within the same
    ** should pop to 'tr', not the first 'td' + """ + + nestingResetTriggers = self.NESTABLE_TAGS.get(name) + isNestable = nestingResetTriggers != None + isResetNesting = self.RESET_NESTING_TAGS.has_key(name) + popTo = None + inclusive = True + for i in range(len(self.tagStack)-1, 0, -1): + p = self.tagStack[i] + if (not p or p.name == name) and not isNestable: + #Non-nestable tags get popped to the top or to their + #last occurance. + popTo = name + break + if (nestingResetTriggers is not None + and p.name in nestingResetTriggers) \ + or (nestingResetTriggers is None and isResetNesting + and self.RESET_NESTING_TAGS.has_key(p.name)): + + #If we encounter one of the nesting reset triggers + #peculiar to this tag, or we encounter another tag + #that causes nesting to reset, pop up to but not + #including that tag. + popTo = p.name + inclusive = False + break + p = p.parent + if popTo: + self._popToTag(popTo, inclusive) + + def unknown_starttag(self, name, attrs, selfClosing=0): + #print "Start tag %s: %s" % (name, attrs) + if self.quoteStack: + #This is not a real tag. + #print "<%s> is not real!" % name + attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs]) + self.handle_data('<%s%s>' % (name, attrs)) + return + self.endData() + + if not self.isSelfClosingTag(name) and not selfClosing: + self._smartPop(name) + + if self.parseOnlyThese and len(self.tagStack) <= 1 \ + and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): + return + + tag = Tag(self, name, attrs, self.currentTag, self.previous) + if self.previous: + self.previous.next = tag + self.previous = tag + self.pushTag(tag) + if selfClosing or self.isSelfClosingTag(name): + self.popTag() + if name in self.QUOTE_TAGS: + #print "Beginning quote (%s)" % name + self.quoteStack.append(name) + self.literal = 1 + return tag + + def unknown_endtag(self, name): + #print "End tag %s" % name + if self.quoteStack and self.quoteStack[-1] != name: + #This is not a real end tag. + #print " is not real!" % name + self.handle_data('' % name) + return + self.endData() + self._popToTag(name) + if self.quoteStack and self.quoteStack[-1] == name: + self.quoteStack.pop() + self.literal = (len(self.quoteStack) > 0) + + def handle_data(self, data): + self.currentData.append(data) + + def _toStringSubclass(self, text, subclass): + """Adds a certain piece of text to the tree as a NavigableString + subclass.""" + self.endData() + self.handle_data(text) + self.endData(subclass) + + def handle_pi(self, text): + """Handle a processing instruction as a ProcessingInstruction + object, possibly one with a %SOUP-ENCODING% slot into which an + encoding will be plugged later.""" + if text[:3] == "xml": + text = u"xml version='1.0' encoding='%SOUP-ENCODING%'" + self._toStringSubclass(text, ProcessingInstruction) + + def handle_comment(self, text): + "Handle comments as Comment objects." + self._toStringSubclass(text, Comment) + + def handle_charref(self, ref): + "Handle character references as data." + if self.convertEntities: + data = unichr(int(ref)) + else: + data = '&#%s;' % ref + self.handle_data(data) + + def handle_entityref(self, ref): + """Handle entity references as data, possibly converting known + HTML and/or XML entity references to the corresponding Unicode + characters.""" + data = None + if self.convertHTMLEntities: + try: + data = unichr(name2codepoint[ref]) + except KeyError: + pass + + if not data and self.convertXMLEntities: + data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref) + + if not data and self.convertHTMLEntities and \ + not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref): + # TODO: We've got a problem here. We're told this is + # an entity reference, but it's not an XML entity + # reference or an HTML entity reference. Nonetheless, + # the logical thing to do is to pass it through as an + # unrecognized entity reference. + # + # Except: when the input is "&carol;" this function + # will be called with input "carol". When the input is + # "AT&T", this function will be called with input + # "T". We have no way of knowing whether a semicolon + # was present originally, so we don't know whether + # this is an unknown entity or just a misplaced + # ampersand. + # + # The more common case is a misplaced ampersand, so I + # escape the ampersand and omit the trailing semicolon. + data = "&%s" % ref + if not data: + # This case is different from the one above, because we + # haven't already gone through a supposedly comprehensive + # mapping of entities to Unicode characters. We might not + # have gone through any mapping at all. So the chances are + # very high that this is a real entity, and not a + # misplaced ampersand. + data = "&%s;" % ref + self.handle_data(data) + + def handle_decl(self, data): + "Handle DOCTYPEs and the like as Declaration objects." + self._toStringSubclass(data, Declaration) + + def parse_declaration(self, i): + """Treat a bogus SGML declaration as raw data. Treat a CDATA + declaration as a CData object.""" + j = None + if self.rawdata[i:i+9] == '', i) + if k == -1: + k = len(self.rawdata) + data = self.rawdata[i+9:k] + j = k+3 + self._toStringSubclass(data, CData) + else: + try: + j = SGMLParser.parse_declaration(self, i) + except SGMLParseError: + toHandle = self.rawdata[i:] + self.handle_data(toHandle) + j = i + len(toHandle) + return j + +class BeautifulSoup(BeautifulStoneSoup): + + """This parser knows the following facts about HTML: + + * Some tags have no closing tag and should be interpreted as being + closed as soon as they are encountered. + + * The text inside some tags (ie. 'script') may contain tags which + are not really part of the document and which should be parsed + as text, not tags. If you want to parse the text as tags, you can + always fetch it and parse it explicitly. + + * Tag nesting rules: + + Most tags can't be nested at all. For instance, the occurance of + a

    tag should implicitly close the previous

    tag. + +

    Para1

    Para2 + should be transformed into: +

    Para1

    Para2 + + Some tags can be nested arbitrarily. For instance, the occurance + of a

    tag should _not_ implicitly close the previous +
    tag. + + Alice said:
    Bob said:
    Blah + should NOT be transformed into: + Alice said:
    Bob said:
    Blah + + Some tags can be nested, but the nesting is reset by the + interposition of other tags. For instance, a
    , + but not close a tag in another table. + +
    BlahBlah + should be transformed into: +
    BlahBlah + but, + Blah
    Blah + should NOT be transformed into + Blah
    Blah + + Differing assumptions about tag nesting rules are a major source + of problems with the BeautifulSoup class. If BeautifulSoup is not + treating as nestable a tag your page author treats as nestable, + try ICantBelieveItsBeautifulSoup, MinimalSoup, or + BeautifulStoneSoup before writing your own subclass.""" + + def __init__(self, *args, **kwargs): + if not kwargs.has_key('smartQuotesTo'): + kwargs['smartQuotesTo'] = self.HTML_ENTITIES + kwargs['isHTML'] = True + BeautifulStoneSoup.__init__(self, *args, **kwargs) + + SELF_CLOSING_TAGS = buildTagMap(None, + ('br' , 'hr', 'input', 'img', 'meta', + 'spacer', 'link', 'frame', 'base', 'col')) + + PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) + + QUOTE_TAGS = {'script' : None, 'textarea' : None} + + #According to the HTML standard, each of these inline tags can + #contain another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', + 'center') + + #According to the HTML standard, these block tags can contain + #another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del') + + #Lists can contain other lists, but there are restrictions. + NESTABLE_LIST_TAGS = { 'ol' : [], + 'ul' : [], + 'li' : ['ul', 'ol'], + 'dl' : [], + 'dd' : ['dl'], + 'dt' : ['dl'] } + + #Tables can contain other tables, but there are restrictions. + NESTABLE_TABLE_TAGS = {'table' : [], + 'tr' : ['table', 'tbody', 'tfoot', 'thead'], + 'td' : ['tr'], + 'th' : ['tr'], + 'thead' : ['table'], + 'tbody' : ['table'], + 'tfoot' : ['table'], + } + + NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre') + + #If one of these tags is encountered, all tags up to the next tag of + #this type are popped. + RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', + NON_NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, + NESTABLE_TABLE_TAGS) + + NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) + + # Used to detect the charset in a META tag; see start_meta + CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M) + + def start_meta(self, attrs): + """Beautiful Soup can detect a charset included in a META tag, + try to convert the document to that charset, and re-parse the + document from the beginning.""" + httpEquiv = None + contentType = None + contentTypeIndex = None + tagNeedsEncodingSubstitution = False + + for i in range(0, len(attrs)): + key, value = attrs[i] + key = key.lower() + if key == 'http-equiv': + httpEquiv = value + elif key == 'content': + contentType = value + contentTypeIndex = i + + if httpEquiv and contentType: # It's an interesting meta tag. + match = self.CHARSET_RE.search(contentType) + if match: + if (self.declaredHTMLEncoding is not None or + self.originalEncoding == self.fromEncoding): + # An HTML encoding was sniffed while converting + # the document to Unicode, or an HTML encoding was + # sniffed during a previous pass through the + # document, or an encoding was specified + # explicitly and it worked. Rewrite the meta tag. + def rewrite(match): + return match.group(1) + "%SOUP-ENCODING%" + newAttr = self.CHARSET_RE.sub(rewrite, contentType) + attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], + newAttr) + tagNeedsEncodingSubstitution = True + else: + # This is our first pass through the document. + # Go through it again with the encoding information. + newCharset = match.group(3) + if newCharset and newCharset != self.originalEncoding: + self.declaredHTMLEncoding = newCharset + self._feed(self.declaredHTMLEncoding) + raise StopParsing + pass + tag = self.unknown_starttag("meta", attrs) + if tag and tagNeedsEncodingSubstitution: + tag.containsSubstitutions = True + +class StopParsing(Exception): + pass + +class ICantBelieveItsBeautifulSoup(BeautifulSoup): + + """The BeautifulSoup class is oriented towards skipping over + common HTML errors like unclosed tags. However, sometimes it makes + errors of its own. For instance, consider this fragment: + + FooBar + + This is perfectly valid (if bizarre) HTML. However, the + BeautifulSoup class will implicitly close the first b tag when it + encounters the second 'b'. It will think the author wrote + "FooBar", and didn't close the first 'b' tag, because + there's no real-world reason to bold something that's already + bold. When it encounters '' it will close two more 'b' + tags, for a grand total of three tags closed instead of two. This + can throw off the rest of your document structure. The same is + true of a number of other tags, listed below. + + It's much more common for someone to forget to close a 'b' tag + than to actually use nested 'b' tags, and the BeautifulSoup class + handles the common case. This class handles the not-co-common + case: where you can't believe someone wrote what they did, but + it's valid HTML and BeautifulSoup screwed up by assuming it + wouldn't be.""" + + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ + ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', + 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', + 'big') + + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',) + + NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) + +class MinimalSoup(BeautifulSoup): + """The MinimalSoup class is for parsing HTML that contains + pathologically bad markup. It makes no assumptions about tag + nesting, but it does know which tags are self-closing, that +