From 9963c8ff47e3bc396c69ffa12d0b1573b8029b3e Mon Sep 17 00:00:00 2001 From: Tristan Matthews <tristan.matthews@savoirfairelinux.com> Date: Fri, 18 May 2012 17:28:25 -0400 Subject: [PATCH] * #11269: merged master into video --- NEWS | 2 + daemon/Makefile.am | 3 +- daemon/configure.ac | 2 +- daemon/src/account.cpp | 33 +- daemon/src/account.h | 10 +- daemon/src/audio/alsa/alsalayer.cpp | 37 +- daemon/src/audio/audiolayer.cpp | 13 +- daemon/src/audio/audiolayer.h | 8 +- daemon/src/audio/audioloop.cpp | 4 +- daemon/src/audio/audiorecord.cpp | 66 +- daemon/src/audio/audiorecorder.cpp | 16 +- daemon/src/audio/audiorecorder.h | 2 + .../src/audio/audiortp/audio_rtp_factory.cpp | 65 +- daemon/src/audio/audiortp/audio_rtp_factory.h | 26 +- .../audiortp/audio_rtp_record_handler.cpp | 128 +- .../audio/audiortp/audio_rtp_record_handler.h | 34 +- .../src/audio/audiortp/audio_rtp_session.cpp | 43 +- .../src/audio/audiortp/audio_srtp_session.cpp | 212 +- .../src/audio/audiortp/audio_srtp_session.h | 123 +- .../audiortp/audio_symmetric_rtp_session.cpp | 14 +- .../src/audio/audiortp/audio_zrtp_session.cpp | 23 +- .../audio/audiortp/zrtp_session_callback.cpp | 26 +- .../audio/audiortp/zrtp_session_callback.h | 2 +- daemon/src/audio/codecs/alaw.cpp | 56 +- daemon/src/audio/codecs/audiocodec.cpp | 55 +- daemon/src/audio/codecs/audiocodec.h | 41 +- daemon/src/audio/codecs/audiocodecfactory.cpp | 51 +- daemon/src/audio/codecs/g722.cpp | 448 ++- daemon/src/audio/codecs/g722.h | 68 +- daemon/src/audio/codecs/gsmcodec.cpp | 22 +- daemon/src/audio/codecs/speexcodec.h | 55 +- daemon/src/audio/codecs/speexcodec_nb.cpp | 2 +- daemon/src/audio/codecs/speexcodec_ub.cpp | 2 +- daemon/src/audio/codecs/speexcodec_wb.cpp | 2 +- daemon/src/audio/codecs/ulaw.cpp | 53 +- daemon/src/audio/echosuppress.cpp | 4 +- daemon/src/audio/gaincontrol.cpp | 2 +- daemon/src/audio/mainbuffer.cpp | 18 +- daemon/src/audio/pulseaudio/audiostream.cpp | 26 +- daemon/src/audio/pulseaudio/pulselayer.cpp | 156 +- daemon/src/audio/recordable.cpp | 2 +- daemon/src/audio/ringbuffer.cpp | 2 +- daemon/src/audio/samplerateconverter.cpp | 16 +- daemon/src/audio/samplerateconverter.h | 2 +- daemon/src/audio/sound/audiofile.cpp | 4 +- daemon/src/audio/speexechocancel.cpp | 2 +- daemon/src/config/sfl_config.cpp | 3 +- daemon/src/config/yamlemitter.cpp | 2 +- daemon/src/config/yamlnode.cpp | 25 +- daemon/src/config/yamlparser.cpp | 11 +- daemon/src/dbus/callmanager-introspec.xml | 19 + daemon/src/dbus/callmanager.cpp | 63 +- daemon/src/dbus/callmanager.h | 22 +- .../dbus/configurationmanager-introspec.xml | 10 +- daemon/src/dbus/configurationmanager.cpp | 6 +- daemon/src/history/history.cpp | 6 +- daemon/src/iax/iaxaccount.cpp | 4 +- daemon/src/iax/iaxvoiplink.cpp | 13 +- daemon/src/iax/iaxvoiplink.h | 3 +- daemon/src/logger.h | 17 +- daemon/src/managerimpl.cpp | 409 +-- daemon/src/managerimpl.h | 16 +- daemon/src/numbercleaner.cpp | 1 - daemon/src/sip/sdes_negotiator.cpp | 6 +- daemon/src/sip/sdes_negotiator.h | 8 +- daemon/src/sip/sdp.cpp | 4 +- daemon/src/sip/sip_utils.cpp | 3 +- daemon/src/sip/sipaccount.cpp | 82 +- daemon/src/sip/sipaccount.h | 15 + daemon/src/sip/siptransport.cpp | 84 +- daemon/src/video/libav_utils.cpp | 8 +- daemon/src/video/video_v4l2_list.cpp | 6 +- daemon/src/voiplink.cpp | 2 +- daemon/test/Makefile.am | 4 +- daemon/test/resamplertest.cpp | 230 ++ daemon/test/resamplertest.h | 153 + daemon/test/test_utils.h | 3 +- gnome/INSTALL | 365 -- gnome/configure.ac | 4 +- gnome/src/Makefile.am | 9 +- gnome/src/actions.c | 213 +- gnome/src/callable_obj.c | 41 +- gnome/src/callable_obj.h | 13 +- gnome/src/conference_obj.c | 35 +- gnome/src/config/accountconfigdialog.c | 31 +- gnome/src/config/accountlistconfigdialog.c | 4 +- gnome/src/config/addressbook-config.c | 9 +- gnome/src/config/assistant.c | 131 +- gnome/src/config/audioconf.c | 1 + gnome/src/contacts/addrbookfactory.c | 5 +- gnome/src/contacts/calllist.c | 76 +- gnome/src/contacts/calllist.h | 14 +- gnome/src/contacts/calltab.c | 8 +- gnome/src/contacts/calltree.c | 1260 +++---- gnome/src/contacts/calltree.h | 29 +- gnome/src/contacts/conferencelist.c | 42 +- gnome/src/contacts/history.c | 31 +- gnome/src/dbus/callmanager-introspec.xml | 21 +- .../dbus/configurationmanager-introspec.xml | 10 +- gnome/src/dbus/dbus.c | 247 +- gnome/src/dbus/dbus.h | 6 + gnome/src/logger.h | 11 +- gnome/src/main.c | 4 +- gnome/src/mainwindow.c | 1 + gnome/src/sflphone_const.h | 8 +- gnome/src/sliders.c | 16 +- gnome/src/uimanager.c | 120 +- gnome/src/widget/imwidget.c | 1 + kde/CMakeLists.txt | 7 +- kde/data/sflphone-client-kdeui.rc | 83 +- kde/doc/index.docbook | 2 +- kde/plasma/CMakeLists.txt | 3 +- kde/plasma/dataengine/sflphonEngine.cpp | 173 - kde/plasma/dataengine/sflphonEngine.h | 66 - kde/plasma/plasmoid-qml/CMakeLists.txt | 11 + .../package/contents/images/configure.svgz | Bin 0 -> 13090 bytes .../package/contents/images/contact.svg | 542 +++ .../package/contents/images/favorites.svg | 1286 +++++++ .../package/contents/images/history.svgz | Bin 0 -> 3656 bytes .../package/contents/images/phone.svg | 66 + .../package/contents/images/state/.directory | 3 + .../package/contents/images/state/busy.svg | 781 +++++ .../package/contents/images/state/call.svg | 488 +++ .../package/contents/images/state/current.svg | 737 ++++ .../package/contents/images/state/dial.svg | 546 +++ .../package/contents/images/state/fail.svg | 111 + .../package/contents/images/state/hang_up.svg | 772 ++++ .../package/contents/images/state/hold.svg | 818 +++++ .../contents/images/state/icon_accept.svg | 412 +++ .../contents/images/state/icon_unhold.svg | 441 +++ .../contents/images/state/incoming.svg | 184 + .../contents/images/state/new_call.svg | 844 +++++ .../contents/images/state/rec_call.svg | 1406 ++++++++ .../package/contents/images/state/record.svg | 1057 ++++++ .../package/contents/images/state/ring.svg | 999 ++++++ .../contents/images/state/transfert.svg | 892 +++++ .../package/contents/images/state/unhold.svg | 980 ++++++ .../contents/images/transfertarrow.svg | 133 + .../package/contents/ui/.TabBar.qml.kate-swp | Bin 0 -> 174 bytes .../package/contents/ui/BookmarkTab.qml | 153 + .../package/contents/ui/CallTab.qml | 399 +++ .../package/contents/ui/ContactTab.qml | 303 ++ .../package/contents/ui/DialPad.qml | 37 + .../package/contents/ui/HistoryTab.qml | 257 ++ .../contents/ui/ListSectiondelegate.qml | 24 + .../package/contents/ui/NumberOverlay.qml | 83 + .../package/contents/ui/Settingstab.qml | 154 + .../package/contents/ui/TabBar.qml | 99 + .../package/contents/ui/TransferOverlay.qml | 124 + .../plasmoid-qml/package/contents/ui/main.qml | 125 + .../plasmoid-qml/package/metadata.desktop | 21 + kde/plasma/plasmoid/CMakeLists.txt | 61 - kde/plasma/plasmoid/CallItem.cpp | 110 - kde/plasma/plasmoid/CallItem.h | 39 - kde/plasma/plasmoid/ConferenceItem.cpp | 39 - kde/plasma/plasmoid/ConferenceItem.h | 28 - kde/plasma/plasmoid/DialPage.cpp | 75 - kde/plasma/plasmoid/DialPage.h | 49 - kde/plasma/plasmoid/MainWidget.cpp | 160 - kde/plasma/plasmoid/MainWidget.h | 59 - kde/plasma/plasmoid/SFLPhonePlasmoid.cpp | 172 - kde/plasma/plasmoid/SFLPhonePlasmoid.h | 63 - kde/plasma/plasmoid/ViewItem.h | 12 - .../plasmoid/plasma-applet-sflphone.desktop | 16 - kde/plasma/plasmoid/sflphone-plasmoid.desktop | 15 - kde/src/AccountListModel.cpp | 3 +- kde/src/AccountView.cpp | 16 +- kde/src/AccountWizard.cpp | 23 +- kde/src/AccountWizard.h | 1 + kde/src/ActionSetAccountFirst.cpp | 2 +- kde/src/AkonadiBackend.h | 77 - kde/src/CMakeLists.txt | 105 +- kde/src/CallView.cpp | 52 +- kde/src/CallView.h | 4 +- kde/src/SFLPhone.cpp | 15 +- kde/src/SFLPhone.h | 3 +- kde/src/SFLPhoneView.cpp | 59 +- kde/src/SFLPhoneView.h | 8 +- kde/src/SFLPhoneapplication.h | 21 + kde/src/conf/ConfigAccountList.cpp | 26 +- kde/src/conf/ConfigAccountList.h | 20 + kde/src/conf/ConfigurationDialog.cpp | 45 +- kde/src/conf/ConfigurationDialog.h | 42 +- kde/src/conf/dlgaccounts.cpp | 107 +- kde/src/conf/dlgaccounts.h | 40 +- kde/src/conf/dlgaccountsbase.ui | 56 +- kde/src/conf/dlgaddressbook.cpp | 79 +- kde/src/conf/dlgaddressbook.h | 53 +- kde/src/conf/dlgaddressbookbase.ui | 177 +- kde/src/conf/dlgaudio.cpp | 55 +- kde/src/conf/dlgaudio.h | 42 +- kde/src/conf/dlgdisplay.cpp | 40 +- kde/src/conf/dlgdisplay.h | 40 +- kde/src/conf/dlggeneral.cpp | 55 +- kde/src/conf/dlggeneral.h | 45 +- kde/src/conf/dlghooks.cpp | 40 +- kde/src/conf/dlghooks.h | 40 +- kde/src/conf/sflphone-client-kde.kcfg | 141 - .../dbus/configurationmanager-introspec.xml | 21 +- kde/src/{ => klib}/AkonadiBackend.cpp | 134 +- kde/src/klib/AkonadiBackend.h | 87 + kde/src/klib/CMakeLists.txt | 67 + .../{conf => klib}/ConfigurationSkeleton.cpp | 134 +- .../{conf => klib}/ConfigurationSkeleton.h | 46 +- kde/src/klib/HelperFunctions.cpp | 47 + kde/src/klib/HelperFunctions.h | 42 + kde/src/klib/SortableDockCommon.cpp | 73 + kde/src/klib/SortableDockCommon.h | 128 + kde/src/klib/SortableDockCommon.hpp | 231 ++ kde/src/klib/dataengine.h | 0 .../klib}/dataengine/CMakeLists.txt | 10 +- .../dataengine/plasma-engine-sflphone.desktop | 0 .../dataengine/plasma-engine-testtime.desktop | 0 kde/src/klib/dataengine/sflphonEngine.cpp | 349 ++ kde/src/klib/dataengine/sflphonEngine.h | 78 + kde/src/klib/dataengine/sflphone.operations | 41 + kde/src/klib/dataengine/sflphoneService.cpp | 58 + kde/src/klib/dataengine/sflphoneService.h | 166 + kde/src/{conf => klib}/kcfg_settings.kcfgc | 2 + kde/src/klib/sflphone-client-kde.kcfg | 140 + kde/src/lib/Account.cpp | 59 +- kde/src/lib/Account.h | 39 +- kde/src/lib/AccountList.cpp | 47 +- kde/src/lib/AccountList.h | 40 +- kde/src/lib/CMakeLists.txt | 5 +- kde/src/lib/COPYING | 138 + kde/src/lib/Call.cpp | 68 +- kde/src/lib/Call.h | 52 +- kde/src/lib/CallModel.cpp | 52 +- kde/src/lib/CallModel.h | 124 +- kde/src/lib/CallModel.hpp | 373 +- kde/src/lib/Contact.cpp | 83 +- kde/src/lib/Contact.h | 70 +- kde/src/lib/ContactBackend.cpp | 39 +- kde/src/lib/ContactBackend.h | 45 +- kde/src/lib/Item.cpp | 39 +- kde/src/lib/Item.h | 148 +- .../lib/callmanager_interface_singleton.cpp | 38 +- kde/src/lib/callmanager_interface_singleton.h | 38 +- ...nfigurationmanager_interface_singleton.cpp | 41 +- ...configurationmanager_interface_singleton.h | 39 +- kde/src/lib/dbus/callmanager-introspec.xml | 1598 ++++----- .../dbus/configurationmanager-introspec.xml | 1153 +++--- kde/src/lib/instance_interface_singleton.cpp | 41 +- kde/src/lib/instance_interface_singleton.h | 45 +- kde/src/lib/sflphone_const.h | 291 +- kde/src/lib/typedefs.h | 20 + kde/src/main.cpp | 5 +- kde/src/ui/SFLPhoneView_base.ui | 32 + kde/src/widgets/BookmarkDock.cpp | 68 +- kde/src/widgets/BookmarkDock.h | 15 +- kde/src/widgets/CallTreeItem.cpp | 12 +- kde/src/widgets/CategorizedTreeWidget.cpp | 158 + kde/src/widgets/CategorizedTreeWidget.h | 87 + kde/src/widgets/CategoryDrawer.cpp | 273 ++ kde/src/widgets/CategoryDrawer.h | 45 + kde/src/widgets/ContactDock.cpp | 148 +- kde/src/widgets/ContactDock.h | 33 +- kde/src/widgets/ContactItemWidget.cpp | 2 +- kde/src/widgets/HistoryDock.cpp | 121 +- kde/src/widgets/HistoryDock.h | 21 +- kde/src/widgets/HistoryTreeItem.cpp | 309 +- kde/src/widgets/HistoryTreeItem.h | 95 +- plugins/configure.ac | 2 +- tools/asterisk/keys/500.crt | 21 + tools/asterisk/keys/500.csr | 10 + tools/asterisk/keys/500.key | 15 + tools/asterisk/keys/500.pem | 36 + tools/asterisk/keys/600.crt | 21 + tools/asterisk/keys/600.csr | 10 + tools/asterisk/keys/600.key | 15 + tools/asterisk/keys/600.pem | 36 + tools/build-system/launch-build-machine-2.sh | 8 +- .../sflphone-client-kde/debian/changelog | 3112 +---------------- .../sflphone-client-kde/debian/control | 23 +- .../sflphone-client-kde/debian/control.lucid | 20 - .../sflphone-client-kde/debian/control.natty | 20 - .../debian/control.oneiric | 20 - .../sflphone-client-kde/debian/copyright | 30 +- .../sflphone-client-kde/debian/cron.d | 4 - .../launchpad/sflphone-client-kde/debian/dirs | 7 - .../launchpad/sflphone-client-kde/debian/docs | 5 - .../sflphone-client-kde/debian/manpages | 2 - .../launchpad/sflphone-client-kde/debian/menu | 6 + .../sflphone-client-kde/debian/postinst | 9 - .../sflphone-client-kde/debian/preinst | 15 - .../sflphone-client-kde/debian/prerm | 7 - .../sflphone-client-kde/debian/rules | 125 +- .../sflphone-client-kde/debian/source/format | 1 + 289 files changed, 24559 insertions(+), 11061 deletions(-) create mode 100644 daemon/test/resamplertest.cpp create mode 100644 daemon/test/resamplertest.h delete mode 100644 gnome/INSTALL delete mode 100644 kde/plasma/dataengine/sflphonEngine.cpp delete mode 100644 kde/plasma/dataengine/sflphonEngine.h create mode 100644 kde/plasma/plasmoid-qml/CMakeLists.txt create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/configure.svgz create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/contact.svg create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/favorites.svg create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/history.svgz create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/phone.svg create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/state/.directory create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/busy.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/call.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/current.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/dial.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/fail.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/hang_up.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/hold.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/icon_accept.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/icon_unhold.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/incoming.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/new_call.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/rec_call.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/record.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/ring.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/transfert.svg create mode 100755 kde/plasma/plasmoid-qml/package/contents/images/state/unhold.svg create mode 100644 kde/plasma/plasmoid-qml/package/contents/images/transfertarrow.svg create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/.TabBar.qml.kate-swp create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/BookmarkTab.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/CallTab.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/ContactTab.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/DialPad.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/HistoryTab.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/ListSectiondelegate.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/NumberOverlay.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/Settingstab.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/TabBar.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/TransferOverlay.qml create mode 100644 kde/plasma/plasmoid-qml/package/contents/ui/main.qml create mode 100644 kde/plasma/plasmoid-qml/package/metadata.desktop delete mode 100644 kde/plasma/plasmoid/CMakeLists.txt delete mode 100644 kde/plasma/plasmoid/CallItem.cpp delete mode 100644 kde/plasma/plasmoid/CallItem.h delete mode 100644 kde/plasma/plasmoid/ConferenceItem.cpp delete mode 100644 kde/plasma/plasmoid/ConferenceItem.h delete mode 100644 kde/plasma/plasmoid/DialPage.cpp delete mode 100644 kde/plasma/plasmoid/DialPage.h delete mode 100644 kde/plasma/plasmoid/MainWidget.cpp delete mode 100644 kde/plasma/plasmoid/MainWidget.h delete mode 100644 kde/plasma/plasmoid/SFLPhonePlasmoid.cpp delete mode 100644 kde/plasma/plasmoid/SFLPhonePlasmoid.h delete mode 100644 kde/plasma/plasmoid/ViewItem.h delete mode 100644 kde/plasma/plasmoid/plasma-applet-sflphone.desktop delete mode 100644 kde/plasma/plasmoid/sflphone-plasmoid.desktop delete mode 100644 kde/src/AkonadiBackend.h delete mode 100755 kde/src/conf/sflphone-client-kde.kcfg rename kde/src/{ => klib}/AkonadiBackend.cpp (67%) create mode 100644 kde/src/klib/AkonadiBackend.h create mode 100644 kde/src/klib/CMakeLists.txt rename kde/src/{conf => klib}/ConfigurationSkeleton.cpp (66%) rename kde/src/{conf => klib}/ConfigurationSkeleton.h (60%) create mode 100644 kde/src/klib/HelperFunctions.cpp create mode 100644 kde/src/klib/HelperFunctions.h create mode 100644 kde/src/klib/SortableDockCommon.cpp create mode 100644 kde/src/klib/SortableDockCommon.h create mode 100644 kde/src/klib/SortableDockCommon.hpp create mode 100644 kde/src/klib/dataengine.h rename kde/{plasma => src/klib}/dataengine/CMakeLists.txt (64%) rename kde/{plasma => src/klib}/dataengine/plasma-engine-sflphone.desktop (100%) rename kde/{plasma => src/klib}/dataengine/plasma-engine-testtime.desktop (100%) create mode 100644 kde/src/klib/dataengine/sflphonEngine.cpp create mode 100644 kde/src/klib/dataengine/sflphonEngine.h create mode 100644 kde/src/klib/dataengine/sflphone.operations create mode 100644 kde/src/klib/dataengine/sflphoneService.cpp create mode 100644 kde/src/klib/dataengine/sflphoneService.h rename kde/src/{conf => klib}/kcfg_settings.kcfgc (61%) create mode 100755 kde/src/klib/sflphone-client-kde.kcfg create mode 100644 kde/src/lib/COPYING create mode 100644 kde/src/widgets/CategorizedTreeWidget.cpp create mode 100644 kde/src/widgets/CategorizedTreeWidget.h create mode 100644 kde/src/widgets/CategoryDrawer.cpp create mode 100644 kde/src/widgets/CategoryDrawer.h create mode 100644 tools/asterisk/keys/500.crt create mode 100644 tools/asterisk/keys/500.csr create mode 100644 tools/asterisk/keys/500.key create mode 100644 tools/asterisk/keys/500.pem create mode 100644 tools/asterisk/keys/600.crt create mode 100644 tools/asterisk/keys/600.csr create mode 100644 tools/asterisk/keys/600.key create mode 100644 tools/asterisk/keys/600.pem delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/control.lucid delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/control.natty delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/control.oneiric delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/cron.d delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/dirs delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/docs delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/manpages create mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/menu delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/postinst delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/preinst delete mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/prerm create mode 100644 tools/build-system/launchpad/sflphone-client-kde/debian/source/format diff --git a/NEWS b/NEWS index 622094a882..4adde3113d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ # SFLphone ################################################ +* 2012-05-17: 1.1.0 has been released + * 2011-11-18: 1.0.1 has been released * 2011-09-30: 1.0.0 has been released diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 32969d2465..34aed6bc2a 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -21,8 +21,7 @@ endif ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libs src ringtones man $(TESTS_DIR) doc -EXTRA_DIST = README.gentoo \ - m4/libtool.m4 \ +EXTRA_DIST = m4/libtool.m4 \ m4/lt~obsolete.m4 \ m4/ltoptions.m4 \ m4/ltsugar.m4 \ diff --git a/daemon/configure.ac b/daemon/configure.ac index e1d7c8aae1..f11f73ea0a 100644 --- a/daemon/configure.ac +++ b/daemon/configure.ac @@ -2,7 +2,7 @@ dnl SFLPhone - configure.ac for automake 1.9 and autoconf 2.59 dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) -AC_INIT([sflphone],[1.0.2],[sflphoneteam@savoirfairelinux.com],[sflphone]) +AC_INIT([sflphone],[1.1.0],[sflphoneteam@savoirfairelinux.com],[sflphone]) AC_COPYRIGHT([[Copyright (c) Savoir-Faire Linux 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012]]) AC_REVISION([$Revision$]) diff --git a/daemon/src/account.cpp b/daemon/src/account.cpp index a813b6434b..1494cab0d8 100644 --- a/daemon/src/account.cpp +++ b/daemon/src/account.cpp @@ -56,7 +56,7 @@ Account::Account(const std::string &accountID, const std::string &type) : , userAgent_("SFLphone") , mailBox_() { - // Initialize the codec list, used when creating a new account + // Initialize the codec order, used when creating a new account loadDefaultCodecs(); } @@ -77,25 +77,25 @@ void Account::setRegistrationState(const RegistrationState &state) void Account::loadDefaultCodecs() { // Initialize codec - std::vector<std::string> codecList; - codecList.push_back("0"); - codecList.push_back("3"); - codecList.push_back("8"); - codecList.push_back("9"); - codecList.push_back("110"); - codecList.push_back("111"); - codecList.push_back("112"); + std::vector<std::string> result; + result.push_back("0"); + result.push_back("3"); + result.push_back("8"); + result.push_back("9"); + result.push_back("110"); + result.push_back("111"); + result.push_back("112"); - setActiveCodecs(codecList); + setActiveCodecs(result); #ifdef SFL_VIDEO setActiveVideoCodecs(sfl_video::getCodecList()); #endif } #ifdef SFL_VIDEO -void Account::setActiveVideoCodecs (const std::vector <std::string> &list) +void Account::setActiveVideoCodecs(const std::vector<std::string> &list) { - videoCodecList_ = !list.empty() ? list : sfl_video::getCodecList(); + videoCodecList_ = !list.empty() ? list : sfl_video::getCodecList(); } #endif @@ -105,14 +105,15 @@ void Account::setActiveCodecs(const std::vector <std::string> &list) codecList_.clear(); // list contains the ordered payload of active codecs picked by the user for this account - // we used the CodecList vector to save the order. - for (std::vector<std::string>::const_iterator i = list.begin(); i != list.end(); ++i) { - int payload = std::atoi(i->c_str()); + // we used the CodecOrder vector to save the order. + for (std::vector<std::string>::const_iterator iter = list.begin(); iter != list.end(); + ++iter) { + int payload = std::atoi(iter->c_str()); codecList_.push_back(static_cast<int>(payload)); } // update the codec string according to new codec selection - codecStr_ = ManagerImpl::serialize(list); + codecStr_ = ManagerImpl::join_string(list); } std::string Account::mapStateNumberToString(RegistrationState state) diff --git a/daemon/src/account.h b/daemon/src/account.h index 708a3a3106..61ea340ae2 100644 --- a/daemon/src/account.h +++ b/daemon/src/account.h @@ -76,10 +76,14 @@ static const char *const CONFIG_ACCOUNT_ALIAS = "Account.alias"; static const char *const CONFIG_ACCOUNT_MAILBOX = "Account.mailbox"; static const char *const CONFIG_ACCOUNT_ENABLE = "Account.enable"; static const char *const CONFIG_ACCOUNT_REGISTRATION_EXPIRE = "Account.registrationExpire"; +static const char *const CONFIG_ACCOUNT_REGISTRATION_STATUS = "Account.registrationStatus"; +static const char *const CONFIG_ACCOUNT_REGISTRATION_STATE_CODE = "Account.registrationCode"; +static const char *const CONFIG_ACCOUNT_REGISTRATION_STATE_DESC = "Account.registrationDescription"; static const char *const CONFIG_CREDENTIAL_NUMBER = "Credential.count"; static const char *const CONFIG_ACCOUNT_DTMF_TYPE = "Account.dtmfType"; static const char *const CONFIG_RINGTONE_PATH = "Account.ringtonePath"; static const char *const CONFIG_RINGTONE_ENABLED = "Account.ringtoneEnabled"; +static const char *const CONFIG_KEEP_ALIVE_ENABLED = "Account.keepAliveEnabled"; static const char *const CONFIG_ACCOUNT_HOSTNAME = "Account.hostname"; static const char *const CONFIG_ACCOUNT_USERNAME = "Account.username"; @@ -128,10 +132,6 @@ static const char *const CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE = "TLS.requireCli static const char *const CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC = "TLS.negotiationTimeoutSec"; static const char *const CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC = "TLS.negotiationTimemoutMsec"; -static const char *const CONFIG_REGISTRATION_STATUS = "Registration.Status"; -static const char *const CONFIG_REGISTRATION_STATE_CODE = "Registration.code"; -static const char *const CONFIG_REGISTRATION_STATE_DESCRIPTION = "Registration.description"; - // General configuration keys for accounts static const char * const ALIAS_KEY = "alias"; static const char * const TYPE_KEY = "type"; @@ -295,7 +295,7 @@ class Account : public Serializable { /** * Helper function used to load the default codec order from the codec factory - * setActiveCodecs is called to sync both codecOrder_ and codecStr_ + * setActiveCodecs is called to sync both codecList_ and codecStr_ */ void loadDefaultCodecs(); diff --git a/daemon/src/audio/alsa/alsalayer.cpp b/daemon/src/audio/alsa/alsalayer.cpp index 00ecd4aa9e..70d51237ed 100644 --- a/daemon/src/audio/alsa/alsalayer.cpp +++ b/daemon/src/audio/alsa/alsalayer.cpp @@ -219,7 +219,7 @@ AlsaLayer::stopStream() #define ALSA_CALL(call, error) ({ \ int err_code = call; \ if (err_code < 0) \ - ERROR("ALSA: "error": %s", snd_strerror(err_code)); \ + ERROR(error ": %s", snd_strerror(err_code)); \ err_code; \ }) @@ -314,16 +314,16 @@ bool AlsaLayer::alsa_set_params(snd_pcm_t *pcm_handle) TRY(snd_pcm_hw_params_any(HW), "hwparams init"); TRY(snd_pcm_hw_params_set_access(HW, SND_PCM_ACCESS_RW_INTERLEAVED), "access type"); TRY(snd_pcm_hw_params_set_format(HW, SND_PCM_FORMAT_S16_LE), "sample format"); - TRY(snd_pcm_hw_params_set_rate_near(HW, &audioSampleRate_, NULL), "sample rate"); + TRY(snd_pcm_hw_params_set_rate_near(HW, &sampleRate_, NULL), "sample rate"); TRY(snd_pcm_hw_params_set_channels(HW, 1), "channel count"); TRY(snd_pcm_hw_params_set_period_size_near(HW, &periodSize, NULL), "period time"); TRY(snd_pcm_hw_params_set_periods_near(HW, &periods, NULL), "periods number"); TRY(snd_pcm_hw_params(HW), "hwparams"); #undef HW - DEBUG("ALSA: %s using sampling rate %dHz", + DEBUG("%s using sampling rate %dHz", (snd_pcm_stream(pcm_handle) == SND_PCM_STREAM_PLAYBACK) ? "playback" : "capture", - audioSampleRate_); + sampleRate_); snd_pcm_sw_params_t *swparams = NULL; snd_pcm_sw_params_alloca(&swparams); @@ -370,7 +370,7 @@ AlsaLayer::write(void* buffer, int length, snd_pcm_t * handle) } default: - ERROR("ALSA: unknown write error, dropping frames: %s", snd_strerror(err)); + ERROR("Unknown write error, dropping frames: %s", snd_strerror(err)); stopPlaybackStream(); break; } @@ -405,12 +405,12 @@ AlsaLayer::read(void* buffer, int toCopy) startCaptureStream(); } - ERROR("ALSA: XRUN capture ignored (%s)", snd_strerror(err)); + ERROR("XRUN capture ignored (%s)", snd_strerror(err)); break; } case EPERM: - ERROR("ALSA: Can't capture, EPERM (%s)", snd_strerror(err)); + ERROR("Can't capture, EPERM (%s)", snd_strerror(err)); prepareCaptureStream(); startCaptureStream(); break; @@ -456,7 +456,7 @@ AlsaLayer::getAudioDeviceIndexMap(AudioStreamDirection dir) const snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); - int numCard = -1 ; + int numCard = -1; std::vector<HwIDPair> audioDevice; @@ -541,7 +541,7 @@ AlsaLayer::getAudioDeviceIndex(const std::string &description) const void AlsaLayer::capture() { unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - bool resample = audioSampleRate_ != mainBufferSampleRate; + bool resample = sampleRate_ != mainBufferSampleRate; int toGetSamples = snd_pcm_avail_update(captureHandle_); @@ -567,10 +567,11 @@ void AlsaLayer::capture() AudioLayer::applyGain(&(*in.begin()), toGetSamples, getCaptureGain()); if (resample) { - int outSamples = toGetSamples * ((double) audioSampleRate_ / mainBufferSampleRate); + int outSamples = toGetSamples * ((double) sampleRate_ / mainBufferSampleRate); std::vector<SFLDataFormat> rsmpl_out(outSamples); - converter_->resample(&(*in.begin()), &(*rsmpl_out.begin()), - mainBufferSampleRate, audioSampleRate_, toGetSamples); + converter_.resample(&(*in.begin()), &(*rsmpl_out.begin()), + rsmpl_out.size(), mainBufferSampleRate, sampleRate_, + toGetSamples); dcblocker_.process(&(*rsmpl_out.begin()), &(*rsmpl_out.begin()), outSamples); Manager::instance().getMainBuffer()->putData(&(*rsmpl_out.begin()), rsmpl_out.size() * sizeof(rsmpl_out[0]), MainBuffer::DEFAULT_ID); @@ -585,7 +586,7 @@ void AlsaLayer::playback(int maxSamples) { unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - bool resample = audioSampleRate_ != mainBufferSampleRate; + bool resample = sampleRate_ != mainBufferSampleRate; int toGet = Manager::instance().getMainBuffer()->availForGet(MainBuffer::DEFAULT_ID); int toPut = maxSamples * sizeof(SFLDataFormat); @@ -617,7 +618,7 @@ void AlsaLayer::playback(int maxSamples) double resampleFactor = 1.0; if (resample) { - resampleFactor = (double) audioSampleRate_ / mainBufferSampleRate; + resampleFactor = (double) sampleRate_ / mainBufferSampleRate; maxNbBytesToGet = (double) toGet / resampleFactor; } @@ -631,10 +632,10 @@ void AlsaLayer::playback(int maxSamples) if (resample) { int inSamples = toGet / sizeof(SFLDataFormat); int outSamples = inSamples * resampleFactor; - SFLDataFormat *rsmpl_out = (SFLDataFormat*) malloc(outSamples * sizeof(SFLDataFormat)); - converter_->resample(out, rsmpl_out, mainBufferSampleRate, audioSampleRate_, inSamples); - write(rsmpl_out, outSamples * sizeof(SFLDataFormat), playbackHandle_); - free(rsmpl_out); + std::vector<SFLDataFormat> rsmpl_out(outSamples); + converter_.resample(out, &(*rsmpl_out.begin()), rsmpl_out.size(), + mainBufferSampleRate, sampleRate_, inSamples); + write(&(*rsmpl_out.begin()), outSamples * sizeof(SFLDataFormat), playbackHandle_); } else { write(out, toGet, playbackHandle_); } diff --git a/daemon/src/audio/audiolayer.cpp b/daemon/src/audio/audiolayer.cpp index 1c77203070..ab7c34284b 100644 --- a/daemon/src/audio/audiolayer.cpp +++ b/daemon/src/audio/audiolayer.cpp @@ -40,25 +40,16 @@ unsigned int AudioLayer::playbackGain_ = 100; AudioLayer::AudioLayer() : isStarted_(false) , urgentRingBuffer_(SIZEBUF, MainBuffer::DEFAULT_ID) - , audioSampleRate_(Manager::instance().getMainBuffer()->getInternalSamplingRate()) + , sampleRate_(Manager::instance().getMainBuffer()->getInternalSamplingRate()) , mutex_() , dcblocker_() , audioPref(Manager::instance().audioPreference) - , converter_(new SamplerateConverter(audioSampleRate_)) + , converter_(sampleRate_) , lastNotificationTime_(0) { urgentRingBuffer_.createReadPointer(MainBuffer::DEFAULT_ID); } - -AudioLayer::~AudioLayer() -{ - if(converter_) { - delete converter_; - converter_ = NULL; - } -} - void AudioLayer::flushMain() { ost::MutexLock guard(mutex_); diff --git a/daemon/src/audio/audiolayer.h b/daemon/src/audio/audiolayer.h index d7729f8bb3..3ed96b2364 100644 --- a/daemon/src/audio/audiolayer.h +++ b/daemon/src/audio/audiolayer.h @@ -62,7 +62,7 @@ class AudioLayer { public: AudioLayer(); - virtual ~AudioLayer(); + virtual ~AudioLayer() {} virtual std::vector<std::string> getAudioDeviceList(AudioStreamDirection dir) const = 0; @@ -158,7 +158,7 @@ class AudioLayer { * default: 44100 HZ */ unsigned int getSampleRate() const { - return audioSampleRate_; + return sampleRate_; } /** @@ -199,7 +199,7 @@ class AudioLayer { * Sample Rate SFLphone should send sound data to the sound card * The value can be set in the user config file- now: 44100HZ */ - unsigned int audioSampleRate_; + unsigned int sampleRate_; /** * Lock for the entire audio layer @@ -219,7 +219,7 @@ class AudioLayer { /** * Manage sampling rate conversion */ - SamplerateConverter *converter_; + SamplerateConverter converter_; private: /** diff --git a/daemon/src/audio/audioloop.cpp b/daemon/src/audio/audioloop.cpp index 354f7c56f1..024d2cfe64 100644 --- a/daemon/src/audio/audioloop.cpp +++ b/daemon/src/audio/audioloop.cpp @@ -53,10 +53,10 @@ AudioLoop::getNext(SFLDataFormat* output, size_t total_samples, short volume) size_t pos = pos_; if (size_ == 0) { - ERROR("AudioLoop: Error: Audio loop size is 0"); + ERROR("Audio loop size is 0"); return; } else if (pos >= size_) { - ERROR("AudioLoop: Error: Invalid loop position %d", pos); + ERROR("Invalid loop position %d", pos); return; } diff --git a/daemon/src/audio/audiorecord.cpp b/daemon/src/audio/audiorecord.cpp index 8acdfa853f..33f2ae2c2b 100644 --- a/daemon/src/audio/audiorecord.cpp +++ b/daemon/src/audio/audiorecord.cpp @@ -28,6 +28,10 @@ * as that of the covered work. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "audiorecord.h" #include <unistd.h> #include <sstream> // for stringstream @@ -98,16 +102,16 @@ void AudioRecord::setRecordingOption(FILE_TYPE type, int sndSmplRate, const std: void AudioRecord::initFilename(const std::string &peerNumber) { std::string fName(filename_); - fName.append("-" + peerNumber); + fName.append("-" + peerNumber + "-" PACKAGE); if (fileType_ == FILE_RAW) { if (filename_.find(".raw") == std::string::npos) { - DEBUG("AudioRecord: concatenate .raw file extension: name : %s", filename_.c_str()); + DEBUG("Concatenate .raw file extension: name : %s", filename_.c_str()); fName.append(".raw"); } } else if (fileType_ == FILE_WAV) { if (filename_.find(".wav") == std::string::npos) { - DEBUG("AudioRecord: concatenate .wav file extension: name : %s", filename_.c_str()); + DEBUG("Concatenate .wav file extension: name : %s", filename_.c_str()); fName.append(".wav"); } } @@ -125,7 +129,7 @@ bool AudioRecord::openFile() bool result = false; if (not fileExists()) { - DEBUG("AudioRecord: Filename does not exist, creating one"); + DEBUG("Filename does not exist, creating one"); byteCounter_ = 0; if (fileType_ == FILE_RAW) @@ -133,7 +137,7 @@ bool AudioRecord::openFile() else if (fileType_ == FILE_WAV) result = setWavFile(); } else { - DEBUG("AudioRecord: Filename already exists, opening it"); + DEBUG("Filename already exists, opening it"); if (fileType_ == FILE_RAW) result = openExistingRawFile(); else if (fileType_ == FILE_WAV) @@ -180,7 +184,7 @@ void AudioRecord::setRecording() void AudioRecord::stopRecording() { - DEBUG("AudioRecording: Stop recording"); + DEBUG("Stop recording"); recordingEnabled_ = false; } @@ -227,7 +231,7 @@ void AudioRecord::createFilename() out << timeinfo->tm_sec; filename_ = out.str(); - DEBUG("AudioRecord: Generate filename for this call %s ", filename_.c_str()); + DEBUG("Generate filename for this call %s ", filename_.c_str()); } bool AudioRecord::setRawFile() @@ -235,11 +239,11 @@ bool AudioRecord::setRawFile() fileHandle_ = fopen(savePath_.c_str(), "wb"); if (!fileHandle_) { - WARN("AudioRecord: Could not create RAW file!"); + WARN("Could not create RAW file!"); return false; } - DEBUG("AudioRecord:setRawFile() : created RAW file."); + DEBUG("created RAW file."); return true; } @@ -267,12 +271,12 @@ namespace { bool AudioRecord::setWavFile() { - DEBUG("AudioRecord: Create new wave file %s, sampling rate: %d", savePath_.c_str(), sndSmplRate_); + DEBUG("Create new wave file %s, sampling rate: %d", savePath_.c_str(), sndSmplRate_); fileHandle_ = fopen(savePath_.c_str(), "wb"); if (!fileHandle_) { - WARN("AudioRecord: Error: could not create WAV file."); + WARN("Could not create WAV file."); return false; } @@ -297,11 +301,11 @@ bool AudioRecord::setWavFile() hdr.bytes_per_sec = hdr.sample_rate * hdr.bytes_per_samp; if (fwrite(&hdr, 4, 11, fileHandle_) != 11) { - WARN("AudioRecord: Error: could not write WAV header for file. "); + WARN("Could not write WAV header for file. "); return false; } - DEBUG("AudioRecord: Wrote wave header \"%s\"", header_to_string(hdr).c_str()); + DEBUG("Wrote wave header \"%s\"", header_to_string(hdr).c_str()); return true; } @@ -310,7 +314,7 @@ bool AudioRecord::openExistingRawFile() fileHandle_ = fopen(filename_.c_str(), "ab+"); if (!fileHandle_) { - WARN("AudioRecord: could not create RAW file!"); + WARN("could not create RAW file!"); return false; } @@ -319,37 +323,37 @@ bool AudioRecord::openExistingRawFile() bool AudioRecord::openExistingWavFile() { - DEBUG("%s(%s)\n", __PRETTY_FUNCTION__, filename_.c_str()); + DEBUG("Opening %s", filename_.c_str()); fileHandle_ = fopen(filename_.c_str(), "rb+"); if (!fileHandle_) { - WARN("AudioRecord: Error: could not open WAV file!"); + WARN("Could not open WAV file!"); return false; } if (fseek(fileHandle_, 40, SEEK_SET) != 0) // jump to data length - WARN("AudioRecord: Error: Couldn't seek offset 40 in the file "); + WARN("Couldn't seek offset 40 in the file "); if (fread(&byteCounter_, 4, 1, fileHandle_)) - WARN("AudioRecord: Error: bytecounter Read successfully "); + WARN("bytecounter Read successfully "); if (fseek(fileHandle_, 0 , SEEK_END) != 0) - WARN("AudioRecord: Error: Couldn't seek at the en of the file "); + WARN("Couldn't seek at the en of the file "); if (fclose(fileHandle_) != 0) - WARN("AudioRecord: Error: Can't close file r+ "); + WARN("Can't close file r+ "); fileHandle_ = fopen(filename_.c_str(), "ab+"); if (!fileHandle_) { - WARN("AudioRecord: Error: Could not createopen WAV file ab+!"); + WARN("Could not createopen WAV file ab+!"); return false; } if (fseek(fileHandle_, 4 , SEEK_END) != 0) - WARN("AudioRecord: Error: Couldn't seek at the en of the file "); + WARN("Couldn't seek at the en of the file "); return true; @@ -358,50 +362,50 @@ bool AudioRecord::openExistingWavFile() void AudioRecord::closeWavFile() { if (fileHandle_ == 0) { - DEBUG("AudioRecord: Can't closeWavFile, a file has not yet been opened!"); + DEBUG("Can't closeWavFile, a file has not yet been opened!"); return; } - DEBUG("AudioRecord: Close wave file"); + DEBUG("Close wave file"); SINT32 bytes = byteCounter_ * channels_; fseek(fileHandle_, 40, SEEK_SET); // jump to data length if (ferror(fileHandle_)) - WARN("AudioRecord: Error: can't reach offset 40 while closing"); + WARN("Can't reach offset 40 while closing"); fwrite(&bytes, sizeof(SINT32), 1, fileHandle_); if (ferror(fileHandle_)) - WARN("AudioRecord: Error: can't write bytes for data length "); + WARN("Can't write bytes for data length "); bytes = byteCounter_ * channels_ + 44; // + 44 for the wave header fseek(fileHandle_, 4, SEEK_SET); // jump to file size if (ferror(fileHandle_)) - WARN("AudioRecord: Error: can't reach offset 4"); + WARN("Can't reach offset 4"); fwrite(&bytes, 4, 1, fileHandle_); if (ferror(fileHandle_)) - WARN("AudioRecord: Error: can't reach offset 4"); + WARN("Can't reach offset 4"); if (fclose(fileHandle_) != 0) - WARN("AudioRecord: Error: can't close file"); + WARN("Can't close file"); } void AudioRecord::recData(SFLDataFormat* buffer, size_t nSamples) { if (recordingEnabled_) { if (fileHandle_ == 0) { - DEBUG("AudioRecord: Can't record data, a file has not yet been opened!"); + DEBUG("Can't record data, a file has not yet been opened!"); return; } if (fwrite(buffer, sizeof(SFLDataFormat), nSamples, fileHandle_) != nSamples) - WARN("AudioRecord: Could not record data! "); + WARN("Could not record data! "); else { fflush(fileHandle_); byteCounter_ += nSamples * sizeof(SFLDataFormat); diff --git a/daemon/src/audio/audiorecorder.cpp b/daemon/src/audio/audiorecorder.cpp index 63cac9e7e5..54a742179a 100644 --- a/daemon/src/audio/audiorecorder.cpp +++ b/daemon/src/audio/audiorecorder.cpp @@ -30,13 +30,15 @@ #include "audiorecorder.h" #include "mainbuffer.h" +#include "logger.h" #include <sstream> #include <cassert> +#include <tr1/array> int AudioRecorder::count_ = 0; AudioRecorder::AudioRecorder(AudioRecord *arec, MainBuffer *mb) : ost::Thread(), - recorderId_(), mbuffer_(mb), arecord_(arec) + recorderId_(), mbuffer_(mb), arecord_(arec), running_(true) { assert(mb); @@ -59,16 +61,16 @@ AudioRecorder::AudioRecorder(AudioRecord *arec, MainBuffer *mb) : ost::Thread() void AudioRecorder::run() { const size_t BUFFER_LENGTH = 10000; - SFLDataFormat buffer[BUFFER_LENGTH]; + std::tr1::array<SFLDataFormat, BUFFER_LENGTH> buffer; + buffer.assign(0); - while (isRunning()) { + while (running_) { size_t availBytes = mbuffer_->availForGet(recorderId_); - - mbuffer_->getData(buffer, std::min(availBytes, BUFFER_LENGTH), recorderId_); + mbuffer_->getData(buffer.data(), std::min(availBytes, buffer.size()), recorderId_); if (availBytes > 0) - arecord_->recData(buffer, availBytes / sizeof(SFLDataFormat)); + arecord_->recData(buffer.data(), availBytes / sizeof(SFLDataFormat)); - sleep(20); + Thread::sleep(20); } } diff --git a/daemon/src/audio/audiorecorder.h b/daemon/src/audio/audiorecorder.h index 82be9a4795..c417b4cc7b 100644 --- a/daemon/src/audio/audiorecorder.h +++ b/daemon/src/audio/audiorecorder.h @@ -44,6 +44,7 @@ class AudioRecorder : public ost::Thread { AudioRecorder(AudioRecord *arec, MainBuffer *mb); ~AudioRecorder() { + running_ = false; terminate(); } @@ -61,6 +62,7 @@ class AudioRecorder : public ost::Thread { std::string recorderId_; MainBuffer *mbuffer_; AudioRecord *arecord_; + bool running_; }; #endif diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.cpp b/daemon/src/audio/audiortp/audio_rtp_factory.cpp index 2170b06e52..c723f81252 100644 --- a/daemon/src/audio/audiortp/audio_rtp_factory.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_factory.cpp @@ -28,35 +28,36 @@ * as that of the covered work. */ - - #include "audio_rtp_factory.h" #include "audio_zrtp_session.h" -#include "audio_srtp_session.h" #include "audio_symmetric_rtp_session.h" #include "manager.h" #include "sip/sdp.h" #include "sip/sipcall.h" #include "sip/sipaccount.h" #include "sip/sdes_negotiator.h" +#include "logger.h" namespace sfl { AudioRtpFactory::AudioRtpFactory(SIPCall *ca) : rtpSession_(NULL), audioRtpThreadMutex_(), srtpEnabled_(false), helloHashEnabled_(false), - cachedRemoteContext_(0), cachedLocalContext_(0), ca_(ca), + cachedLocalMasterKey_(MAX_MASTER_KEY_LENGTH), + cachedLocalMasterSalt_(MAX_MASTER_SALT_LENGTH), + cachedRemoteMasterKey_(MAX_MASTER_KEY_LENGTH), + cachedRemoteMasterSalt_(MAX_MASTER_SALT_LENGTH), + remoteOfferIsSet_(false), ca_(ca), keyExchangeProtocol_(NONE) {} AudioRtpFactory::~AudioRtpFactory() { delete rtpSession_; - delete cachedLocalContext_; - delete cachedRemoteContext_; } void AudioRtpFactory::initConfig() { + DEBUG("AudioRtpFactory: init config"); if (rtpSession_ != NULL) stop(); @@ -85,6 +86,7 @@ void AudioRtpFactory::initConfig() void AudioRtpFactory::initSession() { + DEBUG("AudioRtpFactory: init session"); ost::MutexLock m(audioRtpThreadMutex_); if (srtpEnabled_) { @@ -111,16 +113,13 @@ void AudioRtpFactory::initSession() rtpSession_ = new AudioSymmetricRtpSession(*ca_); } -void AudioRtpFactory::start(AudioCodec* audiocodec) +void sfl::AudioRtpFactory::start(AudioCodec* audiocodec) { if (rtpSession_ == NULL) - throw AudioRtpFactoryException("AudioRtpFactory: Error: RTP session was null when trying to start audio thread"); - - if (keyExchangeProtocol_ == SDES and cachedLocalContext_ and cachedRemoteContext_) - static_cast<AudioSrtpSession *>(rtpSession_)->restoreCryptoContext(cachedLocalContext_, cachedRemoteContext_); + throw AudioRtpFactoryException("RTP session was null when trying to start audio thread"); if (rtpSession_->startRtpThread(*audiocodec) != 0) - throw AudioRtpFactoryException("AudioRtpFactory: Error: Failed to start AudioRtpSession thread"); + throw AudioRtpFactoryException("Failed to start AudioRtpSession thread"); } void AudioRtpFactory::stop() @@ -134,7 +133,7 @@ void AudioRtpFactory::stop() int AudioRtpFactory::getSessionMedia() { if (rtpSession_ == NULL) - throw AudioRtpFactoryException("AudioRtpFactory: Error: RTP session was null when trying to get session media type"); + throw AudioRtpFactoryException("RTP session was null when trying to get session media type"); return rtpSession_->getCodecPayloadType(); } @@ -142,7 +141,7 @@ int AudioRtpFactory::getSessionMedia() void AudioRtpFactory::updateSessionMedia(AudioCodec *audiocodec) { if (rtpSession_ == NULL) - throw AudioRtpFactoryException("AudioRtpFactory: Error: rtpSession_ was null when trying to update IP address"); + throw AudioRtpFactoryException("rtpSession_ was NULL when trying to update IP address"); rtpSession_->updateSessionMedia(*audiocodec); } @@ -158,24 +157,37 @@ sfl::AudioZrtpSession * AudioRtpFactory::getAudioZrtpSession() if (keyExchangeProtocol_ == ZRTP) return static_cast<AudioZrtpSession *>(rtpSession_); else - throw AudioRtpFactoryException("RTP: Error: rtpSession_ is NULL in getAudioZrtpSession"); + throw AudioRtpFactoryException("rtpSession_ is NULL in getAudioZrtpSession"); } void sfl::AudioRtpFactory::initLocalCryptoInfo() { + DEBUG("AudioRtpFactory: Init local crypto info"); + if (rtpSession_ && keyExchangeProtocol_ == SDES) { + AudioSrtpSession *srtp = static_cast<AudioSrtpSession*>(rtpSession_); + // the context is invalidated and deleted by the call to initLocalCryptoInfo + srtp->initLocalCryptoInfo(); + ca_->getLocalSDP()->setLocalSdpCrypto(srtp->getLocalCryptoInfo()); + } +} + +void sfl::AudioRtpFactory::initLocalCryptoInfoOnOffHold() +{ + DEBUG("AudioRtpFactory: Init local crypto info"); if (rtpSession_ && keyExchangeProtocol_ == SDES) { AudioSrtpSession *srtp = static_cast<AudioSrtpSession*>(rtpSession_); // the context is invalidated and deleted by the call to initLocalCryptoInfo - cachedLocalContext_ = srtp->initLocalCryptoInfo(); + srtp->initLocalCryptoInfoOnOffhold(); ca_->getLocalSDP()->setLocalSdpCrypto(srtp->getLocalCryptoInfo()); } } + void AudioRtpFactory::setRemoteCryptoInfo(sfl::SdesNegotiator& nego) { if (rtpSession_ and keyExchangeProtocol_ == SDES) { AudioSrtpSession *srtp = static_cast<AudioSrtpSession *>(rtpSession_); - cachedRemoteContext_ = srtp->setRemoteCryptoInfo(nego); + srtp->setRemoteCryptoInfo(nego); } else throw AudioRtpFactoryException("RTP: Error: rtpSession_ is NULL in setRemoteCryptoInfo"); } @@ -191,4 +203,23 @@ void AudioRtpFactory::sendDtmfDigit(int digit) rtpSession_->putDtmfEvent(digit); } +void sfl::AudioRtpFactory::saveLocalContext() +{ + if (rtpSession_ and keyExchangeProtocol_ == SDES) { + AudioSrtpSession *srtp = dynamic_cast<AudioSrtpSession *>(rtpSession_); + assert(srtp); + cachedLocalMasterKey_ = srtp->getLocalMasterKey(); + cachedLocalMasterSalt_ = srtp->getLocalMasterSalt(); + } +} + +void sfl::AudioRtpFactory::restoreLocalContext() +{ + if (rtpSession_ and keyExchangeProtocol_ == SDES) { + AudioSrtpSession *srtp = dynamic_cast<AudioSrtpSession *>(rtpSession_); + assert(srtp); + srtp->setLocalMasterKey(cachedLocalMasterKey_); + srtp->setLocalMasterSalt(cachedLocalMasterSalt_); + } +} } diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.h b/daemon/src/audio/audiortp/audio_rtp_factory.h index 0aa88f0f31..172cd1eadd 100644 --- a/daemon/src/audio/audiortp/audio_rtp_factory.h +++ b/daemon/src/audio/audiortp/audio_rtp_factory.h @@ -31,10 +31,12 @@ #ifndef __AUDIO_RTP_FACTORY_H__ #define __AUDIO_RTP_FACTORY_H__ -#include <stdexcept> #include <ccrtp/CryptoContext.h> +#include <stdexcept> +#include <tr1/array> #include "cc_thread.h" #include "audio_rtp_session.h" +#include "audio_srtp_session.h" #include "noncopyable.h" #include "sip/sdes_negotiator.h" @@ -121,6 +123,7 @@ class AudioRtpFactory { sfl::AudioZrtpSession * getAudioZrtpSession(); void initLocalCryptoInfo(); + void initLocalCryptoInfoOnOffHold(); /** * Set remote cryptographic info. Should be called after negotiation in SDP @@ -138,6 +141,10 @@ class AudioRtpFactory { */ void sendDtmfDigit(int digit); + void saveLocalContext(); + + void restoreLocalContext(); + private: NON_COPYABLE(AudioRtpFactory); enum KeyExchangeProtocol { NONE, SDES, ZRTP }; @@ -152,11 +159,20 @@ class AudioRtpFactory { // May be set manually or from config using initAudioRtpConfig bool helloHashEnabled_; - /** Remote srtp crypto context to be set into incoming data queue. */ - ost::CryptoContext *cachedRemoteContext_; + /** local master key for outgoing packet encryption **/ + std::vector<uint8> cachedLocalMasterKey_; + + /** local master salt for outgoing packet encryption **/ + std::vector<uint8> cachedLocalMasterSalt_; + + /** remote master key for incoming packet decryption **/ + std::vector<uint8> cachedRemoteMasterKey_; + + /** remote master salt for incoming packet decryption **/ + std::vector<uint8> cachedRemoteMasterSalt_; - /** Local srtp crypto context to be set into outgoing data queue. */ - ost::CryptoContext *cachedLocalContext_; + /** Used to make sure remote crypto context not initialized twice. */ + bool remoteOfferIsSet_; SIPCall *ca_; KeyExchangeProtocol keyExchangeProtocol_; diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp index 071a978ce5..041181db39 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp @@ -29,42 +29,58 @@ #include "audio_rtp_record_handler.h" #include <fstream> +#include <algorithm> #include "logger.h" #include "sip/sipcall.h" #include "audio/audiolayer.h" #include "manager.h" +#include <fstream> + namespace sfl { -static const SFLDataFormat initFadeinFactor = 32000; +static const SFLDataFormat INIT_FADE_IN_FACTOR = 32000; + +#ifdef RECTODISK +std::ofstream rtpResampled ("testRtpOutputResampled.raw", std::ifstream::binary); +std::ofstream rtpNotResampled("testRtpOutput.raw", std::ifstream::binary); +#endif AudioRtpRecord::AudioRtpRecord() : audioCodec_(0) , audioCodecMutex_() , codecPayloadType_(0) , hasDynamicPayloadType_(false) - , converter_(0) + , decData_() // std::tr1::arrays will be 0-initialized + , resampledData_() + , encodedData_() + , converterEncode_(0) + , converterDecode_(0) , codecSampleRate_(0) , codecFrameSize_(0) , converterSamplingRate_(0) , dtmfQueue_() - , micAmplFactor_(initFadeinFactor) - , noiseSuppress_(0) + , fadeFactor_(INIT_FADE_IN_FACTOR) + , noiseSuppressEncode_(0) + , noiseSuppressDecode_(0) , audioProcessMutex_() , callId_("") , dtmfPayloadType_(101) // same as Asterisk -{ - memset(decData_, 0x0, sizeof decData_); - memset(resampledData_, 0x0, sizeof resampledData_); - memset(encodedData_, 0x0, sizeof encodedData_); -} +{} AudioRtpRecord::~AudioRtpRecord() { - delete converter_; +#ifdef RECTODISK + rtpResampled.close(); + rtpNotResampled.close(); +#endif + + delete converterEncode_; + delete converterDecode_; delete audioCodec_; - delete noiseSuppress_; + delete noiseSuppressEncode_; + delete noiseSuppressDecode_; } @@ -98,15 +114,19 @@ void AudioRtpRecordHandler::initBuffers() // initialize SampleRate converter using AudioLayer's sampling rate // (internal buffers initialized with maximal sampling rate and frame size) - delete audioRtpRecord_.converter_; - audioRtpRecord_.converter_ = new SamplerateConverter(getCodecSampleRate()); + delete audioRtpRecord_.converterEncode_; + audioRtpRecord_.converterEncode_ = new SamplerateConverter(getCodecSampleRate()); + delete audioRtpRecord_.converterDecode_; + audioRtpRecord_.converterDecode_ = new SamplerateConverter(getCodecSampleRate()); } void AudioRtpRecordHandler::initNoiseSuppress() { ost::MutexLock lock(audioRtpRecord_.audioProcessMutex_); - delete audioRtpRecord_.noiseSuppress_; - audioRtpRecord_.noiseSuppress_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate()); + delete audioRtpRecord_.noiseSuppressEncode_; + audioRtpRecord_.noiseSuppressEncode_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate()); + delete audioRtpRecord_.noiseSuppressDecode_; + audioRtpRecord_.noiseSuppressDecode_ = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate()); } void AudioRtpRecordHandler::putDtmfEvent(int digit) @@ -116,14 +136,10 @@ void AudioRtpRecordHandler::putDtmfEvent(int digit) int AudioRtpRecordHandler::processDataEncode() { - SFLDataFormat *micData = audioRtpRecord_.decData_; - unsigned char *micDataEncoded = audioRtpRecord_.encodedData_; - SFLDataFormat *micDataConverted = audioRtpRecord_.resampledData_; - int codecSampleRate = getCodecSampleRate(); int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - double resampleFactor = (double)mainBufferSampleRate / codecSampleRate; + double resampleFactor = (double) mainBufferSampleRate / codecSampleRate; // compute nb of byte to get coresponding to 1 audio frame int samplesToGet = resampleFactor * getCodecFrameSize(); @@ -132,16 +148,21 @@ int AudioRtpRecordHandler::processDataEncode() if (Manager::instance().getMainBuffer()->availForGet(id_) < bytesToGet) return 0; + SFLDataFormat *micData = audioRtpRecord_.decData_.data(); int bytes = Manager::instance().getMainBuffer()->getData(micData, bytesToGet, id_); +#ifdef RECTODISK + rtpNotResampled.write((const char *)micData, bytes); +#endif + if (bytes != bytesToGet) { - ERROR("%s : asked %d bytes from mainbuffer, got %d", __PRETTY_FUNCTION__, bytesToGet, bytes); + ERROR("Asked for %d bytes from mainbuffer, got %d", bytesToGet, bytes); return 0; } int samples = bytesToGet / sizeof(SFLDataFormat); - fadeIn(micData, samples, &audioRtpRecord_.micAmplFactor_); + audioRtpRecord_.fadeInDecodedData(samples); if (Manager::instance().getEchoCancelState()) echoCanceller.getData(micData); @@ -149,18 +170,30 @@ int AudioRtpRecordHandler::processDataEncode() SFLDataFormat *out = micData; if (codecSampleRate != mainBufferSampleRate) { - out = micDataConverted; - audioRtpRecord_.converter_->resample(micData, micDataConverted, - codecSampleRate, mainBufferSampleRate, samplesToGet); + assert(audioRtpRecord_.converterEncode_); + + audioRtpRecord_.converterEncode_->resample(micData, + audioRtpRecord_.resampledData_.data(), + audioRtpRecord_.resampledData_.size(), + mainBufferSampleRate, codecSampleRate, + samplesToGet); + +#ifdef RECTODISK + rtpResampled.write((const char *)audioRtpRecord_.resampledData_.data(), samplesToGet*sizeof(SFLDataFormat)/2 ); +#endif + + out = audioRtpRecord_.resampledData_.data(); } if (Manager::instance().audioPreference.getNoiseReduce()) { ost::MutexLock lock(audioRtpRecord_.audioProcessMutex_); - audioRtpRecord_.noiseSuppress_->process(micData, getCodecFrameSize()); + assert(audioRtpRecord_.noiseSuppressEncode_); + audioRtpRecord_.noiseSuppressEncode_->process(micData, getCodecFrameSize()); } { ost::MutexLock lock(audioRtpRecord_.audioCodecMutex_); + unsigned char *micDataEncoded = audioRtpRecord_.encodedData_.data(); return audioRtpRecord_.audioCodec_->encode(micDataEncoded, out, getCodecFrameSize()); } } @@ -170,21 +203,23 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si if (getCodecPayloadType() != payloadType) return; - int codecSampleRate = getCodecSampleRate(); - - SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_; - SFLDataFormat *spkrDataConverted = audioRtpRecord_.resampledData_; - - int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - - int inSamples; + int inSamples = 0; + size = std::min(size, audioRtpRecord_.decData_.size()); + SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data(); { ost::MutexLock lock(audioRtpRecord_.audioCodecMutex_); // Return the size of data in samples - inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded , spkrData , size); + inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size); + } + + if (Manager::instance().audioPreference.getNoiseReduce()) { + ost::MutexLock lock(audioRtpRecord_.audioProcessMutex_); + assert(audioRtpRecord_.noiseSuppressDecode_); + audioRtpRecord_.noiseSuppressDecode_->process(spkrDataDecoded, getCodecFrameSize()); } - fadeIn(spkrDataDecoded, inSamples, &audioRtpRecord_.micAmplFactor_); + + audioRtpRecord_.fadeInDecodedData(inSamples); // Normalize incomming signal gainController.process(spkrDataDecoded, inSamples); @@ -192,12 +227,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si SFLDataFormat *out = spkrDataDecoded; int outSamples = inSamples; + int codecSampleRate = getCodecSampleRate(); + int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); + // test if resampling is required if (codecSampleRate != mainBufferSampleRate) { + out = audioRtpRecord_.resampledData_.data(); // Do sample rate conversion outSamples = ((float) inSamples * ((float) mainBufferSampleRate / (float) codecSampleRate)); - audioRtpRecord_.converter_->resample(spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, inSamples); - out = spkrDataConverted; + audioRtpRecord_.converterDecode_->resample(spkrDataDecoded, out, + audioRtpRecord_.resampledData_.size(), codecSampleRate, + mainBufferSampleRate, inSamples); } if (Manager::instance().getEchoCancelState()) @@ -206,15 +246,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si Manager::instance().getMainBuffer()->putData(out, outSamples * sizeof(SFLDataFormat), id_); } -void AudioRtpRecordHandler::fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor) +void AudioRtpRecord::fadeInDecodedData(size_t size) { // if factor reaches 0, this function should have no effect - if (!audio or !factor or *factor <= 0) + if (fadeFactor_ <= 0 or size > decData_.size()) return; - while (size > 0) - audio[--size] /= *factor; + std::transform(decData_.begin(), decData_.begin() + size, decData_.begin(), + std::bind1st(std::divides<double>(), fadeFactor_)); - *factor /= FADEIN_STEP_SIZE; + // Factor used to increase volume in fade in + const SFLDataFormat FADEIN_STEP_SIZE = 4; + fadeFactor_ /= FADEIN_STEP_SIZE; } } diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.h b/daemon/src/audio/audiortp/audio_rtp_record_handler.h index b1bdad528f..3f3a7ec649 100644 --- a/daemon/src/audio/audiortp/audio_rtp_record_handler.h +++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.h @@ -34,6 +34,7 @@ using std::ptrdiff_t; #include <ccrtp/rtp.h> +#include <tr1/array> #include <list> class SIPCall; @@ -50,9 +51,6 @@ namespace sfl { // Frequency (in packet number) #define RTP_TIMESTAMP_RESET_FREQ 100 -// Factor use to increase volume in fade in -#define FADEIN_STEP_SIZE 4; - static const int schedulingTimeout = 4000; static const int expireTimeout = 1000000; @@ -72,7 +70,7 @@ timeval2microtimeout(const timeval& t) /** * Class meant to store internal data in order to encode/decode, * resample, process, and packetize audio streams. This class should not be - * handled directly. Use AudioRtpRecorrdHandeler + * handled directly. Use AudioRtpRecordHandler */ class AudioRtpRecord { public: @@ -83,20 +81,29 @@ class AudioRtpRecord { ost::Mutex audioCodecMutex_; int codecPayloadType_; bool hasDynamicPayloadType_; - SFLDataFormat decData_[DEC_BUFFER_SIZE]; - SFLDataFormat resampledData_[DEC_BUFFER_SIZE]; - unsigned char encodedData_[DEC_BUFFER_SIZE]; - SamplerateConverter *converter_; + std::tr1::array<SFLDataFormat, DEC_BUFFER_SIZE> decData_; +// FIXME: resampledData should be resized as needed + std::tr1::array<SFLDataFormat, DEC_BUFFER_SIZE * 4> resampledData_; + std::tr1::array<unsigned char, DEC_BUFFER_SIZE> encodedData_; + SamplerateConverter *converterEncode_; + SamplerateConverter *converterDecode_; int codecSampleRate_; int codecFrameSize_; int converterSamplingRate_; std::list<int> dtmfQueue_; - SFLDataFormat micAmplFactor_; - NoiseSuppress *noiseSuppress_; + SFLDataFormat fadeFactor_; + NoiseSuppress *noiseSuppressEncode_; + NoiseSuppress *noiseSuppressDecode_; ost::Mutex audioProcessMutex_; std::string callId_; unsigned int dtmfPayloadType_; + private: + friend class AudioRtpRecordHandler; + /** + * Ramp In audio data to avoid audio click from peer + */ + void fadeInDecodedData(size_t size); NON_COPYABLE(AudioRtpRecord); }; @@ -136,7 +143,7 @@ class AudioRtpRecordHandler { } const unsigned char *getMicDataEncoded() const { - return audioRtpRecord_.encodedData_; + return audioRtpRecord_.encodedData_.data(); } void initBuffers(); @@ -153,11 +160,6 @@ class AudioRtpRecordHandler { */ void processDataDecode(unsigned char * spkrData, size_t size, int payloadType); - /** - * Ramp In audio data to avoid audio click from peer - */ - void fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor); - void setDtmfPayloadType(unsigned int payloadType) { audioRtpRecord_.dtmfPayloadType_ = payloadType; } diff --git a/daemon/src/audio/audiortp/audio_rtp_session.cpp b/daemon/src/audio/audiortp/audio_rtp_session.cpp index b0464cae86..6d70bcd0c6 100644 --- a/daemon/src/audio/audiortp/audio_rtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_session.cpp @@ -33,12 +33,9 @@ */ #include "audio_rtp_session.h" -#include "audio_symmetric_rtp_session.h" #include "logger.h" #include "sip/sdp.h" #include "sip/sipcall.h" -#include "audio/audiolayer.h" -#include <ccrtp/rtp.h> #include <ccrtp/oqueue.h> #include "manager.h" @@ -72,10 +69,10 @@ void AudioRtpSession::updateSessionMedia(AudioCodec &audioCodec) Manager::instance().audioSamplingRateChanged(audioRtpRecord_.codecSampleRate_); if (lastSamplingRate != audioRtpRecord_.codecSampleRate_) { - DEBUG("AudioRtpSession: Update noise suppressor with sampling rate %d and frame size %d", getCodecSampleRate(), getCodecFrameSize()); + DEBUG("Update noise suppressor with sampling rate %d and frame size %d", + getCodecSampleRate(), getCodecFrameSize()); initNoiseSuppress(); } - } void AudioRtpSession::setSessionMedia(AudioCodec &audioCodec) @@ -94,20 +91,20 @@ void AudioRtpSession::setSessionMedia(AudioCodec &audioCodec) else timestampIncrement_ = frameSize; - DEBUG("AudioRtpSession: Codec payload: %d", payloadType); - DEBUG("AudioRtpSession: Codec sampling rate: %d", smplRate); - DEBUG("AudioRtpSession: Codec frame size: %d", frameSize); - DEBUG("AudioRtpSession: RTP timestamp increment: %d", timestampIncrement_); + DEBUG("Codec payload: %d", payloadType); + DEBUG("Codec sampling rate: %d", smplRate); + DEBUG("Codec frame size: %d", frameSize); + DEBUG("RTP timestamp increment: %d", timestampIncrement_); if (payloadType == g722PayloadType) { - DEBUG("AudioRtpSession: Setting G722 payload format"); + DEBUG("Setting G722 payload format"); queue_.setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) payloadType, g722RtpClockRate)); } else { if (dynamic) { - DEBUG("AudioRtpSession: Setting dynamic payload format"); + DEBUG("Setting dynamic payload format"); queue_.setPayloadFormat(ost::DynamicPayloadFormat((ost::PayloadType) payloadType, smplRate)); } else { - DEBUG("AudioRtpSession: Setting static payload format"); + DEBUG("Setting static payload format"); queue_.setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) payloadType)); } } @@ -129,7 +126,7 @@ void AudioRtpSession::sendDtmfEvent() audioRtpRecord_.dtmfQueue_.pop_front(); - DEBUG("AudioRtpSession: Send RTP Dtmf (%d)", payload.event); + DEBUG("Send RTP Dtmf (%d)", payload.event); incrementTimestampForDTMF(); @@ -144,7 +141,8 @@ void AudioRtpSession::sendDtmfEvent() queue_.setMark(false); // get back the payload to audio - queue_.setPayloadFormat(ost::StaticPayloadFormat((ost::StaticPayloadType) getCodecPayloadType())); + const ost::StaticPayloadFormat pf(static_cast<ost::StaticPayloadType>(getCodecPayloadType())); + queue_.setPayloadFormat(pf); } @@ -156,7 +154,7 @@ void AudioRtpSession::receiveSpeakerData() return; unsigned char* spkrDataIn = (unsigned char*) adu->getData(); // data in char - unsigned int size = adu->getSize(); // size in char + size_t size = adu->getSize(); // size in char // DTMF over RTP, size must be over 4 in order to process it as voice data if (size > 4) @@ -184,7 +182,8 @@ void AudioRtpSession::sendMicData() void AudioRtpSession::setSessionTimeouts() { - DEBUG("AudioRtpSession: Set session scheduling timeout (%d) and expireTimeout (%d)", sfl::schedulingTimeout, sfl::expireTimeout); + DEBUG("Set session scheduling timeout (%d) and expireTimeout (%d)", + sfl::schedulingTimeout, sfl::expireTimeout); queue_.setSchedulingTimeout(sfl::schedulingTimeout); queue_.setExpireTimeout(sfl::expireTimeout); @@ -196,7 +195,7 @@ void AudioRtpSession::setDestinationIpAddress() remote_ip_ = ost::InetHostAddress(call_.getLocalSDP()->getRemoteIP().c_str()); if (!remote_ip_) { - WARN("AudioRtpSession: Target IP address (%s) is not correct!", + WARN("Target IP address (%s) is not correct!", call_.getLocalSDP()->getRemoteIP().data()); return; } @@ -204,24 +203,24 @@ void AudioRtpSession::setDestinationIpAddress() // Store remote port in case we would need to forget current destination remote_port_ = (unsigned short) call_.getLocalSDP()->getRemoteAudioPort(); - DEBUG("AudioRtpSession: New remote address for session: %s:%d", + DEBUG("New remote address for session: %s:%d", call_.getLocalSDP()->getRemoteIP().data(), remote_port_); if (!queue_.addDestination(remote_ip_, remote_port_)) { - WARN("AudioRtpSession: Can't add new destination to session!"); + WARN("Can't add new destination to session!"); return; } } void AudioRtpSession::updateDestinationIpAddress() { - DEBUG("AudioRtpSession: Update destination ip address"); + DEBUG("Update destination ip address"); // Destination address are stored in a list in ccrtp // This method remove the current destination entry if (!queue_.forgetDestination(remote_ip_, remote_port_, remote_port_ + 1)) - DEBUG("AudioRtpSession: Did not remove previous destination"); + DEBUG("Did not remove previous destination"); // new destination is stored in call // we just need to recall this method @@ -234,7 +233,7 @@ int AudioRtpSession::startRtpThread(AudioCodec &audiocodec) if (isStarted_) return 0; - DEBUG("AudioRtpSession: Starting main thread"); + DEBUG("Starting main thread"); isStarted_ = true; setSessionTimeouts(); diff --git a/daemon/src/audio/audiortp/audio_srtp_session.cpp b/daemon/src/audio/audiortp/audio_srtp_session.cpp index 38567d1b62..25eb48da99 100644 --- a/daemon/src/audio/audiortp/audio_srtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_srtp_session.cpp @@ -31,6 +31,8 @@ #include "logger.h" #include "array_size.h" +#include <algorithm> + #include <openssl/sha.h> #include <openssl/hmac.h> #include <openssl/evp.h> @@ -95,23 +97,35 @@ namespace { } // Fills the array dest with length random bytes - void buffer_fill(unsigned char dest [], size_t length) + void bufferFillMasterKey(std::vector<uint8>& dest) { - DEBUG("AudioSrtp: Init local master key"); + DEBUG("Init local master key"); - // @TODO key may have different length depending on cipher suite // Allocate memory for key - std::vector<unsigned char> random_key(length); + std::vector<unsigned char> random_key(dest.size()); // Generate ryptographically strong pseudo-random bytes - if (RAND_bytes(&(*random_key.begin()), length) != 1) + if (RAND_bytes(&(*random_key.begin()), dest.size()) != 1) DEBUG("Error occured while generating cryptographically strong pseudo-random key"); - memcpy(dest, &(*random_key.begin()), length); + std::copy(random_key.begin(), random_key.end(), dest.begin()); } -} + // Fills the array dest with length random bytes + void bufferFillMasterSalt(std::vector<uint8>& dest) + { + DEBUG("Init local master key"); + + // Allocate memory for key + std::vector<unsigned char> random_key(dest.size()); + + // Generate ryptographically strong pseudo-random bytes + if (RAND_bytes(&(*random_key.begin()), dest.size()) != 1) + DEBUG("Error occured while generating cryptographically strong pseudo-random key"); + std::copy(random_key.begin(), random_key.end(), dest.begin()); + } +} AudioSrtpSession::AudioSrtpSession(SIPCall &call) : AudioSymmetricRtpSession(call), @@ -119,21 +133,16 @@ AudioSrtpSession::AudioSrtpSession(SIPCall &call) : localCryptoCtx_(0), localCryptoSuite_(0), remoteCryptoSuite_(0), - localMasterKey_(), - localMasterKeyLength_(0), - localMasterSalt_(), - localMasterSaltLength_(0), - remoteMasterKey_(), - remoteMasterKeyLength_(0), - remoteMasterSalt_(), - remoteMasterSaltLength_(0), + localMasterKey_(MAX_MASTER_KEY_LENGTH), + localMasterSalt_(MAX_MASTER_SALT_LENGTH), + remoteMasterKey_(MAX_MASTER_KEY_LENGTH), + remoteMasterSalt_(MAX_MASTER_SALT_LENGTH), remoteOfferIsSet_(false) {} - -ost::CryptoContext* AudioSrtpSession::initLocalCryptoInfo() +void AudioSrtpSession::initLocalCryptoInfo() { - DEBUG("AudioSrtp: Set cryptographic info for this rtp session"); + DEBUG("AudioSrtpSession: Set cryptographic info for this rtp session"); // Initialize local Crypto context initializeLocalMasterKey(); @@ -144,13 +153,24 @@ ost::CryptoContext* AudioSrtpSession::initLocalCryptoInfo() localCryptoCtx_->deriveSrtpKeys(0); setOutQueueCryptoContext(localCryptoCtx_); - return localCryptoCtx_; } -std::vector<std::string> AudioSrtpSession::getLocalCryptoInfo() +void AudioSrtpSession::initLocalCryptoInfoOnOffhold() { + DEBUG("AudioSrtpSession: Set cryptographic info for this rtp session"); - DEBUG("AudioSrtp: Get Cryptographic info from this rtp session"); + // Initialize local Crypto context + initializeLocalCryptoContext(); + + // Set local crypto context in ccrtp + localCryptoCtx_->deriveSrtpKeys(0); + + setOutQueueCryptoContext(localCryptoCtx_); +} + +std::vector<std::string> AudioSrtpSession::getLocalCryptoInfo() +{ + DEBUG("Get Cryptographic info from this rtp session"); std::vector<std::string> crypto_vector; @@ -158,7 +178,7 @@ std::vector<std::string> AudioSrtpSession::getLocalCryptoInfo() // cryptographic context tagged 1, 2, 3... std::string tag = "1"; - std::string crypto_suite = sfl::CryptoSuites[localCryptoSuite_].name; + std::string crypto_suite(sfl::CryptoSuites[localCryptoSuite_].name); // srtp keys formated as the following as the following // inline:keyParameters|keylifetime|MasterKeyIdentifier @@ -179,14 +199,10 @@ std::vector<std::string> AudioSrtpSession::getLocalCryptoInfo() return crypto_vector; } -ost::CryptoContext* -AudioSrtpSession::setRemoteCryptoInfo(sfl::SdesNegotiator& nego) +void AudioSrtpSession::setRemoteCryptoInfo(const sfl::SdesNegotiator& nego) { if (not remoteOfferIsSet_) { - DEBUG("%s", nego.getKeyInfo().c_str()); - // Use second crypto suite if key length is 32 bit, default is 80; - if (nego.getAuthTagLength() == "32") { localCryptoSuite_ = 1; remoteCryptoSuite_ = 1; @@ -197,55 +213,50 @@ AudioSrtpSession::setRemoteCryptoInfo(sfl::SdesNegotiator& nego) // init crypto content in Srtp session initializeRemoteCryptoContext(); - setInQueueCryptoContext(remoteCryptoCtx_); + if (remoteCryptoCtx_) { + setInQueueCryptoContext(remoteCryptoCtx_); + } remoteOfferIsSet_ = true; } - return remoteCryptoCtx_; +} + +namespace { + static const size_t BITS_PER_BYTE = 8; } void AudioSrtpSession::initializeLocalMasterKey() { - DEBUG("AudioSrtp: Init local master key"); - // @TODO key may have different length depending on cipher suite - localMasterKeyLength_ = sfl::CryptoSuites[localCryptoSuite_].masterKeyLength / 8; - assert(ARRAYSIZE(localMasterKey_) >= localMasterKeyLength_); - DEBUG("AudioSrtp: Local master key length %d", localMasterKeyLength_); - buffer_fill(localMasterKey_, localMasterKeyLength_); + localMasterKey_.resize(sfl::CryptoSuites[localCryptoSuite_].masterKeyLength / BITS_PER_BYTE); + bufferFillMasterKey(localMasterKey_); } void AudioSrtpSession::initializeLocalMasterSalt() { - // @TODO key may have different length depending on cipher suite - localMasterSaltLength_ = sfl::CryptoSuites[localCryptoSuite_].masterSaltLength / 8; - assert(ARRAYSIZE(localMasterSalt_) >= localMasterSaltLength_); - DEBUG("AudioSrtp: Local master salt length %d", localMasterSaltLength_); - buffer_fill(localMasterSalt_, localMasterSaltLength_); + localMasterSalt_.resize(sfl::CryptoSuites[localCryptoSuite_].masterSaltLength / BITS_PER_BYTE); + bufferFillMasterSalt(localMasterSalt_); } std::string AudioSrtpSession::getBase64ConcatenatedKeys() { - DEBUG("AudioSrtp: Get base64 concatenated keys"); + DEBUG("Get base64 concatenated keys"); // compute concatenated master and salt length - int concatLength = localMasterKeyLength_ + localMasterSaltLength_; - - uint8 concatKeys[concatLength]; - - DEBUG("AudioSrtp: Concatenated length %d", concatLength); + std::vector<uint8> concatKeys; + concatKeys.reserve(localMasterKey_.size() + localMasterSalt_.size()); // concatenate keys - memcpy((void*) concatKeys, (void*) localMasterKey_, localMasterKeyLength_); - memcpy((void*)(concatKeys + localMasterKeyLength_), (void*) localMasterSalt_, localMasterSaltLength_); + concatKeys.insert(concatKeys.end(), localMasterKey_.begin(), localMasterKey_.end()); + concatKeys.insert(concatKeys.end(), localMasterSalt_.begin(), localMasterSalt_.end()); // encode concatenated keys in base64 - return encodeBase64((unsigned char*) concatKeys, concatLength); + return encodeBase64(&(*concatKeys.begin()), concatKeys.size()); } void AudioSrtpSession::unBase64ConcatenatedKeys(std::string base64keys) { - remoteMasterKeyLength_ = sfl::CryptoSuites[remoteCryptoSuite_].masterKeyLength / 8; - remoteMasterSaltLength_ = sfl::CryptoSuites[remoteCryptoSuite_].masterSaltLength / 8; + remoteMasterKey_.resize(sfl::CryptoSuites[remoteCryptoSuite_].masterKeyLength / BITS_PER_BYTE); + remoteMasterSalt_.resize(sfl::CryptoSuites[remoteCryptoSuite_].masterSaltLength / BITS_PER_BYTE); // pointer to binary data char *dataptr = (char*) base64keys.data(); @@ -254,64 +265,99 @@ void AudioSrtpSession::unBase64ConcatenatedKeys(std::string base64keys) std::vector<char> output(decodeBase64((unsigned char*) dataptr, strlen(dataptr))); // copy master and slt respectively - memcpy((void*) remoteMasterKey_, &(*output.begin()), remoteMasterKeyLength_); - memcpy((void*) remoteMasterSalt_, &(*output.begin()) + remoteMasterKeyLength_, remoteMasterSaltLength_); + const std::vector<char>::iterator key_end = output.begin() + remoteMasterKey_.size(); + std::copy(output.begin(), key_end, remoteMasterKey_.begin()); + std::copy(key_end, output.end(), remoteMasterSalt_.begin()); } void AudioSrtpSession::initializeRemoteCryptoContext() { - DEBUG("AudioSrtp: Initialize remote crypto context"); + DEBUG("Initialize remote crypto context"); - CryptoSuiteDefinition crypto = sfl::CryptoSuites[remoteCryptoSuite_]; + const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[remoteCryptoSuite_]; - delete remoteCryptoCtx_; remoteCryptoCtx_ = new ost::CryptoContext(0x0, 0, // roc, 0L, // keydr, SrtpEncryptionAESCM, SrtpAuthenticationSha1Hmac, - remoteMasterKey_, - remoteMasterKeyLength_, - remoteMasterSalt_, - remoteMasterSaltLength_, - crypto.encryptionKeyLength / 8, - crypto.srtpAuthKeyLength / 8, - crypto.masterSaltLength / 8, - crypto.srtpAuthTagLength / 8); + &(*remoteMasterKey_.begin()), + remoteMasterKey_.size(), + &(*remoteMasterSalt_.begin()), + remoteMasterSalt_.size(), + crypto.encryptionKeyLength / BITS_PER_BYTE, + crypto.srtpAuthKeyLength / BITS_PER_BYTE, + crypto.masterSaltLength / BITS_PER_BYTE, + crypto.srtpAuthTagLength / BITS_PER_BYTE); } void AudioSrtpSession::initializeLocalCryptoContext() { - DEBUG("AudioSrtp: Initialize local crypto context"); + DEBUG("Initialize local crypto context"); - CryptoSuiteDefinition crypto = sfl::CryptoSuites[localCryptoSuite_]; + const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[localCryptoSuite_]; - delete localCryptoCtx_; localCryptoCtx_ = new ost::CryptoContext(OutgoingDataQueue::getLocalSSRC(), 0, // roc, 0L, // keydr, SrtpEncryptionAESCM, SrtpAuthenticationSha1Hmac, - localMasterKey_, - localMasterKeyLength_, - localMasterSalt_, - localMasterSaltLength_, - crypto.encryptionKeyLength / 8, - crypto.srtpAuthKeyLength / 8, - crypto.masterSaltLength / 8, - crypto.srtpAuthTagLength / 8); + &(*localMasterKey_.begin()), + localMasterKey_.size(), + &(*localMasterSalt_.begin()), + localMasterSalt_.size(), + crypto.encryptionKeyLength / BITS_PER_BYTE, + crypto.srtpAuthKeyLength / BITS_PER_BYTE, + crypto.masterSaltLength / BITS_PER_BYTE, + crypto.srtpAuthTagLength / BITS_PER_BYTE); } -void AudioSrtpSession::restoreCryptoContext(ost::CryptoContext *localContext, - ost::CryptoContext *remoteContext) +void +AudioSrtpSession::setLocalMasterKey(const std::vector<uint8>& key) { - delete remoteCryptoCtx_; - remoteCryptoCtx_ = remoteContext; - delete localCryptoCtx_; - localCryptoCtx_ = localContext; - setInQueueCryptoContext(remoteCryptoCtx_); - setOutQueueCryptoContext(localCryptoCtx_); + localMasterKey_ = key; +} + +std::vector<uint8> +AudioSrtpSession::getLocalMasterKey() const +{ + return localMasterKey_; +} + +void +AudioSrtpSession::setLocalMasterSalt(const std::vector<uint8>& salt) +{ + localMasterSalt_ = salt; +} + +std::vector<uint8> +AudioSrtpSession::getLocalMasterSalt() const +{ + return localMasterSalt_; +} + +void +AudioSrtpSession::setRemoteMasterKey(const std::vector<uint8>& key) +{ + remoteMasterKey_ = key; +} + +std::vector<uint8> AudioSrtpSession::getRemoteMasterKey() const +{ + return remoteMasterKey_; +} + +void +AudioSrtpSession::setRemoteMasterSalt(const std::vector<uint8>& salt) +{ + remoteMasterSalt_ = salt; +} + +std::vector<uint8> +AudioSrtpSession::getRemoteMasterSalt() const +{ + return remoteMasterSalt_; } } diff --git a/daemon/src/audio/audiortp/audio_srtp_session.h b/daemon/src/audio/audiortp/audio_srtp_session.h index a84cfccc84..18d0adc926 100644 --- a/daemon/src/audio/audiortp/audio_srtp_session.h +++ b/daemon/src/audio/audiortp/audio_srtp_session.h @@ -63,14 +63,17 @@ class SIPCall; +---------------------+-------------+--------------+---------------+ */ - namespace sfl { +#define MAX_MASTER_KEY_LENGTH 16 +#define MAX_MASTER_SALT_LENGTH 14 + class AudioSrtpSession : public AudioSymmetricRtpSession { public: /** - * Constructor for this rtp session + * Constructor for this rtp session. The local and remote keys must be properly + * initialized using initLocalCryptoInfo and setRemoteCryptoInfo respectively. */ AudioSrtpSession(SIPCall &call); @@ -82,32 +85,85 @@ class AudioSrtpSession : public AudioSymmetricRtpSession { std::vector<std::string> getLocalCryptoInfo(); /** - * Set remote crypto header from incoming sdp offer - * @return The new remote crypto context, to be cached by the caller + * Set remote crypto header from incoming sdp offer. It is expected that the + * local cryptographic context is initialized with mehod */ - ost::CryptoContext* setRemoteCryptoInfo(sfl::SdesNegotiator &nego); + void setRemoteCryptoInfo(const sfl::SdesNegotiator &nego); /** * Init local crypto context for outgoing data - * this method must be called before sending first Invite request - * with SDP offer. + * this method must be called before sending or receiving an SDP offer. + * It is required for media negotiation that the local cryptographic + * context be properly initialized. + * * @return The new local crypto context, to be cached by the caller */ - ost::CryptoContext* initLocalCryptoInfo(); + void initLocalCryptoInfo(); + + /** + * Initialize crypto context + */ + void initLocalCryptoInfoOnOffhold(); + + /** + * Replace the local master key with the one specified. One must call + * initializeLocalCryptoContext to apply the key to the encryption engine. + */ + void setLocalMasterKey(const std::vector<uint8>& key); + + /** + * Store the current local master key in an external buffer + * for future reinitialization of the session. + */ + std::vector<uint8> getLocalMasterKey() const; + + /** + * Replace the local master salt with the one specificed. One must call + * initializeLocalCryptoContext to apply the key to the encryption engine. + */ + void setLocalMasterSalt(const std::vector<uint8>& salt); + + /** + * Store the lcoal master salt in an external buffer for future + * reinitialization of the ssession. + */ + std::vector<uint8> getLocalMasterSalt() const; + + /** + * Replace the remote master key with one specified. One must call + * initializeRemoteCryptoContext to apply the key to the decryption engine. + */ + void setRemoteMasterKey(const std::vector<uint8>& key); + + /** + * Store the remote master key in an extenal buffer for future + * reinitialization of the session. + */ + std::vector<uint8> getRemoteMasterKey() const; /** - * Restore the cryptographic context. most likely useful to restore - * a call after hold action + * Replace the remote master salt with one specified. On must call + * initializeRemoteCryptoContext to apply the key to the decryption engine. */ - void restoreCryptoContext(ost::CryptoContext *, ost::CryptoContext *); + void setRemoteMasterSalt(const std::vector<uint8>& salt); + + /** + * Store the remote master salt in an external buffer for future + * reinitialization of the session. + */ + std::vector<uint8> getRemoteMasterSalt() const; private: NON_COPYABLE(AudioSrtpSession); - /** Remote srtp crypto context to be set into incoming data queue. */ + /** + * Remote srtp crypto context to be set into incoming data queue. + */ ost::CryptoContext* remoteCryptoCtx_; - /** Local srtp crypto context to be set into outgoing data queue. */ + /** + * Local srtp crypto context to be set into outgoing data queue. + */ ost::CryptoContext* localCryptoCtx_; /** @@ -144,33 +200,36 @@ class AudioSrtpSession : public AudioSymmetricRtpSession { */ void unBase64ConcatenatedKeys(std::string base64keys); - /** Default local crypto suite is AES_CM_128_HMAC_SHA1_80*/ + /** + * Default local crypto suite is AES_CM_128_HMAC_SHA1_80 + */ int localCryptoSuite_; - /** Remote crypto suite is initialized at AES_CM_128_HMAC_SHA1_80*/ + /** + * Remote crypto suite is initialized at AES_CM_128_HMAC_SHA1_80 + */ int remoteCryptoSuite_; - uint8 localMasterKey_[16]; - - /** local master key length in byte */ - size_t localMasterKeyLength_; - - uint8 localMasterSalt_[14]; - - /** local master salt length in byte */ - size_t localMasterSaltLength_; - - uint8 remoteMasterKey_[16]; + /** + * Array to store the local master key + */ + std::vector<uint8> localMasterKey_; - /** remote master key length in byte */ - size_t remoteMasterKeyLength_; + /** + * Array to store local master salt + */ + std::vector<uint8> localMasterSalt_; - uint8 remoteMasterSalt_[14]; + std::vector<uint8> remoteMasterKey_; - /** remote master salt length in byte */ - size_t remoteMasterSaltLength_; + /** + * Array to store the remote master salt + */ + std::vector<uint8> remoteMasterSalt_; - /** Used to make sure remote crypto context not initialized wice. */ + /** + * Used to make sure remote crypto context not initialized twice. + */ bool remoteOfferIsSet_; }; } diff --git a/daemon/src/audio/audiortp/audio_symmetric_rtp_session.cpp b/daemon/src/audio/audiortp/audio_symmetric_rtp_session.cpp index ee5e3a53b3..559c657805 100644 --- a/daemon/src/audio/audiortp/audio_symmetric_rtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_symmetric_rtp_session.cpp @@ -32,13 +32,9 @@ * as that of the covered work. */ -#include "audio_rtp_session.h" #include "audio_symmetric_rtp_session.h" -#include "audio_rtp_record_handler.h" #include "logger.h" -#include "sip/sdp.h" #include "sip/sipcall.h" -#include "audio/audiolayer.h" namespace sfl { @@ -48,7 +44,8 @@ AudioSymmetricRtpSession::AudioSymmetricRtpSession(SIPCall &call) : , AudioRtpSession(call, *this, *this) , rtpThread_(*this) { - DEBUG("AudioSymmetricRtpSession: Setting new RTP session with destination %s:%d", call_.getLocalIp().c_str(), call_.getLocalAudioPort()); + DEBUG("Setting new RTP session with destination %s:%d", + call_.getLocalIp().c_str(), call_.getLocalAudioPort()); audioRtpRecord_.callId_ = call_.getCallId(); } @@ -69,7 +66,7 @@ void AudioSymmetricRtpSession::AudioRtpThread::run() TimerPort::setTimer(threadSleep); - DEBUG("AudioRtpThread: Entering Audio rtp thread main loop"); + DEBUG("Entering Audio rtp thread main loop"); while (running_) { // Send session @@ -83,7 +80,7 @@ void AudioSymmetricRtpSession::AudioRtpThread::run() TimerPort::incTimer(threadSleep); } - DEBUG("AudioRtpThread: Leaving audio rtp thread loop"); + DEBUG("Leaving audio rtp thread loop"); } void AudioSymmetricRtpSession::setSessionMedia(AudioCodec &audioCodec) @@ -94,12 +91,11 @@ void AudioSymmetricRtpSession::setSessionMedia(AudioCodec &audioCodec) int AudioSymmetricRtpSession::startRtpThread(AudioCodec &audiocodec) { - DEBUG("AudioSymmetricRtpSession: Starting main thread"); + DEBUG("Starting main thread"); if (isStarted_) return 0; AudioRtpSession::startRtpThread(audiocodec); return startSymmetricRtpThread(); } - } diff --git a/daemon/src/audio/audiortp/audio_zrtp_session.cpp b/daemon/src/audio/audiortp/audio_zrtp_session.cpp index ca4449e318..72570544b9 100644 --- a/daemon/src/audio/audiortp/audio_zrtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_zrtp_session.cpp @@ -34,26 +34,19 @@ #include "audio_zrtp_session.h" #include "zrtp_session_callback.h" -#include "fileutils.h" #include "sip/sipcall.h" -#include "sip/sdp.h" -#include "audio/audiolayer.h" #include "logger.h" #include "manager.h" +#include "fileutils.h" #include <libzrtpcpp/zrtpccrtp.h> #include <libzrtpcpp/ZrtpQueue.h> #include <libzrtpcpp/ZrtpUserCallback.h> - -#include <cstdio> -#include <cstring> -#include <cerrno> - #include <ccrtp/rtp.h> namespace sfl { -AudioZrtpSession::AudioZrtpSession(SIPCall &call, const std::string& zidFilename) : +AudioZrtpSession::AudioZrtpSession(SIPCall &call, const std::string &zidFilename) : AudioRtpSession(call, *this, *this), ost::TRTPSessionBase<ost::SymmetricRTPChannel, ost::SymmetricRTPChannel, ost::ZrtpQueue>(ost::InetHostAddress(call_.getLocalIp().c_str()), call_.getLocalAudioPort(), @@ -62,9 +55,8 @@ AudioZrtpSession::AudioZrtpSession(SIPCall &call, const std::string& zidFilename ost::defaultApplication()), zidFilename_(zidFilename) { - DEBUG("AudioZrtpSession initialized"); initializeZid(); - DEBUG("AudioZrtpSession: Setting new RTP session with destination %s:%d", + DEBUG("Setting new RTP session with destination %s:%d", call_.getLocalIp().c_str(), call_.getLocalAudioPort()); } @@ -83,18 +75,17 @@ void AudioZrtpSession::initializeZid() std::string xdg_config = std::string(HOMEDIR) + DIR_SEPARATOR_STR + ".cache" + DIR_SEPARATOR_STR + PACKAGE + "/" + zidFilename_; - DEBUG(" xdg_config %s", xdg_config.c_str()); + DEBUG("xdg_config %s", xdg_config.c_str()); if (XDG_CACHE_HOME != NULL) { std::string xdg_env = std::string(XDG_CACHE_HOME) + zidFilename_; - DEBUG(" xdg_env %s", xdg_env.c_str()); + DEBUG("xdg_env %s", xdg_env.c_str()); (xdg_env.length() > 0) ? zidCompleteFilename = xdg_env : zidCompleteFilename = xdg_config; } else zidCompleteFilename = xdg_config; if (initialize(zidCompleteFilename.c_str()) >= 0) { - DEBUG("Register callbacks"); setEnableZrtp(true); setUserCallback(new ZrtpSessionCallback(call_)); return; @@ -133,7 +124,7 @@ void AudioZrtpSession::run() { // Set recording sampling rate call_.setRecordingSmplRate(getCodecSampleRate()); - DEBUG("AudioZrtpSession: Entering mainloop for call %s", call_.getCallId().c_str()); + DEBUG("Entering mainloop for call %s", call_.getCallId().c_str()); uint32 timeout = 0; @@ -168,7 +159,7 @@ void AudioZrtpSession::run() } } - DEBUG("AudioZrtpSession: Left main loop for call %s", call_.getCallId().c_str()); + DEBUG("Left main loop for call %s", call_.getCallId().c_str()); } void AudioZrtpSession::incrementTimestampForDTMF() diff --git a/daemon/src/audio/audiortp/zrtp_session_callback.cpp b/daemon/src/audio/audiortp/zrtp_session_callback.cpp index 4383d09d15..635180a85a 100644 --- a/daemon/src/audio/audiortp/zrtp_session_callback.cpp +++ b/daemon/src/audio/audiortp/zrtp_session_callback.cpp @@ -35,9 +35,7 @@ #include "manager.h" #include <cstdlib> -#include <string> #include <map> -#include <utility> // for std::pair using namespace GnuZrtpCodes; @@ -45,18 +43,12 @@ using namespace ost; namespace sfl { -ZrtpSessionCallback::ZrtpSessionCallback(SIPCall &call) : - call_(call) +ZrtpSessionCallback::ZrtpSessionCallback(SIPCall &call) : call_(call) { - using std::pair; - using std::string; - // we've already initialized the maps, we only need to check one if (not infoMap_.empty()) return; - DEBUG("Zrtp: Initialize callbacks"); - // Information Map infoMap_[InfoHelloReceived] = "Hello received, preparing a Commit"; infoMap_[InfoCommitDHGenerated] = "Commit: Generated a public DH key"; @@ -111,33 +103,31 @@ ZrtpSessionCallback::ZrtpSessionCallback(SIPCall &call) : void ZrtpSessionCallback::secureOn(std::string cipher) { - DEBUG("Zrtp: Secure mode is on with cipher %s", cipher.c_str()); + DEBUG("Secure mode is on with cipher %s", cipher.c_str()); Manager::instance().getDbusManager()->getCallManager()->secureZrtpOn(call_.getCallId(), cipher); } void ZrtpSessionCallback::secureOff() { - DEBUG("Zrtp: Secure mode is off"); + DEBUG("Secure mode is off"); Manager::instance().getDbusManager()->getCallManager()->secureZrtpOff(call_.getCallId()); } void ZrtpSessionCallback::showSAS(std::string sas, bool verified) { - DEBUG("Zrtp: SAS is: %s", sas.c_str()); + DEBUG("SAS is: %s", sas.c_str()); Manager::instance().getDbusManager()->getCallManager()->showSAS(call_.getCallId(), sas, verified); } - void ZrtpSessionCallback::zrtpNotSuppOther() { - DEBUG("Zrtp: Callee does not support ZRTP"); + DEBUG("Callee does not support ZRTP"); Manager::instance().getDbusManager()->getCallManager()->zrtpNotSuppOther(call_.getCallId()); } - void ZrtpSessionCallback::showMessage(GnuZrtpCodes::MessageSeverity sev, int32_t subCode) { @@ -156,9 +146,9 @@ ZrtpSessionCallback::zrtpNegotiationFailed(MessageSeverity severity, int subCode if (severity == ZrtpError) { if (subCode < 0) { // received an error packet from peer subCode *= -1; - DEBUG("Zrtp: Received error packet: "); + DEBUG("Received error packet: "); } else - DEBUG("Zrtp: Sent error packet: "); + DEBUG("Sent error packet: "); std::map<int32, std::string>::const_iterator iter = zrtpMap_.find(subCode); if (iter != zrtpMap_.end()) { @@ -177,7 +167,7 @@ ZrtpSessionCallback::zrtpNegotiationFailed(MessageSeverity severity, int subCode void ZrtpSessionCallback::confirmGoClear() { - DEBUG("Zrtp: Received go clear message. Until confirmation, ZRTP won't send any data"); + DEBUG("Received go clear message. Until confirmation, ZRTP won't send any data"); Manager::instance().getDbusManager()->getCallManager()->zrtpNotSuppOther(call_.getCallId()); } diff --git a/daemon/src/audio/audiortp/zrtp_session_callback.h b/daemon/src/audio/audiortp/zrtp_session_callback.h index e9e92a9c2c..1577efe949 100644 --- a/daemon/src/audio/audiortp/zrtp_session_callback.h +++ b/daemon/src/audio/audiortp/zrtp_session_callback.h @@ -37,7 +37,7 @@ using std::ptrdiff_t; #include <libzrtpcpp/zrtpccrtp.h> #include <libzrtpcpp/ZrtpQueue.h> #include <libzrtpcpp/ZrtpUserCallback.h> -#include <exception> +#include <string> #include <map> class SIPCall; diff --git a/daemon/src/audio/codecs/alaw.cpp b/daemon/src/audio/codecs/alaw.cpp index 9adc558fdb..4ae6973886 100644 --- a/daemon/src/audio/codecs/alaw.cpp +++ b/daemon/src/audio/codecs/alaw.cpp @@ -31,49 +31,38 @@ #include "sfl_types.h" #include "audiocodec.h" -#include <cassert> class Alaw : public sfl::AudioCodec { public: // 8 PCMA A 8000 1 [RFC3551] - Alaw(int payload=8) - : sfl::AudioCodec(payload, "PCMA") { - clockRate_ = 8000; - frameSize_ = 160; // samples, 20 ms at 8kHz - channel_ = 1; + Alaw() : sfl::AudioCodec(8, "PCMA", 8000, 160, 1) { bitrate_ = 64; hasDynamicPayload_ = false; } - virtual ~Alaw() {} - - virtual int decode(short *dst, unsigned char *src, size_t buf_size) { - assert(buf_size == frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat)); - unsigned char* end = src + buf_size; - - while (src < end) - *dst++ = ALawDecode(*src++); + private: + virtual int decode(SFLDataFormat *dst, unsigned char *src, size_t buf_size) + { + for (unsigned char* end = src + buf_size; src < end; ++src, ++dst) + *dst = ALawDecode(*src); return frameSize_; } - virtual int encode(unsigned char *dst, short *src, size_t buf_size) { - assert(buf_size >= frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat)); - uint8* end = dst + frameSize_; - - while (dst < end) - *dst++ = ALawEncode(*src++); + virtual int encode(unsigned char *dst, SFLDataFormat *src, size_t /*buf_size*/) + { + for (unsigned char *end = dst + frameSize_; dst < end; ++src, ++dst) + *dst = ALawEncode(*src); return frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat); } - - - int ALawDecode(uint8 alaw) { + int ALawDecode(uint8 alaw) + { alaw ^= 0x55; // A-law has alternate bits inverted for transmission - uint sign = alaw&0x80; - int linear = alaw&0x1f; + uint sign = alaw & 0x80; + int linear = alaw & 0x1f; linear <<= 4; linear += 8; // Add a 'half' bit (0x08) to place PCM value in middle of range @@ -91,8 +80,8 @@ class Alaw : public sfl::AudioCodec { return linear; } - - uint8 ALawEncode(int16 pcm16) { + uint8 ALawEncode(SFLDataFormat pcm16) + { int p = pcm16; uint a; // u-law value we are forming @@ -107,18 +96,18 @@ class Alaw : public sfl::AudioCodec { //calculate segment and interval numbers p >>= 4; - if (p>=0x20) { - if (p>=0x100) { + if (p >= 0x20) { + if (p >= 0x100) { p >>= 4; a += 0x40; } - if (p>=0x40) { + if (p >= 0x40) { p >>= 2; a += 0x20; } - if (p>=0x20) { + if (p >= 0x20) { p >>= 1; a += 0x10; } @@ -127,7 +116,8 @@ class Alaw : public sfl::AudioCodec { // a&0x70 now holds segment value and 'p' the interval number a += p; // a now equal to encoded A-law value - return a^0x55; // A-law has alternate bits inverted for transmission + // A-law has alternate bits inverted for transmission + return a ^ 0x55; } }; @@ -135,7 +125,7 @@ class Alaw : public sfl::AudioCodec { // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Alaw(8); + return new Alaw; } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/audiocodec.cpp b/daemon/src/audio/codecs/audiocodec.cpp index 5dbfe798e4..05287fbe89 100644 --- a/daemon/src/audio/codecs/audiocodec.cpp +++ b/daemon/src/audio/codecs/audiocodec.cpp @@ -36,42 +36,36 @@ using std::ptrdiff_t; namespace sfl { -AudioCodec::AudioCodec(uint8 payload, const std::string &codecName) : - codecName_(codecName), clockRate_(8000), channel_(1), frameSize_(0), - bitrate_(0.0), bandwidth_(0.0), hasDynamicPayload_(false), - payload_(payload), payloadFormat_(0) -{ - init(payload, clockRate_); -} +AudioCodec::AudioCodec(uint8 payload, const std::string &codecName, + int clockRate, int frameSize, int channel) : + codecName_(codecName), + clockRate_(clockRate), + channel_(channel), + frameSize_(frameSize), + bitrate_(0.0), + bandwidth_(0.0), + payload_(payload), + payloadFormat_(payload, clockRate_), + hasDynamicPayload_((payload_ >= 96 and payload_ <= 127) or payload_ == 9) +{} AudioCodec::AudioCodec(const AudioCodec& c) : - codecName_(c.codecName_), clockRate_(c.clockRate_), channel_(c.channel_), - frameSize_(c.frameSize_), bitrate_(c.bitrate_), bandwidth_(c.bandwidth_), - hasDynamicPayload_(c.hasDynamicPayload_), payload_(c.payload_), - payloadFormat_(c.payloadFormat_) -{ - init(c.payload_, c.clockRate_); -} - -void AudioCodec::init(uint8 payloadType, uint32 clockRate) -{ - payloadFormat_ = new ost::DynamicPayloadFormat(payloadType, clockRate); - - // If g722 (payload 9), we need to init libccrtp symetric sessions with using - // dynamic payload format. This way we get control on rtp clockrate. - hasDynamicPayload_ = ((payload_ >= 96 and payload_ <= 127) or payload_ == 9); -} + codecName_(c.codecName_), + clockRate_(c.clockRate_), + channel_(c.channel_), + frameSize_(c.frameSize_), + bitrate_(c.bitrate_), + bandwidth_(c.bandwidth_), + payload_(c.payload_), + payloadFormat_(c.payloadFormat_), + hasDynamicPayload_(c.hasDynamicPayload_) +{} std::string AudioCodec::getMimeSubtype() const { return codecName_; } -const ost::PayloadFormat& AudioCodec::getPayloadFormat() -{ - return *payloadFormat_; -} - uint8 AudioCodec::getPayloadType() const { return payload_; @@ -97,9 +91,4 @@ double AudioCodec::getBitRate() const return bitrate_; } -AudioCodec::~AudioCodec() -{ - delete payloadFormat_; -} - } // end namespace sfl diff --git a/daemon/src/audio/codecs/audiocodec.h b/daemon/src/audio/codecs/audiocodec.h index 26ea4fe45c..4811da4b77 100644 --- a/daemon/src/audio/codecs/audiocodec.h +++ b/daemon/src/audio/codecs/audiocodec.h @@ -33,59 +33,39 @@ #define __AUDIO_CODEC_H__ #include <string> -#include <dlfcn.h> +#include "cc_config.h" +#include <ccrtp/formats.h> // for ost::DynamicPayloadFormat #include "codec.h" /* bump when codec binary interface changes */ -#define CODEC_ENTRY create_0_9_14 -#define CODEC_ENTRY_SYMBOL "create_0_9_14" +#define CODEC_ENTRY create_1_1_0 +#define CODEC_ENTRY_SYMBOL "create_1_1_0" // We assume all decoders will be fed 20ms of audio or less // And we'll resample them to 44.1kHz or less // Also assume mono #define DEC_BUFFER_SIZE ((44100 * 20) / 1000) -namespace ost { -class PayloadFormat; -class DynamicPayloadFormat; -} - namespace sfl { class AudioCodec : public Codec { public: - AudioCodec(uint8 payload, const std::string &codecName); + AudioCodec(uint8 payload, const std::string &codecName, int clockRate, + int frameSize, int channel); /** * Copy constructor. */ AudioCodec(const AudioCodec& codec); - virtual ~AudioCodec(); + virtual ~AudioCodec() {}; /** * @Override */ std::string getMimeSubtype() const; - /** - * @Override - */ - const ost::PayloadFormat& getPayloadFormat(); - - /** - * @Override - */ - void setParameter(const std::string& /*name*/, const std::string& /*value*/) {}; - - /** - * @Override - */ - std::string getParameter(const std::string& /*name*/) const { - return ""; - }; - /** * Decode an input buffer and fill the output buffer with the decoded data * @param buffer_size : the size of the input buffer @@ -151,15 +131,14 @@ class AudioCodec : public Codec { /** Bandwidth */ double bandwidth_; - bool hasDynamicPayload_; - private: AudioCodec& operator=(const AudioCodec&); uint8 payload_; - ost::DynamicPayloadFormat* payloadFormat_; + ost::DynamicPayloadFormat payloadFormat_; - void init(uint8 payloadType, uint32 clockRate); +protected: + bool hasDynamicPayload_; }; } // end namespace sfl diff --git a/daemon/src/audio/codecs/audiocodecfactory.cpp b/daemon/src/audio/codecs/audiocodecfactory.cpp index 51422014a7..08ae72719b 100644 --- a/daemon/src/audio/codecs/audiocodecfactory.cpp +++ b/daemon/src/audio/codecs/audiocodecfactory.cpp @@ -37,6 +37,7 @@ #include "audiocodecfactory.h" #include <cstdlib> +#include <dlfcn.h> #include <algorithm> // for std::find #include "fileutils.h" #include "logger.h" @@ -50,10 +51,10 @@ AudioCodecFactory::AudioCodecFactory() : if (codecDynamicList.empty()) ERROR("Error - No codecs available"); else { - for (CodecVector::const_iterator i = codecDynamicList.begin(); - i != codecDynamicList.end() ; ++i) { - codecsMap_[(int)(*i)->getPayloadType()] = *i; - DEBUG("Loaded codec %s" , (*i)->getMimeSubtype().c_str()); + for (CodecVector::const_iterator iter = codecDynamicList.begin(); + iter != codecDynamicList.end() ; ++iter) { + codecsMap_[(int)(*iter)->getPayloadType()] = *iter; + DEBUG("Loaded codec %s" , (*iter)->getMimeSubtype().c_str()); } } } @@ -80,11 +81,9 @@ std::vector<int32_t > AudioCodecFactory::getAudioCodecList() const { std::vector<int32_t> list; - int size = codecsMap_.size(); - printf("%d\n",size); - for (CodecsMap::const_iterator i = codecsMap_.begin(); i != codecsMap_.end(); ++i) - if (i->second) - list.push_back((int32_t)i->first); + for (CodecsMap::const_iterator iter = codecsMap_.begin(); iter != codecsMap_.end(); ++iter) + if (iter->second) + list.push_back((int32_t)iter->first); return list; } @@ -112,20 +111,22 @@ double AudioCodecFactory::getBitRate(int payload) const return 0.0; } + int AudioCodecFactory::getSampleRate(int payload) const { CodecsMap::const_iterator iter = codecsMap_.find(payload); - if (iter!=codecsMap_.end()) - return (iter->second->getClockRate() * 0.001); - return 0; + if (iter != codecsMap_.end()) + return iter->second->getClockRate(); + else + return 0; } void AudioCodecFactory::saveActiveCodecs(const std::vector<std::string>& list) { defaultCodecList_.clear(); // list contains the ordered payload of active codecs picked by the user - // we used the CodecList vector to save the order. + // we used the CodecOrder vector to save the order. for (std::vector<std::string>::const_iterator iter = list.begin(); iter != list.end(); ++iter) { int payload = std::atoi(iter->c_str()); @@ -138,9 +139,9 @@ void AudioCodecFactory::saveActiveCodecs(const std::vector<std::string>& list) AudioCodecFactory::~AudioCodecFactory() { - for (std::vector<CodecHandlePointer>::const_iterator i = - codecInMemory_.begin(); i != codecInMemory_.end(); ++i) - unloadCodec(*i); + for (std::vector<CodecHandlePointer>::const_iterator iter = + codecInMemory_.begin(); iter != codecInMemory_.end(); ++iter) + unloadCodec(*iter); } std::vector<sfl::Codec*> AudioCodecFactory::scanCodecDirectory() @@ -195,7 +196,7 @@ std::vector<sfl::Codec*> AudioCodecFactory::scanCodecDirectory() sfl::Codec* AudioCodecFactory::loadCodec(const std::string &path) { - void * codecHandle = dlopen(path.c_str() , RTLD_LAZY); + void * codecHandle = dlopen(path.c_str(), RTLD_LAZY); if (!codecHandle) { ERROR("%s\n", dlerror()); @@ -204,7 +205,7 @@ sfl::Codec* AudioCodecFactory::loadCodec(const std::string &path) dlerror(); - create_t* createCodec = (create_t*) dlsym(codecHandle , CODEC_ENTRY_SYMBOL); + create_t* createCodec = (create_t*) dlsym(codecHandle, CODEC_ENTRY_SYMBOL); char *error = dlerror(); if (error) { @@ -238,9 +239,11 @@ void AudioCodecFactory::unloadCodec(CodecHandlePointer p) sfl::Codec* AudioCodecFactory::instantiateCodec(int payload) const { - for (std::vector<CodecHandlePointer>::const_iterator i = codecInMemory_.begin(); i != codecInMemory_.end(); ++i) { - if (i->first->getPayloadType() == payload) { - create_t* createCodec = (create_t*) dlsym(i->second , CODEC_ENTRY_SYMBOL); + std::vector< CodecHandlePointer >::const_iterator iter; + + for (iter = codecInMemory_.begin(); iter != codecInMemory_.end(); ++iter) { + if (iter->first->getPayloadType() == payload) { + create_t* createCodec = (create_t*) dlsym(iter->second , CODEC_ENTRY_SYMBOL); char *error = dlerror(); @@ -309,8 +312,10 @@ AudioCodecFactory::alreadyInCache(const std::string &lib) bool AudioCodecFactory::isCodecLoaded(int payload) const { - for (CodecsMap::const_iterator i = codecsMap_.begin(); i != codecsMap_.end(); ++i) - if (i->first == payload) + CodecsMap::const_iterator iter; + + for (iter = codecsMap_.begin(); iter != codecsMap_.end(); ++iter) + if (iter->first == payload) return true; return false; diff --git a/daemon/src/audio/codecs/g722.cpp b/daemon/src/audio/codecs/g722.cpp index 21755430a7..c4917cb467 100644 --- a/daemon/src/audio/codecs/g722.cpp +++ b/daemon/src/audio/codecs/g722.cpp @@ -33,335 +33,288 @@ #include "audiocodec.h" #include "sfl_types.h" #include "g722.h" -#include "noncopyable.h" -#include <stdlib.h> -#include <string.h> -#include <cassert> +#include <cstdlib> +#include <cstring> class G722 : public sfl::AudioCodec { public: - G722(int payload=9) : sfl::AudioCodec(payload, "G722"), - decode_s(new g722_decode_state_t), - encode_s(new g722_encode_state_t) { - clockRate_ = 16000; - frameSize_ = 320; // samples, 20 ms at 16kHz - channel_ = 1; + G722() : sfl::AudioCodec(9, "G722", 16000, 320, 1), decode_state_(), + encode_state_() { bitrate_ = 64; hasDynamicPayload_ = false; - g722_decode_init(); - g722_encode_init(); + g722_state_init(decode_state_); + g722_state_init(encode_state_); } - ~G722() { - g722_decode_release(); - g722_encode_release(); - } - - virtual int decode(short *dst, unsigned char *src, size_t buf_size) { - assert(buf_size == frameSize_ / sizeof(SFLDataFormat) * encode_s->bits_per_sample / 8); - return g722_decode((int16_t*) dst, (const uint8_t*) src, buf_size); + private: + virtual int decode(SFLDataFormat *dst, unsigned char *src, size_t buf_size) + { + return g722_decode(dst, src, buf_size); } - virtual int encode(unsigned char *dst, short *src, size_t buf_size) { - int out = g722_encode((uint8_t*) dst, (const int16_t*) src, frameSize_); - assert((size_t)out <= buf_size); + virtual int encode(unsigned char *dst, SFLDataFormat *src, size_t /*buf_size*/) + { + int out = g722_encode(dst, src, frameSize_); return out; } - - void g722_encode_init() { - encode_s->itu_test_mode = false; - - // 8 => 64 kbps; 7 => 56 kbps; 6 => 48 kbps - encode_s->bits_per_sample = 8; - - // Enable 8khz mode, encode using lower subband only - encode_s->eight_k = false; - - // Never set packed true when using 64 kbps - encode_s->packed = false; - - memset(encode_s->band, 0, sizeof(decode_s->band)); - encode_s->band[0].det = 32; - encode_s->band[1].det = 8; - - memset(encode_s->x, 0, sizeof(encode_s->x)); - - decode_s->in_buffer = 0; - decode_s->in_bits = 0; - decode_s->out_buffer = 0; - decode_s->out_bits = 0; - } - - void g722_decode_init() { - - decode_s->itu_test_mode = false; + static void g722_state_init(g722_state_t &state) + { + state.itu_test_mode = false; // 8 => 64 kbps; 7 => 56 kbps; 6 => 48 kbps - decode_s->bits_per_sample = 8; + state.bits_per_sample = 8; // Enable 8khz mode, encode using lower subband only - decode_s->eight_k = false; + state.eight_k = false; // Never set packed true when using 64 kbps - decode_s->packed = false; - - memset(decode_s->band, 0, sizeof(decode_s->band)); - decode_s->band[0].det = 32; - decode_s->band[1].det = 8; + state.packed = false; - decode_s->in_bits = 0; + memset(state.band, 0, sizeof(state.band)); + state.band[0].det = 32; + state.band[1].det = 8; - memset(decode_s->x, 0, sizeof(decode_s->x)); + memset(state.x, 0, sizeof(state.x)); - decode_s->in_buffer = 0; - decode_s->in_bits = 0; - decode_s->out_buffer = 0; - decode_s->out_bits = 0; + state.in_buffer = 0; + state.in_bits = 0; + state.out_buffer = 0; + state.out_bits = 0; } - int16_t saturate(int32_t amp) { - int16_t amp16 = 0; + SFLDataFormat saturate(int32_t amp) + { + SFLDataFormat amp16 = 0; /* Hopefully this is optimised for the common case - not clipping */ - amp16 = (int16_t) amp; + amp16 = (SFLDataFormat) amp; if (amp == amp16) return amp16; if (amp > INT16_MAX) - return INT16_MAX; + return INT16_MAX; - return INT16_MIN; + return INT16_MIN; } - - void block4_encode(int band, int d) { + void block4_encode(int band, int d) + { int wd1 = 0; int wd2 = 0; int wd3 = 0; int i = 0; /* Block 4, RECONS */ - encode_s->band[band].d[0] = d; - encode_s->band[band].r[0] = saturate(encode_s->band[band].s + d); + encode_state_.band[band].d[0] = d; + encode_state_.band[band].r[0] = saturate(encode_state_.band[band].s + d); /* Block 4, PARREC */ - encode_s->band[band].p[0] = saturate(encode_s->band[band].sz + d); + encode_state_.band[band].p[0] = saturate(encode_state_.band[band].sz + d); /* Block 4, UPPOL2 */ for (i = 0; i < 3; i++) - encode_s->band[band].sg[i] = encode_s->band[band].p[i] >> 15; + encode_state_.band[band].sg[i] = encode_state_.band[band].p[i] >> 15; - wd1 = saturate(encode_s->band[band].a[1] << 2); + wd1 = saturate(encode_state_.band[band].a[1] << 2); - wd2 = (encode_s->band[band].sg[0] == encode_s->band[band].sg[1]) ? -wd1 : wd1; + wd2 = (encode_state_.band[band].sg[0] == encode_state_.band[band].sg[1]) ? -wd1 : wd1; if (wd2 > 32767) wd2 = 32767; - wd3 = (wd2 >> 7) + ((encode_s->band[band].sg[0] == encode_s->band[band].sg[2]) ? 128 : -128); + wd3 = (wd2 >> 7) + ((encode_state_.band[band].sg[0] == encode_state_.band[band].sg[2]) ? 128 : -128); - wd3 += (encode_s->band[band].a[2]*32512) >> 15; + wd3 += (encode_state_.band[band].a[2]*32512) >> 15; if (wd3 > 12288) wd3 = 12288; else if (wd3 < -12288) wd3 = -12288; - encode_s->band[band].ap[2] = wd3; + encode_state_.band[band].ap[2] = wd3; /* Block 4, UPPOL1 */ - encode_s->band[band].sg[0] = encode_s->band[band].p[0] >> 15; + encode_state_.band[band].sg[0] = encode_state_.band[band].p[0] >> 15; - encode_s->band[band].sg[1] = encode_s->band[band].p[1] >> 15; + encode_state_.band[band].sg[1] = encode_state_.band[band].p[1] >> 15; - wd1 = (encode_s->band[band].sg[0] == encode_s->band[band].sg[1]) ? 192 : -192; + wd1 = (encode_state_.band[band].sg[0] == encode_state_.band[band].sg[1]) ? 192 : -192; - wd2 = (encode_s->band[band].a[1]*32640) >> 15; + wd2 = (encode_state_.band[band].a[1]*32640) >> 15; - encode_s->band[band].ap[1] = saturate(wd1 + wd2); + encode_state_.band[band].ap[1] = saturate(wd1 + wd2); - wd3 = saturate(15360 - encode_s->band[band].ap[2]); + wd3 = saturate(15360 - encode_state_.band[band].ap[2]); - if (encode_s->band[band].ap[1] > wd3) - encode_s->band[band].ap[1] = wd3; - else if (encode_s->band[band].ap[1] < -wd3) - encode_s->band[band].ap[1] = -wd3; + if (encode_state_.band[band].ap[1] > wd3) + encode_state_.band[band].ap[1] = wd3; + else if (encode_state_.band[band].ap[1] < -wd3) + encode_state_.band[band].ap[1] = -wd3; /* Block 4, UPZERO */ wd1 = (d == 0) ? 0 : 128; - encode_s->band[band].sg[0] = d >> 15; + encode_state_.band[band].sg[0] = d >> 15; for (i = 1; i < 7; i++) { - encode_s->band[band].sg[i] = encode_s->band[band].d[i] >> 15; - wd2 = (encode_s->band[band].sg[i] == encode_s->band[band].sg[0]) ? wd1 : -wd1; - wd3 = (encode_s->band[band].b[i]*32640) >> 15; - encode_s->band[band].bp[i] = saturate(wd2 + wd3); + encode_state_.band[band].sg[i] = encode_state_.band[band].d[i] >> 15; + wd2 = (encode_state_.band[band].sg[i] == encode_state_.band[band].sg[0]) ? wd1 : -wd1; + wd3 = (encode_state_.band[band].b[i]*32640) >> 15; + encode_state_.band[band].bp[i] = saturate(wd2 + wd3); } /* Block 4, DELAYA */ for (i = 6; i > 0; i--) { - encode_s->band[band].d[i] = encode_s->band[band].d[i - 1]; - encode_s->band[band].b[i] = encode_s->band[band].bp[i]; + encode_state_.band[band].d[i] = encode_state_.band[band].d[i - 1]; + encode_state_.band[band].b[i] = encode_state_.band[band].bp[i]; } for (i = 2; i > 0; i--) { - encode_s->band[band].r[i] = encode_s->band[band].r[i - 1]; - encode_s->band[band].p[i] = encode_s->band[band].p[i - 1]; - encode_s->band[band].a[i] = encode_s->band[band].ap[i]; + encode_state_.band[band].r[i] = encode_state_.band[band].r[i - 1]; + encode_state_.band[band].p[i] = encode_state_.band[band].p[i - 1]; + encode_state_.band[band].a[i] = encode_state_.band[band].ap[i]; } /* Block 4, FILTEP */ - wd1 = saturate(encode_s->band[band].r[1] + encode_s->band[band].r[1]); + wd1 = saturate(encode_state_.band[band].r[1] + encode_state_.band[band].r[1]); - wd1 = (encode_s->band[band].a[1]*wd1) >> 15; + wd1 = (encode_state_.band[band].a[1]*wd1) >> 15; - wd2 = saturate(encode_s->band[band].r[2] + encode_s->band[band].r[2]); + wd2 = saturate(encode_state_.band[band].r[2] + encode_state_.band[band].r[2]); - wd2 = (encode_s->band[band].a[2]*wd2) >> 15; + wd2 = (encode_state_.band[band].a[2]*wd2) >> 15; - encode_s->band[band].sp = saturate(wd1 + wd2); + encode_state_.band[band].sp = saturate(wd1 + wd2); /* Block 4, FILTEZ */ - encode_s->band[band].sz = 0; + encode_state_.band[band].sz = 0; for (i = 6; i > 0; i--) { - wd1 = saturate(encode_s->band[band].d[i] + encode_s->band[band].d[i]); - encode_s->band[band].sz += (encode_s->band[band].b[i]*wd1) >> 15; + wd1 = saturate(encode_state_.band[band].d[i] + encode_state_.band[band].d[i]); + encode_state_.band[band].sz += (encode_state_.band[band].b[i]*wd1) >> 15; } - encode_s->band[band].sz = saturate(encode_s->band[band].sz); + encode_state_.band[band].sz = saturate(encode_state_.band[band].sz); /* Block 4, PREDIC */ - encode_s->band[band].s = saturate(encode_s->band[band].sp + encode_s->band[band].sz); + encode_state_.band[band].s = saturate(encode_state_.band[band].sp + encode_state_.band[band].sz); } - void block4_decode(int band, int d) { + void block4_decode(int band, int d) + { int wd1 = 0; int wd2 = 0; int wd3 = 0; int i = 0; /* Block 4, RECONS */ - decode_s->band[band].d[0] = d; - decode_s->band[band].r[0] = saturate(decode_s->band[band].s + d); + decode_state_.band[band].d[0] = d; + decode_state_.band[band].r[0] = saturate(decode_state_.band[band].s + d); /* Block 4, PARREC */ - decode_s->band[band].p[0] = saturate(decode_s->band[band].sz + d); + decode_state_.band[band].p[0] = saturate(decode_state_.band[band].sz + d); /* Block 4, UPPOL2 */ for (i = 0; i < 3; i++) - decode_s->band[band].sg[i] = decode_s->band[band].p[i] >> 15; + decode_state_.band[band].sg[i] = decode_state_.band[band].p[i] >> 15; - wd1 = saturate(decode_s->band[band].a[1] << 2); + wd1 = saturate(decode_state_.band[band].a[1] << 2); - wd2 = (decode_s->band[band].sg[0] == decode_s->band[band].sg[1]) ? -wd1 : wd1; + wd2 = (decode_state_.band[band].sg[0] == decode_state_.band[band].sg[1]) ? -wd1 : wd1; if (wd2 > 32767) wd2 = 32767; - wd3 = (decode_s->band[band].sg[0] == decode_s->band[band].sg[2]) ? 128 : -128; + wd3 = (decode_state_.band[band].sg[0] == decode_state_.band[band].sg[2]) ? 128 : -128; wd3 += (wd2 >> 7); - wd3 += (decode_s->band[band].a[2]*32512) >> 15; + wd3 += (decode_state_.band[band].a[2]*32512) >> 15; if (wd3 > 12288) wd3 = 12288; else if (wd3 < -12288) wd3 = -12288; - decode_s->band[band].ap[2] = wd3; + decode_state_.band[band].ap[2] = wd3; /* Block 4, UPPOL1 */ - decode_s->band[band].sg[0] = decode_s->band[band].p[0] >> 15; + decode_state_.band[band].sg[0] = decode_state_.band[band].p[0] >> 15; - decode_s->band[band].sg[1] = decode_s->band[band].p[1] >> 15; + decode_state_.band[band].sg[1] = decode_state_.band[band].p[1] >> 15; - wd1 = (decode_s->band[band].sg[0] == decode_s->band[band].sg[1]) ? 192 : -192; + wd1 = (decode_state_.band[band].sg[0] == decode_state_.band[band].sg[1]) ? 192 : -192; - wd2 = (decode_s->band[band].a[1]*32640) >> 15; + wd2 = (decode_state_.band[band].a[1]*32640) >> 15; - decode_s->band[band].ap[1] = saturate(wd1 + wd2); + decode_state_.band[band].ap[1] = saturate(wd1 + wd2); - wd3 = saturate(15360 - decode_s->band[band].ap[2]); + wd3 = saturate(15360 - decode_state_.band[band].ap[2]); - if (decode_s->band[band].ap[1] > wd3) - decode_s->band[band].ap[1] = wd3; - else if (decode_s->band[band].ap[1] < -wd3) - decode_s->band[band].ap[1] = -wd3; + if (decode_state_.band[band].ap[1] > wd3) + decode_state_.band[band].ap[1] = wd3; + else if (decode_state_.band[band].ap[1] < -wd3) + decode_state_.band[band].ap[1] = -wd3; /* Block 4, UPZERO */ wd1 = (d == 0) ? 0 : 128; - decode_s->band[band].sg[0] = d >> 15; + decode_state_.band[band].sg[0] = d >> 15; for (i = 1; i < 7; i++) { - decode_s->band[band].sg[i] = decode_s->band[band].d[i] >> 15; - wd2 = (decode_s->band[band].sg[i] == decode_s->band[band].sg[0]) ? wd1 : -wd1; - wd3 = (decode_s->band[band].b[i]*32640) >> 15; - decode_s->band[band].bp[i] = saturate(wd2 + wd3); + decode_state_.band[band].sg[i] = decode_state_.band[band].d[i] >> 15; + wd2 = (decode_state_.band[band].sg[i] == decode_state_.band[band].sg[0]) ? wd1 : -wd1; + wd3 = (decode_state_.band[band].b[i]*32640) >> 15; + decode_state_.band[band].bp[i] = saturate(wd2 + wd3); } /* Block 4, DELAYA */ for (i = 6; i > 0; i--) { - decode_s->band[band].d[i] = decode_s->band[band].d[i - 1]; - decode_s->band[band].b[i] = decode_s->band[band].bp[i]; + decode_state_.band[band].d[i] = decode_state_.band[band].d[i - 1]; + decode_state_.band[band].b[i] = decode_state_.band[band].bp[i]; } for (i = 2; i > 0; i--) { - decode_s->band[band].r[i] = decode_s->band[band].r[i - 1]; - decode_s->band[band].p[i] = decode_s->band[band].p[i - 1]; - decode_s->band[band].a[i] = decode_s->band[band].ap[i]; + decode_state_.band[band].r[i] = decode_state_.band[band].r[i - 1]; + decode_state_.band[band].p[i] = decode_state_.band[band].p[i - 1]; + decode_state_.band[band].a[i] = decode_state_.band[band].ap[i]; } /* Block 4, FILTEP */ - wd1 = saturate(decode_s->band[band].r[1] + decode_s->band[band].r[1]); + wd1 = saturate(decode_state_.band[band].r[1] + decode_state_.band[band].r[1]); - wd1 = (decode_s->band[band].a[1]*wd1) >> 15; + wd1 = (decode_state_.band[band].a[1]*wd1) >> 15; - wd2 = saturate(decode_s->band[band].r[2] + decode_s->band[band].r[2]); + wd2 = saturate(decode_state_.band[band].r[2] + decode_state_.band[band].r[2]); - wd2 = (decode_s->band[band].a[2]*wd2) >> 15; + wd2 = (decode_state_.band[band].a[2]*wd2) >> 15; - decode_s->band[band].sp = saturate(wd1 + wd2); + decode_state_.band[band].sp = saturate(wd1 + wd2); /* Block 4, FILTEZ */ - decode_s->band[band].sz = 0; + decode_state_.band[band].sz = 0; for (i = 6; i > 0; i--) { - wd1 = saturate(decode_s->band[band].d[i] + decode_s->band[band].d[i]); - decode_s->band[band].sz += (decode_s->band[band].b[i]*wd1) >> 15; + wd1 = saturate(decode_state_.band[band].d[i] + decode_state_.band[band].d[i]); + decode_state_.band[band].sz += (decode_state_.band[band].b[i]*wd1) >> 15; } - decode_s->band[band].sz = saturate(decode_s->band[band].sz); + decode_state_.band[band].sz = saturate(decode_state_.band[band].sz); /* Block 4, PREDIC */ - decode_s->band[band].s = saturate(decode_s->band[band].sp + decode_s->band[band].sz); - } - - int g722_encode_release() { - delete decode_s; - decode_s = NULL; - return 0; + decode_state_.band[band].s = saturate(decode_state_.band[band].sp + decode_state_.band[band].sz); } - - int g722_decode_release() { - delete encode_s; - encode_s = NULL; - return 0; - } - - int g722_decode(int16_t amp[], const uint8_t g722_data[], int len) { + int g722_decode(SFLDataFormat amp[], const uint8_t g722_data[], int len) + { static const int wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 }; static const int rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0 }; static const int ilb[32] = { @@ -433,22 +386,22 @@ class G722 : public sfl::AudioCodec { for (j = 0; j < len;) { - if (decode_s->packed) { + if (decode_state_.packed) { /* Unpack the code bits */ - if (decode_s->in_bits < decode_s->bits_per_sample) { - decode_s->in_buffer |= (g722_data[j++] << decode_s->in_bits); - decode_s->in_bits += 8; + if (decode_state_.in_bits < decode_state_.bits_per_sample) { + decode_state_.in_buffer |= (g722_data[j++] << decode_state_.in_bits); + decode_state_.in_bits += 8; } - code = decode_s->in_buffer & ((1 << decode_s->bits_per_sample) - 1); + code = decode_state_.in_buffer & ((1 << decode_state_.bits_per_sample) - 1); - decode_s->in_buffer >>= decode_s->bits_per_sample; - decode_s->in_bits -= decode_s->bits_per_sample; + decode_state_.in_buffer >>= decode_state_.bits_per_sample; + decode_state_.in_bits -= decode_state_.bits_per_sample; } else { code = g722_data[j++]; } - switch (decode_s->bits_per_sample) { + switch (decode_state_.bits_per_sample) { default: @@ -474,10 +427,10 @@ class G722 : public sfl::AudioCodec { } /* Block 5L, LOW BAND INVQBL */ - wd2 = (decode_s->band[0].det*wd2) >> 15; + wd2 = (decode_state_.band[0].det*wd2) >> 15; /* Block 5L, RECONS */ - rlow = decode_s->band[0].s + wd2; + rlow = decode_state_.band[0].s + wd2; /* Block 6L, LIMIT */ if (rlow > 16383) @@ -488,12 +441,12 @@ class G722 : public sfl::AudioCodec { /* Block 2L, INVQAL */ wd2 = qm4[wd1]; - dlowt = (decode_s->band[0].det*wd2) >> 15; + dlowt = (decode_state_.band[0].det*wd2) >> 15; /* Block 3L, LOGSCL */ wd2 = rl42[wd1]; - wd1 = (decode_s->band[0].nb*127) >> 7; + wd1 = (decode_state_.band[0].nb*127) >> 7; wd1 += wl[wd2]; @@ -502,25 +455,25 @@ class G722 : public sfl::AudioCodec { else if (wd1 > 18432) wd1 = 18432; - decode_s->band[0].nb = wd1; + decode_state_.band[0].nb = wd1; /* Block 3L, SCALEL */ - wd1 = (decode_s->band[0].nb >> 6) & 31; + wd1 = (decode_state_.band[0].nb >> 6) & 31; - wd2 = 8 - (decode_s->band[0].nb >> 11); + wd2 = 8 - (decode_state_.band[0].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); - decode_s->band[0].det = wd3 << 2; + decode_state_.band[0].det = wd3 << 2; block4_decode(0, dlowt); - if (!decode_s->eight_k) { + if (!decode_state_.eight_k) { /* Block 2H, INVQAH */ wd2 = qm2[ihigh]; - dhigh = (decode_s->band[1].det*wd2) >> 15; + dhigh = (decode_state_.band[1].det*wd2) >> 15; /* Block 5H, RECONS */ - rhigh = dhigh + decode_s->band[1].s; + rhigh = dhigh + decode_state_.band[1].s; /* Block 6H, LIMIT */ if (rhigh > 16383) @@ -531,7 +484,7 @@ class G722 : public sfl::AudioCodec { /* Block 2H, INVQAH */ wd2 = rh2[ihigh]; - wd1 = (decode_s->band[1].nb*127) >> 7; + wd1 = (decode_state_.band[1].nb*127) >> 7; wd1 += wh[wd2]; @@ -540,47 +493,47 @@ class G722 : public sfl::AudioCodec { else if (wd1 > 22528) wd1 = 22528; - decode_s->band[1].nb = wd1; + decode_state_.band[1].nb = wd1; /* Block 3H, SCALEH */ - wd1 = (decode_s->band[1].nb >> 6) & 31; + wd1 = (decode_state_.band[1].nb >> 6) & 31; - wd2 = 10 - (decode_s->band[1].nb >> 11); + wd2 = 10 - (decode_state_.band[1].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); - decode_s->band[1].det = wd3 << 2; + decode_state_.band[1].det = wd3 << 2; block4_decode(1, dhigh); } - if (decode_s->itu_test_mode) { - amp[outlen++] = (int16_t)(rlow << 1); - amp[outlen++] = (int16_t)(rhigh << 1); + if (decode_state_.itu_test_mode) { + amp[outlen++] = (SFLDataFormat)(rlow << 1); + amp[outlen++] = (SFLDataFormat)(rhigh << 1); } else { - if (decode_s->eight_k) { - amp[outlen++] = (int16_t) rlow; + if (decode_state_.eight_k) { + amp[outlen++] = (SFLDataFormat) rlow; } else { /* Apply the receive QMF */ for (i = 0; i < 22; i++) - decode_s->x[i] = decode_s->x[i + 2]; + decode_state_.x[i] = decode_state_.x[i + 2]; - decode_s->x[22] = rlow + rhigh; + decode_state_.x[22] = rlow + rhigh; - decode_s->x[23] = rlow - rhigh; + decode_state_.x[23] = rlow - rhigh; xout1 = 0; xout2 = 0; for (i = 0; i < 12; i++) { - xout2 += decode_s->x[2*i]*qmf_coeffs[i]; - xout1 += decode_s->x[2*i + 1]*qmf_coeffs[11 - i]; + xout2 += decode_state_.x[2*i]*qmf_coeffs[i]; + xout1 += decode_state_.x[2*i + 1]*qmf_coeffs[11 - i]; } - amp[outlen++] = (int16_t)(xout1 >> 12); + amp[outlen++] = (SFLDataFormat)(xout1 >> 12); - amp[outlen++] = (int16_t)(xout2 >> 12); + amp[outlen++] = (SFLDataFormat)(xout2 >> 12); } } } @@ -588,7 +541,8 @@ class G722 : public sfl::AudioCodec { return outlen; } - int g722_encode(uint8_t g722_data[], const int16_t amp[], int len) { + int g722_encode(uint8_t g722_data[], const SFLDataFormat amp[], int len) + { static const int q6[32] = { 0, 35, 72, 110, 150, 190, 233, 276, 323, 370, 422, 473, 530, 587, 650, 714, @@ -666,21 +620,21 @@ class G722 : public sfl::AudioCodec { xhigh = 0; for (j = 0; j < len;) { - if (encode_s->itu_test_mode) { + if (encode_state_.itu_test_mode) { xlow = xhigh = amp[j++] >> 1; } else { - if (encode_s->eight_k) { + if (encode_state_.eight_k) { xlow = amp[j++]; } else { /* Apply the transmit QMF */ /* Shuffle the buffer down */ for (i = 0; i < 22; i++) - encode_s->x[i] = encode_s->x[i + 2]; + encode_state_.x[i] = encode_state_.x[i + 2]; - encode_s->x[22] = amp[j++]; + encode_state_.x[22] = amp[j++]; - encode_s->x[23] = amp[j++]; + encode_state_.x[23] = amp[j++]; /* Discard every other QMF output */ sumeven = 0; @@ -688,8 +642,8 @@ class G722 : public sfl::AudioCodec { sumodd = 0; for (i = 0; i < 12; i++) { - sumodd += encode_s->x[2*i]*qmf_coeffs[i]; - sumeven += encode_s->x[2*i + 1]*qmf_coeffs[11 - i]; + sumodd += encode_state_.x[2*i]*qmf_coeffs[i]; + sumeven += encode_state_.x[2*i + 1]*qmf_coeffs[11 - i]; } xlow = (sumeven + sumodd) >> 13; @@ -699,13 +653,13 @@ class G722 : public sfl::AudioCodec { } /* Block 1L, SUBTRA */ - el = saturate(xlow - encode_s->band[0].s); + el = saturate(xlow - encode_state_.band[0].s); /* Block 1L, QUANTL */ wd = (el >= 0) ? el : - (el + 1); for (i = 1; i < 30; i++) { - wd1 = (q6[i]*encode_s->band[0].det) >> 12; + wd1 = (q6[i]*encode_state_.band[0].det) >> 12; if (wd < wd1) break; @@ -716,79 +670,79 @@ class G722 : public sfl::AudioCodec { /* Block 2L, INVQAL */ ril = ilow >> 2; wd2 = qm4[ril]; - dlow = (encode_s->band[0].det*wd2) >> 15; + dlow = (encode_state_.band[0].det*wd2) >> 15; /* Block 3L, LOGSCL */ il4 = rl42[ril]; - wd = (encode_s->band[0].nb*127) >> 7; - encode_s->band[0].nb = wd + wl[il4]; + wd = (encode_state_.band[0].nb*127) >> 7; + encode_state_.band[0].nb = wd + wl[il4]; - if (encode_s->band[0].nb < 0) - encode_s->band[0].nb = 0; - else if (encode_s->band[0].nb > 18432) - encode_s->band[0].nb = 18432; + if (encode_state_.band[0].nb < 0) + encode_state_.band[0].nb = 0; + else if (encode_state_.band[0].nb > 18432) + encode_state_.band[0].nb = 18432; /* Block 3L, SCALEL */ - wd1 = (encode_s->band[0].nb >> 6) & 31; + wd1 = (encode_state_.band[0].nb >> 6) & 31; - wd2 = 8 - (encode_s->band[0].nb >> 11); + wd2 = 8 - (encode_state_.band[0].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); - encode_s->band[0].det = wd3 << 2; + encode_state_.band[0].det = wd3 << 2; block4_encode(0, dlow); - if (encode_s->eight_k) { + if (encode_state_.eight_k) { /* Just leave the high bits as zero */ - code = (0xC0 | ilow) >> (8 - encode_s->bits_per_sample); + code = (0xC0 | ilow) >> (8 - encode_state_.bits_per_sample); } else { /* Block 1H, SUBTRA */ - eh = saturate(xhigh - encode_s->band[1].s); + eh = saturate(xhigh - encode_state_.band[1].s); /* Block 1H, QUANTH */ wd = (eh >= 0) ? eh : - (eh + 1); - wd1 = (564*encode_s->band[1].det) >> 12; + wd1 = (564*encode_state_.band[1].det) >> 12; mih = (wd >= wd1) ? 2 : 1; ihigh = (eh < 0) ? ihn[mih] : ihp[mih]; /* Block 2H, INVQAH */ wd2 = qm2[ihigh]; - dhigh = (encode_s->band[1].det*wd2) >> 15; + dhigh = (encode_state_.band[1].det*wd2) >> 15; /* Block 3H, LOGSCH */ ih2 = rh2[ihigh]; - wd = (encode_s->band[1].nb*127) >> 7; - encode_s->band[1].nb = wd + wh[ih2]; + wd = (encode_state_.band[1].nb*127) >> 7; + encode_state_.band[1].nb = wd + wh[ih2]; - if (encode_s->band[1].nb < 0) - encode_s->band[1].nb = 0; - else if (encode_s->band[1].nb > 22528) - encode_s->band[1].nb = 22528; + if (encode_state_.band[1].nb < 0) + encode_state_.band[1].nb = 0; + else if (encode_state_.band[1].nb > 22528) + encode_state_.band[1].nb = 22528; /* Block 3H, SCALEH */ - wd1 = (encode_s->band[1].nb >> 6) & 31; + wd1 = (encode_state_.band[1].nb >> 6) & 31; - wd2 = 10 - (encode_s->band[1].nb >> 11); + wd2 = 10 - (encode_state_.band[1].nb >> 11); wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); - encode_s->band[1].det = wd3 << 2; + encode_state_.band[1].det = wd3 << 2; block4_encode(1, dhigh); - code = ((ihigh << 6) | ilow) >> (8 - encode_s->bits_per_sample); + code = ((ihigh << 6) | ilow) >> (8 - encode_state_.bits_per_sample); } - if (encode_s->packed) { + if (encode_state_.packed) { /* Pack the code bits */ - encode_s->out_buffer |= (code << encode_s->out_bits); - encode_s->out_bits += encode_s->bits_per_sample; + encode_state_.out_buffer |= (code << encode_state_.out_bits); + encode_state_.out_bits += encode_state_.bits_per_sample; - if (encode_s->out_bits >= 8) { - g722_data[g722_bytes++] = (uint8_t)(encode_s->out_buffer & 0xFF); - encode_s->out_bits -= 8; - encode_s->out_buffer >>= 8; + if (encode_state_.out_bits >= 8) { + g722_data[g722_bytes++] = (uint8_t)(encode_state_.out_buffer & 0xFF); + encode_state_.out_bits -= 8; + encode_state_.out_buffer >>= 8; } } else { g722_data[g722_bytes++] = (uint8_t) code; @@ -798,19 +752,15 @@ class G722 : public sfl::AudioCodec { return g722_bytes; } - private: - NON_COPYABLE(G722); - - g722_decode_state_t *decode_s; - g722_encode_state_t *encode_s; - + g722_state_t decode_state_; + g722_state_t encode_state_; }; // the class factories // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new G722(9); + return new G722; } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/g722.h b/daemon/src/audio/codecs/g722.h index cb589e54c8..b117a09ed0 100644 --- a/daemon/src/audio/codecs/g722.h +++ b/daemon/src/audio/codecs/g722.h @@ -30,10 +30,8 @@ * as that of the covered work. */ - - -#if !defined(_G722_H_) -#define _G722_H_ +#ifndef G722_H_ +#define G722_H_ /** @@ -54,13 +52,13 @@ enum { }; #ifndef INT16_MAX -#define INT16_MAX 32767 +#define INT16_MAX 32767 #endif #ifndef INT16_MIN -#define INT16_MIN (-32768) +#define INT16_MIN (-32768) #endif -typedef struct { +struct g722_state_t { /*! TRUE if the operating in the special ITU test mode, with the band split filters disabled. */ int itu_test_mode; @@ -94,58 +92,6 @@ typedef struct { int in_bits; unsigned int out_buffer; int out_bits; -} g722_encode_state_t; - -typedef struct { - /*! TRUE if the operating in the special ITU test mode, with the band split filters - disabled. */ - int itu_test_mode; - /*! TRUE if the G.722 data is packed */ - int packed; - /*! TRUE if decode to 8k samples/second */ - int eight_k; - /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */ - int bits_per_sample; - - /*! Signal history for the QMF */ - int x[24]; - - struct { - int s; - int sp; - int sz; - int r[3]; - int a[3]; - int ap[3]; - int p[3]; - int d[7]; - int b[7]; - int bp[7]; - int sg[7]; - int nb; - int det; - } band[2]; - - unsigned int in_buffer; - int in_bits; - unsigned int out_buffer; - int out_bits; -} g722_decode_state_t; - -#ifdef __cplusplus -extern "C" { -#endif - - void g722_encode_init(); - int g722_encode_release(); - int g722_encode(uint8_t g722_data[], const int16_t amp[], int len); - - void g722_decode_init(); - int g722_decode_release(); - int g722_decode(int16_t amp[], const uint8_t g722_data[], int len); - -#ifdef __cplusplus -} -#endif +}; -#endif +#endif // G722_H_ diff --git a/daemon/src/audio/codecs/gsmcodec.cpp b/daemon/src/audio/codecs/gsmcodec.cpp index 9fcab30112..97e720a24e 100644 --- a/daemon/src/audio/codecs/gsmcodec.cpp +++ b/daemon/src/audio/codecs/gsmcodec.cpp @@ -31,8 +31,8 @@ #include "audiocodec.h" +#include "sfl_types.h" #include "noncopyable.h" -#include <cassert> #include <stdexcept> extern "C" { @@ -47,10 +47,8 @@ class Gsm : public sfl::AudioCodec { public: // _payload should be 3 - Gsm(int payload=3) : sfl::AudioCodec(payload, "GSM"), decode_gsmhandle_(NULL), encode_gsmhandle_(NULL) { - clockRate_ = 8000; - frameSize_ = 160; // samples, 20 ms at 8kHz - channel_ = 1; + Gsm() : sfl::AudioCodec(3, "GSM", 8000, 160, 1), + decode_gsmhandle_(NULL), encode_gsmhandle_(NULL) { bitrate_ = 13.3; hasDynamicPayload_ = false; @@ -61,22 +59,22 @@ class Gsm : public sfl::AudioCodec { throw std::runtime_error("ERROR: encode_gsm_create\n"); } - virtual ~Gsm() { + virtual ~Gsm() + { gsm_destroy(decode_gsmhandle_); gsm_destroy(encode_gsmhandle_); } - virtual int decode(short * dst, unsigned char * src, size_t buf_size) { - assert(buf_size == 33); - + virtual int decode(SFLDataFormat * dst, unsigned char * src, size_t /*buf_size*/) + { if (gsm_decode(decode_gsmhandle_, (gsm_byte*) src, (gsm_signal*) dst) < 0) throw std::runtime_error("ERROR: gsm_decode\n"); return frameSize_; } - virtual int encode(unsigned char * dst, short * src, size_t buf_size) { - assert(buf_size >= 33); + virtual int encode(unsigned char * dst, SFLDataFormat * src, size_t /*buf_size*/) + { gsm_encode(encode_gsmhandle_, (gsm_signal*) src, (gsm_byte*) dst); return 33; } @@ -90,7 +88,7 @@ class Gsm : public sfl::AudioCodec { // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Gsm(3); + return new Gsm; } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/speexcodec.h b/daemon/src/audio/codecs/speexcodec.h index 7b53fcdce2..7b5cb261be 100644 --- a/daemon/src/audio/codecs/speexcodec.h +++ b/daemon/src/audio/codecs/speexcodec.h @@ -32,62 +32,35 @@ #include "global.h" #include "audiocodec.h" #include "noncopyable.h" -#include <cstdio> +#include "array_size.h" #include <speex/speex.h> #include <cassert> -static const unsigned int clockRate [3] = { - 8000, - 16000, - 32000 -}; -static const unsigned int frameSize[3] = { - 160, - 320, - 640, -}; -static const unsigned int bitRate[3] = { // FIXME : not using VBR? - 24, - 42, - 0, -}; -static const bool dynamicPayload[3] = { - true, - false, - true, -}; - -const SpeexMode* speexMode[3] = { - &speex_nb_mode, - &speex_wb_mode, - &speex_uwb_mode, // wb -}; - class Speex : public sfl::AudioCodec { public: - Speex(int payload) : - sfl::AudioCodec(payload, "speex"), speex_dec_bits_(), - speex_enc_bits_(), speex_dec_state_(0), speex_enc_state_(0), + Speex(int payload, unsigned clockRate, unsigned frameSize, + unsigned bitRate, bool dynamicPayload, const SpeexMode *mode) : + sfl::AudioCodec(payload, "speex", clockRate, frameSize, 1), + speex_dec_bits_(), + speex_enc_bits_(), + speex_dec_state_(0), + speex_enc_state_(0), speex_frame_size_(0) { assert(payload >= 110 && payload <= 112); assert(110 == PAYLOAD_CODEC_SPEEX_8000 && - 111 == PAYLOAD_CODEC_SPEEX_16000 && - 112 == PAYLOAD_CODEC_SPEEX_32000); - int type = payload - 110; + 111 == PAYLOAD_CODEC_SPEEX_16000 && + 112 == PAYLOAD_CODEC_SPEEX_32000); - clockRate_ = clockRate[type]; - frameSize_ = frameSize[type]; - channel_ = 1; - bitrate_ = bitRate[type]; - hasDynamicPayload_ = dynamicPayload[type]; + bitrate_ = bitRate; + hasDynamicPayload_ = dynamicPayload; // Init the decoder struct speex_bits_init(&speex_dec_bits_); - speex_dec_state_ = speex_decoder_init(speexMode[type]); + speex_dec_state_ = speex_decoder_init(mode); // Init the encoder struct speex_bits_init(&speex_enc_bits_); - speex_enc_state_ = speex_encoder_init(speexMode[type]); + speex_enc_state_ = speex_encoder_init(mode); speex_encoder_ctl(speex_enc_state_, SPEEX_SET_SAMPLING_RATE, &clockRate_); speex_decoder_ctl(speex_dec_state_, SPEEX_GET_FRAME_SIZE, &speex_frame_size_); diff --git a/daemon/src/audio/codecs/speexcodec_nb.cpp b/daemon/src/audio/codecs/speexcodec_nb.cpp index 3b6e6e378f..4351d1630d 100644 --- a/daemon/src/audio/codecs/speexcodec_nb.cpp +++ b/daemon/src/audio/codecs/speexcodec_nb.cpp @@ -35,7 +35,7 @@ // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Speex(110); + return new Speex(110, 8000, 160, 24, true, &speex_nb_mode); } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/speexcodec_ub.cpp b/daemon/src/audio/codecs/speexcodec_ub.cpp index cf3ffc2c98..12d15cd28b 100644 --- a/daemon/src/audio/codecs/speexcodec_ub.cpp +++ b/daemon/src/audio/codecs/speexcodec_ub.cpp @@ -35,7 +35,7 @@ // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Speex(112); + return new Speex(112, 32000, 640, 0, true, &speex_uwb_mode); } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/speexcodec_wb.cpp b/daemon/src/audio/codecs/speexcodec_wb.cpp index 80afee3c8e..ce9368d0e8 100644 --- a/daemon/src/audio/codecs/speexcodec_wb.cpp +++ b/daemon/src/audio/codecs/speexcodec_wb.cpp @@ -35,7 +35,7 @@ // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Speex(111); + return new Speex(111, 16000, 320, 42, false, &speex_wb_mode); } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/codecs/ulaw.cpp b/daemon/src/audio/codecs/ulaw.cpp index 9efe77c80a..7a00b96056 100644 --- a/daemon/src/audio/codecs/ulaw.cpp +++ b/daemon/src/audio/codecs/ulaw.cpp @@ -31,87 +31,78 @@ #include "audiocodec.h" #include "sfl_types.h" -#include <cassert> class Ulaw : public sfl::AudioCodec { public: // 0 PCMU A 8000 1 [RFC3551] - Ulaw(int payload=0) - : sfl::AudioCodec(payload, "PCMU") { - clockRate_ = 8000; - frameSize_ = 160; // samples, 20 ms at 8kHz - channel_ = 1; + Ulaw() : sfl::AudioCodec(0, "PCMU", 8000, 160, 1) { bitrate_ = 64; hasDynamicPayload_ = false; } - virtual int decode(short *dst, unsigned char *src, size_t buf_size) { - assert(buf_size == frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat)); - unsigned char* end = src+buf_size; - - while (src<end) - *dst++ = ULawDecode(*src++); + virtual int decode(SFLDataFormat *dst, unsigned char *src, size_t buf_size) { + for (unsigned char* end = src + buf_size; src < end; ++src, ++dst) + *dst = ULawDecode(*src); return frameSize_; } - virtual int encode(unsigned char *dst, short *src, size_t buf_size) { - assert(buf_size >= frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat)); - uint8* end = dst + frameSize_; - - while (dst<end) - *dst++ = ULawEncode(*src++); + virtual int encode(unsigned char *dst, SFLDataFormat *src, size_t /*buf_size*/) { + for (unsigned char * end = dst + frameSize_; dst < end; ++src, ++dst) + *dst = ULawEncode(*src); return frameSize_ / 2 /* compression factor = 2:1 */ * sizeof(SFLDataFormat);; } - int ULawDecode(uint8 ulaw) { + SFLDataFormat ULawDecode(uint8 ulaw) + { ulaw ^= 0xff; // u-law has all bits inverted for transmission - int linear = ulaw&0x0f; + int linear = ulaw & 0x0f; linear <<= 3; linear |= 0x84; // Set MSB (0x80) and a 'half' bit (0x04) to place PCM value in middle of range - uint shift = ulaw>>4; + uint shift = ulaw >> 4; shift &= 7; linear <<= shift; linear -= 0x84; // Subract uLaw bias - if (ulaw&0x80) + if (ulaw & 0x80) return -linear; else return linear; } - uint8 ULawEncode(int16 pcm16) { + uint8 ULawEncode(SFLDataFormat pcm16) + { int p = pcm16; uint u; // u-law value we are forming - if (p<0) { + if (p < 0) { p = ~p; - u = 0x80^0x10^0xff; // Sign bit = 1 (^0x10 because this will get inverted later) ^0xff ^0xff to invert final u-Law code + u = 0x80 ^ 0x10 ^ 0xff; // Sign bit = 1 (^0x10 because this will get inverted later) ^0xff ^0xff to invert final u-Law code } else { - u = 0x00^0x10^0xff; // Sign bit = 0 (-0x10 because this amount extra will get added later) ^0xff to invert final u-Law code + u = 0x00 ^ 0x10 ^ 0xff; // Sign bit = 0 (-0x10 because this amount extra will get added later) ^0xff to invert final u-Law code } p += 0x84; // Add uLaw bias - if (p>0x7f00) + if (p > 0x7f00) p = 0x7f00; // Clip to 15 bits // Calculate segment and interval numbers p >>= 3; // Shift down to 13bit - if (p>=0x100) { + if (p >= 0x100) { p >>= 4; u ^= 0x40; } - if (p>=0x40) { + if (p >= 0x40) { p >>= 2; u ^= 0x20; } - if (p>=0x20) { + if (p >= 0x20) { p >>= 1; u ^= 0x10; } @@ -126,7 +117,7 @@ class Ulaw : public sfl::AudioCodec { // cppcheck-suppress unusedFunction extern "C" sfl::Codec* CODEC_ENTRY() { - return new Ulaw(0); + return new Ulaw; } // cppcheck-suppress unusedFunction diff --git a/daemon/src/audio/echosuppress.cpp b/daemon/src/audio/echosuppress.cpp index b509155f86..d30b03f8ae 100644 --- a/daemon/src/audio/echosuppress.cpp +++ b/daemon/src/audio/echosuppress.cpp @@ -32,7 +32,7 @@ void EchoSuppress::putData(SFLDataFormat *inputData, int samples) assert(sizeof(SFLDataFormat) == sizeof(pj_int16_t)); if (pjmedia_echo_playback(echoState_, reinterpret_cast<pj_int16_t *>(inputData)) != PJ_SUCCESS) - WARN("EchoCancel: Problem while putting input data"); + WARN("Problem while putting input data"); } void EchoSuppress::getData(SFLDataFormat *outputData) @@ -40,5 +40,5 @@ void EchoSuppress::getData(SFLDataFormat *outputData) assert(sizeof(SFLDataFormat) == sizeof(pj_int16_t)); if (pjmedia_echo_capture(echoState_, reinterpret_cast<pj_int16_t *>(outputData), 0) != PJ_SUCCESS) - WARN("EchoCancel: Problem while getting output data"); + WARN("Problem while getting output data"); } diff --git a/daemon/src/audio/gaincontrol.cpp b/daemon/src/audio/gaincontrol.cpp index 5e0f282fd5..297b1fd0e0 100644 --- a/daemon/src/audio/gaincontrol.cpp +++ b/daemon/src/audio/gaincontrol.cpp @@ -23,7 +23,7 @@ GainControl::GainControl(double sr, double target) : averager_(sr, SFL_GAIN_ATTA , maxIncreaseStep_(exp(0.11513 * 12. * 160 / 8000)) // Computed on 12 frames (240 ms) , maxDecreaseStep_(exp(-0.11513 * 40. * 160 / 8000))// Computed on 40 frames (800 ms) { - DEBUG("GainControl: Target gain %f dB (%f linear)", targetLeveldB_, targetLevelLinear_); + DEBUG("Target gain %f dB (%f linear)", targetLeveldB_, targetLevelLinear_); } void GainControl::process(SFLDataFormat *buf, int samples) diff --git a/daemon/src/audio/mainbuffer.cpp b/daemon/src/audio/mainbuffer.cpp index 6b19f0b100..6925bf0f43 100644 --- a/daemon/src/audio/mainbuffer.cpp +++ b/daemon/src/audio/mainbuffer.cpp @@ -71,12 +71,12 @@ bool MainBuffer::removeCallIDSet(const std::string & set_id) CallIDSet* callid_set = getCallIDSet(set_id); if (!callid_set) { - DEBUG("removeCallIDSet error callid set %s does not exist!", set_id.c_str()); + DEBUG("CallID set %s does not exist!", set_id.c_str()); return false; } if (callIDMap_.erase(set_id) == 0) { - DEBUG("removeCallIDSet error while removing callid set %s!", set_id.c_str()); + DEBUG("CallID set %s not found!", set_id.c_str()); return false; } @@ -96,9 +96,9 @@ void MainBuffer::removeCallIDfromSet(const std::string & set_id, const std::stri CallIDSet* callid_set = getCallIDSet(set_id); if (callid_set == NULL) - ERROR("removeCallIDfromSet error callid set %s does not exist!", set_id.c_str()); + ERROR("CallIDSet %s does not exist!", set_id.c_str()); else if (callid_set->erase(call_id) == 0) - ERROR("removeCallIDfromSet error while removing callid %s from set %s!", call_id.c_str(), set_id.c_str()); + ERROR("Could not find callID %s in set %s!", call_id.c_str(), set_id.c_str()); } RingBuffer* MainBuffer::getRingBuffer(const std::string & call_id) @@ -123,11 +123,11 @@ bool MainBuffer::removeRingBuffer(const std::string & call_id) delete ring_buffer; return true; } else { - ERROR("BufferManager: Error: Fail to delete ringbuffer %s!", call_id.c_str()); + ERROR("Fail to delete ringbuffer %s!", call_id.c_str()); return false; } } else { - DEBUG("BufferManager: Error: Ringbuffer %s does not exist!", call_id.c_str()); + DEBUG("Ringbuffer %s does not exist!", call_id.c_str()); return true; } } @@ -215,7 +215,7 @@ void MainBuffer::unBindHalfDuplexOut(const std::string & process_id, const std:: removeRingBuffer(call_id); } } else { - DEBUG("Error: did not found ringbuffer %s", process_id.c_str()); + DEBUG("did not found ringbuffer %s", process_id.c_str()); removeCallIDSet(process_id); } @@ -339,12 +339,12 @@ int MainBuffer::availForGetByID(const std::string &call_id, const std::string &reader_id) { if ((call_id != DEFAULT_ID) and (reader_id == call_id)) - ERROR("MainBuffer: Error: RingBuffer has a readpointer on itself"); + ERROR("RingBuffer has a readpointer on itself"); RingBuffer* ringbuffer = getRingBuffer(call_id); if (ringbuffer == NULL) { - ERROR("MainBuffer: Error: RingBuffer does not exist"); + ERROR("RingBuffer does not exist"); return 0; } else return ringbuffer->AvailForGet(reader_id); diff --git a/daemon/src/audio/pulseaudio/audiostream.cpp b/daemon/src/audio/pulseaudio/audiostream.cpp index 8ac348f782..a1943f36d4 100644 --- a/daemon/src/audio/pulseaudio/audiostream.cpp +++ b/daemon/src/audio/pulseaudio/audiostream.cpp @@ -53,8 +53,8 @@ AudioStream::AudioStream(pa_context *c, pa_threaded_mainloop *m, const char *des audiostream_ = pa_stream_new(c, desc, &sample_spec, &channel_map); if (!audiostream_) { - ERROR("Pulse: %s: pa_stream_new() failed : %s" , desc, pa_strerror(pa_context_errno(c))); - throw std::runtime_error("Pulse : could not create stream\n"); + ERROR("%s: pa_stream_new() failed : %s" , desc, pa_strerror(pa_context_errno(c))); + throw std::runtime_error("Could not create stream\n"); } pa_buffer_attr attributes; @@ -102,30 +102,30 @@ AudioStream::stream_state_callback(pa_stream* s, void* /*user_data*/) switch (pa_stream_get_state(s)) { case PA_STREAM_CREATING: - DEBUG("Pulse: Stream is creating..."); + DEBUG("Stream is creating..."); break; case PA_STREAM_TERMINATED: - DEBUG("Pulse: Stream is terminating..."); + DEBUG("Stream is terminating..."); break; case PA_STREAM_READY: - DEBUG("Pulse: Stream successfully created, connected to %s", pa_stream_get_device_name(s)); - DEBUG("Pulse: maxlength %u", pa_stream_get_buffer_attr(s)->maxlength); - DEBUG("Pulse: tlength %u", pa_stream_get_buffer_attr(s)->tlength); - DEBUG("Pulse: prebuf %u", pa_stream_get_buffer_attr(s)->prebuf); - DEBUG("Pulse: minreq %u", pa_stream_get_buffer_attr(s)->minreq); - DEBUG("Pulse: fragsize %u", pa_stream_get_buffer_attr(s)->fragsize); - DEBUG("Pulse: samplespec %s", pa_sample_spec_snprint(str, sizeof(str), pa_stream_get_sample_spec(s))); + DEBUG("Stream successfully created, connected to %s", pa_stream_get_device_name(s)); + DEBUG("maxlength %u", pa_stream_get_buffer_attr(s)->maxlength); + DEBUG("tlength %u", pa_stream_get_buffer_attr(s)->tlength); + DEBUG("prebuf %u", pa_stream_get_buffer_attr(s)->prebuf); + DEBUG("minreq %u", pa_stream_get_buffer_attr(s)->minreq); + DEBUG("fragsize %u", pa_stream_get_buffer_attr(s)->fragsize); + DEBUG("samplespec %s", pa_sample_spec_snprint(str, sizeof(str), pa_stream_get_sample_spec(s))); break; case PA_STREAM_UNCONNECTED: - DEBUG("Pulse: Stream unconnected"); + DEBUG("Stream unconnected"); break; case PA_STREAM_FAILED: default: - ERROR("Pulse: Sink/Source doesn't exists: %s" , pa_strerror(pa_context_errno(pa_stream_get_context(s)))); + ERROR("Sink/Source doesn't exists: %s" , pa_strerror(pa_context_errno(pa_stream_get_context(s)))); break; } } diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp index 575e8a1e8b..87f1089320 100644 --- a/daemon/src/audio/pulseaudio/pulselayer.cpp +++ b/daemon/src/audio/pulseaudio/pulselayer.cpp @@ -38,6 +38,9 @@ #include "logger.h" #include "manager.h" +#include <stdlib.h> +#include <fstream> + namespace { void playback_callback(pa_stream * /*s*/, size_t /*bytes*/, void* userdata) @@ -57,11 +60,16 @@ void ringtone_callback(pa_stream * /*s*/, size_t /*bytes*/, void* userdata) void stream_moved_callback(pa_stream *s, void *userdata UNUSED) { - DEBUG("stream_moved_callback: stream %d to %d", pa_stream_get_index(s), pa_stream_get_device_index(s)); + DEBUG("stream %d to %d", pa_stream_get_index(s), pa_stream_get_device_index(s)); } } // end anonymous namespace +#ifdef RECTODISK +std::ofstream outfileResampled ("testMicOuputResampled.raw", std::ifstream::binary); +std::ofstream outfile("testMicOuput.raw", std::ifstream::binary); +#endif + PulseLayer::PulseLayer() : playback_(0) , record_(0) @@ -106,6 +114,11 @@ PulseLayer::PulseLayer() PulseLayer::~PulseLayer() { +#ifdef RECTODISK + outfile.close(); + outfileResampled.close(); +#endif + disconnectAudioStream(); if (mainloop_) @@ -133,11 +146,11 @@ void PulseLayer::context_state_callback(pa_context* c, void *user_data) case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: - DEBUG("Audio: Waiting...."); + DEBUG("Waiting...."); break; case PA_CONTEXT_READY: - DEBUG("Audio: Connection to PulseAudio server established"); + DEBUG("Connection to PulseAudio server established"); pa_threaded_mainloop_signal(pulse->mainloop_, 0); pa_context_subscribe(c, mask, NULL, pulse); pa_context_set_subscribe_callback(c, context_changed_callback, pulse); @@ -150,7 +163,7 @@ void PulseLayer::context_state_callback(pa_context* c, void *user_data) case PA_CONTEXT_FAILED: default: - ERROR("Pulse: %s" , pa_strerror(pa_context_errno(c))); + ERROR("%s" , pa_strerror(pa_context_errno(c))); pa_threaded_mainloop_signal(pulse->mainloop_, 0); pulse->disconnectAudioStream(); break; @@ -196,22 +209,22 @@ void PulseLayer::createStreams(pa_context* c) std::string ringtoneDevice(audioPref.getDeviceRingtone()); std::string defaultDevice = ""; - DEBUG("PulseAudio: Devices:\n playback: %s\n record: %s\n ringtone: %s", + DEBUG("Devices:\n playback: %s\n record: %s\n ringtone: %s", playbackDevice.c_str(), captureDevice.c_str(), ringtoneDevice.c_str()); - playback_ = new AudioStream(c, mainloop_, "SFLphone playback", PLAYBACK_STREAM, audioSampleRate_, + playback_ = new AudioStream(c, mainloop_, "SFLphone playback", PLAYBACK_STREAM, sampleRate_, inSourceList(playbackDevice) ? playbackDevice : defaultDevice); pa_stream_set_write_callback(playback_->pulseStream(), playback_callback, this); pa_stream_set_moved_callback(playback_->pulseStream(), stream_moved_callback, this); - record_ = new AudioStream(c, mainloop_, "SFLphone capture", CAPTURE_STREAM, audioSampleRate_, + record_ = new AudioStream(c, mainloop_, "SFLphone capture", CAPTURE_STREAM, sampleRate_, inSinkList(captureDevice) ? captureDevice : defaultDevice); pa_stream_set_read_callback(record_->pulseStream() , capture_callback, this); pa_stream_set_moved_callback(record_->pulseStream(), stream_moved_callback, this); - ringtone_ = new AudioStream(c, mainloop_, "SFLphone ringtone", RINGTONE_STREAM, audioSampleRate_, + ringtone_ = new AudioStream(c, mainloop_, "SFLphone ringtone", RINGTONE_STREAM, sampleRate_, inSourceList(ringtoneDevice) ? ringtoneDevice : defaultDevice); pa_stream_set_write_callback(ringtone_->pulseStream(), ringtone_callback, this); @@ -300,24 +313,24 @@ void PulseLayer::writeToSpeaker() pa_stream *s = playback_->pulseStream(); // available bytes to be written in pulseaudio internal buffer - int writable = pa_stream_writable_size(s); + int ret = pa_stream_writable_size(s); - if (writable < 0) { - ERROR("Pulse: playback error : %s", pa_strerror(writable)); + if (ret < 0) { + ERROR("Playback error : %s", pa_strerror(ret)); return; - } else if (writable == 0) + } else if (ret == 0) return; - size_t bytes = writable; + size_t writableBytes = ret; notifyIncomingCall(); size_t urgentBytes = urgentRingBuffer_.AvailForGet(MainBuffer::DEFAULT_ID); - if (urgentBytes > bytes) - urgentBytes = bytes; + if (urgentBytes > writableBytes) + urgentBytes = writableBytes; - void *data; + void *data = 0; if (urgentBytes) { pa_stream_begin_write(s, &data, &urgentBytes); urgentRingBuffer_.Get(data, urgentBytes, MainBuffer::DEFAULT_ID); @@ -332,10 +345,10 @@ void PulseLayer::writeToSpeaker() if (toneToPlay) { if (playback_->isReady()) { - pa_stream_begin_write(s, &data, &bytes); - toneToPlay->getNext((SFLDataFormat*)data, bytes / sizeof(SFLDataFormat), 100); - applyGain(static_cast<SFLDataFormat *>(data), bytes / sizeof(SFLDataFormat), getPlaybackGain()); - pa_stream_write(s, data, bytes, NULL, 0, PA_SEEK_RELATIVE); + pa_stream_begin_write(s, &data, &writableBytes); + toneToPlay->getNext((SFLDataFormat*)data, writableBytes / sizeof(SFLDataFormat), 100); + applyGain(static_cast<SFLDataFormat *>(data), writableBytes / sizeof(SFLDataFormat), getPlaybackGain()); + pa_stream_write(s, data, writableBytes, NULL, 0, PA_SEEK_RELATIVE); } return; @@ -346,46 +359,46 @@ void PulseLayer::writeToSpeaker() size_t availSamples = Manager::instance().getMainBuffer()->availForGet(MainBuffer::DEFAULT_ID) / sizeof(SFLDataFormat); if (availSamples == 0) { - pa_stream_begin_write(s, &data, &bytes); - memset(data, 0, bytes); - pa_stream_write(s, data, bytes, NULL, 0, PA_SEEK_RELATIVE); + pa_stream_begin_write(s, &data, &writableBytes); + memset(data, 0, writableBytes); + pa_stream_write(s, data, writableBytes, NULL, 0, PA_SEEK_RELATIVE); return; } - unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - bool resample = audioSampleRate_ != mainBufferSampleRate; - - // how much samples we can write in the output - size_t outSamples = bytes / sizeof(SFLDataFormat); + // how many samples we can write to the output + size_t writableSamples = writableBytes / sizeof(SFLDataFormat); - // how much samples we want to read from the buffer - size_t inSamples = outSamples; + // how many samples we want to read from the buffer + size_t readableSamples = writableSamples; double resampleFactor = 1.; + unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); + bool resample = sampleRate_ != mainBufferSampleRate; if (resample) { - resampleFactor = (double) audioSampleRate_ / mainBufferSampleRate; - inSamples = (double) inSamples / resampleFactor; + resampleFactor = (double) sampleRate_ / mainBufferSampleRate; + readableSamples = (double) readableSamples / resampleFactor; } - if (inSamples > availSamples) - inSamples = availSamples; - - size_t outBytes = (double)inSamples * resampleFactor * sizeof(SFLDataFormat); + if (readableSamples > availSamples) + readableSamples = availSamples; - size_t inBytes = inSamples * sizeof(SFLDataFormat); - pa_stream_begin_write(s, &data, &inBytes); - Manager::instance().getMainBuffer()->getData(data, inBytes, MainBuffer::DEFAULT_ID); + size_t readableBytes = readableSamples * sizeof(SFLDataFormat); + pa_stream_begin_write(s, &data, &readableBytes); + Manager::instance().getMainBuffer()->getData(data, readableBytes, MainBuffer::DEFAULT_ID); if (resample) { - SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc(outBytes); - converter_->resample((SFLDataFormat*)data, rsmpl_out, mainBufferSampleRate, audioSampleRate_, inSamples); - applyGain(rsmpl_out, outBytes / sizeof(SFLDataFormat), getPlaybackGain()); - pa_stream_write(s, rsmpl_out, outBytes, NULL, 0, PA_SEEK_RELATIVE); + const size_t nResampled = (double) readableSamples * resampleFactor; + size_t resampledBytes = nResampled * sizeof(SFLDataFormat); + SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc(resampledBytes); + converter_.resample((SFLDataFormat*)data, rsmpl_out, nResampled, + mainBufferSampleRate, sampleRate_, readableSamples); + applyGain(rsmpl_out, nResampled, getPlaybackGain()); + pa_stream_write(s, rsmpl_out, resampledBytes, NULL, 0, PA_SEEK_RELATIVE); pa_xfree(rsmpl_out); } else { - applyGain(static_cast<SFLDataFormat *>(data), inBytes / sizeof(SFLDataFormat), getPlaybackGain()); - pa_stream_write(s, data, inBytes, NULL, 0, PA_SEEK_RELATIVE); + applyGain(static_cast<SFLDataFormat *>(data), readableSamples, getPlaybackGain()); + pa_stream_write(s, data, readableBytes, NULL, 0, PA_SEEK_RELATIVE); } } @@ -397,16 +410,14 @@ void PulseLayer::readFromMic() const char *data = NULL; size_t bytes; - if (pa_stream_peek(record_->pulseStream() , (const void**) &data , &bytes) < 0 or !data) { - ERROR("Audio: Error capture stream peek failed: %s" , pa_strerror(pa_context_errno(context_))); + if (pa_stream_peek(record_->pulseStream() , (const void**) &data , &bytes) < 0 or !data) return; - } unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate(); - bool resample = audioSampleRate_ != mainBufferSampleRate; + bool resample = sampleRate_ != mainBufferSampleRate; if (resample) { - double resampleFactor = (double) audioSampleRate_ / mainBufferSampleRate; + double resampleFactor = (double) sampleRate_ / mainBufferSampleRate; bytes = (double) bytes * resampleFactor; } @@ -418,15 +429,22 @@ void PulseLayer::readFromMic() mic_buffer_ = new SFLDataFormat[samples]; } - if (resample) - converter_->resample((SFLDataFormat*)data, mic_buffer_, mainBufferSampleRate, audioSampleRate_, samples); +#ifdef RECTODISK + outfile.write((const char *)data, bytes); +#endif + if (resample) { + converter_.resample((SFLDataFormat*)data, mic_buffer_, samples, mainBufferSampleRate, sampleRate_, samples); + } - dcblocker_.process(mic_buffer_, resample ? mic_buffer_ : (SFLDataFormat*)data, samples); + dcblocker_.process(mic_buffer_, (SFLDataFormat*)data, samples); applyGain(mic_buffer_, bytes / sizeof(SFLDataFormat), getCaptureGain()); Manager::instance().getMainBuffer()->putData(mic_buffer_, bytes, MainBuffer::DEFAULT_ID); +#ifdef RECTODISK + outfileResampled.write((const char *)mic_buffer_, bytes); +#endif if (pa_stream_drop(record_->pulseStream()) < 0) - ERROR("Audio: Error: capture stream drop failed: %s" , pa_strerror(pa_context_errno(context_))); + ERROR("Capture stream drop failed: %s" , pa_strerror(pa_context_errno(context_))); } @@ -440,7 +458,7 @@ void PulseLayer::ringtoneToSpeaker() int writable = pa_stream_writable_size(s); if (writable < 0) - ERROR("Pulse: ringtone error : %s", pa_strerror(writable)); + ERROR("Ringtone error : %s", pa_strerror(writable)); if (writable <= 0) return; @@ -466,54 +484,54 @@ void PulseLayer::context_changed_callback(pa_context* c, pa_subscription_event_t PulseLayer *context = static_cast<PulseLayer*>(userdata); switch (t) { case PA_SUBSCRIPTION_EVENT_SINK: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SINK"); + DEBUG("PA_SUBSCRIPTION_EVENT_SINK"); context->sinkList_.clear(); pa_context_get_sink_info_list(c, sink_input_info_callback, userdata); break; case PA_SUBSCRIPTION_EVENT_SOURCE: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SOURCE"); + DEBUG("PA_SUBSCRIPTION_EVENT_SOURCE"); context->sourceList_.clear(); pa_context_get_source_info_list(c, source_input_info_callback, userdata); break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SINK_INPUT"); + DEBUG("PA_SUBSCRIPTION_EVENT_SINK_INPUT"); break; case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT"); + DEBUG("PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT"); break; case PA_SUBSCRIPTION_EVENT_MODULE: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_MODULE"); + DEBUG("PA_SUBSCRIPTION_EVENT_MODULE"); break; case PA_SUBSCRIPTION_EVENT_CLIENT: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_CLIENT"); + DEBUG("PA_SUBSCRIPTION_EVENT_CLIENT"); break; case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE"); + DEBUG("PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE"); break; case PA_SUBSCRIPTION_EVENT_SERVER: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_SERVER"); + DEBUG("PA_SUBSCRIPTION_EVENT_SERVER"); break; case PA_SUBSCRIPTION_EVENT_CARD: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_CARD"); + DEBUG("PA_SUBSCRIPTION_EVENT_CARD"); break; case PA_SUBSCRIPTION_EVENT_FACILITY_MASK: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_FACILITY_MASK"); + DEBUG("PA_SUBSCRIPTION_EVENT_FACILITY_MASK"); break; case PA_SUBSCRIPTION_EVENT_CHANGE: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_CHANGE"); + DEBUG("PA_SUBSCRIPTION_EVENT_CHANGE"); break; case PA_SUBSCRIPTION_EVENT_REMOVE: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_REMOVE"); + DEBUG("PA_SUBSCRIPTION_EVENT_REMOVE"); context->sinkList_.clear(); context->sourceList_.clear(); pa_context_get_sink_info_list(c, sink_input_info_callback, userdata); pa_context_get_source_info_list(c, source_input_info_callback, userdata); break; case PA_SUBSCRIPTION_EVENT_TYPE_MASK: - DEBUG("Audio: PA_SUBSCRIPTION_EVENT_TYPE_MASK"); + DEBUG("PA_SUBSCRIPTION_EVENT_TYPE_MASK"); break; default: - DEBUG("Audio: Unknown event type %d", t); + DEBUG("Unknown event type %d", t); } } diff --git a/daemon/src/audio/recordable.cpp b/daemon/src/audio/recordable.cpp index 7eda5bd661..6915c1e6c0 100644 --- a/daemon/src/audio/recordable.cpp +++ b/daemon/src/audio/recordable.cpp @@ -33,7 +33,7 @@ Recordable::Recordable() : recAudio_(), recorder_(&recAudio_, Manager::instance().getMainBuffer()) { - DEBUG("=================== Set recornding options: %s", Manager::instance().audioPreference.getRecordpath().c_str()); + DEBUG("Set recording options: %s", Manager::instance().audioPreference.getRecordpath().c_str()); recAudio_.setRecordingOption(AudioRecord::FILE_WAV, 8000, Manager::instance().audioPreference.getRecordpath()); } diff --git a/daemon/src/audio/ringbuffer.cpp b/daemon/src/audio/ringbuffer.cpp index fe8547d06f..51491fcf6e 100644 --- a/daemon/src/audio/ringbuffer.cpp +++ b/daemon/src/audio/ringbuffer.cpp @@ -132,7 +132,7 @@ RingBuffer::storeReadPointer(int pointer_value, const std::string &call_id) if (iter != readpointer_.end()) iter->second = pointer_value; else - DEBUG("storeReadPointer: Cannot find \"%s\" readPointer in \"%s\" ringbuffer", call_id.c_str(), buffer_id_.c_str()); + DEBUG("Cannot find \"%s\" readPointer in \"%s\" ringbuffer", call_id.c_str(), buffer_id_.c_str()); } diff --git a/daemon/src/audio/samplerateconverter.cpp b/daemon/src/audio/samplerateconverter.cpp index be38d25f95..e64a86e9f6 100644 --- a/daemon/src/audio/samplerateconverter.cpp +++ b/daemon/src/audio/samplerateconverter.cpp @@ -31,6 +31,7 @@ #include "samplerateconverter.h" #include "manager.h" #include <cassert> +#include "logger.h" SamplerateConverter::SamplerateConverter(int freq) : floatBufferIn_(0), floatBufferOut_(0), samples_(0), maxFreq_(freq), src_state_(0) @@ -63,15 +64,16 @@ SamplerateConverter::Short2FloatArray(const short *in, float *out, int len) } void SamplerateConverter::resample(SFLDataFormat *dataIn, - SFLDataFormat *dataOut, int inputFreq, - int outputFreq, int nbSamples) + SFLDataFormat *dataOut, + size_t dataOutSize, int inputFreq, + int outputFreq, size_t nbSamples) { double sampleFactor = (double) outputFreq / inputFreq; if (sampleFactor == 1.0) return; - const int outSamples = nbSamples * sampleFactor; + size_t outSamples = nbSamples * sampleFactor; const unsigned int maxSamples = std::max(outSamples, nbSamples); if (maxSamples > samples_) { @@ -91,8 +93,12 @@ void SamplerateConverter::resample(SFLDataFormat *dataIn, src_data.src_ratio = sampleFactor; src_data.end_of_input = 0; // More data will come - Short2FloatArray(dataIn , floatBufferIn_, nbSamples); + Short2FloatArray(dataIn, floatBufferIn_, nbSamples); src_process(src_state_, &src_data); - src_float_to_short_array(floatBufferOut_, dataOut , outSamples); + if (outSamples > dataOutSize) { + ERROR("Outsamples exceeds output buffer size, clamping to %u", dataOutSize); + outSamples = dataOutSize; + } + src_float_to_short_array(floatBufferOut_, dataOut, outSamples); } diff --git a/daemon/src/audio/samplerateconverter.h b/daemon/src/audio/samplerateconverter.h index 31518d203a..3dbbab464f 100644 --- a/daemon/src/audio/samplerateconverter.h +++ b/daemon/src/audio/samplerateconverter.h @@ -59,7 +59,7 @@ class SamplerateConverter { * @param SamplerateConverter2 The desired sample rate * @param nbSamples The number of samples to process */ - void resample(SFLDataFormat* dataIn , SFLDataFormat* dataOut , int oldrate, int newrate, int nbSamples); + void resample(SFLDataFormat* dataIn, SFLDataFormat* dataOut, size_t dataOutSize, int oldrate, int newrate, size_t nbSamples); /** * Convert short table to floats for audio processing diff --git a/daemon/src/audio/sound/audiofile.cpp b/daemon/src/audio/sound/audiofile.cpp index be11a5b2d5..6678c74751 100644 --- a/daemon/src/audio/sound/audiofile.cpp +++ b/daemon/src/audio/sound/audiofile.cpp @@ -183,7 +183,7 @@ WaveFile::WaveFile(const std::string &fileName, int newRate) : AudioFile(fileNam // sample frames, should not be longer than a minute int nbSamples = std::min(60 * fileRate, 8 * bytes / dt / chan); - DEBUG("WaveFile: frame size %ld, data size %d align %d rate %d avgbyte %d " + DEBUG("Frame size %ld, data size %d align %d rate %d avgbyte %d " "chunk size %d dt %d", nbSamples, bytes, blockal, fileRate, avgb, chunkSize, dt); @@ -205,7 +205,7 @@ WaveFile::WaveFile(const std::string &fileName, int newRate) : AudioFile(fileNam const int outSamples = ceil(nbSamples * ratio); size_ = outSamples; buffer_ = new SFLDataFormat[size_]; - converter.resample(tempBuffer, buffer_, fileRate, newRate, nbSamples); + converter.resample(tempBuffer, buffer_, size_, fileRate, newRate, nbSamples); delete [] tempBuffer; } else buffer_ = tempBuffer; diff --git a/daemon/src/audio/speexechocancel.cpp b/daemon/src/audio/speexechocancel.cpp index f51989ed5d..4fc2531843 100644 --- a/daemon/src/audio/speexechocancel.cpp +++ b/daemon/src/audio/speexechocancel.cpp @@ -48,7 +48,7 @@ SpeexEchoCancel::SpeexEchoCancel() : tmpMic_(), tmpOut_() { - DEBUG("EchoCancel: Initializing echo canceller with delay: %d, filter " + DEBUG("Initializing echo canceller with delay: %d, filter " "length: %d, frame size: %d and samplerate %d", echoDelay_, echoTailLength_, EC_FRAME_SIZE, SPEEX_SAMPLE_RATE); diff --git a/daemon/src/config/sfl_config.cpp b/daemon/src/config/sfl_config.cpp index 5b4841b0bd..c7e5ac3102 100644 --- a/daemon/src/config/sfl_config.cpp +++ b/daemon/src/config/sfl_config.cpp @@ -195,7 +195,7 @@ void ConfigTree::setConfigTreeItem(const std::string& section, bool ConfigTree::populateFromFile(const std::string& fileName) { - DEBUG("ConfigTree: Populate from file %s", fileName.c_str()); + DEBUG("Populate from file %s", fileName.c_str()); if (fileName.empty()) return false; @@ -322,4 +322,3 @@ ConfigTreeIterator::next() return tk; } } // end namespace ConfigTree - diff --git a/daemon/src/config/yamlemitter.cpp b/daemon/src/config/yamlemitter.cpp index 6ab19a9416..9713bba467 100644 --- a/daemon/src/config/yamlemitter.cpp +++ b/daemon/src/config/yamlemitter.cpp @@ -97,7 +97,7 @@ void YamlEmitter::serializeAccount(MappingNode *map) if (isFirstAccount_) { int accountid; - DEBUG("YamlEmitter: Create account sequence"); + DEBUG("Create account sequence"); // accountSequence_ need to be static outside this scope since reused each time an account is written if ((accountid = yaml_document_add_scalar(&document_, NULL, (yaml_char_t *) "accounts", -1, YAML_PLAIN_SCALAR_STYLE)) == 0) diff --git a/daemon/src/config/yamlnode.cpp b/daemon/src/config/yamlnode.cpp index 6d313f8ad0..e20f870ae7 100644 --- a/daemon/src/config/yamlnode.cpp +++ b/daemon/src/config/yamlnode.cpp @@ -93,8 +93,7 @@ typedef std::map<std::string, YamlNode*> Mapping; void MappingNode::setKeyValue(const std::string &key, YamlNode *value) { - Mapping::iterator it = map_.end(); - map_.insert(it, std::pair<std::string, YamlNode *>(key, value)); + map_[key] = value; } void MappingNode::removeKeyValue(const std::string &key) @@ -107,6 +106,8 @@ YamlNode *MappingNode::getValue(const std::string &key) const { Mapping::const_iterator it = map_.find(key); + + if (it != map_.end()) return it->second; else @@ -125,19 +126,23 @@ void MappingNode::getValue(const std::string &key, bool *b) const void MappingNode::getValue(const std::string &key, int *i) const { - ScalarNode *node = static_cast<ScalarNode*>(getValue(key)); - if (!node) + ScalarNode *node = dynamic_cast<ScalarNode*>(getValue(key)); + if (!node) { + ERROR("node %s not found", key.c_str()); return; + } *i = std::atoi(node->getValue().c_str()); } void MappingNode::getValue(const std::string &key, std::string *v) const { - ScalarNode *node = static_cast<ScalarNode*>(getValue(key)); + ScalarNode *node = dynamic_cast<ScalarNode*>(getValue(key)); - if (!node) + if (!node) { + ERROR("node %s not found", key.c_str()); return; + } *v = node->getValue(); } @@ -146,7 +151,7 @@ void MappingNode::getValue(const std::string &key, std::string *v) const void MappingNode::deleteChildNodes() { for (Mapping::iterator it = map_.begin(); it != map_.end(); ++it) { - YamlNode *yamlNode = static_cast<YamlNode *>(it->second); + YamlNode *yamlNode = dynamic_cast<YamlNode *>(it->second); if (!yamlNode) continue; @@ -155,21 +160,21 @@ void MappingNode::deleteChildNodes() case DOCUMENT: break; case SEQUENCE: { - SequenceNode *sequence = static_cast<SequenceNode *>(yamlNode); + SequenceNode *sequence = dynamic_cast<SequenceNode *>(yamlNode); sequence->deleteChildNodes(); delete sequence; sequence = NULL; } break; case MAPPING: { - MappingNode *mapping = static_cast<MappingNode *>(yamlNode); + MappingNode *mapping = dynamic_cast<MappingNode *>(yamlNode); mapping->deleteChildNodes(); delete mapping; mapping = NULL; } break; case SCALAR: { - ScalarNode *scalar = static_cast<ScalarNode *>(yamlNode); + ScalarNode *scalar = dynamic_cast<ScalarNode *>(yamlNode); delete scalar; scalar = NULL; } diff --git a/daemon/src/config/yamlparser.cpp b/daemon/src/config/yamlparser.cpp index 059a28eaf2..0a56ce3da4 100644 --- a/daemon/src/config/yamlparser.cpp +++ b/daemon/src/config/yamlparser.cpp @@ -31,8 +31,9 @@ #include "yamlparser.h" #include "../global.h" -#include "config.h" +#include "sfl_config.h" #include "yamlnode.h" +#include "logger.h" #include <cstdio> namespace Conf { @@ -223,10 +224,7 @@ void YamlParser::processStream() void YamlParser::processDocument() { - doc_ = new YamlDocument(); - - if (!doc_) - throw YamlParserException("Not able to create new document"); + doc_ = new YamlDocument; for (; (eventIndex_ < eventNumber_) and (events_[eventIndex_].type != YAML_DOCUMENT_END_EVENT); ++eventIndex_) { switch (events_[eventIndex_].type) { @@ -265,6 +263,7 @@ void YamlParser::processScalar(YamlNode *topNode) break; case MAPPING: ((MappingNode *)(topNode))->addNode(sclr); + break; case SCALAR: default: break; @@ -370,6 +369,8 @@ void YamlParser::processMapping(YamlNode *topNode) void YamlParser::constructNativeData() { + if (!doc_) + throw YamlParserException("YAML Document not initialized"); Sequence *seq = doc_->getSequence(); for (Sequence::iterator iter = seq->begin(); iter != seq->end(); ++iter) { diff --git a/daemon/src/dbus/callmanager-introspec.xml b/daemon/src/dbus/callmanager-introspec.xml index 8a3abaef7d..534fda54f5 100644 --- a/daemon/src/dbus/callmanager-introspec.xml +++ b/daemon/src/dbus/callmanager-introspec.xml @@ -313,6 +313,24 @@ </arg> </method> + <method name="getConferenceId" tp:name-for-bindings="getConferenceId"> + <tp:added version="1.1.0"/> + <tp:docstring> + If thsi call participate to a conference, return the conference id. + Return an empty string elsewhere. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The call id. + </tp:docstring> + </arg> + <arg type="s" name="confID" direction="out"> + <tp:docstring> + A string containing the conference ID, or an empty string. + </tp:docstring> + </arg> + </method> + <method name="setRecording" tp:name-for-bindings="setRecording"> <tp:docstring> Start recording a call. @@ -375,6 +393,7 @@ <li>DISPLAY_NAME</li> <li>CALL_STATE</li> <li>CALL_TYPE</li> + <li>CONF_ID</li> </ul> </tp:docstring> </arg> diff --git a/daemon/src/dbus/callmanager.cpp b/daemon/src/dbus/callmanager.cpp index c9b0923b13..31e0b74964 100644 --- a/daemon/src/dbus/callmanager.cpp +++ b/daemon/src/dbus/callmanager.cpp @@ -42,12 +42,8 @@ #include "logger.h" #include "manager.h" -namespace { - const char* SERVER_PATH = "/org/sflphone/SFLphone/CallManager"; -} - CallManager::CallManager(DBus::Connection& connection) - : DBus::ObjectAdaptor(connection, SERVER_PATH) + : DBus::ObjectAdaptor(connection, "/org/sflphone/SFLphone/CallManager") {} void CallManager::placeCall(const std::string& accountID, @@ -143,10 +139,11 @@ void CallManager::setVolume(const std::string& device, const double& value) DEBUG("DBUS set volume for %s: %f", device.c_str(), value); - if (device == "speaker") - audiolayer->setPlaybackGain(value * 100.0); - else if (device == "mic") - audiolayer->setCaptureGain(value * 100.0); + if (device == "speaker") { + audiolayer->setPlaybackGain((int)(value * 100.0)); + } else if (device == "mic") { + audiolayer->setCaptureGain((int)(value * 100.0)); + } volumeChanged(device, value); } @@ -156,7 +153,7 @@ CallManager::getVolume(const std::string& device) { AudioLayer *audiolayer = Manager::instance().getAudioDriver(); - if (!audiolayer) { + if(!audiolayer) { ERROR("CallManager: Audio layer not valid while updating volume"); return 0.0; } @@ -176,7 +173,7 @@ CallManager::joinParticipant(const std::string& sel_callID, const std::string& d } void -CallManager::createConfFromParticipantList(const std::vector< std::string >& participants) +CallManager::createConfFromParticipantList(const std::vector<std::string>& participants) { Manager::instance().createConfFromParticipantList(participants); } @@ -235,6 +232,12 @@ CallManager::getParticipantList(const std::string& confID) return Manager::instance().getParticipantList(confID); } +std::string +CallManager::getConferenceId(const std::string& callID) +{ + return Manager::instance().getConferenceId(callID); +} + bool CallManager::startRecordedFilePlayback(const std::string& filepath) { @@ -261,7 +264,7 @@ CallManager::getIsRecording(const std::string& callID) std::string CallManager::getCurrentAudioCodecName(const std::string& callID) { - return Manager::instance().getCurrentCodecName(callID); + return Manager::instance().getCurrentCodecName(callID).c_str(); } std::map<std::string, std::string> @@ -329,51 +332,63 @@ CallManager::setSASVerified(const std::string& callID) sfl::AudioZrtpSession * zSession; zSession = getAudioZrtpSession(callID); zSession->SASVerified(); - } catch (...) {} + } catch (...) { + } } void CallManager::resetSASVerified(const std::string& callID) { try { - sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID); + sfl::AudioZrtpSession * zSession; + zSession = getAudioZrtpSession(callID); zSession->resetSASVerified(); - } catch (...) {} + } catch (...) { + } } void CallManager::setConfirmGoClear(const std::string& callID) { try { - sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID); + sfl::AudioZrtpSession * zSession; + zSession = getAudioZrtpSession(callID); zSession->goClearOk(); - } catch (...) {} + } catch (...) { + } } -void CallManager::requestGoClear(const std::string& callID) +void +CallManager::requestGoClear(const std::string& callID) { try { - sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID); + sfl::AudioZrtpSession * zSession; + zSession = getAudioZrtpSession(callID); zSession->requestGoClear(); - } catch (...) {} + } catch (...) { + } } void CallManager::acceptEnrollment(const std::string& callID, const bool& accepted) { try { - sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID); + sfl::AudioZrtpSession * zSession; + zSession = getAudioZrtpSession(callID); zSession->acceptEnrollment(accepted); - } catch (...) {} + } catch (...) { + } } void CallManager::setPBXEnrollment(const std::string& callID, const bool& yesNo) { try { - sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID); + sfl::AudioZrtpSession * zSession; + zSession = getAudioZrtpSession(callID); zSession->setPBXEnrollment(yesNo); - } catch (...) {} + } catch (...) { + } } void diff --git a/daemon/src/dbus/callmanager.h b/daemon/src/dbus/callmanager.h index a43ab96d39..9c3591ccbc 100644 --- a/daemon/src/dbus/callmanager.h +++ b/daemon/src/dbus/callmanager.h @@ -60,10 +60,10 @@ namespace sfl { class AudioZrtpSession; } -class CallManager : public org::sflphone::SFLphone::CallManager_adaptor, - public DBus::IntrospectableAdaptor, - public DBus::ObjectAdaptor { - +class CallManager + : public org::sflphone::SFLphone::CallManager_adaptor, + public DBus::IntrospectableAdaptor, + public DBus::ObjectAdaptor { public: CallManager(DBus::Connection& connection); @@ -82,13 +82,13 @@ class CallManager : public org::sflphone::SFLphone::CallManager_adaptor, void hold(const std::string& callID); void unhold(const std::string& callID); void transfer(const std::string& callID, const std::string& to); - void attendedTransfer(const std::string& transferID, const std::string &targetID); - std::map<std::string, std::string> getCallDetails(const std::string &callID); - std::vector<std::string> getCallList(); + void attendedTransfer(const std::string& transferID, const std::string& targetID); + std::map< std::string, std::string > getCallDetails(const std::string& callID); + std::vector< std::string > getCallList(); /* Conference related methods */ - void joinParticipant(const std::string& sel_callID, const std::string &drag_callID); - void createConfFromParticipantList(const std::vector<std::string> &participants); + void joinParticipant(const std::string& sel_callID, const std::string& drag_callID); + void createConfFromParticipantList(const std::vector< std::string >& participants); void addParticipant(const std::string& callID, const std::string& confID); void addMainParticipant(const std::string& confID); void detachParticipant(const std::string& callID); @@ -98,13 +98,14 @@ class CallManager : public org::sflphone::SFLphone::CallManager_adaptor, void unholdConference(const std::string& confID); std::vector<std::string> getConferenceList(); std::vector<std::string> getParticipantList(const std::string& confID); + std::string getConferenceId(const std::string& callID); std::map<std::string, std::string> getConferenceDetails(const std::string& callID); /* File Playback methods */ bool startRecordedFilePlayback(const std::string& filepath); void stopRecordedFilePlayback(const std::string& filepath); - /* General media methods */ + /* General audio methods */ void setVolume(const std::string& device, const double& value); double getVolume(const std::string& device); void setRecording(const std::string& callID); @@ -130,4 +131,3 @@ class CallManager : public org::sflphone::SFLphone::CallManager_adaptor, }; #endif//CALLMANAGER_H - diff --git a/daemon/src/dbus/configurationmanager-introspec.xml b/daemon/src/dbus/configurationmanager-introspec.xml index 2021a4b3e5..a3de1b2053 100644 --- a/daemon/src/dbus/configurationmanager-introspec.xml +++ b/daemon/src/dbus/configurationmanager-introspec.xml @@ -37,9 +37,9 @@ <li>DISPLAY_NAMEL: The display name</li> <li>STUN_ENABLE: True or False (Default: False)</li> <li>STUN_SERVER: The STUN server address</li> - <li>REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> - <li>REGISTRATION_STATE_CODE</li> - <li>REGISTRATION_STATE_DESCRIPTION</li> + <li>ACCOUNT_REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> + <li>ACCOUNT_REGISTRATION_STATE_CODE</li> + <li>ACCOUNT_REGISTRATION_STATE_DESC</li> <li>SRTP_KEY_EXCHANGE</li> <li>SRTP_ENABLE: Whether or not voice communication are encrypted - True or False (Default: False)</li> <li>SRTP_RTP_FALLBACK</li> @@ -91,7 +91,6 @@ Get configuration settings of the IP2IP_PROFILE. They are sligthly different from account settings since no VoIP accounts are involved. </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <!--<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/>--> <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> <tp:docstring> Available parameters are: @@ -449,6 +448,9 @@ <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> </signal> + <signal name="historyChanged" tp:name-for-bindings="historyChanged"> + </signal> + <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> <arg type="s" name="accountID"/> <arg type="i" name="registration_state"/> diff --git a/daemon/src/dbus/configurationmanager.cpp b/daemon/src/dbus/configurationmanager.cpp index 98e7494253..01e5f3cb09 100644 --- a/daemon/src/dbus/configurationmanager.cpp +++ b/daemon/src/dbus/configurationmanager.cpp @@ -57,7 +57,7 @@ std::map<std::string, std::string> ConfigurationManager::getIp2IpDetails() SIPAccount *sipaccount = Manager::instance().getIP2IPAccount(); if (!sipaccount) { - ERROR("ConfigurationManager: could not find IP2IP account"); + ERROR("Could not find IP2IP account"); return ip2ipAccountDetails; } else return sipaccount->getIp2IpDetails(); @@ -117,7 +117,7 @@ void ConfigurationManager::setTlsSettings(const std::map<std::string, std::strin SIPAccount * sipaccount = Manager::instance().getIP2IPAccount(); if (!sipaccount) { - DEBUG("ConfigurationManager: Error: No valid account in set TLS settings"); + DEBUG("No valid account in set TLS settings"); return; } @@ -263,7 +263,7 @@ int32_t ConfigurationManager::getAudioDeviceIndex(const std::string& name) std::string ConfigurationManager::getCurrentAudioOutputPlugin() { - DEBUG("ConfigurationManager: Get audio plugin %s", Manager::instance().getCurrentAudioOutputPlugin().c_str()); + DEBUG("Get audio plugin %s", Manager::instance().getCurrentAudioOutputPlugin().c_str()); return Manager::instance().getCurrentAudioOutputPlugin(); } diff --git a/daemon/src/history/history.cpp b/daemon/src/history/history.cpp index 42284b99fa..d812d04e3c 100644 --- a/daemon/src/history/history.cpp +++ b/daemon/src/history/history.cpp @@ -64,7 +64,7 @@ bool History::load(int limit) bool History::save() { - DEBUG("History: Saving history in XDG directory: %s", path_.c_str()); + DEBUG("Saving history in XDG directory: %s", path_.c_str()); ensurePath(); std::sort(items_.begin(), items_.end()); std::ofstream outfile(path_.c_str()); @@ -99,7 +99,7 @@ void History::ensurePath() if (mkdir(userdata.data(), 0755) != 0) { // If directory creation failed if (errno != EEXIST) { - DEBUG("History: Cannot create directory: %m"); + DEBUG("Cannot create directory: %m"); return; } } @@ -126,7 +126,7 @@ void History::setPath(const std::string &path) void History::addCall(Call *call, int limit) { if (!call) { - ERROR("History: Call is NULL, ignoring"); + ERROR("Call is NULL, ignoring"); return; } call->time_stop(); diff --git a/daemon/src/iax/iaxaccount.cpp b/daemon/src/iax/iaxaccount.cpp index 5fbc1dc913..411330db50 100644 --- a/daemon/src/iax/iaxaccount.cpp +++ b/daemon/src/iax/iaxaccount.cpp @@ -93,7 +93,7 @@ void IAXAccount::unserialize(const Conf::MappingNode &map) map.getValue(CODECS_KEY, &codecStr_); // Update codec list which one is used for SDP offer - setActiveCodecs(ManagerImpl::unserialize(codecStr_)); + setActiveCodecs(ManagerImpl::split_string(codecStr_)); map.getValue(DISPLAY_NAME_KEY, &displayName_); } @@ -126,7 +126,7 @@ std::map<std::string, std::string> IAXAccount::getAccountDetails() const RegistrationState state(registrationState_); - a[CONFIG_REGISTRATION_STATUS] = mapStateNumberToString(state); + a[CONFIG_ACCOUNT_REGISTRATION_STATUS] = mapStateNumberToString(state); a[CONFIG_ACCOUNT_USERAGENT] = userAgent_; return a; diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp index d8d2caa7b3..a1afbf2f26 100644 --- a/daemon/src/iax/iaxvoiplink.cpp +++ b/daemon/src/iax/iaxvoiplink.cpp @@ -38,6 +38,7 @@ #include "hooks/urlhook.h" #include "audio/audiolayer.h" #include "audio/samplerateconverter.h" +#include "array_size.h" #include <cmath> #include <dlfcn.h> @@ -180,7 +181,8 @@ IAXVoIPLink::sendAudioFromMic() SFLDataFormat *in; if (audioRate != mainBufferSampleRate) { - converter_.resample(decData_, resampledData_, audioRate, mainBufferSampleRate, samples); + converter_.resample(decData_, resampledData_, ARRAYSIZE(resampledData_), + audioRate, mainBufferSampleRate, samples); in = resampledData_; outSamples = 0; } else { @@ -209,8 +211,6 @@ IAXVoIPLink::getIAXCall(const std::string& id) void IAXVoIPLink::sendRegister(Account *a) { - DEBUG("Send register"); - IAXAccount *account = dynamic_cast<IAXAccount*>(a); if (account->getHostname().empty()) @@ -282,8 +282,6 @@ IAXVoIPLink::answer(Call *call) void IAXVoIPLink::hangup(const std::string& id) { - DEBUG("IAXVoIPLink: Hangup"); - IAXCall* call = getIAXCall(id); if (call == NULL) @@ -304,8 +302,6 @@ IAXVoIPLink::hangup(const std::string& id) void IAXVoIPLink::peerHungup(const std::string& id) { - DEBUG("IAXVoIPLink: Peer hung up"); - IAXCall* call = getIAXCall(id); if (call == NULL) @@ -583,7 +579,8 @@ void IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall* call) if (audioRate != mainBufferSampleRate) { outSize = (double)outSize * (mainBufferSampleRate / audioRate); - converter_.resample(decData_, resampledData_, mainBufferSampleRate, audioRate, samples); + converter_.resample(decData_, resampledData_, ARRAYSIZE(resampledData_), + mainBufferSampleRate, audioRate, samples); out = resampledData_; } diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h index c848043d23..6d115b7345 100644 --- a/daemon/src/iax/iaxvoiplink.h +++ b/daemon/src/iax/iaxvoiplink.h @@ -255,7 +255,8 @@ class IAXVoIPLink : public VoIPLink { /** encoder/decoder/resampler buffers */ SFLDataFormat decData_[DEC_BUFFER_SIZE]; - SFLDataFormat resampledData_[DEC_BUFFER_SIZE]; +#warning FIXME: resampled buffer should be resized as appropriate + SFLDataFormat resampledData_[DEC_BUFFER_SIZE * 4]; unsigned char encodedData_[DEC_BUFFER_SIZE]; /** Sample rate converter object */ diff --git a/daemon/src/logger.h b/daemon/src/logger.h index 353d4abb42..f40f00ce02 100644 --- a/daemon/src/logger.h +++ b/daemon/src/logger.h @@ -28,8 +28,8 @@ * as that of the covered work. */ -#ifndef __LOGGER_H__ -#define __LOGGER_H__ +#ifndef LOGGER_H_ +#define LOGGER_H_ #include <syslog.h> @@ -41,10 +41,13 @@ void setDebugMode(bool); bool getDebugMode(); }; -#define ERROR(...) Logger::log(LOG_ERR, __VA_ARGS__) -#define WARN(...) Logger::log(LOG_WARNING, __VA_ARGS__) -#define INFO(...) Logger::log(LOG_INFO, __VA_ARGS__) -#define DEBUG(...) Logger::log(LOG_DEBUG, __VA_ARGS__) +#define LOGGER(M, LEVEL, ...) Logger::log(LEVEL, "%s:%d: " M, __FILE__, \ + __LINE__, ##__VA_ARGS__) + +#define ERROR(M, ...) LOGGER(M, LOG_ERR, ##__VA_ARGS__) +#define WARN(M, ...) LOGGER(M, LOG_WARNING, ##__VA_ARGS__) +#define INFO(M, ...) LOGGER(M, LOG_INFO, ##__VA_ARGS__) +#define DEBUG(M, ...) LOGGER(M, LOG_DEBUG, ##__VA_ARGS__) #define BLACK "\033[22;30m" #define RED "\033[22;31m" @@ -64,5 +67,5 @@ bool getDebugMode(); #define WHITE "\033[01;37m" #define END_COLOR "\033[0m" -#endif +#endif // LOGGER_H_ diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index 783dec8268..194a8a9bd6 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -50,7 +50,6 @@ #include "config/yamlparser.h" #include "config/yamlemitter.h" #include "audio/alsa/alsalayer.h" -#include "audio/pulseaudio/pulselayer.h" #include "audio/sound/tonelist.h" #include "audio/sound/audiofile.h" #include "audio/sound/dtmf.h" @@ -91,7 +90,7 @@ ManagerImpl::ManagerImpl() : void ManagerImpl::init(const std::string &config_file) { path_ = config_file.empty() ? createConfigFile() : config_file; - DEBUG("Manager: configuration file path: %s", path_.c_str()); + DEBUG("Configuration file path: %s", path_.c_str()); try { Conf::YamlParser parser(path_.c_str()); @@ -100,7 +99,7 @@ void ManagerImpl::init(const std::string &config_file) parser.constructNativeData(); loadAccountMap(parser); } catch (const Conf::YamlParserException &e) { - ERROR("Manager: %s", e.what()); + ERROR("%s", e.what()); fflush(stderr); loadDefaultAccountMap(); } @@ -111,7 +110,7 @@ void ManagerImpl::init(const std::string &config_file) ost::MutexLock lock(audioLayerMutex_); if (audiodriver_) { telephoneTone_.reset(new TelephoneTone(preferences.getZoneToneChoice(), audiodriver_->getSampleRate())); - dtmfKey_.reset(new DTMF(8000)); + dtmfKey_.reset(new DTMF(getMainBuffer()->getInternalSamplingRate())); } } @@ -122,7 +121,7 @@ void ManagerImpl::init(const std::string &config_file) void ManagerImpl::terminate() { std::vector<std::string> callList(getCallList()); - DEBUG("Manager: Hangup %zu remaining call", callList.size()); + DEBUG("Hangup %zu remaining call", callList.size()); for (std::vector<std::string>::iterator iter = callList.begin(); iter != callList.end(); ++iter) @@ -177,17 +176,17 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, const std::string& conf_id) { if (call_id.empty()) { - DEBUG("Manager: New outgoing call abort, missing callid"); + DEBUG("New outgoing call abort, missing callid"); return false; } // Call ID must be unique if (not getAccountFromCall(call_id).empty()) { - ERROR("Manager: Error: Call id already exists in outgoing call"); + ERROR("Call id already exists in outgoing call"); return false; } - DEBUG("Manager: New outgoing call %s to %s", call_id.c_str(), to.c_str()); + DEBUG("New outgoing call %s to %s", call_id.c_str(), to.c_str()); stopTone(); @@ -199,7 +198,7 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, // in any cases we have to detach from current communication if (hasCurrentCall()) { - DEBUG("Manager: Has current call (%s) put it onhold", current_call_id.c_str()); + DEBUG("Has current call (%s) put it onhold", current_call_id.c_str()); // if this is not a conferenceand this and is not a conference participant if (not isConference(current_call_id) and not isConferenceParticipant(current_call_id)) @@ -208,21 +207,19 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, detachParticipant(MainBuffer::DEFAULT_ID, current_call_id); } - DEBUG("Manager: Selecting account %s", account_id.c_str()); + DEBUG("Selecting account %s", account_id.c_str()); // fallback using the default sip account if the specied doesn't exist std::string use_account_id = ""; if (!accountExists(account_id)) { - WARN("Manager: Account does not exist, trying with default SIP account"); + WARN("Account does not exist, trying with default SIP account"); use_account_id = SIPAccount::IP2IP_PROFILE; } else { use_account_id = account_id; } - // Is this account exist - if (!associateCallToAccount(call_id, use_account_id)) - WARN("Manager: Warning: Could not associate call id %s to account id %s", call_id.c_str(), use_account_id.c_str()); + associateCallToAccount(call_id, use_account_id); try { Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned); @@ -230,7 +227,7 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, call->setConfId(conf_id); } catch (const VoipLinkException &e) { callFailure(call_id); - ERROR("Manager: %s", e.what()); + ERROR("%s", e.what()); return false; } @@ -242,7 +239,7 @@ bool ManagerImpl::outgoingCall(const std::string& account_id, //THREAD=Main : for outgoing Call bool ManagerImpl::answerCall(const std::string& call_id) { - DEBUG("Manager: Answer call %s", call_id.c_str()); + DEBUG("Answer call %s", call_id.c_str()); // If sflphone is ringing stopTone(); @@ -250,33 +247,31 @@ bool ManagerImpl::answerCall(const std::string& call_id) // store the current call id std::string current_call_id(getCurrentCallId()); - // Retreive call coresponding to this id - std::string account_id = getAccountFromCall(call_id); - Call *call = getAccountLink(account_id)->getCall(call_id); + Call *call = getCallFromCallID(call_id); - if (call == NULL) { - ERROR("Manager: Error: Call is null"); - } + if (call == NULL) + ERROR("Call is NULL"); // in any cases we have to detach from current communication if (hasCurrentCall()) { - DEBUG("Manager: Currently conversing with %s", current_call_id.c_str()); + DEBUG("Currently conversing with %s", current_call_id.c_str()); if (not isConference(current_call_id) and not isConferenceParticipant(current_call_id)) { - DEBUG("Manager: Answer call: Put the current call (%s) on hold", current_call_id.c_str()); + DEBUG("Answer call: Put the current call (%s) on hold", current_call_id.c_str()); onHoldCall(current_call_id); } else if (isConference(current_call_id) and not isConferenceParticipant(call_id)) { // if we are talking to a conference and we are answering an incoming call - DEBUG("Manager: Detach main participant from conference"); + DEBUG("Detach main participant from conference"); detachParticipant(MainBuffer::DEFAULT_ID, current_call_id); } } try { + const std::string account_id = getAccountFromCall(call_id); getAccountLink(account_id)->answer(call); } catch (const std::runtime_error &e) { - ERROR("Manager: Error: %s", e.what()); + ERROR("%s", e.what()); } // if it was waiting, it's waiting no more @@ -309,7 +304,7 @@ bool ManagerImpl::answerCall(const std::string& call_id) //THREAD=Main void ManagerImpl::hangupCall(const std::string& callId) { - DEBUG("Manager: Hangup call %s", callId.c_str()); + DEBUG("Hangup call %s", callId.c_str()); // store the current call id std::string currentCallId(getCurrentCallId()); @@ -317,11 +312,11 @@ void ManagerImpl::hangupCall(const std::string& callId) stopTone(); /* Broadcast a signal over DBus */ - DEBUG("Manager: Send DBUS call state change (HUNGUP) for id %s", callId.c_str()); + DEBUG("Send DBUS call state change (HUNGUP) for id %s", callId.c_str()); dbus_.getCallManager()->callStateChanged(callId, "HUNGUP"); if (not isValidCall(callId) and not isIPToIP(callId)) { - ERROR("Manager: Error: Could not hang up call, call not valid"); + ERROR("Could not hang up call, call not valid"); return; } @@ -348,16 +343,18 @@ void ManagerImpl::hangupCall(const std::string& callId) Call * call = SIPVoIPLink::instance()->getCall(callId); history_.addCall(call, preferences.getHistoryLimit()); SIPVoIPLink::instance()->hangup(callId); + saveHistory(); } catch (const VoipLinkException &e) { ERROR("%s", e.what()); } } else { std::string accountId(getAccountFromCall(callId)); - VoIPLink *link = getAccountLink(accountId); - Call * call = link->getCall(callId); + Call * call = getCallFromCallID(callId); history_.addCall(call, preferences.getHistoryLimit()); + VoIPLink *link = getAccountLink(accountId); link->hangup(callId); removeCallAccount(callId); + saveHistory(); } getMainBuffer()->stateInfo(); @@ -365,7 +362,7 @@ void ManagerImpl::hangupCall(const std::string& callId) bool ManagerImpl::hangupConference(const std::string& id) { - DEBUG("Manager: Hangup conference %s", id.c_str()); + DEBUG("Hangup conference %s", id.c_str()); ConferenceMap::iterator iter_conf = conferenceMap_.find(id); @@ -379,7 +376,7 @@ bool ManagerImpl::hangupConference(const std::string& id) iter != participants.end(); ++iter) hangupCall(*iter); } else { - ERROR("Manager: No such conference %s", id.c_str()); + ERROR("No such conference %s", id.c_str()); return false; } } @@ -395,7 +392,7 @@ bool ManagerImpl::hangupConference(const std::string& id) //THREAD=Main void ManagerImpl::onHoldCall(const std::string& callId) { - DEBUG("Manager: Put call %s on hold", callId.c_str()); + DEBUG("Put call %s on hold", callId.c_str()); stopTone(); @@ -403,20 +400,20 @@ void ManagerImpl::onHoldCall(const std::string& callId) try { if (isIPToIP(callId)) { - SIPVoIPLink::instance()-> onhold(callId); + SIPVoIPLink::instance()->onhold(callId); } else { /* Classic call, attached to an account */ std::string account_id(getAccountFromCall(callId)); if (account_id.empty()) { - DEBUG("Manager: Account ID %s or callid %s doesn't exists in call onHold", account_id.c_str(), callId.c_str()); + DEBUG("Account ID %s or callid %s doesn't exist in call onHold", account_id.c_str(), callId.c_str()); return; } getAccountLink(account_id)->onhold(callId); } } catch (const VoipLinkException &e) { - ERROR("Manager: Error: %s", e.what()); + ERROR("%s", e.what()); } // Unbind calls in main buffer @@ -438,10 +435,9 @@ void ManagerImpl::onHoldCall(const std::string& callId) //THREAD=Main void ManagerImpl::offHoldCall(const std::string& callId) { - std::string accountId; std::string codecName; - DEBUG("Manager: Put call %s off hold", callId.c_str()); + DEBUG("Put call %s off hold", callId.c_str()); stopTone(); @@ -452,7 +448,7 @@ void ManagerImpl::offHoldCall(const std::string& callId) if (hasCurrentCall()) { if (not isConference(currentCallId) and not isConferenceParticipant(currentCallId)) { - DEBUG("Manager: Has current call (%s), put on hold", currentCallId.c_str()); + DEBUG("Has current call (%s), put on hold", currentCallId.c_str()); onHoldCall(currentCallId); } else if (isConference(currentCallId) and not isConferenceParticipant(callId)) detachParticipant(MainBuffer::DEFAULT_ID, currentCallId); @@ -464,10 +460,8 @@ void ManagerImpl::offHoldCall(const std::string& callId) SIPVoIPLink::instance()->offhold(callId); else { /* Classic call, attached to an account */ - accountId = getAccountFromCall(callId); - - DEBUG("Manager: Setting offhold, Account %s, callid %s", accountId.c_str(), callId.c_str()); - + const std::string accountId(getAccountFromCall(callId)); + DEBUG("Setting offhold, Account %s, callid %s", accountId.c_str(), callId.c_str()); Call * call = getAccountLink(accountId)->getCall(callId); if (call) { @@ -479,9 +473,7 @@ void ManagerImpl::offHoldCall(const std::string& callId) dbus_.getCallManager()->callStateChanged(callId, isRec ? "UNHOLD_RECORD" : "UNHOLD_CURRENT"); if (isConferenceParticipant(callId)) { - std::string currentAccountId(getAccountFromCall(callId)); - Call *call = getAccountLink(currentAccountId)->getCall(callId); - + Call *call = getCallFromCallID(callId); if (call) switchCall(call->getConfId()); @@ -586,7 +578,7 @@ void ManagerImpl::refuseCall(const std::string& id) Conference* ManagerImpl::createConference(const std::string& id1, const std::string& id2) { - DEBUG("Manager: Create conference with call %s and %s", id1.c_str(), id2.c_str()); + DEBUG("Create conference with call %s and %s", id1.c_str(), id2.c_str()); Conference* conf = new Conference; @@ -604,8 +596,8 @@ ManagerImpl::createConference(const std::string& id1, const std::string& id2) void ManagerImpl::removeConference(const std::string& conference_id) { - DEBUG("Manager: Remove conference %s", conference_id.c_str()); - DEBUG("Manager: number of participants: %u", conferenceMap_.size()); + DEBUG("Remove conference %s", conference_id.c_str()); + DEBUG("number of participants: %u", conferenceMap_.size()); ConferenceMap::iterator iter = conferenceMap_.find(conference_id); Conference* conf = 0; @@ -614,7 +606,7 @@ void ManagerImpl::removeConference(const std::string& conference_id) conf = iter->second; if (conf == NULL) { - ERROR("Manager: Error: Conference not found"); + ERROR("Conference not found"); return; } @@ -636,9 +628,9 @@ void ManagerImpl::removeConference(const std::string& conference_id) // Then remove the conference from the conference map if (conferenceMap_.erase(conference_id) == 1) - DEBUG("Manager: Conference %s removed successfully", conference_id.c_str()); + DEBUG("Conference %s removed successfully", conference_id.c_str()); else - ERROR("Manager: Error: Cannot remove conference: %s", conference_id.c_str()); + ERROR("Cannot remove conference: %s", conference_id.c_str()); delete conf; } @@ -646,8 +638,9 @@ void ManagerImpl::removeConference(const std::string& conference_id) Conference* ManagerImpl::getConferenceFromCallID(const std::string& call_id) { - std::string account_id(getAccountFromCall(call_id)); - Call *call = getAccountLink(account_id)->getCall(call_id); + Call *call = getCallFromCallID(call_id); + if (!call) + return NULL; ConferenceMap::const_iterator iter(conferenceMap_.find(call->getConfId())); @@ -696,12 +689,12 @@ void ManagerImpl::unHoldConference(const std::string& id) ParticipantSet participants(conf->getParticipantList()); for (ParticipantSet::const_iterator iter = participants.begin(); iter!= participants.end(); ++iter) { - Call *call = getAccountLink(getAccountFromCall(*iter))->getCall(*iter); - - // if one call is currently recording, the conference is in state recording - isRec |= call->isRecording(); - - offHoldCall(*iter); + Call *call = getCallFromCallID(*iter); + if (call) { + // if one call is currently recording, the conference is in state recording + isRec |= call->isRecording(); + offHoldCall(*iter); + } } conf->setState(isRec ? Conference::ACTIVE_ATTACHED_REC : Conference::ACTIVE_ATTACHED); @@ -723,11 +716,11 @@ bool ManagerImpl::isConferenceParticipant(const std::string& call_id) void ManagerImpl::addParticipant(const std::string& callId, const std::string& conferenceId) { - DEBUG("Manager: Add participant %s to %s", callId.c_str(), conferenceId.c_str()); + DEBUG("Add participant %s to %s", callId.c_str(), conferenceId.c_str()); ConferenceMap::iterator iter = conferenceMap_.find(conferenceId); if (iter == conferenceMap_.end()) { - ERROR("Manager: Error: Conference id is not valid"); + ERROR("Conference id is not valid"); return; } @@ -735,7 +728,7 @@ void ManagerImpl::addParticipant(const std::string& callId, const std::string& c Call *call = getAccountLink(currentAccountId)->getCall(callId); if (call == NULL) { - ERROR("Manager: Error: Call id is not valid"); + ERROR("Call id is not valid"); return; } @@ -783,7 +776,7 @@ void ManagerImpl::addParticipant(const std::string& callId, const std::string& c ParticipantSet participants(conf->getParticipantList()); if (participants.empty()) - ERROR("Manager: Error: Participant list is empty for this conference"); + ERROR("Participant list is empty for this conference"); // reset ring buffer for all conference participant // flush conference participants only @@ -832,7 +825,7 @@ void ManagerImpl::addMainParticipant(const std::string& conference_id) else if (conf->getState() == Conference::ACTIVE_DETACHED_REC) conf->setState(Conference::ACTIVE_ATTACHED_REC); else - WARN("Manager: Warning: Invalid conference state while adding main participant"); + WARN("Invalid conference state while adding main participant"); dbus_.getCallManager()->conferenceChanged(conference_id, conf->getStateStr()); } @@ -841,15 +834,43 @@ void ManagerImpl::addMainParticipant(const std::string& conference_id) switchCall(conference_id); } +Call * +ManagerImpl::getCallFromCallID(const std::string &callID) +{ + const std::string accountID(getAccountFromCall(callID)); + Call *call = getAccountLink(accountID)->getCall(callID); + return call; +} + void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& callId2) { - DEBUG("Manager: Join participants %s, %s", callId1.c_str(), callId2.c_str()); + DEBUG("Join participants %s, %s", callId1.c_str(), callId2.c_str()); + if (callId1 == callId2) { + ERROR("Cannot join participant %s to itself", callId1.c_str()); + return; + } + + // Set corresponding conference ids for call 1 + Call *call1 = getCallFromCallID(callId1); + + if (call1 == NULL) { + ERROR("Could not find call %s", callId1.c_str()); + return; + } + + // Set corresponding conderence details + Call *call2 = getCallFromCallID(callId2); + + if (call2 == NULL) { + ERROR("Could not find call %s", callId2.c_str()); + return; + } std::map<std::string, std::string> call1Details(getCallDetails(callId1)); std::map<std::string, std::string> call2Details(getCallDetails(callId2)); std::string current_call_id(getCurrentCallId()); - DEBUG("Manager: Current Call ID %s", current_call_id.c_str()); + DEBUG("Current Call ID %s", current_call_id.c_str()); // detach from the conference and switch to this conference if ((current_call_id != callId1) and (current_call_id != callId2)) { @@ -860,35 +881,18 @@ void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& onHoldCall(current_call_id); // currently in a call } - Conference *conf = createConference(callId1, callId2); - - // Set corresponding conference ids for call 1 - std::string currentAccountId1 = getAccountFromCall(callId1); - Call *call1 = getAccountLink(currentAccountId1)->getCall(callId1); - if (call1 == NULL) { - ERROR("Manager: Could not find call %s", callId1.c_str()); - return; - } + Conference *conf = createConference(callId1, callId2); call1->setConfId(conf->getConfID()); getMainBuffer()->unBindAll(callId1); - // Set corresponding conderence details - std::string currentAccountId2(getAccountFromCall(callId2)); - Call *call2 = getAccountLink(currentAccountId2)->getCall(callId2); - - if (call2 == NULL) { - ERROR("Manager: Could not find call %s", callId2.c_str()); - return; - } - call2->setConfId(conf->getConfID()); getMainBuffer()->unBindAll(callId2); // Process call1 according to its state std::string call1_state_str(call1Details.find("CALL_STATE")->second); - DEBUG("Manager: Process call %s state: %s", callId1.c_str(), call1_state_str.c_str()); + DEBUG("Process call %s state: %s", callId1.c_str(), call1_state_str.c_str()); if (call1_state_str == "HOLD") { conf->bindParticipant(callId1); @@ -904,11 +908,11 @@ void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& conf->bindParticipant(callId1); answerCall(callId1); } else - WARN("Manager: Call state not recognized"); + WARN("Call state not recognized"); // Process call2 according to its state std::string call2_state_str(call2Details.find("CALL_STATE")->second); - DEBUG("Manager: Process call %s state: %s", callId2.c_str(), call2_state_str.c_str()); + DEBUG("Process call %s state: %s", callId2.c_str(), call2_state_str.c_str()); if (call2_state_str == "HOLD") { conf->bindParticipant(callId2); @@ -924,7 +928,7 @@ void ManagerImpl::joinParticipant(const std::string& callId1, const std::string& conf->bindParticipant(callId2); answerCall(callId2); } else - WARN("Manager: Call state not recognized"); + WARN("Call state not recognized"); // Switch current call id to this conference switchCall(conf->getConfID()); @@ -944,7 +948,7 @@ void ManagerImpl::createConfFromParticipantList(const std::vector< std::string > { // we must at least have 2 participant for a conference if (participantList.size() <= 1) { - ERROR("Manager: Error: Participant number must be higher or equal to 2"); + ERROR("Participant number must be higher or equal to 2"); return; } @@ -997,7 +1001,7 @@ void ManagerImpl::createConfFromParticipantList(const std::vector< std::string > void ManagerImpl::detachParticipant(const std::string& call_id, const std::string& current_id) { - DEBUG("Manager: Detach participant %s (current id: %s)", call_id.c_str(), + DEBUG("Detach participant %s (current id: %s)", call_id.c_str(), current_id.c_str()); std::string current_call_id(getCurrentCallId()); @@ -1006,14 +1010,14 @@ void ManagerImpl::detachParticipant(const std::string& call_id, Call *call = getAccountLink(currentAccountId)->getCall(call_id); if (call == NULL) { - ERROR("Manager: Error: Could not find call %s", call_id.c_str()); + ERROR("Could not find call %s", call_id.c_str()); return; } Conference *conf = getConferenceFromCallID(call_id); if (conf == NULL) { - ERROR("Manager: Error: Call is not conferencing, cannot detach"); + ERROR("Call is not conferencing, cannot detach"); return; } @@ -1021,7 +1025,7 @@ void ManagerImpl::detachParticipant(const std::string& call_id, std::map<std::string, std::string>::iterator iter_details(call_details.find("CALL_STATE")); if (iter_details == call_details.end()) { - ERROR("Manager: Error: Could not find CALL_STATE"); + ERROR("Could not find CALL_STATE"); return; } @@ -1033,25 +1037,25 @@ void ManagerImpl::detachParticipant(const std::string& call_id, // Conference may have been deleted and set to 0 above processRemainingParticipants(current_call_id, conf); if (conf == 0) { - ERROR("Manager: Error: Call is not conferencing, cannot detach"); + ERROR("Call is not conferencing, cannot detach"); return; } } dbus_.getCallManager()->conferenceChanged(conf->getConfID(), conf->getStateStr()); } else { - DEBUG("Manager: Unbind main participant from conference %d"); + DEBUG("Unbind main participant from conference %d"); getMainBuffer()->unBindAll(MainBuffer::DEFAULT_ID); if (not isConference(current_call_id)) { - ERROR("Manager: Warning: Current call id (%s) is not a conference", current_call_id.c_str()); + ERROR("Current call id (%s) is not a conference", current_call_id.c_str()); return; } ConferenceMap::iterator iter = conferenceMap_.find(current_call_id); if (iter == conferenceMap_.end() or iter->second == 0) { - DEBUG("Manager: Error: Conference is NULL"); + DEBUG("Conference is NULL"); return; } Conference *conf = iter->second; @@ -1061,7 +1065,7 @@ void ManagerImpl::detachParticipant(const std::string& call_id, else if (conf->getState() == Conference::ACTIVE_ATTACHED_REC) conf->setState(Conference::ACTIVE_DETACHED_REC); else - WARN("Manager: Warning: Undefined behavior, invalid conference state in detach participant"); + WARN("Undefined behavior, invalid conference state in detach participant"); dbus_.getCallManager()->conferenceChanged(conf->getConfID(), conf->getStateStr()); @@ -1072,7 +1076,7 @@ void ManagerImpl::detachParticipant(const std::string& call_id, void ManagerImpl::removeParticipant(const std::string& call_id) { - DEBUG("Manager: Remove participant %s", call_id.c_str()); + DEBUG("Remove participant %s", call_id.c_str()); // this call is no more a conference participant const std::string currentAccountId(getAccountFromCall(call_id)); @@ -1082,12 +1086,12 @@ void ManagerImpl::removeParticipant(const std::string& call_id) ConferenceMap::const_iterator iter = conf_map.find(call->getConfId()); if (iter == conf_map.end() or iter->second == 0) { - ERROR("Manager: Error: No conference with id %s, cannot remove participant", call->getConfId().c_str()); + ERROR("No conference with id %s, cannot remove participant", call->getConfId().c_str()); return; } Conference *conf = iter->second; - DEBUG("Manager: Remove participant %s", call_id.c_str()); + DEBUG("Remove participant %s", call_id.c_str()); conf->remove(call_id); call->setConfId(""); @@ -1100,7 +1104,7 @@ void ManagerImpl::processRemainingParticipants(const std::string ¤t_call_i { ParticipantSet participants(conf->getParticipantList()); size_t n = participants.size(); - DEBUG("Manager: Process remaining %d participant(s) from conference %s", + DEBUG("Process remaining %d participant(s) from conference %s", n, conf->getConfID().c_str()); if (n > 1) { @@ -1131,7 +1135,7 @@ void ManagerImpl::processRemainingParticipants(const std::string ¤t_call_i removeConference(conf->getConfID()); conf = 0; } else { - DEBUG("Manager: No remaining participants, remove conference"); + DEBUG("No remaining participants, remove conference"); removeConference(conf->getConfID()); conf = 0; switchCall(""); @@ -1141,39 +1145,37 @@ void ManagerImpl::processRemainingParticipants(const std::string ¤t_call_i void ManagerImpl::joinConference(const std::string& conf_id1, const std::string& conf_id2) { - ConferenceMap::iterator iter(conferenceMap_.find(conf_id1)); + DEBUG("Join conferences %s and %s", conf_id1.c_str(), conf_id2.c_str()); - if (iter == conferenceMap_.end()) { - ERROR("Manager: Error: Not a valid conference ID: %s", conf_id1.c_str()); + if (conferenceMap_.find(conf_id1) == conferenceMap_.end()) { + ERROR("Not a valid conference ID: %s", conf_id1.c_str()); return; } - if (conferenceMap_.find(conf_id2) != conferenceMap_.end()) { - ERROR("Manager: Error: Not a valid conference ID: %s", conf_id2.c_str()); + if (conferenceMap_.find(conf_id2) == conferenceMap_.end()) { + ERROR("Not a valid conference ID: %s", conf_id2.c_str()); return; } - if (iter->second) { - Conference *conf = iter->second; - ParticipantSet participants(conf->getParticipantList()); + Conference *conf = conferenceMap_.find(conf_id1)->second; + ParticipantSet participants(conf->getParticipantList()); - for (ParticipantSet::const_iterator p = participants.begin(); - p != participants.end(); ++p) { - detachParticipant(*p, ""); - addParticipant(*p, conf_id2); - } + for (ParticipantSet::const_iterator p = participants.begin(); + p != participants.end(); ++p) { + detachParticipant(*p, ""); + addParticipant(*p, conf_id2); } } void ManagerImpl::addStream(const std::string& call_id) { - DEBUG("Manager: Add audio stream %s", call_id.c_str()); + DEBUG("Add audio stream %s", call_id.c_str()); std::string currentAccountId(getAccountFromCall(call_id)); Call *call = getAccountLink(currentAccountId)->getCall(call_id); if (call and isConferenceParticipant(call_id)) { - DEBUG("Manager: Add stream to conference"); + DEBUG("Add stream to conference"); // bind to conference participant ConferenceMap::iterator iter = conferenceMap_.find(call->getConfId()); @@ -1194,7 +1196,7 @@ void ManagerImpl::addStream(const std::string& call_id) } } else { - DEBUG("Manager: Add stream to call"); + DEBUG("Add stream to call"); // bind to main getMainBuffer()->bindCallID(call_id, MainBuffer::DEFAULT_ID); @@ -1209,7 +1211,7 @@ void ManagerImpl::addStream(const std::string& call_id) void ManagerImpl::removeStream(const std::string& call_id) { - DEBUG("Manager: Remove audio stream %s", call_id.c_str()); + DEBUG("Remove audio stream %s", call_id.c_str()); getMainBuffer()->unBindAll(call_id); getMainBuffer()->stateInfo(); } @@ -1217,7 +1219,7 @@ void ManagerImpl::removeStream(const std::string& call_id) //THREAD=Main void ManagerImpl::saveConfig() { - DEBUG("Manager: Saving Configuration to XDG directory %s", path_.c_str()); + DEBUG("Saving Configuration to XDG directory %s", path_.c_str()); AudioLayer *audiolayer = getAudioDriver(); if (audiolayer != NULL) { audioPreference.setVolumemic(audiolayer->getCaptureGain()); @@ -1257,7 +1259,7 @@ void ManagerImpl::playDtmf(char code) stopTone(); if (not voipPreferences.getPlayDtmf()) { - DEBUG("Manager: playDtmf: Do not have to play a tone..."); + DEBUG("Do not have to play a tone..."); return; } @@ -1265,7 +1267,7 @@ void ManagerImpl::playDtmf(char code) int pulselen = voipPreferences.getPulseLength(); if (pulselen == 0) { - DEBUG("Manager: playDtmf: Pulse length is not set..."); + DEBUG("Pulse length is not set..."); return; } @@ -1276,7 +1278,7 @@ void ManagerImpl::playDtmf(char code) // fast return, no sound, so no dtmf if (audiodriver_ == NULL || dtmfKey_.get() == 0) { - DEBUG("Manager: playDtmf: Error no audio layer..."); + DEBUG("No audio layer..."); return; } @@ -1385,12 +1387,12 @@ void ManagerImpl::incomingMessage(const std::string& callID, std::string accountId(getAccountFromCall(*iter_p)); - DEBUG("Manager: Send message to %s, (%s)", (*iter_p).c_str(), accountId.c_str()); + DEBUG("Send message to %s, (%s)", (*iter_p).c_str(), accountId.c_str()); Account *account = getAccount(accountId); if (!account) { - ERROR("Manager: Failed to get account while sending instant message"); + ERROR("Failed to get account while sending instant message"); return; } @@ -1409,7 +1411,7 @@ void ManagerImpl::incomingMessage(const std::string& callID, bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& message, const std::string& from) { if (isConference(callID)) { - DEBUG("Manager: Is a conference, send instant message to everyone"); + DEBUG("Is a conference, send instant message to everyone"); ConferenceMap::iterator it = conferenceMap_.find(callID); if (it == conferenceMap_.end()) @@ -1430,7 +1432,7 @@ bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& Account *account = getAccount(accountId); if (!account) { - DEBUG("Manager: Failed to get account while sending instant message"); + DEBUG("Failed to get account while sending instant message"); return false; } @@ -1441,7 +1443,7 @@ bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& } if (isConferenceParticipant(callID)) { - DEBUG("Manager: Call is participant in a conference, send instant message to everyone"); + DEBUG("Call is participant in a conference, send instant message to everyone"); Conference *conf = getConferenceFromCallID(callID); if (!conf) @@ -1457,7 +1459,7 @@ bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& Account *account = getAccount(accountId); if (!account) { - DEBUG("Manager: Failed to get account while sending instant message"); + DEBUG("Failed to get account while sending instant message"); return false; } @@ -1467,7 +1469,7 @@ bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& Account *account = getAccount(getAccountFromCall(callID)); if (!account) { - DEBUG("Manager: Failed to get account while sending instant message"); + DEBUG("Failed to get account while sending instant message"); return false; } @@ -1480,7 +1482,7 @@ bool ManagerImpl::sendTextMessage(const std::string& callID, const std::string& //THREAD=VoIP CALL=Outgoing void ManagerImpl::peerAnsweredCall(const std::string& id) { - DEBUG("Manager: Peer answered call %s", id.c_str()); + DEBUG("Peer answered call %s", id.c_str()); // The if statement is usefull only if we sent two calls at the same time. if (isCurrentCall(id)) @@ -1505,7 +1507,7 @@ void ManagerImpl::peerAnsweredCall(const std::string& id) //THREAD=VoIP Call=Outgoing void ManagerImpl::peerRingingCall(const std::string& id) { - DEBUG("Manager: Peer call %s ringing", id.c_str()); + DEBUG("Peer call %s ringing", id.c_str()); if (isCurrentCall(id)) ringback(); @@ -1516,7 +1518,7 @@ void ManagerImpl::peerRingingCall(const std::string& id) //THREAD=VoIP Call=Outgoing/Ingoing void ManagerImpl::peerHungupCall(const std::string& call_id) { - DEBUG("Manager: Peer hungup call %s", call_id.c_str()); + DEBUG("Peer hungup call %s", call_id.c_str()); if (isConferenceParticipant(call_id)) { Conference *conf = getConferenceFromCallID(call_id); @@ -1537,6 +1539,7 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) Call * call = SIPVoIPLink::instance()->getCall(call_id); history_.addCall(call, preferences.getHistoryLimit()); SIPVoIPLink::instance()->hangup(call_id); + saveHistory(); } else { const std::string account_id(getAccountFromCall(call_id)); @@ -1544,6 +1547,7 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) Call * call = link->getCall(call_id); history_.addCall(call, preferences.getHistoryLimit()); link->peerHungup(call_id); + saveHistory(); } /* Broadcast a signal over DBus */ @@ -1554,7 +1558,7 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) removeStream(call_id); if (getCallList().empty()) { - DEBUG("Manager: Stop audio stream, there are no calls remaining"); + DEBUG("Stop audio stream, there are no calls remaining"); ost::MutexLock lock(audioLayerMutex_); audiodriver_->stopStream(); } @@ -1563,7 +1567,7 @@ void ManagerImpl::peerHungupCall(const std::string& call_id) //THREAD=VoIP void ManagerImpl::callBusy(const std::string& id) { - DEBUG("Manager: Call %s busy", id.c_str()); + DEBUG("Call %s busy", id.c_str()); dbus_.getCallManager()->callStateChanged(id, "BUSY"); if (isCurrentCall(id)) { @@ -1586,11 +1590,11 @@ void ManagerImpl::callFailure(const std::string& call_id) } if (isConferenceParticipant(call_id)) { - DEBUG("Manager: Call %s participating in a conference failed", call_id.c_str()); + DEBUG("Call %s participating in a conference failed", call_id.c_str()); Conference *conf = getConferenceFromCallID(call_id); if (conf == NULL) { - ERROR("Manager: Could not retreive conference from call id %s", call_id.c_str()); + ERROR("Could not retreive conference from call id %s", call_id.c_str()); return; } @@ -1622,7 +1626,7 @@ void ManagerImpl::playATone(Tone::TONEID toneId) ost::MutexLock lock(audioLayerMutex_); if (audiodriver_ == NULL) { - ERROR("Manager: Error: Audio layer not initialized"); + ERROR("Audio layer not initialized"); return; } @@ -1696,7 +1700,7 @@ void ManagerImpl::ringtone(const std::string& accountID) Account *account = getAccount(accountID); if (!account) { - WARN("Manager: Warning: invalid account in ringtone"); + WARN("Invalid account in ringtone"); return; } @@ -1719,7 +1723,7 @@ void ManagerImpl::ringtone(const std::string& accountID) ost::MutexLock lock(audioLayerMutex_); if (!audiodriver_) { - ERROR("Manager: Error: no audio layer in ringtone"); + ERROR("no audio layer in ringtone"); return; } @@ -1747,7 +1751,7 @@ void ManagerImpl::ringtone(const std::string& accountID) audiofile_.reset(new RawFile(ringchoice, static_cast<sfl::AudioCodec *>(codec), samplerate)); } } catch (const AudioFileException &e) { - ERROR("Manager: Exception: %s", e.what()); + ERROR("Exception: %s", e.what()); } } // leave mutex @@ -1799,7 +1803,7 @@ std::string ManagerImpl::createConfigFile() const return configdir + DIR_SEPARATOR_STR + PROGNAME + ".yml"; } -std::vector<std::string> ManagerImpl::unserialize(std::string s) +std::vector<std::string> ManagerImpl::split_string(std::string s) { std::vector<std::string> list; std::string temp; @@ -1814,7 +1818,7 @@ std::vector<std::string> ManagerImpl::unserialize(std::string s) return list; } -std::string ManagerImpl::serialize(const std::vector<std::string> &v) +std::string ManagerImpl::join_string(const std::vector<std::string> &v) { std::ostringstream os; std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, "/")); @@ -1975,7 +1979,7 @@ int ManagerImpl::isRingtoneEnabled(const std::string& id) Account *account = getAccount(id); if (!account) { - WARN("Manager: Warning: invalid account in ringtone enabled"); + WARN("Invalid account in ringtone enabled"); return 0; } @@ -1987,7 +1991,7 @@ void ManagerImpl::ringtoneEnabled(const std::string& id) Account *account = getAccount(id); if (!account) { - WARN("Manager: Warning: invalid account in ringtone enabled"); + WARN("Invalid account in ringtone enabled"); return; } @@ -2001,7 +2005,7 @@ std::string ManagerImpl::getRecordPath() const void ManagerImpl::setRecordPath(const std::string& recPath) { - DEBUG("Manager: Set record path %s", recPath.c_str()); + DEBUG("Set record path %s", recPath.c_str()); audioPreference.setRecordpath(recPath); } @@ -2021,11 +2025,11 @@ void ManagerImpl::setRecordingCall(const std::string& id) ConferenceMap::const_iterator it(conferenceMap_.find(id)); if (it == conferenceMap_.end()) { - DEBUG("Manager: Set recording for call %s", id.c_str()); + DEBUG("Set recording for call %s", id.c_str()); std::string accountid(getAccountFromCall(id)); rec = getAccountLink(accountid)->getCall(id); } else { - DEBUG("Manager: Set recording for conference %s", id.c_str()); + DEBUG("Set recording for conference %s", id.c_str()); Conference *conf = it->second; if (conf) { @@ -2038,7 +2042,7 @@ void ManagerImpl::setRecordingCall(const std::string& id) } if (rec == NULL) { - ERROR("Manager: Error: Could not find recordable instance %s", id.c_str()); + ERROR("Could not find recordable instance %s", id.c_str()); return; } @@ -2055,14 +2059,14 @@ bool ManagerImpl::isRecording(const std::string& id) bool ManagerImpl::startRecordedFilePlayback(const std::string& filepath) { - DEBUG("Manager: Start recorded file playback %s", filepath.c_str()); + DEBUG("Start recorded file playback %s", filepath.c_str()); int sampleRate; { ost::MutexLock lock(audioLayerMutex_); if (!audiodriver_) { - ERROR("Manager: Error: No audio layer in start recorded file playback"); + ERROR("No audio layer in start recorded file playback"); return false; } @@ -2080,7 +2084,7 @@ bool ManagerImpl::startRecordedFilePlayback(const std::string& filepath) try { audiofile_.reset(new WaveFile(filepath, sampleRate)); } catch (const AudioFileException &e) { - ERROR("Manager: Exception: %s", e.what()); + ERROR("Exception: %s", e.what()); } } // release toneMutex @@ -2093,7 +2097,7 @@ bool ManagerImpl::startRecordedFilePlayback(const std::string& filepath) void ManagerImpl::stopRecordedFilePlayback(const std::string& filepath) { - DEBUG("Manager: Stop recorded file playback %s", filepath.c_str()); + DEBUG("Stop recorded file playback %s", filepath.c_str()); { ost::MutexLock lock(audioLayerMutex_); @@ -2108,7 +2112,7 @@ void ManagerImpl::stopRecordedFilePlayback(const std::string& filepath) void ManagerImpl::setHistoryLimit(int days) { - DEBUG("Manager: Set history limit"); + DEBUG("Set history limit"); preferences.setHistoryLimit(days); saveConfig(); } @@ -2125,7 +2129,7 @@ int32_t ManagerImpl::getMailNotify() const void ManagerImpl::setMailNotify() { - DEBUG("Manager: Set mail notify"); + DEBUG("Set mail notify"); preferences.getNotifyMails() ? preferences.setNotifyMails(true) : preferences.setNotifyMails(false); saveConfig(); } @@ -2139,7 +2143,7 @@ void ManagerImpl::setAudioManager(const std::string &api) return; if (api == audioPreference.getAudioApi()) { - DEBUG("Manager: Audio manager chosen already in use. No changes made. "); + DEBUG("Audio manager chosen already in use. No changes made. "); return; } } @@ -2162,7 +2166,7 @@ int ManagerImpl::getAudioDeviceIndex(const std::string &name) ost::MutexLock lock(audioLayerMutex_); if (audiodriver_ == NULL) { - ERROR("Manager: Error: Audio layer not initialized"); + ERROR("Audio layer not initialized"); return soundCardIndex; } @@ -2246,7 +2250,7 @@ void ManagerImpl::audioSamplingRateChanged(int samplerate) ost::MutexLock lock(audioLayerMutex_); if (!audiodriver_) { - DEBUG("Manager: No Audio driver initialized"); + DEBUG("No Audio driver initialized"); return; } @@ -2254,10 +2258,10 @@ void ManagerImpl::audioSamplingRateChanged(int samplerate) int currentSamplerate = mainBuffer_.getInternalSamplingRate(); if (currentSamplerate >= samplerate) { - DEBUG("Manager: No need to update audio layer sampling rate"); + DEBUG("No need to update audio layer sampling rate"); return; } else - DEBUG("Manager: Audio sampling rate changed: %d -> %d", currentSamplerate, samplerate); + DEBUG("Audio sampling rate changed: %d -> %d", currentSamplerate, samplerate); bool wasActive = audiodriver_->isStarted(); @@ -2300,7 +2304,7 @@ void ManagerImpl::setConfig(const std::string& section, void ManagerImpl::setAccountsOrder(const std::string& order) { - DEBUG("Manager: Set accounts order : %s", order.c_str()); + DEBUG("Set accounts order : %s", order.c_str()); // Set the new config preferences.setAccountOrder(order); @@ -2322,7 +2326,7 @@ std::vector<std::string> ManagerImpl::getAccountList() const if (ip2ip_iter->second) v.push_back(ip2ip_iter->second->getAccountID()); else - ERROR("Manager: could not find IP2IP profile in getAccount list"); + ERROR("could not find IP2IP profile in getAccount list"); // If no order has been set, load the default one ie according to the creation date. if (account_order.empty()) { @@ -2356,7 +2360,7 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails( static const SIPAccount DEFAULT_ACCOUNT("default"); if (accountID.empty()) { - DEBUG("Manager: Returning default account settings"); + DEBUG("Returning default account settings"); return DEFAULT_ACCOUNT.getAccountDetails(); } @@ -2369,7 +2373,7 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails( if (account) return account->getAccountDetails(); else { - DEBUG("Manager: Get account details on a non-existing accountID %s. Returning default", accountID.c_str()); + DEBUG("Get account details on a non-existing accountID %s. Returning default", accountID.c_str()); return DEFAULT_ACCOUNT.getAccountDetails(); } } @@ -2380,12 +2384,12 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails( void ManagerImpl::setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details) { - DEBUG("Manager: Set account details for %s", accountID.c_str()); + DEBUG("Set account details for %s", accountID.c_str()); Account* account = getAccount(accountID); if (account == NULL) { - ERROR("Manager: Error: Could not find account %s", accountID.c_str()); + ERROR("Could not find account %s", accountID.c_str()); return; } @@ -2403,7 +2407,8 @@ void ManagerImpl::setAccountDetails(const std::string& accountID, dbus_.getConfigurationManager()->accountsChanged(); } -std::string ManagerImpl::addAccount(const std::map<std::string, std::string>& details) +std::string +ManagerImpl::addAccount(const std::map<std::string, std::string>& details) { /** @todo Deal with both the accountMap_ and the Configuration */ std::stringstream accountID; @@ -2414,7 +2419,7 @@ std::string ManagerImpl::addAccount(const std::map<std::string, std::string>& de // Get the type std::string accountType((*details.find(CONFIG_ACCOUNT_TYPE)).second); - DEBUG("Manager: Adding account %s", newAccountID.c_str()); + DEBUG("Adding account %s", newAccountID.c_str()); /** @todo Verify the uniqueness, in case a program adds accounts, two in a row. */ @@ -2449,7 +2454,7 @@ std::string ManagerImpl::addAccount(const std::map<std::string, std::string>& de preferences.setAccountOrder(accountList); } - DEBUG("AccountMap: %s", accountList.c_str()); + DEBUG("Getting accounts: %s", accountList.c_str()); newAccount->registerVoIPLink(); @@ -2480,20 +2485,12 @@ void ManagerImpl::removeAccount(const std::string& accountID) } // ACCOUNT handling -bool ManagerImpl::associateCallToAccount(const std::string& callID, +void ManagerImpl::associateCallToAccount(const std::string& callID, const std::string& accountID) { - std::string useAccountID = accountID; - - if (getAccountFromCall(callID).empty() and accountExists(accountID)) { - // account id exist in AccountMap - ost::MutexLock m(callAccountMapMutex_); - callAccountMap_[callID] = accountID; - DEBUG("Manager: Associate Call %s with Account %s", callID.data(), accountID.data()); - return true; - } - - return false; + ost::MutexLock m(callAccountMapMutex_); + callAccountMap_[callID] = accountID; + DEBUG("Associate Call %s with Account %s", callID.data(), accountID.data()); } std::string ManagerImpl::getAccountFromCall(const std::string& callID) @@ -2544,7 +2541,7 @@ std::string ManagerImpl::getNewCallID() std::vector<std::string> ManagerImpl::loadAccountOrder() const { - return unserialize(preferences.getAccountOrder()); + return split_string(preferences.getAccountOrder()); } void ManagerImpl::loadDefaultAccountMap() @@ -2570,7 +2567,7 @@ namespace { { const Conf::MappingNode *node = dynamic_cast<const Conf::MappingNode *>(item); if (!node) { - ERROR("ManagerImpl: could not load account"); + ERROR("Could not load account"); return; } @@ -2625,7 +2622,7 @@ void ManagerImpl::loadAccountMap(Conf::YamlParser &parser) if (ip2ip != seq->end()) { MappingNode *node = dynamic_cast<MappingNode*>(*ip2ip); if (node) - accountMap_[SIPAccount::IP2IP_PROFILE]->unserialize(node); + accountMap_[SIPAccount::IP2IP_PROFILE]->unserialize(*node); } // Initialize default UDP transport according to @@ -2684,14 +2681,14 @@ ManagerImpl::getAccount(const std::string& accountID) std::string ManagerImpl::getAccountIdFromNameAndServer(const std::string& userName, const std::string& server) const { - DEBUG("Manager : username = %s, server = %s", userName.c_str(), server.c_str()); + DEBUG("username = %s, server = %s", userName.c_str(), server.c_str()); // Try to find the account id from username and server name by full match for (AccountMap::const_iterator iter = accountMap_.begin(); iter != accountMap_.end(); ++iter) { SIPAccount *account = dynamic_cast<SIPAccount *>(iter->second); if (account and account->isEnabled() and account->fullMatch(userName, server)) { - DEBUG("Manager: Matching account id in request is a fullmatch %s@%s", userName.c_str(), server.c_str()); + DEBUG("Matching account id in request is a fullmatch %s@%s", userName.c_str(), server.c_str()); return iter->first; } } @@ -2701,7 +2698,7 @@ std::string ManagerImpl::getAccountIdFromNameAndServer(const std::string& userNa SIPAccount *account = dynamic_cast<SIPAccount *>(iter->second); if (account and account->isEnabled() and account->hostnameMatch(server)) { - DEBUG("Manager: Matching account id in request with hostname %s", server.c_str()); + DEBUG("Matching account id in request with hostname %s", server.c_str()); return iter->first; } } @@ -2711,13 +2708,12 @@ std::string ManagerImpl::getAccountIdFromNameAndServer(const std::string& userNa SIPAccount *account = dynamic_cast<SIPAccount *>(iter->second); if (account and account->isEnabled() and account->userMatch(userName)) { - DEBUG("Manager: Matching account id in request with username %s", userName.c_str()); + DEBUG("Matching account id in request with username %s", userName.c_str()); return iter->first; } } - DEBUG("Manager: Username %s or server %s doesn't match any account, using IP2IP", userName.c_str(), server.c_str()); - + DEBUG("Username %s or server %s doesn't match any account, using IP2IP", userName.c_str(), server.c_str()); return ""; } @@ -2747,13 +2743,13 @@ void ManagerImpl::setAddressbookSettings(const std::map<std::string, int32_t>& s void ManagerImpl::setAddressbookList(const std::vector<std::string>& list) { - addressbookPreference.setList(ManagerImpl::serialize(list)); + addressbookPreference.setList(ManagerImpl::join_string(list)); saveConfig(); } std::vector<std::string> ManagerImpl::getAddressbookList() const { - return unserialize(addressbookPreference.getList()); + return split_string(addressbookPreference.getList()); } void ManagerImpl::setIPToIPForCall(const std::string& callID, bool IPToIP) @@ -2797,8 +2793,9 @@ std::map<std::string, std::string> ManagerImpl::getCallDetails(const std::string call_details["DISPLAY_NAME"] = call->getDisplayName(); call_details["CALL_STATE"] = call->getStateStr(); call_details["CALL_TYPE"] = type.str(); + call_details["CONF_ID"] = call->getConfId(); } else { - ERROR("Manager: Error: getCallDetails()"); + ERROR("Call is NULL"); call_details["ACCOUNTID"] = ""; call_details["PEER_NUMBER"] = "Unknown"; call_details["PEER_NAME"] = "Unknown"; @@ -2861,15 +2858,31 @@ std::vector<std::string> ManagerImpl::getParticipantList(const std::string& conf const ParticipantSet participants(iter_conf->second->getParticipantList()); std::copy(participants.begin(), participants.end(), std::back_inserter(v));; } else - WARN("Manager: Warning: Did not find conference %s", confID.c_str()); + WARN("Did not find conference %s", confID.c_str()); return v; } +std::string ManagerImpl::getConferenceId(const std::string& callID) +{ + std::string account_id = getAccountFromCall(callID); + Call *call = getAccountLink(account_id)->getCall(callID); + if(call == NULL) { + ERROR("Get conference id"); + return ""; + } + + std::string confID = call->getConfId(); + + return confID; +} + void ManagerImpl::saveHistory() { if (!history_.save()) - ERROR("Manager: could not save history!"); + ERROR("Could not save history!"); + else + dbus_.getConfigurationManager()->historyChanged(); } void ManagerImpl::clearHistory() diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 52ff232294..53dbd564c1 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -458,6 +458,8 @@ class ManagerImpl { */ std::vector<std::string> getParticipantList(const std::string& confID) const; + std::string getConferenceId(const std::string& callID); + /** * Save the details of an existing account, given the account ID * This will load the configuration map with the given data. @@ -572,9 +574,9 @@ class ManagerImpl { * Required format: payloads separated with one slash. * @return std::string The serializabled string */ - static std::string serialize(const std::vector<std::string> &v); + static std::string join_string(const std::vector<std::string> &v); - static std::vector<std::string> unserialize(std::string v); + static std::vector<std::string> split_string(std::string v); /** * Ringtone option. @@ -842,6 +844,12 @@ class ManagerImpl { const AudioCodecFactory audioCodecFactory; private: + + /** + * Get the Call referred to by callID. If the Call does not exist, return NULL + */ + Call *getCallFromCallID(const std::string &callID); + /** * Play the dtmf-associated sound * @param code The pressed key @@ -1009,7 +1017,7 @@ class ManagerImpl { * @param accountID the known accountID present in accountMap * @return bool True if the new association is create */ - bool associateCallToAccount(const std::string& callID, const std::string& accountID); + void associateCallToAccount(const std::string& callID, const std::string& accountID); /** * Test if call is a valid call, i.e. have been created and stored in @@ -1071,7 +1079,7 @@ class ManagerImpl { * @param accountID Account ID to get * @return VoIPLink* The voip link from the account pointer or 0 */ - VoIPLink* getAccountLink(const std::string& accountID=""); + VoIPLink* getAccountLink(const std::string& accountID); std::string getAccountIdFromNameAndServer(const std::string& userName, const std::string& server) const; diff --git a/daemon/src/numbercleaner.cpp b/daemon/src/numbercleaner.cpp index eae0394543..c49c2240ed 100644 --- a/daemon/src/numbercleaner.cpp +++ b/daemon/src/numbercleaner.cpp @@ -30,7 +30,6 @@ */ #include "numbercleaner.h" -#include "logger.h" #include <algorithm> namespace { diff --git a/daemon/src/sip/sdes_negotiator.cpp b/daemon/src/sip/sdes_negotiator.cpp index a8eed12a7d..8bf4cc12db 100644 --- a/daemon/src/sip/sdes_negotiator.cpp +++ b/daemon/src/sip/sdes_negotiator.cpp @@ -91,7 +91,6 @@ std::vector<CryptoAttribute *> SdesNegotiator::parse() // Take each line from the vector // and parse its content - std::vector<CryptoAttribute *> cryptoAttributeVector; for (std::vector<std::string>::iterator iter = remoteAttribute_.begin(); @@ -174,8 +173,7 @@ std::vector<CryptoAttribute *> SdesNegotiator::parse() bool SdesNegotiator::negotiate() { - - std::vector<CryptoAttribute *> cryptoAttributeVector = parse(); + std::vector<CryptoAttribute *> cryptoAttributeVector(parse()); std::vector<CryptoAttribute *>::iterator iter_offer = cryptoAttributeVector.begin(); std::vector<CryptoSuiteDefinition>::const_iterator iter_local = localCapabilities_.begin(); @@ -194,7 +192,7 @@ bool SdesNegotiator::negotiate() cryptoSuite_ = (*iter_offer)->getCryptoSuite(); srtpKeyMethod_ = (*iter_offer)->getSrtpKeyMethod(); srtpKeyInfo_ = (*iter_offer)->getSrtpKeyInfo(); - authTagLength_ = cryptoSuite_.substr(cryptoSuite_.size()-2, 2); + authTagLength_ = cryptoSuite_.substr(cryptoSuite_.size() - 2, 2); } ++iter_local; diff --git a/daemon/src/sip/sdes_negotiator.h b/daemon/src/sip/sdes_negotiator.h index 416f940b01..c6d575da1d 100644 --- a/daemon/src/sip/sdes_negotiator.h +++ b/daemon/src/sip/sdes_negotiator.h @@ -62,7 +62,7 @@ enum KeyMethod { }; struct CryptoSuiteDefinition { - char * name; + const char *name; int masterKeyLength; int masterSaltLength; int srtpLifetime; @@ -81,9 +81,9 @@ struct CryptoSuiteDefinition { * as defined in RFC4568 (6.2) */ static const CryptoSuiteDefinition CryptoSuites[] = { - { (char*) "AES_CM_128_HMAC_SHA1_80", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 80, 80, 160, 160 }, - { (char*) "AES_CM_128_HMAC_SHA1_32", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 32, 80, 160, 160 }, - { (char*) "F8_128_HMAC_SHA1_80", 128, 112, 48, 31, AESF8Mode, 128, HMACSHA1, 80, 80, 160, 160 } + { "AES_CM_128_HMAC_SHA1_80", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 80, 80, 160, 160 }, + { "AES_CM_128_HMAC_SHA1_32", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 32, 80, 160, 160 }, + { "F8_128_HMAC_SHA1_80", 128, 112, 48, 31, AESF8Mode, 128, HMACSHA1, 80, 80, 160, 160 } }; diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp index aa474d8c75..ad3d40bb2e 100644 --- a/daemon/src/sip/sdp.cpp +++ b/daemon/src/sip/sdp.cpp @@ -76,6 +76,7 @@ Sdp::Sdp(pj_pool_t *pool) void Sdp::setActiveLocalSdpSession(const pjmedia_sdp_session *sdp) { activeLocalSession_ = (pjmedia_sdp_session*) sdp; + if (activeLocalSession_->media_count < 1) return; @@ -274,6 +275,7 @@ pjmedia_sdp_media *Sdp::setMediaDescriptorLine(bool /*audio*/) } med->attr[ med->attr_count++] = pjmedia_sdp_attr_create(memPool_, "sendrecv", NULL); + if (!zrtpHelloHash_.empty()) addZrtpAttribute(med, zrtpHelloHash_); @@ -719,8 +721,6 @@ void Sdp::setMediaTransportInfoFromRemoteSdp() void Sdp::getRemoteSdpCryptoFromOffer(const pjmedia_sdp_session* remote_sdp, CryptoOffer& crypto_offer) { - CryptoOffer remoteOffer; - for (unsigned i = 0; i < remote_sdp->media_count; ++i) { pjmedia_sdp_media *media = remote_sdp->media[i]; diff --git a/daemon/src/sip/sip_utils.cpp b/daemon/src/sip/sip_utils.cpp index a412c550a3..bdcd57542a 100644 --- a/daemon/src/sip/sip_utils.cpp +++ b/daemon/src/sip/sip_utils.cpp @@ -40,8 +40,6 @@ #include <pjsip/sip_types.h> #include <pjsip/sip_uri.h> #include <pj/list.h> - - #include "sip_utils.h" std::string @@ -80,6 +78,7 @@ sip_utils::createRouteSet(const std::string &route, pj_pool_t *hdr_pool) pjsip_route_hdr *route_set = pjsip_route_hdr_create(hdr_pool); pjsip_route_hdr *routing = pjsip_route_hdr_create(hdr_pool); pjsip_sip_uri *url = pjsip_sip_uri_create(hdr_pool, 0); + url->lr_param = 1; routing->name_addr.uri = (pjsip_uri*) url; pj_strdup2(hdr_pool, &url->host, host.c_str()); url->port = port; diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index 3eaa9a077c..e51dc50a6d 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -42,13 +42,15 @@ #include "manager.h" #include <pwd.h> #include <sstream> +#include <stdlib.h> const char * const SIPAccount::IP2IP_PROFILE = "IP2IP"; const char * const SIPAccount::OVERRTP_STR = "overrtp"; const char * const SIPAccount::SIPINFO_STR = "sipinfo"; namespace { - const int MIN_REGISTRATION_TIME = 600; + const int MIN_REGISTRATION_TIME = 60; + const int DEFAULT_REGISTRATION_TIME = 3600; } SIPAccount::SIPAccount(const std::string& accountID) @@ -96,7 +98,9 @@ SIPAccount::SIPAccount(const std::string& accountID) , zrtpHelloHash_(true) , zrtpNotSuppWarning_(true) , registrationStateDetailed_() + , keepAliveEnabled_(false) , keepAliveTimer_() + , keepAliveTimerActive_(false) , link_(SIPVoIPLink::instance()) , receivedParameter_() , rPort_(-1) @@ -127,6 +131,7 @@ void SIPAccount::serialize(Conf::YamlEmitter &emitter) ScalarNode port(portstr.str()); ScalarNode serviceRoute(serviceRoute_); ScalarNode contactUpdateEnabled(contactUpdateEnabled_); + ScalarNode keepAliveEnabled(keepAliveEnabled_); ScalarNode mailbox(mailBox_); ScalarNode publishAddr(publishedIpAddress_); @@ -141,9 +146,9 @@ void SIPAccount::serialize(Conf::YamlEmitter &emitter) for (vector<string>::const_iterator i = videoCodecList_.begin(); i != videoCodecList_.end(); ++i) DEBUG("%s", i->c_str()); - DEBUG("%s", Manager::instance().serialize(videoCodecList_).c_str()); + DEBUG("%s", Manager::instance().join_string(videoCodecList_).c_str()); - ScalarNode vcodecs(Manager::instance().serialize(videoCodecList_)); + ScalarNode vcodecs(Manager::instance().join_string(videoCodecList_)); #endif ScalarNode ringtonePath(ringtonePath_); @@ -207,6 +212,7 @@ void SIPAccount::serialize(Conf::YamlEmitter &emitter) #endif accountmap.setKeyValue(RINGTONE_PATH_KEY, &ringtonePath); accountmap.setKeyValue(RINGTONE_ENABLED_KEY, &ringtoneEnabled); + accountmap.setKeyValue(KEEP_ALIVE_ENABLED, &keepAliveEnabled); accountmap.setKeyValue(SRTP_KEY, &srtpmap); srtpmap.setKeyValue(SRTP_ENABLE_KEY, &srtpenabled); @@ -251,7 +257,7 @@ void SIPAccount::serialize(Conf::YamlEmitter &emitter) try { emitter.serializeAccount(&accountmap); } catch (const YamlEmitterException &e) { - ERROR("ConfigTree: %s", e.what()); + ERROR("%s", e.what()); } Sequence *seq = credentialseq.getSequence(); @@ -282,7 +288,7 @@ void SIPAccount::unserialize(const Conf::MappingNode &map) map.getValue(VIDEO_CODECS_KEY, &vcodecs); #endif // Update codec list which one is used for SDP offer - setActiveCodecs(ManagerImpl::unserialize(codecStr_)); + setActiveCodecs(ManagerImpl::split_string(codecStr_)); map.getValue(RINGTONE_PATH_KEY, &ringtonePath_); map.getValue(RINGTONE_ENABLED_KEY, &ringtoneEnabled_); @@ -295,6 +301,7 @@ void SIPAccount::unserialize(const Conf::MappingNode &map) map.getValue(PUBLISH_PORT_KEY, &port); publishedPort_ = port; map.getValue(SAME_AS_LOCAL_KEY, &publishedSameasLocal_); + map.getValue(KEEP_ALIVE_ENABLED, &keepAliveEnabled_); std::string dtmfType; map.getValue(DTMF_TYPE_KEY, &dtmfType); @@ -422,7 +429,6 @@ void SIPAccount::setAccountDetails(std::map<std::string, std::string> details) localPort_ = atoi(details[CONFIG_LOCAL_PORT].c_str()); publishedPort_ = atoi(details[CONFIG_PUBLISHED_PORT].c_str()); if (stunServer_ != details[CONFIG_STUN_SERVER]) { - DEBUG("Stun server changed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); link_->sipTransport.destroyStunResolver(stunServer_); // pj_stun_sock_destroy(pj_stun_sock *stun_sock); } @@ -430,8 +436,11 @@ void SIPAccount::setAccountDetails(std::map<std::string, std::string> details) stunEnabled_ = details[CONFIG_STUN_ENABLE] == "true"; dtmfType_ = details[CONFIG_ACCOUNT_DTMF_TYPE]; registrationExpire_ = atoi(details[CONFIG_ACCOUNT_REGISTRATION_EXPIRE].c_str()); + if(registrationExpire_ < MIN_REGISTRATION_TIME) + registrationExpire_ = MIN_REGISTRATION_TIME; userAgent_ = details[CONFIG_ACCOUNT_USERAGENT]; + keepAliveEnabled_ = details[CONFIG_KEEP_ALIVE_ENABLED] == "true"; // srtp settings srtpEnabled_ = details[CONFIG_SRTP_ENABLE] == "true"; @@ -501,9 +510,9 @@ std::map<std::string, std::string> SIPAccount::getAccountDetails() const registrationStateDescription = registrationStateDetailed_.second; } - a[CONFIG_REGISTRATION_STATUS] = isIP2IP() ? "READY": mapStateNumberToString(state); - a[CONFIG_REGISTRATION_STATE_CODE] = registrationStateCode; - a[CONFIG_REGISTRATION_STATE_DESCRIPTION] = registrationStateDescription; + a[CONFIG_ACCOUNT_REGISTRATION_STATUS] = isIP2IP() ? "READY": mapStateNumberToString(state); + a[CONFIG_ACCOUNT_REGISTRATION_STATE_CODE] = registrationStateCode; + a[CONFIG_ACCOUNT_REGISTRATION_STATE_DESC] = registrationStateDescription; // Add sip specific details a[CONFIG_ACCOUNT_ROUTESET] = serviceRoute_; @@ -525,6 +534,7 @@ std::map<std::string, std::string> SIPAccount::getAccountDetails() const a[CONFIG_STUN_ENABLE] = stunEnabled_ ? "true" : "false"; a[CONFIG_STUN_SERVER] = stunServer_; a[CONFIG_ACCOUNT_DTMF_TYPE] = dtmfType_; + a[CONFIG_KEEP_ALIVE_ENABLED] = keepAliveEnabled_ ? "true" : "false"; a[CONFIG_SRTP_KEY_EXCHANGE] = srtpKeyExchange_; a[CONFIG_SRTP_ENABLE] = srtpEnabled_ ? "true" : "false"; @@ -563,7 +573,7 @@ void SIPAccount::registerVoIPLink() // Init TLS settings if the user wants to use TLS if (tlsEnable_ == "true") { - DEBUG("SIPAccount: TLS is enabled for account %s", accountID_.c_str()); + DEBUG("TLS is enabled for account %s", accountID_.c_str()); transportType_ = PJSIP_TRANSPORT_TLS; initTlsConfiguration(); } @@ -584,7 +594,7 @@ void SIPAccount::registerVoIPLink() try { link_->sendRegister(this); } catch (const VoipLinkException &e) { - ERROR("SIPAccount: %s", e.what()); + ERROR("%s", e.what()); } } @@ -596,7 +606,7 @@ void SIPAccount::unregisterVoIPLink() try { link_->sendUnregister(this); } catch (const VoipLinkException &e) { - ERROR("SIPAccount: %s", e.what()); + ERROR("%s", e.what()); } } @@ -605,7 +615,13 @@ void SIPAccount::startKeepAliveTimer() { if (isTlsEnabled()) return; - DEBUG("SIP ACCOUNT: start keep alive timer"); + if (isIP2IP()) + return; + + if(keepAliveTimerActive_) + return; + + DEBUG("Start keep alive timer for account %s", getAccountID().c_str()); // make sure here we have an entirely new timer memset(&keepAliveTimer_, 0, sizeof(pj_timer_entry)); @@ -613,25 +629,31 @@ void SIPAccount::startKeepAliveTimer() { pj_time_val keepAliveDelay_; keepAliveTimer_.cb = &SIPAccount::keepAliveRegistrationCb; keepAliveTimer_.user_data = this; + keepAliveTimer_.id = rand(); // expiration may be undetermined during the first registration request if (registrationExpire_ == 0) { - DEBUG("Registration Expire == 0, take 60"); - keepAliveDelay_.sec = 60; + DEBUG("Registration Expire: 0, taking 60 instead"); + keepAliveDelay_.sec = 3600; } else { - DEBUG("Registration Expire == %d", registrationExpire_); - keepAliveDelay_.sec = registrationExpire_; + DEBUG("Registration Expire: %d", registrationExpire_); + keepAliveDelay_.sec = registrationExpire_ + MIN_REGISTRATION_TIME; } - keepAliveDelay_.msec = 0; + keepAliveTimerActive_ = true; + link_->registerKeepAliveTimer(keepAliveTimer_, keepAliveDelay_); } void SIPAccount::stopKeepAliveTimer() { - link_->cancelKeepAliveTimer(keepAliveTimer_); + DEBUG("Stop keep alive timer %d for account %s", keepAliveTimer_.id, getAccountID().c_str()); + + keepAliveTimerActive_ = false; + + link_->cancelKeepAliveTimer(keepAliveTimer_); } pjsip_ssl_method SIPAccount::sslMethodStringToPjEnum(const std::string& method) @@ -697,7 +719,7 @@ void SIPAccount::initStunConfiguration() void SIPAccount::loadConfig() { if (registrationExpire_ == 0) - registrationExpire_ = MIN_REGISTRATION_TIME; /** Default expire value for registration */ + registrationExpire_ = DEFAULT_REGISTRATION_TIME; /** Default expire value for registration */ if (tlsEnable_ == "true") { initTlsConfiguration(); @@ -814,7 +836,7 @@ void SIPAccount::setContactHeader(std::string address, std::string port) std::string SIPAccount::getContactHeader() const { if (transport_ == NULL) - ERROR("SipAccount: Transport not created yet"); + ERROR("Transport not created yet"); // The transport type must be specified, in our case START_OTHER refers to stun transport pjsip_transport_type_e transportType = transportType_; @@ -857,8 +879,10 @@ void SIPAccount::keepAliveRegistrationCb(UNUSED pj_timer_heap_t *th, pj_timer_en { SIPAccount *sipAccount = static_cast<SIPAccount *>(te->user_data); + ERROR("Keep alive registration callback for account %s", sipAccount->getAccountID().c_str()); + if (sipAccount == NULL) { - ERROR("Sip account is NULL while registering a new keep alive timer"); + ERROR("SIP account is NULL while registering a new keep alive timer"); return; } @@ -870,16 +894,10 @@ void SIPAccount::keepAliveRegistrationCb(UNUSED pj_timer_heap_t *th, pj_timer_en if (sipAccount->isTlsEnabled()) return; - if (sipAccount->isRegistered()) { - // send a new register request - sipAccount->registerVoIPLink(); + sipAccount->stopKeepAliveTimer(); - // make sure the current timer is deactivated - sipAccount->stopKeepAliveTimer(); - - // register a new timer - sipAccount->startKeepAliveTimer(); - } + if (sipAccount->isRegistered()) + sipAccount->registerVoIPLink(); } namespace { @@ -916,7 +934,7 @@ void SIPAccount::setCredentials(const std::vector<std::map<std::string, std::str { // we can not authenticate without credentials if (creds.empty()) { - ERROR("SIPAccount: Cannot authenticate with empty credentials list"); + ERROR("Cannot authenticate with empty credentials list"); return; } diff --git a/daemon/src/sip/sipaccount.h b/daemon/src/sip/sipaccount.h index dd336839de..df258f6fe7 100644 --- a/daemon/src/sip/sipaccount.h +++ b/daemon/src/sip/sipaccount.h @@ -55,6 +55,7 @@ namespace Conf { const char *const DTMF_TYPE_KEY = "dtmfType"; const char *const SERVICE_ROUTE_KEY = "serviceRoute"; const char *const UPDATE_CONTACT_HEADER_KEY = "updateContact"; + const char *const KEEP_ALIVE_ENABLED = "keepAlive"; // TODO: write an object to store credential which implement serializable const char *const SRTP_KEY = "srtp"; @@ -520,6 +521,10 @@ class SIPAccount : public Account { */ static void keepAliveRegistrationCb(pj_timer_heap_t *th, pj_timer_entry *te); + bool isKeepAliveEnabled() const { + return keepAliveEnabled_; + } + /** * Pointer to the transport used by this acccount */ @@ -730,12 +735,22 @@ class SIPAccount : public Account { */ std::pair<int, std::string> registrationStateDetailed_; + /** + * Determine if the keep alive timer will be activated or not + */ + bool keepAliveEnabled_; + /** * Timer used to regularrly send re-register request based * on the "Expire" sip header (or the "expire" Contact parameter) */ pj_timer_entry keepAliveTimer_; + /** + * Once enabled, this variable tells if the keepalive timer is activated + * for this accout + */ + bool keepAliveTimerActive_; /** * Voice over IP Link contains a listener thread and calls diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index 34ebdd5180..e33545637b 100644 --- a/daemon/src/sip/siptransport.cpp +++ b/daemon/src/sip/siptransport.cpp @@ -69,7 +69,7 @@ std::string SipTransport::getSIPLocalIP() if (pj_gethostip(pj_AF_INET(), &ip_addr) == PJ_SUCCESS) return pj_inet_ntoa(ip_addr.ipv4.sin_addr); else { - ERROR("SipTransport: Could not get local IP"); + ERROR("Could not get local IP"); return ""; } } @@ -103,7 +103,7 @@ std::string SipTransport::getInterfaceAddrFromName(const std::string &ifaceName) int fd = socket(AF_INET, SOCK_DGRAM,0); if (fd < 0) { - ERROR("SipTransport: Error: could not open socket: %m"); + ERROR("Error: could not open socket: %m"); return ""; } @@ -146,26 +146,26 @@ stun_sock_on_status_cb(pj_stun_sock * /*stun_sock*/, pj_stun_sock_op op, { switch (op) { case PJ_STUN_SOCK_DNS_OP: - DEBUG("SipTransport: Stun operation dns resolution"); + DEBUG("STUN operation dns resolution"); break; case PJ_STUN_SOCK_BINDING_OP: - DEBUG("SipTransport: Stun operation binding"); + DEBUG("STUN operation binding"); break; case PJ_STUN_SOCK_KEEP_ALIVE_OP: - DEBUG("SipTransport: Stun operation keep alive"); + DEBUG("STUN operation keep alive"); break; case PJ_STUN_SOCK_MAPPED_ADDR_CHANGE: - DEBUG("SipTransport: Stun operation address mapping change"); + DEBUG("STUN operation address mapping change"); break; default: - DEBUG("SipTransport: Stun unknown operation"); + DEBUG("STUN unknown operation"); break; } if (status == PJ_SUCCESS) { - DEBUG("SipTransport: Stun operation success"); + DEBUG("STUN operation success"); } else { - ERROR("SipTransport: Stun operation failure"); + ERROR("STUN operation failure"); } // Always return true so the stun transport registration retry even on failure @@ -186,7 +186,7 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po { std::string stunResolverName(serverName.ptr, serverName.slen); if (stunSocketMap_.find(stunResolverName) != stunSocketMap_.end()) { - DEBUG("SipTransport: %s already added", stunResolverName.c_str()); + DEBUG("%s already added", stunResolverName.c_str()); return PJ_SUCCESS; } @@ -208,8 +208,8 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); - ERROR("SipTransport: Error creating STUN socket for %.*s: %s", - (int) serverName.slen, serverName.ptr, errmsg); + ERROR("Failed to create STUN socket for %.*s: %s", + (int) serverName.slen, serverName.ptr, errmsg); return status; } @@ -217,12 +217,12 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po // store socket inside list if (status == PJ_SUCCESS) { - DEBUG("SipTransport: Adding %s resolver", stunResolverName.c_str()); + DEBUG("Adding %s resolver", stunResolverName.c_str()); stunSocketMap_[stunResolverName] = stun_sock; } else { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); - DEBUG("SipTransport: Error starting STUN socket for %.*s: %s", + DEBUG("Error starting STUN socket for %.*s: %s", (int) serverName.slen, serverName.ptr, errmsg); pj_stun_sock_destroy(stun_sock); } @@ -238,7 +238,7 @@ pj_status_t SipTransport::destroyStunResolver(const std::string &serverName) DEBUG("***************** Destroy Stun Resolver *********************"); if (it != stunSocketMap_.end()) { - DEBUG("SipTransport: Deleting stun resolver %s", it->first.c_str()); + DEBUG("Deleting STUN resolver %s", it->first.c_str()); if (it->second) pj_stun_sock_destroy(it->second); stunSocketMap_.erase(it); @@ -255,7 +255,7 @@ pjsip_tpfactory* SipTransport::createTlsListener(SIPAccount &account) local_addr.sin_port = pj_htons(account.getTlsListenerPort()); if (account.getTlsSetting() == NULL) { - ERROR("SipTransport: Error TLS settings not specified"); + ERROR("Error TLS settings not specified"); return NULL; } @@ -267,7 +267,7 @@ pjsip_tpfactory* SipTransport::createTlsListener(SIPAccount &account) listeningAddress = getInterfaceAddrFromName(interface); if (listeningAddress.empty()) - ERROR("SipTransport: Could not determine ip address for this transport"); + ERROR("Could not determine IP address for this transport"); pj_str_t pjAddress; pj_cstr(&pjAddress, listeningAddress.c_str()); @@ -277,7 +277,7 @@ pjsip_tpfactory* SipTransport::createTlsListener(SIPAccount &account) pjsip_tpfactory *listener = NULL; if (pjsip_tls_transport_start(endpt_, account.getTlsSetting(), &local_addr, NULL, 1, &listener) != PJ_SUCCESS) { - ERROR("SipTransport: Error Failed to start tls listener"); + ERROR("Failed to start tls listener"); listener = NULL; } return listener; @@ -316,12 +316,12 @@ SipTransport::createTlsTransport(SIPAccount &account) if (localTlsListener == NULL) localTlsListener = createTlsListener(account); - DEBUG("SipTransport: Get new tls transport from transport manager"); + DEBUG("Get new tls transport from transport manager"); pjsip_transport *transport = NULL; pjsip_endpt_acquire_transport(endpt_, PJSIP_TRANSPORT_TLS, &rem_addr, sizeof rem_addr, NULL, &transport); if (transport == NULL) - ERROR("SipTransport: Could not create new TLS transport\n"); + ERROR("Could not create new TLS transport\n"); return transport; } @@ -335,7 +335,7 @@ void SipTransport::createSipTransport(SIPAccount &account) } else if (account.isStunEnabled()) { account.transport_ = createStunTransport(account); if (account.transport_ == NULL) { - WARN("SipTransport: falling back to UDP transport"); + WARN("falling back to UDP transport"); account.transport_ = createUdpTransport(account.getLocalInterface(), account.getLocalPort()); } } else { @@ -347,7 +347,7 @@ void SipTransport::createSipTransport(SIPAccount &account) key << account.getLocalInterface(); key << ":"; key << account.getLocalPort(); - DEBUG("SipTransport: Looking into previously created transport map for" + DEBUG("Looking into previously created transport map for" " %s", key.str().c_str()); // Could not create new transport, this transport may already exists pjsip_transport *cachedTransport = transportMap_[key.str()]; @@ -367,7 +367,7 @@ void SipTransport::createSipTransport(SIPAccount &account) void SipTransport::createDefaultSipUdpTransport() { - DEBUG("SipTransport: Create default sip udp transport"); + DEBUG("Create default sip udp transport"); SIPAccount *account = Manager::instance().getIP2IPAccount(); @@ -382,11 +382,11 @@ void SipTransport::createDefaultSipUdpTransport() } if (transport == NULL) { - ERROR("SipTransport: Create UDP transport"); + ERROR("Could not create UDP transport"); return; } - DEBUG("SipTransport: Created default sip transport on %d", port); + DEBUG("Created default sip transport on %d", port); // set transport for this account account->transport_ = transport; @@ -401,7 +401,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port // init socket to bind this transport to pj_uint16_t listeningPort = (pj_uint16_t) port; - DEBUG("SipTransport: Create UDP transport on %s:%d", interface.c_str(), port); + DEBUG("Create UDP transport on %s:%d", interface.c_str(), port); // determine the ip address for this transport std::string listeningAddress; @@ -411,12 +411,12 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port listeningAddress = getInterfaceAddrFromName(interface); if (listeningAddress.empty()) { - ERROR("SipTransport: Could not determine ip address for this transport"); + ERROR("Could not determine ip address for this transport"); return NULL; } if (listeningPort == 0) { - ERROR("SipTransport: Could not determine port for this transport"); + ERROR("Could not determine port for this transport"); return NULL; } @@ -444,7 +444,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port } } - DEBUG("SipTransport: Listening address %s", fullAddressStr.c_str()); + DEBUG("Listening address %s", fullAddressStr.c_str()); // dump debug information to stdout pjsip_tpmgr_dump_transports(pjsip_endpt_get_tpmgr(endpt_)); transportMap_[fullAddressStr] = transport; @@ -459,8 +459,8 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port pj_uint16_t listeningPort = (pj_uint16_t) port; pjsip_transport *transport = NULL; - DEBUG("SipTransport: Update UDP transport on %s:%d with public addr %s:%d", - interface.c_str(), port, publicAddr.c_str(), publicPort); + DEBUG("Update UDP transport on %s:%d with public addr %s:%d", + interface.c_str(), port, publicAddr.c_str(), publicPort); // determine the ip address for this transport std::string listeningAddress; @@ -470,7 +470,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port listeningAddress = getInterfaceAddrFromName(interface); if (listeningAddress.empty()) { - ERROR("SipTransport: Could not determine ip address for this transport"); + ERROR("Could not determine ip address for this transport"); return NULL; } @@ -491,7 +491,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port // status = pjsip_udp_transport_restart(transport, PJSIP_UDP_TRANSPORT_DESTROY_SOCKET, PJ_INVALID_SOCKET, &boundAddr.ipv4, &hostPort); status = pjsip_udp_transport_start(endpt_, &boundAddr.ipv4, &hostPort, 1, &transport); if (status != PJ_SUCCESS) { - ERROR("SipTransport: Could not start new transport with address %s:%d, error code %d", publicAddr.c_str(), publicPort, status); + ERROR("Could not start new transport with address %s:%d, error code %d", publicAddr.c_str(), publicPort, status); } // dump debug information to stdout @@ -503,7 +503,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port pjsip_tpselector *SipTransport::initTransportSelector(pjsip_transport *transport, pj_pool_t *tp_pool) const { if (!transport) { - ERROR("SipTransport: transport is not initialized"); + ERROR("Transport is not initialized"); return NULL; } pjsip_tpselector *tp = (pjsip_tpselector *) pj_pool_zalloc(tp_pool, sizeof(pjsip_tpselector)); @@ -517,9 +517,9 @@ pjsip_transport *SipTransport::createStunTransport(SIPAccount &account) pj_str_t serverName = account.getStunServerName(); pj_uint16_t port = account.getStunPort(); - DEBUG("SipTransport: Create STUN transport server name: %s, port: %d", serverName, port); + DEBUG("Create STUN transport server name: %s, port: %d", serverName, port); if (createStunResolver(serverName, port) != PJ_SUCCESS) { - ERROR("SipTransport: Can't resolve STUN server"); + ERROR("Can't resolve STUN server"); Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } @@ -529,13 +529,13 @@ pjsip_transport *SipTransport::createStunTransport(SIPAccount &account) pj_sockaddr_in boundAddr; if (pj_sockaddr_in_init(&boundAddr, &serverName, 0) != PJ_SUCCESS) { - ERROR("SipTransport: Can't initialize IPv4 socket on %*s:%i", serverName.slen, serverName.ptr, port); + ERROR("Can't initialize IPv4 socket on %*s:%i", serverName.slen, serverName.ptr, port); Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } if (pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &sock) != PJ_SUCCESS) { - ERROR("SipTransport: Can't create or bind socket"); + ERROR("Can't create or bind socket"); Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } @@ -544,7 +544,7 @@ pjsip_transport *SipTransport::createStunTransport(SIPAccount &account) pj_sockaddr_in pub_addr; if (pjstun_get_mapped_addr(&cp_->factory, 1, &sock, &serverName, port, &serverName, port, &pub_addr) != PJ_SUCCESS) { - ERROR("SipTransport: Can't contact STUN server"); + ERROR("Can't contact STUN server"); pj_sock_close(sock); Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; @@ -591,14 +591,14 @@ void SipTransport::findLocalAddressFromTransport(pjsip_transport *transport, pjs // Update address and port with active transport if (!transport) { - ERROR("SipTransport: Transport is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str()); + ERROR("Transport is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str()); return; } // get the transport manager associated with the SIP enpoint pjsip_tpmgr *tpmgr = pjsip_endpt_get_tpmgr(endpt_); if (!tpmgr) { - ERROR("SipTransport: Transport manager is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str()); + ERROR("Transport manager is NULL in findLocalAddress, using local address %s:%s", addr.c_str(), port.c_str()); return; } @@ -607,7 +607,7 @@ void SipTransport::findLocalAddressFromTransport(pjsip_transport *transport, pjs // if (transportType == PJSIP_TRANSPORT_UDP and transport_) pjsip_tpselector *tp_sel = initTransportSelector(transport, pool_); if (!tp_sel) { - ERROR("SipTransport: Could not initialize transport selector, using local address %s:%s", addr.c_str(), port.c_str()); + ERROR("Could not initialize transport selector, using local address %s:%s", addr.c_str(), port.c_str()); return; } diff --git a/daemon/src/video/libav_utils.cpp b/daemon/src/video/libav_utils.cpp index ca03024a6d..f368ce193d 100644 --- a/daemon/src/video/libav_utils.cpp +++ b/daemon/src/video/libav_utils.cpp @@ -54,18 +54,18 @@ namespace { void findInstalledVideoCodecs() { - std::vector<std::string> libav_codecs; + std::vector<std::string> libav_codecs; AVCodec *p = NULL; while ((p = av_codec_next(p))) if (p->type == AVMEDIA_TYPE_VIDEO) libav_codecs.push_back(p->name); - std::map<std::string, std::string>::const_iterator it; + std::map<std::string, std::string>::const_iterator it; for (it = encoders.begin(); it != encoders.end(); ++it) { if (std::find(libav_codecs.begin(), libav_codecs.end(), it->second) != libav_codecs.end()) - video_codecs.push_back(it->first); + video_codecs.push_back(it->first); else - ERROR("Didn't find \"%s\" encoder\n", it->second.c_str()); + ERROR("Didn't find \"%s\" encoder\n", it->second.c_str()); } } diff --git a/daemon/src/video/video_v4l2_list.cpp b/daemon/src/video/video_v4l2_list.cpp index a229f546c6..bdb0d0760b 100644 --- a/daemon/src/video/video_v4l2_list.cpp +++ b/daemon/src/video/video_v4l2_list.cpp @@ -106,7 +106,7 @@ VideoV4l2ListThread::VideoV4l2ListThread() : devices_(), mutex_(), udev_(0), ude try { addDevice(devpath); } catch (const std::runtime_error &e) { - ERROR(e.what()); + ERROR("%s", e.what()); } } } @@ -135,7 +135,7 @@ udev_failed: if (!addDevice(ss.str())) return; } catch (const std::runtime_error &e) { - ERROR(e.what()); + ERROR("%s", e.what()); return; } } @@ -221,7 +221,7 @@ void VideoV4l2ListThread::run() addDevice(node); Manager::instance().getDbusManager()->getVideoControls()->deviceEvent(); } catch (const std::runtime_error &e) { - ERROR(e.what()); + ERROR("%s", e.what()); } } else if (!strcmp(action, "remove")) { DEBUG("udev: removing %s", node); diff --git a/daemon/src/voiplink.cpp b/daemon/src/voiplink.cpp index d46954f14a..0fb2432a64 100644 --- a/daemon/src/voiplink.cpp +++ b/daemon/src/voiplink.cpp @@ -61,7 +61,7 @@ void VoIPLink::removeCall(const std::string& id) { ost::MutexLock m(callMapMutex_); - DEBUG("VoipLink: removing call %s from list", id.c_str()); + DEBUG("Removing call %s from list", id.c_str()); delete callMap_[id]; callMap_.erase(id); diff --git a/daemon/test/Makefile.am b/daemon/test/Makefile.am index 58e13b52da..156aa5bef4 100644 --- a/daemon/test/Makefile.am +++ b/daemon/test/Makefile.am @@ -37,7 +37,9 @@ test_SOURCES = constants.h \ gaincontroltest.h \ gaincontroltest.cpp \ mainbuffertest.h \ - mainbuffertest.cpp + mainbuffertest.cpp \ + resamplertest.h \ + resamplertest.cpp clean-local: rm -rf cppunitresults.xml im:testfile1.txt im:testfile2.txt \ diff --git a/daemon/test/resamplertest.cpp b/daemon/test/resamplertest.cpp new file mode 100644 index 0000000000..810a389ea3 --- /dev/null +++ b/daemon/test/resamplertest.cpp @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Savoir-Faire Linux Inc. + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#include <iostream> +#include <iterator> +#include <algorithm> +#include <math.h> + +#include "resamplertest.h" + +ResamplerTest::ResamplerTest() : + CppUnit::TestCase("Resampler module test"), inputBuffer(), outputBuffer() +{} + +void ResamplerTest::setUp() +{ + +} + +void ResamplerTest::tearDown() +{ + +} + +namespace { + template <typename T> + void print_buffer(T &buffer) + { + std::copy(buffer.begin(), buffer.end(), + std::ostream_iterator<SFLDataFormat>(std::cout, ", ")); + std::cout << std::endl; + } +} + +void ResamplerTest::testUpsamplingRamp() +{ + // generate input samples and store them in inputBuffer + generateRamp(); + + std::cout << "Test Upsampling Ramp" << std::endl; + SamplerateConverter converter(44100); + + performUpsampling(converter); + + LowSmplrBuffer tmpInputBuffer; + HighSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} + +void ResamplerTest::testDownsamplingRamp() +{ + generateRamp(); + + std::cout << "Test Downsampling Ramp" << std::endl; + SamplerateConverter converter(44100); + + performDownsampling(converter); + + HighSmplrBuffer tmpInputBuffer; + LowSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} + +void ResamplerTest::testUpsamplingTriangle() +{ + generateTriangularSignal(); + + std::cout << "Test Upsampling Triangle" << std::endl; + SamplerateConverter converter(44100); + + performUpsampling(converter); + + LowSmplrBuffer tmpInputBuffer; + HighSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} + +void ResamplerTest::testDownsamplingTriangle() +{ + generateTriangularSignal(); + + std::cout << "Test Downsampling Triangle" << std::endl; + SamplerateConverter converter(44100); + + performDownsampling(converter); + + HighSmplrBuffer tmpInputBuffer; + LowSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} +void ResamplerTest::testUpsamplingSine() +{ + // generate input samples and store them in inputBuffer + generateSineSignal(); + + std::cout << "Test Upsampling Sine" << std::endl; + SamplerateConverter converter(44100); + + performUpsampling(converter); + + LowSmplrBuffer tmpInputBuffer; + HighSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} + +void ResamplerTest::testDownsamplingSine() +{ + // generate input samples and store them in inputBuffer + generateSineSignal(); + + std::cout << "Test Downsampling Sine" << std::endl; + SamplerateConverter converter(44100); + + performDownsampling(converter); + + HighSmplrBuffer tmpInputBuffer; + LowSmplrBuffer tmpOutputBuffer; + + std::copy(inputBuffer.begin(), inputBuffer.begin() + tmpInputBuffer.size(), tmpInputBuffer.begin()); + std::cout << "Input Buffer" << std::endl; + print_buffer(tmpInputBuffer); + + std::copy(outputBuffer.begin(), outputBuffer.begin() + tmpOutputBuffer.size(), tmpOutputBuffer.begin()); + std::cout << "Output Buffer" << std::endl; + print_buffer(tmpOutputBuffer); +} + +void ResamplerTest::generateRamp() +{ + for (size_t i = 0; i < inputBuffer.size(); ++i) + inputBuffer[i] = i; +} + +void ResamplerTest::generateTriangularSignal() +{ + for (size_t i = 0; i < inputBuffer.size(); ++i) + inputBuffer[i] = i * 10; +} + +void ResamplerTest::generateSineSignal() +{ + for (size_t i = 0; i < inputBuffer.size(); ++i) + inputBuffer[i] = (SFLDataFormat) (1000.0 * sin(i)); +} + +void ResamplerTest::performUpsampling(SamplerateConverter &converter) +{ + LowSmplrBuffer tmpInputBuffer; + HighSmplrBuffer tmpOutputBuffer; + + for (size_t i = 0, j = 0; i < (inputBuffer.size() / 2); i += tmpInputBuffer.size(), j += tmpOutputBuffer.size()) { + std::copy(inputBuffer.begin() + i, inputBuffer.begin() + tmpInputBuffer.size() + i, tmpInputBuffer.begin()); + converter.resample(tmpInputBuffer.data(), tmpOutputBuffer.data(), tmpOutputBuffer.size(), 8000, 16000, tmpInputBuffer.size()); + std::copy(tmpOutputBuffer.begin(), tmpOutputBuffer.end(), outputBuffer.begin() + j); + } +} + +void ResamplerTest::performDownsampling(SamplerateConverter &converter) +{ + HighSmplrBuffer tmpInputBuffer; + LowSmplrBuffer tmpOutputBuffer; + + for (size_t i = 0, j = 0; i < inputBuffer.size(); i += tmpInputBuffer.size(), j += tmpOutputBuffer.size()) { + std::copy(inputBuffer.begin() + i, inputBuffer.begin() + tmpInputBuffer.size() + i, tmpInputBuffer.begin()); + converter.resample(tmpInputBuffer.data(), tmpOutputBuffer.data(), tmpOutputBuffer.size(), 16000, 8000, tmpInputBuffer.size()); + std::copy(tmpOutputBuffer.begin(), tmpOutputBuffer.end(), outputBuffer.begin() + j); + } +} diff --git a/daemon/test/resamplertest.h b/daemon/test/resamplertest.h new file mode 100644 index 0000000000..07e95dd93b --- /dev/null +++ b/daemon/test/resamplertest.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2012 Savoir-Faire Linux Inc. + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#ifndef _RESAMPLER_TEST_ +#define _RESAMPLER_TEST_ + +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/TestCaller.h> +#include <cppunit/TestCase.h> +#include <cppunit/TestSuite.h> + +#include <tr1/array> + +#include "audio/samplerateconverter.h" +#include "noncopyable.h" + +#define MAX_BUFFER_LENGTH 40000 +#define TMP_LOWSMPLR_BUFFER_LENGTH 160 +#define TMP_HIGHSMPLR_BUFFER_LENGTH 320 + +typedef std::tr1::array<SFLDataFormat, TMP_LOWSMPLR_BUFFER_LENGTH> LowSmplrBuffer; +typedef std::tr1::array<SFLDataFormat, TMP_HIGHSMPLR_BUFFER_LENGTH> HighSmplrBuffer; + +class ResamplerTest : public CppUnit::TestCase { + + /** + * Use cppunit library macros to add unit test the factory + */ + CPPUNIT_TEST_SUITE(ResamplerTest); + CPPUNIT_TEST(testUpsamplingRamp); + CPPUNIT_TEST(testDownsamplingRamp); + CPPUNIT_TEST(testUpsamplingTriangle); + CPPUNIT_TEST(testDownsamplingTriangle); + CPPUNIT_TEST(testUpsamplingSine); + CPPUNIT_TEST(testDownsamplingSine); + CPPUNIT_TEST_SUITE_END(); + + public: + ResamplerTest(); + + /* + * Code factoring - Common resources can be initialized here. + * This method is called by unitcpp before each test + */ + void setUp(); + + /* + * Code factoring - Common resources can be released here. + * This method is called by unitcpp after each test + */ + void tearDown(); + + /* + * Generate a ramp and upsamples it form 8kHz to 16kHz + */ + void testUpsamplingRamp(); + + /* + * Generate a ramp and downsamples it from 16kHz to 8kHz + */ + void testDownsamplingRamp(); + + /* + * Generate a triangular signal and upsamples it from 8kHz to 16kHz + */ + void testUpsamplingTriangle(); + + /* + * Generate a triangular signal and downsamples it from 16kHz to 8kHz + */ + void testDownsamplingTriangle(); + + /* + * Generate a sine signal and upsamples it from 8kHz to 16kHz + */ + void testUpsamplingSine(); + + /* + * Generate a sine signal and downsamples it from 16kHz to 8kHz + */ + void testDownsamplingSine(); + +private: + NON_COPYABLE(ResamplerTest); + + /* + * Generate a ramp to be stored in inputBuffer + */ + void generateRamp(); + + /* + * Generate a triangular signal to be stored in inputBuffer + */ + void generateTriangularSignal(); + + /* + * Generate a sine signal to be stored in inputBuffer + */ + void generateSineSignal(); + + /* + * Perform upsampling on the whole input buffer + */ + void performUpsampling(SamplerateConverter &converter); + + /* + * Perform downsampling on the whold input buffer + */ + void performDownsampling(SamplerateConverter &converter); + + /** + * Used to store input samples + */ + std::tr1::array<SFLDataFormat, MAX_BUFFER_LENGTH> inputBuffer; + + /** + * Used to receive output samples + */ + std::tr1::array<SFLDataFormat, MAX_BUFFER_LENGTH> outputBuffer; +}; + +/* Register the test module */ +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ResamplerTest, "ResamplerTest"); +CPPUNIT_TEST_SUITE_REGISTRATION(ResamplerTest); + +#endif // _RESAMPLER_TEST_ diff --git a/daemon/test/test_utils.h b/daemon/test/test_utils.h index 4102a28131..0a249c40a0 100644 --- a/daemon/test/test_utils.h +++ b/daemon/test/test_utils.h @@ -31,7 +31,6 @@ #ifndef TEST_UTILS_H_ #define TEST_UTILS_H_ -#define TITLE() DEBUG("-------------------- %s --------------------\n", \ - __PRETTY_FUNCTION__) +#define TITLE() DEBUG("Starting test..."); fflush(stderr) #endif // TEST_UTILS_H_ diff --git a/gnome/INSTALL b/gnome/INSTALL deleted file mode 100644 index 7d1c323bea..0000000000 --- a/gnome/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `<wchar.h>' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/gnome/configure.ac b/gnome/configure.ac index 0b1f2d8230..66ebc318f7 100644 --- a/gnome/configure.ac +++ b/gnome/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([sflphone],[1.0.2],[sflphoneteam@savoirfairelinux.com],[sflphone-client-gnome]) +AC_INIT([sflphone],[1.1.0],[sflphoneteam@savoirfairelinux.com],[sflphone-client-gnome]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE @@ -46,7 +46,7 @@ AM_CONDITIONAL(SFL_VIDEO, test "x$enable_video" != "xno") # check for gtk+-2.0 and if found, check for webkitgtk-1.0. PKG_CHECK_MODULES(GTK, gtk+-3.0, [PKG_CHECK_MODULES(WEBKIT, webkitgtk-3.0)], [PKG_CHECK_MODULES(GTK, gtk+-2.0, - [PKG_CHECK_MODULES(WEBKIT, webkit-1.0)], + [PKG_CHECK_MODULES(WEBKIT, webkit-1.0) && PKG_CHECK_MODULES(GTHREAD, gthread-2.0)], [AC_MSG_ERROR(gtk-2 not found)])]) PKG_CHECK_MODULES(GCONF, gconf-2.0) diff --git a/gnome/src/Makefile.am b/gnome/src/Makefile.am index 444e884f33..49b24a7a27 100644 --- a/gnome/src/Makefile.am +++ b/gnome/src/Makefile.am @@ -41,20 +41,21 @@ sflphone_client_gnome_SOURCES = \ noinst_HEADERS = actions.h sflnotify.h mainwindow.h dialpad.h codeclist.h \ reqaccount.h sflphone_const.h uimanager.h accountlist.h \ - sliders.h statusicon.h callable_obj.h conference_obj.h \ + sliders.h statusicon.h callable_obj.h conference_obj.h \ shortcuts.h eel-gconf-extensions.h logger.h imwindow.h \ - unused.h str_utils.h gtk2_wrappers.h + unused.h str_utils.h gtk2_wrappers.h sflphone_client_gnome_LDADD = $(DBUSGLIB_LIBS) $(LIBNOTIFY_LIBS) \ $(NOTIFY_LIBS) $(SFLPHONEGTK_LIBS) $(X11_LIBS) \ $(GTK_LIBS) $(GLIB_LIBS) $(WEBKIT_LIBS) \ $(LD_LIBS) $(GCONF_LIBS) \ - $(JAVASCRIPT_CORE_GTK_LIBS) + $(JAVASCRIPT_CORE_GTK_LIBS) $(GTHREAD_LIBS) sflphone_client_gnome_CFLAGS = $(DBUSGLIB_CFLAGS) $(LIBNOTIFY_CFLAGS) \ $(NOTIFY_CFLAGS) $(GTK_CFLAGS) $(X11_CFLAGS) \ $(GLIB_CFLAGS) $(WEBKIT_CFLAGS) \ - $(GCONF_CFLAGS) $(JAVASCRIPT_CORE_GTK_CFLAGS) + $(GCONF_CFLAGS) $(JAVASCRIPT_CORE_GTK_CFLAGS) \ + $(GTHREAD_CFLAGS) # add symbolic link install-exec-local: diff --git a/gnome/src/actions.c b/gnome/src/actions.c index bbbddc2398..9f6a082b8f 100644 --- a/gnome/src/actions.c +++ b/gnome/src/actions.c @@ -156,9 +156,6 @@ sflphone_quit() calllist_clean(current_calls_tab); calllist_clean(contacts_tab); calllist_clean(history_tab); - gtk_tree_store_clear(history_tab->store); - gtk_tree_store_clear(current_calls_tab->store); - gtk_tree_store_clear(contacts_tab->store); gtk_main_quit(); } } @@ -182,18 +179,14 @@ sflphone_ringing(callable_obj_t * c) void sflphone_hung_up(callable_obj_t * c) { - DEBUG("SFLphone: Hung up"); + DEBUG("%s", __PRETTY_FUNCTION__); calllist_remove_call(current_calls_tab, c->_callID); - calltree_remove_call(current_calls_tab, c); + calltree_remove_call(current_calls_tab, c->_callID); c->_state = CALL_STATE_DIALING; + call_remove_all_errors(c); update_actions(); - if (c->_confID) { - g_free(c->_confID); - c->_confID = NULL; - } - // test whether the widget contains text, if not remove it if ((im_window_get_nb_tabs() > 1) && c->_im_widget && !(IM_WIDGET(c->_im_widget)->containText)) im_window_remove_tab(c->_im_widget); @@ -220,7 +213,7 @@ void sflphone_fill_account_list(void) account_list_add(acc); /* Fill the actual array of credentials */ dbus_get_credentials(acc); - gchar * status = account_lookup(acc, REGISTRATION_STATUS); + gchar * status = account_lookup(acc, ACCOUNT_REGISTRATION_STATUS); if (g_strcmp0(status, "REGISTERED") == 0) acc->state = ACCOUNT_STATE_REGISTERED; @@ -245,10 +238,10 @@ void sflphone_fill_account_list(void) else acc->state = ACCOUNT_STATE_INVALID; - gchar * code = account_lookup(acc, REGISTRATION_STATE_CODE); + gchar * code = account_lookup(acc, ACCOUNT_REGISTRATION_STATE_CODE); if (code != NULL) acc->protocol_state_code = atoi(code); - acc->protocol_state_description = account_lookup(acc, REGISTRATION_STATE_DESCRIPTION); + acc->protocol_state_description = account_lookup(acc, ACCOUNT_REGISTRATION_STATE_DESC); } g_strfreev(array); @@ -301,7 +294,7 @@ sflphone_hang_up() callable_obj_t * selectedCall = calltab_get_selected_call(current_calls_tab); conference_obj_t * selectedConf = calltab_get_selected_conf(active_calltree_tab); - DEBUG("SFLphone: Hang up"); + DEBUG("%s", __PRETTY_FUNCTION__); if (selectedConf) { im_widget_update_state(IM_WIDGET(selectedConf->_im_widget), FALSE); @@ -313,6 +306,7 @@ sflphone_hang_up() break; case CALL_STATE_RINGING: dbus_hang_up(selectedCall); + call_remove_all_errors(selectedCall); selectedCall->_state = CALL_STATE_DIALING; //selectedCall->_stop = 0; break; @@ -321,6 +315,7 @@ sflphone_hang_up() case CALL_STATE_BUSY: case CALL_STATE_RECORD: dbus_hang_up(selectedCall); + call_remove_all_errors(selectedCall); selectedCall->_state = CALL_STATE_DIALING; time(&selectedCall->_time_stop); @@ -329,15 +324,18 @@ sflphone_hang_up() break; case CALL_STATE_FAILURE: dbus_hang_up(selectedCall); + call_remove_all_errors(selectedCall); selectedCall->_state = CALL_STATE_DIALING; break; case CALL_STATE_INCOMING: dbus_refuse(selectedCall); + call_remove_all_errors(selectedCall); selectedCall->_state = CALL_STATE_DIALING; DEBUG("from sflphone_hang_up : "); break; case CALL_STATE_TRANSFER: dbus_hang_up(selectedCall); + call_remove_all_errors(selectedCall); time(&selectedCall->_time_stop); break; default: @@ -395,7 +393,7 @@ sflphone_pick_up() case CALL_STATE_TRANSFER: dbus_transfer(selectedCall); time(&selectedCall->_time_stop); - calltree_remove_call(current_calls_tab, selectedCall); + calltree_remove_call(current_calls_tab, selectedCall->_callID); calllist_remove_call(current_calls_tab, selectedCall->_callID); break; case CALL_STATE_CURRENT: @@ -433,7 +431,7 @@ sflphone_on_hold() void sflphone_off_hold() { - DEBUG("sflphone_off_hold"); + DEBUG("%s", __PRETTY_FUNCTION__); callable_obj_t * selectedCall = calltab_get_selected_call(current_calls_tab); conference_obj_t * selectedConf = calltab_get_selected_conf(active_calltree_tab); @@ -552,14 +550,14 @@ process_dialing(callable_obj_t *c, guint keyval, gchar *key) dbus_start_tone(FALSE, 0); switch (keyval) { - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: + case GDK_Return: + case GDK_KP_Enter: sflphone_place_call(c); break; - case GDK_KEY_Escape: + case GDK_Escape: sflphone_hang_up(); break; - case GDK_KEY_BackSpace: { + case GDK_BackSpace: { gchar *num = (c->_state == CALL_STATE_TRANSFER) ? c->_trsft_to : c->_peer_number; size_t len = strlen(num); @@ -575,16 +573,17 @@ process_dialing(callable_obj_t *c, guint keyval, gchar *key) break; } - case GDK_KEY_Tab: - case GDK_KEY_Alt_L: - case GDK_KEY_Control_L: - case GDK_KEY_Super_L: - case GDK_KEY_Caps_Lock: + case GDK_Tab: + case GDK_Alt_L: + case GDK_Control_L: + case GDK_Super_L: + case GDK_Caps_Lock: break; default: if (keyval < 127 /* ascii */ || - (keyval >= GDK_KEY_Mode_switch && keyval <= GDK_KEY_KP_9) /* num keypad */) { + (keyval >= GDK_Mode_switch && keyval <= GDK_KP_9) /* num keypad */) { + if (c->_state == CALL_STATE_TRANSFER) { gchar *new_trsft = g_strconcat(c->_trsft_to, key, NULL); g_free(c->_trsft_to); @@ -614,8 +613,12 @@ sflphone_new_call() callable_obj_t *current_selected_call = calltab_get_selected_call(current_calls_tab); - if ((current_selected_call != NULL) && (current_selected_call->_confID == NULL)) - sflphone_on_hold(); + if (current_selected_call != NULL) { + gchar *confID = dbus_get_conference_id(current_selected_call->_callID); + if(g_strcmp0(confID, "") != 0) { + sflphone_on_hold(); + } + } // Play a tone when creating a new call if (calllist_get_size(current_calls_tab) == 0) @@ -640,10 +643,10 @@ sflphone_keypad(guint keyval, gchar * key) if ((active_calltree_tab != current_calls_tab) || (active_calltree_tab == current_calls_tab && !c)) { switch (keyval) { - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - case GDK_KEY_Escape: - case GDK_KEY_BackSpace: + case GDK_Return: + case GDK_KP_Enter: + case GDK_Escape: + case GDK_BackSpace: break; default: calltree_display(current_calls_tab); @@ -659,7 +662,7 @@ sflphone_keypad(guint keyval, gchar * key) case CALL_STATE_CURRENT: switch (keyval) { - case GDK_KEY_Escape: + case GDK_Escape: dbus_hang_up(c); time(&c->_time_stop); calltree_update_call(history_tab, c); @@ -680,7 +683,7 @@ sflphone_keypad(guint keyval, gchar * key) calltree_update_call(history_tab, c); dbus_accept(c); break; - case GDK_KEY_Escape: + case GDK_Escape: dbus_refuse(c); break; } @@ -689,13 +692,14 @@ sflphone_keypad(guint keyval, gchar * key) case CALL_STATE_TRANSFER: switch (keyval) { - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: + case GDK_Return: + case GDK_KP_Enter: dbus_transfer(c); time(&c->_time_stop); - calltree_remove_call(current_calls_tab, c); + calltree_remove_call(current_calls_tab, c->_callID); + update_actions(); break; - case GDK_KEY_Escape: + case GDK_Escape: sflphone_unset_transfer(); break; default: // When a call is on transfer, typing new numbers will add it to c->_peer_number @@ -707,11 +711,11 @@ sflphone_keypad(guint keyval, gchar * key) case CALL_STATE_HOLD: switch (keyval) { - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: + case GDK_Return: + case GDK_KP_Enter: dbus_unhold(c); break; - case GDK_KEY_Escape: + case GDK_Escape: dbus_hang_up(c); break; default: // When a call is on hold, typing new numbers will create a new call @@ -725,7 +729,7 @@ sflphone_keypad(guint keyval, gchar * key) case CALL_STATE_FAILURE: switch (keyval) { - case GDK_KEY_Escape: + case GDK_Escape: dbus_hang_up(c); calltree_update_call(history_tab, c); break; @@ -745,48 +749,57 @@ sflphone_place_call(callable_obj_t * c) { account_t * account = NULL; - DEBUG("Actions: Placing call with %s @ %s and accountid %s", c->_display_name, c->_peer_number, c->_accountID); - - if (c->_state != CALL_STATE_DIALING) + if (c == NULL) { + ERROR("Callable object is NULL while making new call"); return -1; + } + + DEBUG("Placing call from %s to %s using account %s", c->_display_name, c->_peer_number, c->_accountID); - if (!*c->_peer_number) + if (c->_state != CALL_STATE_DIALING) { + ERROR("Call not in state dialing, cannot place call"); return -1; + } - DEBUG("Actions: Get account for this call"); + if (!c->_peer_number || strlen(c->_peer_number) == 0) { + ERROR("No peer number set for this call"); + return -1; + } + // Get the account for this call if (strlen(c->_accountID) != 0) { - DEBUG("Actions: Account %s already set for this call", c->_accountID); + DEBUG("Account %s already set for this call", c->_accountID); account = account_list_get_by_id(c->_accountID); } else { - DEBUG("Actions: No account set for this call, use first of the list"); + DEBUG("No account set for this call, use first of the list"); account = account_list_get_current(); } - if (account == NULL) { - DEBUG("Actions: Unexpected condition: account_t is NULL in %s at %d for accountID %s", __FILE__, __LINE__, c->_accountID); - return -1; + // Make sure the previously found account is registered, take first one registered elsewhere + if (account) { + gpointer status = g_hash_table_lookup(account->properties, "Status"); + if (!utf8_case_equal(status, "REGISTERED")) { + // Place the call with the first registered account + account = account_list_get_by_state(ACCOUNT_STATE_REGISTERED); + } } - gpointer status = g_hash_table_lookup(account->properties, "Status"); - if (utf8_case_equal(status, "REGISTERED")) { - /* The call is made with the current account */ - // free memory for previous account id and get a new one - g_free(c->_accountID); - c->_accountID = g_strdup(account->accountID); - dbus_place_call(c); - } else { - /* Place the call with the first registered account - * and switch the current account. - * If we are here, we can be sure that there is at least one. - */ - account = account_list_get_by_state(ACCOUNT_STATE_REGISTERED); - g_free(c->_accountID); - c->_accountID = g_strdup(account->accountID); - dbus_place_call(c); - notify_current_account(account); + // If there is no account specified or found, fallback on IP2IP call + if(account == NULL) { + DEBUG("Could not find an account for this call, making ip to ip call"); + account = account_list_get_by_id("IP2IP"); + if (account == NULL) { + ERROR("Actions: Could not determine any account for this call"); + return -1; + } } + // free memory for previous account id and use the new one in case it changed + g_free(c->_accountID); + c->_accountID = g_strdup(account->accountID); + dbus_place_call(c); + notify_current_account(account); + c->_history_state = g_strdup(OUTGOING_STRING); return 0; @@ -802,15 +815,10 @@ sflphone_detach_participant(const gchar* callID) else selectedCall = calllist_get_call(current_calls_tab, callID); - DEBUG("Action: Detach participant %s", selectedCall->_callID); - - if (selectedCall->_confID) { - g_free(selectedCall->_confID); - selectedCall->_confID = NULL; - } + DEBUG("Detach participant %s", selectedCall->_callID); im_widget_update_state(IM_WIDGET(selectedCall->_im_widget), TRUE); - calltree_remove_call(current_calls_tab, selectedCall); + calltree_remove_call(current_calls_tab, selectedCall->_callID); calltree_add_call(current_calls_tab, selectedCall, NULL); dbus_detach_participant(selectedCall->_callID); } @@ -818,12 +826,12 @@ sflphone_detach_participant(const gchar* callID) void sflphone_add_participant(const gchar* callID, const gchar* confID) { - DEBUG(">SFLphone: Add participant %s to conference %s", callID, confID); + DEBUG("Add participant %s to conference %s", callID, confID); callable_obj_t *call = calllist_get_call(current_calls_tab, callID); if (call == NULL) { - ERROR("SFLphone: Error: Could not find call"); + ERROR("Could not find call"); return; } @@ -833,7 +841,7 @@ sflphone_add_participant(const gchar* callID, const gchar* confID) void sflphone_add_main_participant(const conference_obj_t * c) { - DEBUG("sflphone add main participant"); + DEBUG("%s", __PRETTY_FUNCTION__); dbus_add_main_participant(c->_confID); } @@ -844,7 +852,7 @@ sflphone_rec_call() conference_obj_t * selectedConf = calltab_get_selected_conf(current_calls_tab); if (selectedCall) { - DEBUG("SFLphone: Set record for selected call"); + DEBUG("Set record for selected call"); dbus_set_record(selectedCall->_callID); switch (selectedCall->_state) { @@ -861,7 +869,7 @@ sflphone_rec_call() calltree_update_call(current_calls_tab, selectedCall); } else if (selectedConf) { - DEBUG("SFLphone: Set record for selected conf"); + DEBUG("Set record for selected conf"); dbus_set_record(selectedConf->_confID); switch (selectedConf->_state) { @@ -882,7 +890,7 @@ sflphone_rec_call() break; } - DEBUG("Actions: Remove and add conference %s", selectedConf->_confID); + DEBUG("Remove and add conference %s", selectedConf->_confID); calltree_remove_conference(current_calls_tab, selectedConf); calltree_add_conference_to_current_calls(selectedConf); } @@ -893,7 +901,7 @@ sflphone_rec_call() void sflphone_mute_call() { - DEBUG("Actions: Mute call"); + DEBUG("%s", __PRETTY_FUNCTION__); toggle_slider_mute_microphone(); } @@ -970,21 +978,25 @@ void sflphone_fill_codec_list_per_account(account_t *account) #endif } - -void sflphone_fill_call_list (void) +void sflphone_fill_call_list(void) { - gchar **list = dbus_get_call_list(); - - for (gchar **calls = list; calls && *calls; ++calls) { - gchar *callID = *calls; - callable_obj_t *c = create_new_call_from_details(*calls, dbus_get_call_details(*calls)); - g_free(callID); - c->_zrtp_confirmed = FALSE; - calllist_add_call(current_calls_tab, c); - calltree_add_call(current_calls_tab, c, NULL); + gchar **call_list = dbus_get_call_list(); + + for (gchar **callp = call_list; callp && *callp; ++callp) { + gchar *callID = *callp; + if (!calllist_get_call(current_calls_tab, callID)) { + callable_obj_t *call = create_new_call_from_details(*callp, dbus_get_call_details(*callp)); + call->_zrtp_confirmed = FALSE; + calllist_add_call(current_calls_tab, call); + + // add in treeview only if does not participate to a conference + gchar *confID = dbus_get_conference_id(call->_callID); + if(g_strcmp0(confID, "") == 0) + calltree_add_call(current_calls_tab, call, NULL); + } } - g_strfreev(list); + g_strfreev(call_list); } @@ -1022,12 +1034,9 @@ static void fill_treeview_with_calls(void) guint n = calllist_get_size(history_tab); for (guint i = 0; i < n; ++i) { - QueueElement *element = calllist_get_nth(history_tab, i); - - if (element->type == HIST_CALL) - calltree_add_history_entry(element->elem.call); - else - WARN("Ignoring conference from history"); + callable_obj_t *call = calllist_get_nth(history_tab, i); + if (call) + calltree_add_history_entry(call); } } @@ -1098,7 +1107,7 @@ sflphone_request_go_clear(void) void sflphone_call_state_changed(callable_obj_t * c, const gchar * description, const guint code) { - DEBUG("SFLPhone: Call State changed %s", description); + DEBUG("Call State changed %s", description); if (c == NULL) { ERROR("SFLphone: Error: callable obj is NULL in %s at %d", __FILE__, __LINE__); diff --git a/gnome/src/callable_obj.c b/gnome/src/callable_obj.c index 61a009ab6a..940ec524cc 100644 --- a/gnome/src/callable_obj.c +++ b/gnome/src/callable_obj.c @@ -40,10 +40,10 @@ #include <glib/gi18n.h> #include "contacts/calltab.h" #include "contacts/calltree.h" +#include "logger.h" #include "dbus.h" #include <unistd.h> - gint get_state_callstruct(gconstpointer a, gconstpointer b) { callable_obj_t * c = (callable_obj_t*) a; @@ -110,6 +110,21 @@ out: return ret; } +void call_add_error(callable_obj_t * call, gpointer dialog) +{ + g_ptr_array_add(call->_error_dialogs, dialog); +} + +void call_remove_error(callable_obj_t * call, gpointer dialog) +{ + g_ptr_array_remove(call->_error_dialogs, dialog); +} + +void call_remove_all_errors(callable_obj_t * call) +{ + g_ptr_array_foreach(call->_error_dialogs, (GFunc) gtk_widget_destroy, NULL); +} + callable_obj_t *create_new_call(callable_type_t type, call_state_t state, const gchar* const callID, const gchar* const accountID, @@ -118,6 +133,7 @@ callable_obj_t *create_new_call(callable_type_t type, call_state_t state, { callable_obj_t *obj = g_new0(callable_obj_t, 1); + obj->_error_dialogs = g_ptr_array_new(); obj->_type = type; obj->_state = state; obj->_callID = *callID ? g_strdup(callID) : g_strdup_printf("%d", rand()); @@ -192,8 +208,7 @@ callable_obj_t *create_history_entry_from_hashtable(GHashTable *entry) value = g_hash_table_lookup(entry, TIMESTAMP_STOP_KEY); new_call->_time_stop = value ? atoi(value) : 0; new_call->_recordfile = g_strdup(g_hash_table_lookup(entry, RECORDING_PATH_KEY)); - new_call->_confID = g_strdup(g_hash_table_lookup(entry, CONFID_KEY)); - new_call->_historyConfID = g_strdup(new_call->_confID); + new_call->_historyConfID = g_strdup(g_hash_table_lookup(entry, CONFID_KEY)); new_call->_record_is_playing = FALSE; return new_call; @@ -202,7 +217,6 @@ callable_obj_t *create_history_entry_from_hashtable(GHashTable *entry) void free_callable_obj_t (callable_obj_t *c) { g_free(c->_callID); - g_free(c->_confID); g_free(c->_historyConfID); g_free(c->_accountID); g_free(c->_srtp_cipher); @@ -302,3 +316,22 @@ gboolean call_was_outgoing(callable_obj_t * obj) { return g_strcmp0(obj->_history_state, OUTGOING_STRING) == 0; } + +void restore_call(const gchar *id) +{ + DEBUG("Restoring call %s", id); + // We fetch the details associated to the specified call + GHashTable *call_details = dbus_get_call_details(id); + if (!call_details) { + ERROR("Invalid call ID"); + return; + } + callable_obj_t *new_call = create_new_call_from_details(id, call_details); + + if (utf8_case_equal(g_hash_table_lookup(call_details, "CALL_TYPE"), INCOMING_STRING)) + new_call->_history_state = g_strdup(INCOMING_STRING); + else + new_call->_history_state = g_strdup(OUTGOING_STRING); + + calllist_add_call(current_calls_tab, new_call); +} diff --git a/gnome/src/callable_obj.h b/gnome/src/callable_obj.h index c20f026a68..05280616fe 100644 --- a/gnome/src/callable_obj.h +++ b/gnome/src/callable_obj.h @@ -96,8 +96,7 @@ typedef struct { int _state_code; // The numeric state code as defined in SIP or IAX gchar* _state_code_description; // A textual description of _state_code gchar* _callID; // The call ID - gchar* _confID; // The conference ID (NULL if don't participate to a conference) - gchar* _historyConfID; // Persistent conf id to be stored in history + gchar* _historyConfID; // Persistent conf id to be stored in history gchar* _accountID; // The account the call is made with time_t _time_start; // The timestamp the call was initiating time_t _time_stop; // The timestamp the call was over @@ -130,6 +129,14 @@ typedef struct { */ GdkPixbuf *_contact_thumbnail; + /** + * Maintains a list of error dialogs + * associated with that call so that + * they could be destroyed at the right + * moment. + */ + GPtrArray * _error_dialogs; + /** * The recording file for this call, if NULL, no recording available * Should be used only for history items @@ -198,4 +205,6 @@ gchar* call_get_audio_codec (callable_obj_t *obj); gchar* call_get_video_codec (callable_obj_t *obj); gboolean call_was_outgoing(callable_obj_t * obj); +void restore_call(const gchar *id); + #endif diff --git a/gnome/src/conference_obj.c b/gnome/src/conference_obj.c index 84ecb0348f..91e4c6d41a 100644 --- a/gnome/src/conference_obj.c +++ b/gnome/src/conference_obj.c @@ -38,23 +38,19 @@ #include "calltab.h" #include "calllist.h" -conference_obj_t *create_new_conference(conference_state_t state, const gchar* const confID) +conference_obj_t * +create_new_conference(conference_state_t state, const gchar* const confID) { if (confID == NULL) { - ERROR("Conference: Error: Conference ID is NULL while creating new conference"); + ERROR("Conference ID is NULL while creating new conference"); return NULL; } - DEBUG("Conference: Create new conference %s", confID); + DEBUG("Create new conference %s", confID); // Allocate memory conference_obj_t *new_conf = g_new0(conference_obj_t, 1); - if (!new_conf) { - ERROR("Conference: Error: Could not allocate data "); - return NULL; - } - // Set state field new_conf->_state = state; @@ -114,7 +110,7 @@ void conference_add_participant_number(const gchar *call_id, conference_obj_t *c callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); if (!call) { - ERROR("Conference: Error: Could not find %s", call_id); + ERROR("Could not find %s", call_id); return; } @@ -124,7 +120,7 @@ void conference_add_participant_number(const gchar *call_id, conference_obj_t *c void conference_add_participant(const gchar* call_id, conference_obj_t* conf) { - DEBUG("Conference: Conference %s, adding participant %s", conf->_confID, call_id); + DEBUG("Conference %s, adding participant %s", conf->_confID, call_id); // store the new participant list after appending participant id conf->participant_list = g_slist_append(conf->participant_list, (gpointer) g_strdup(call_id)); @@ -142,23 +138,11 @@ void conference_remove_participant(const gchar* call_id, conference_obj_t* conf) void conference_participant_list_update(gchar** participants, conference_obj_t* conf) { - DEBUG("Conference: Participant list update"); - if (!conf) { - ERROR("Conference: Error: Conference is NULL"); + ERROR("Conference is NULL"); return; } - for (gchar **part = participants; part && *part; ++part) { - gchar *call_id = (gchar *) (*part); - callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); - - if (call->_confID != NULL) { - g_free(call->_confID); - call->_confID = NULL; - } - } - if (conf->participant_list) { g_slist_free(conf->participant_list); conf->participant_list = NULL; @@ -167,7 +151,10 @@ void conference_participant_list_update(gchar** participants, conference_obj_t* for (gchar **part = participants; part && *part; ++part) { gchar *call_id = (gchar *) (*part); callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); - call->_confID = g_strdup(conf->_confID); + if (!call) { + restore_call(call_id); + call = calllist_get_call(current_calls_tab, call_id); + } conference_add_participant(call_id, conf); } } diff --git a/gnome/src/config/accountconfigdialog.c b/gnome/src/config/accountconfigdialog.c index 838adb5c88..c43b3eba21 100644 --- a/gnome/src/config/accountconfigdialog.c +++ b/gnome/src/config/accountconfigdialog.c @@ -262,7 +262,7 @@ static GtkWidget* create_basic_tab(const account_t *account) else if (account_is_IAX(account)) gtk_combo_box_set_active(GTK_COMBO_BOX(protocol_combo), 1); else { - DEBUG("Config: Error: Account protocol not valid"); + ERROR("Account protocol not valid"); /* Should never come here, add debug message. */ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(protocol_combo), _("Unknown")); gtk_combo_box_set_active(GTK_COMBO_BOX(protocol_combo), 2); @@ -435,7 +435,7 @@ cell_edited_cb(GtkCellRendererText *renderer, gchar *path_desc, gchar *text, GtkTreePath *path = gtk_tree_path_new_from_string(path_desc); gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(renderer), "column")); - DEBUG("path desc in cell_edited_cb: %s\n", text); + DEBUG("path desc: %s\n", text); if ((utf8_case_equal(path_desc, "0")) && !utf8_case_equal(text, gtk_entry_get_text(GTK_ENTRY(entry_username)))) @@ -453,8 +453,7 @@ static void editing_started_cb(GtkCellRenderer *cell UNUSED, GtkCellEditable * editable, const gchar * path, gpointer data UNUSED) { - DEBUG("Editing started"); - DEBUG("path desc in editing_started_cb: %s\n", path); + DEBUG("path desc: %s\n", path); // If we are dealing the first row if (utf8_case_equal(path, "0")) @@ -538,6 +537,7 @@ static void use_sip_tls_cb(GtkWidget *widget, gpointer data) static gchar * get_interface_addr_from_name(const gchar * const iface_name) { + g_assert(iface_name); #define UC(b) (((int)b)&0xff) int fd; @@ -572,6 +572,10 @@ static void local_interface_changed_cb(GtkWidget * widget UNUSED, gpointer data { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(same_as_local_radio_button))) { gchar *local_iface_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(local_address_combo)); + if (!local_iface_name) { + ERROR("Could not get local interface name"); + return; + } gchar *local_iface_addr = get_interface_addr_from_name(local_iface_name); gtk_entry_set_text(GTK_ENTRY(local_address_entry), local_iface_addr); @@ -584,13 +588,13 @@ static void local_interface_changed_cb(GtkWidget * widget UNUSED, gpointer data static void set_published_addr_manually_cb(GtkWidget * widget, gpointer data UNUSED) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { - DEBUG("Config: Showing manual publishing options"); + DEBUG("Showing manual publishing options"); gtk_widget_show(published_port_label); gtk_widget_show(published_port_spin_box); gtk_widget_show(published_address_label); gtk_widget_show(published_address_entry); } else { - DEBUG("Config: Hiding manual publishing options"); + DEBUG("Hiding manual publishing options"); gtk_widget_hide(published_port_label); gtk_widget_hide(published_port_spin_box); gtk_widget_hide(published_address_label); @@ -605,7 +609,7 @@ static void use_stun_cb(GtkWidget *widget, gpointer data UNUSED) return; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { - DEBUG("Config: Showing stun options, hiding Local/Published info"); + DEBUG("Showing stun options, hiding Local/Published info"); gtk_widget_show(stun_server_label); gtk_widget_show(stun_server_entry); gtk_widget_set_sensitive(stun_server_entry, TRUE); @@ -617,7 +621,7 @@ static void use_stun_cb(GtkWidget *widget, gpointer data UNUSED) gtk_widget_hide(published_address_entry); gtk_widget_hide(published_port_spin_box); } else { - DEBUG("Config: disabling stun options, showing Local/Published info"); + DEBUG("disabling stun options, showing Local/Published info"); gtk_widget_set_sensitive(stun_server_entry, FALSE); gtk_widget_set_sensitive(same_as_local_radio_button, TRUE); gtk_widget_set_sensitive(published_addr_radio_button, TRUE); @@ -893,6 +897,10 @@ create_network(const account_t *account) // Fill the text entry with the ip address of local interface selected local_address_entry = gtk_entry_new(); gchar *local_iface_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(local_address_combo)); + if (!local_iface_name) { + ERROR("Could not get local interface name"); + return frame; + } gchar *local_iface_addr = get_interface_addr_from_name(local_iface_name); g_free(local_iface_name); gtk_entry_set_text(GTK_ENTRY(local_address_entry), local_iface_addr); @@ -995,7 +1003,6 @@ GtkWidget* create_published_address(const account_t *account) // This will trigger a signal, and the above two // widgets need to be instanciated before that. g_signal_connect(local_address_combo, "changed", G_CALLBACK(local_interface_changed_cb), local_address_combo); - g_signal_connect(same_as_local_radio_button, "toggled", G_CALLBACK(same_as_local_cb), same_as_local_radio_button); g_signal_connect(published_addr_radio_button, "toggled", G_CALLBACK(set_published_addr_manually_cb), published_addr_radio_button); @@ -1007,7 +1014,7 @@ GtkWidget* create_published_address(const account_t *account) GtkWidget* create_advanced_tab(const account_t *account) { // Build the advanced tab, to appear on the account configuration panel - DEBUG("Config: Build advanced tab"); + DEBUG("Build advanced tab"); GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); @@ -1212,10 +1219,10 @@ static void update_account_from_basic_tab(account_t *account) } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(overrtp))) { - DEBUG("Config: Set dtmf over rtp"); + DEBUG("Set dtmf over rtp"); account_replace(account, ACCOUNT_DTMF_TYPE, OVERRTP); } else { - DEBUG("Config: Set dtmf over sip"); + DEBUG("Set dtmf over sip"); account_replace(account, ACCOUNT_DTMF_TYPE, SIPINFO); } diff --git a/gnome/src/config/accountlistconfigdialog.c b/gnome/src/config/accountlistconfigdialog.c index 6a8b47f0bf..28aa48cb2a 100644 --- a/gnome/src/config/accountlistconfigdialog.c +++ b/gnome/src/config/accountlistconfigdialog.c @@ -147,7 +147,7 @@ static void account_store_add(GtkTreeIter *iter, account_t *account) { const gchar *enabled = account_lookup(account, ACCOUNT_ENABLED); const gchar *type = account_lookup(account, ACCOUNT_TYPE); - DEBUG("Config: Adding account: Account is enabled :%s", enabled); + DEBUG("Account is enabled :%s", enabled); const gchar *state_name = account_state_name(account->state); gtk_list_store_set(account_store, iter, @@ -158,8 +158,6 @@ static void account_store_add(GtkTreeIter *iter, account_t *account) COLUMN_ACCOUNT_ID, account->accountID, -1); } - - /** * Fills the treelist with accounts, should be called whenever the account * list is modified. diff --git a/gnome/src/config/addressbook-config.c b/gnome/src/config/addressbook-config.c index 1832d38e81..14476e0330 100644 --- a/gnome/src/config/addressbook-config.c +++ b/gnome/src/config/addressbook-config.c @@ -219,7 +219,7 @@ addressbook_config_book_active_toggled( treePath = gtk_tree_path_new_from_string(path); if (!(model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)))) { - DEBUG("Addressbook: No valid model (%s:%d)", __FILE__, __LINE__); + DEBUG("No valid model (%s:%d)", __FILE__, __LINE__); return; } @@ -241,7 +241,8 @@ addressbook_config_book_active_toggled( book_data = addrbook->get_book_data_by_uid(uid); if (book_data == NULL) { - ERROR("Addressbook: Error: Could not find addressbook %s", uid); + ERROR("Could not find addressbook %s", uid); + return; } book_data->active = active; @@ -299,12 +300,12 @@ addressbook_config_fill_book_list() GSList *books_data = addrbook->get_books_data(book_list); if (!books_data) { - DEBUG("Addressbook: No valid books data (%s:%d)", __FILE__, __LINE__); + DEBUG("No valid books data (%s:%d)", __FILE__, __LINE__); } // Get model of view and clear it if (!(store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(book_tree_view))))) { - DEBUG("Addressbook: Could not find model from treeview (%s:%d)", __FILE__, __LINE__); + DEBUG("Could not find model from treeview (%s:%d)", __FILE__, __LINE__); return; } diff --git a/gnome/src/config/assistant.c b/gnome/src/config/assistant.c index beeda0b8ad..d25e882bd6 100644 --- a/gnome/src/config/assistant.c +++ b/gnome/src/config/assistant.c @@ -41,26 +41,26 @@ struct _wizard *wiz; static int account_type; -static int use_sflphone_org = 1; +static gboolean use_sflphone_org = TRUE; static account_t* current; static char message[1024]; /** * Forward function */ -static gint forward_page_func(gint current_page , gpointer data); +static gint forward_page_func(gint current_page, gpointer data); /** * Page template */ static GtkWidget* create_vbox(GtkAssistantPageType type, const gchar *title, const gchar *section); -void prefill_sip(void) ; +void prefill_sip(void); -void set_account_type(GtkWidget* widget , gpointer data UNUSED) +void set_account_type(GtkWidget* widget, gpointer data UNUSED) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) account_type = _SIP; else - account_type = _IAX ; + account_type = _IAX; } static void show_password_cb(GtkWidget *widget UNUSED, gpointer data) @@ -101,13 +101,11 @@ void getMessageSummary(const gchar * alias, const gchar * server, const gchar * strcat(message, _("None")); } -void set_sflphone_org(GtkWidget* widget , gpointer data UNUSED) +void set_sflphone_org(GtkWidget* widget, gpointer data UNUSED) { - use_sflphone_org = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ?1:0) ; + use_sflphone_org = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } - - /** * Callback when the close button of the dialog is clicked * Action : close the assistant widget and get back to sflphone main window @@ -220,10 +218,10 @@ void enable_stun(GtkWidget* widget) void build_wizard(void) { - use_sflphone_org = 1; + use_sflphone_org = TRUE; if (wiz) - return ; + return; wiz = (struct _wizard*) g_malloc(sizeof(struct _wizard)); current = create_default_account(); @@ -237,7 +235,7 @@ void build_wizard(void) gtk_window_set_title(GTK_WINDOW(wiz->assistant), _("SFLphone account creation wizard")); gtk_window_set_position(GTK_WINDOW(wiz->assistant), GTK_WIN_POS_CENTER); - gtk_window_set_default_size(GTK_WINDOW(wiz->assistant), 200 , 200); + gtk_window_set_default_size(GTK_WINDOW(wiz->assistant), 200, 200); build_intro(); build_sfl_or_account(); @@ -248,22 +246,20 @@ void build_wizard(void) build_email_configuration(); build_summary(); - g_signal_connect(G_OBJECT(wiz->assistant), "close" , G_CALLBACK(close_callback), NULL); + g_signal_connect(G_OBJECT(wiz->assistant), "close", G_CALLBACK(close_callback), NULL); - g_signal_connect(G_OBJECT(wiz->assistant), "cancel" , G_CALLBACK(cancel_callback), NULL); + g_signal_connect(G_OBJECT(wiz->assistant), "cancel", G_CALLBACK(cancel_callback), NULL); gtk_widget_show_all(wiz->assistant); - gtk_assistant_set_forward_page_func(GTK_ASSISTANT(wiz->assistant), (GtkAssistantPageFunc) forward_page_func , NULL , NULL); + gtk_assistant_set_forward_page_func(GTK_ASSISTANT(wiz->assistant), (GtkAssistantPageFunc) forward_page_func, NULL, NULL); gtk_assistant_update_buttons_state(GTK_ASSISTANT(wiz->assistant)); } GtkWidget* build_intro() { - GtkWidget *label; - - wiz->intro = create_vbox(GTK_ASSISTANT_PAGE_INTRO , "SFLphone GNOME client" , _("Welcome to the Account creation wizard of SFLphone!")); - label = gtk_label_new(_("This installation wizard will help you configure an account.")) ; + wiz->intro = create_vbox(GTK_ASSISTANT_PAGE_INTRO, "SFLphone GNOME client", _("Welcome to the Account creation wizard of SFLphone!")); + GtkWidget *label = gtk_label_new(_("This installation wizard will help you configure an account.")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_widget_set_size_request(GTK_WIDGET(label), 380, -1); @@ -275,17 +271,14 @@ GtkWidget* build_intro() GtkWidget* build_select_account() { - GtkWidget* sip; - GtkWidget* iax; - - wiz->protocols = create_vbox(GTK_ASSISTANT_PAGE_CONTENT , _("VoIP Protocols") , _("Select an account type")); + wiz->protocols = create_vbox(GTK_ASSISTANT_PAGE_CONTENT, _("VoIP Protocols"), _("Select an account type")); - sip = gtk_radio_button_new_with_label(NULL, _("SIP (Session Initiation Protocol)")); - gtk_box_pack_start(GTK_BOX(wiz->protocols) , sip , TRUE, TRUE, 0); - iax = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sip), _("IAX2 (InterAsterix Exchange)")); - gtk_box_pack_start(GTK_BOX(wiz->protocols) , iax , TRUE, TRUE, 0); + GtkWidget *sip = gtk_radio_button_new_with_label(NULL, _("SIP (Session Initiation Protocol)")); + gtk_box_pack_start(GTK_BOX(wiz->protocols), sip, TRUE, TRUE, 0); + GtkWidget *iax = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sip), _("IAX2 (InterAsterix Exchange)")); + gtk_box_pack_start(GTK_BOX(wiz->protocols), iax, TRUE, TRUE, 0); - g_signal_connect(G_OBJECT(sip) , "clicked" , G_CALLBACK(set_account_type) , NULL); + g_signal_connect(G_OBJECT(sip), "clicked", G_CALLBACK(set_account_type), NULL); gtk_assistant_set_page_complete(GTK_ASSISTANT(wiz->assistant), wiz->protocols, TRUE); return wiz->protocols; @@ -294,16 +287,13 @@ GtkWidget* build_select_account() GtkWidget* build_sfl_or_account() { - GtkWidget* sfl; - GtkWidget* cus; + wiz->sflphone_org = create_vbox(GTK_ASSISTANT_PAGE_CONTENT, _("Account"), _("Please select one of the following options")); - wiz->sflphone_org = create_vbox(GTK_ASSISTANT_PAGE_CONTENT , _("Account") , _("Please select one of the following options")); - - sfl = gtk_radio_button_new_with_label(NULL, _("Create a free SIP/IAX2 account on sflphone.org \n(For testing purpose only)")); - gtk_box_pack_start(GTK_BOX(wiz->sflphone_org) , sfl , TRUE, TRUE, 0); - cus = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sfl), _("Register an existing SIP or IAX2 account")); - gtk_box_pack_start(GTK_BOX(wiz->sflphone_org) , cus , TRUE, TRUE, 0); - g_signal_connect(G_OBJECT(sfl) , "clicked" , G_CALLBACK(set_sflphone_org) , NULL); + GtkWidget *sfl = gtk_radio_button_new_with_label(NULL, _("Create a free SIP/IAX2 account on sflphone.org \n(For testing purpose only)")); + gtk_box_pack_start(GTK_BOX(wiz->sflphone_org), sfl, TRUE, TRUE, 0); + GtkWidget *cus = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sfl), _("Register an existing SIP or IAX2 account")); + gtk_box_pack_start(GTK_BOX(wiz->sflphone_org), cus, TRUE, TRUE, 0); + g_signal_connect(G_OBJECT(sfl), "clicked", G_CALLBACK(set_sflphone_org), NULL); return wiz->sflphone_org; } @@ -315,12 +305,12 @@ GtkWidget* build_sip_account_configuration(void) GtkWidget* label; GtkWidget * clearTextCheckbox; - wiz->sip_account = create_vbox(GTK_ASSISTANT_PAGE_CONTENT , _("SIP account settings") , _("Please fill the following information")); + wiz->sip_account = create_vbox(GTK_ASSISTANT_PAGE_CONTENT, _("SIP account settings"), _("Please fill the following information")); // table - table = gtk_table_new(7, 2 , FALSE/* homogeneous */); + table = gtk_table_new(7, 2, FALSE/* homogeneous */); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); - gtk_box_pack_start(GTK_BOX(wiz->sip_account) , table , TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(wiz->sip_account), table, TRUE, TRUE, 0); // alias field label = gtk_label_new_with_mnemonic(_("_Alias")); @@ -374,7 +364,7 @@ GtkWidget* build_sip_account_configuration(void) wiz->zrtp_enable = gtk_check_button_new_with_mnemonic(_("Secure communications with _ZRTP")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wiz->zrtp_enable), FALSE); gtk_table_attach(GTK_TABLE(table), wiz->zrtp_enable, 0, 1, 6, 7, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_set_sensitive(GTK_WIDGET(wiz->zrtp_enable) , TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(wiz->zrtp_enable), TRUE); //gtk_assistant_set_page_complete(GTK_ASSISTANT(wiz->assistant), wiz->sip_account, TRUE); return wiz->sip_account; @@ -385,12 +375,12 @@ GtkWidget* build_email_configuration(void) GtkWidget* label; GtkWidget* table; - wiz->email = create_vbox(GTK_ASSISTANT_PAGE_CONTENT , _("Optional email address") , _("This email address will be used to send your voicemail messages.")); + wiz->email = create_vbox(GTK_ASSISTANT_PAGE_CONTENT, _("Optional email address"), _("This email address will be used to send your voicemail messages.")); - table = gtk_table_new(4, 2 , FALSE/* homogeneous */); + table = gtk_table_new(4, 2, FALSE/* homogeneous */); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); - gtk_box_pack_start(GTK_BOX(wiz->email) , table , TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(wiz->email), table, TRUE, TRUE, 0); // email field label = gtk_label_new_with_mnemonic(_("_Email address")); @@ -404,7 +394,7 @@ GtkWidget* build_email_configuration(void) wiz->zrtp_enable = gtk_check_button_new_with_mnemonic(_("Secure communications with _ZRTP")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wiz->zrtp_enable), FALSE); gtk_table_attach(GTK_TABLE(table), wiz->zrtp_enable, 0, 1, 5, 6, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_set_sensitive(GTK_WIDGET(wiz->zrtp_enable) , TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(wiz->zrtp_enable), TRUE); return wiz->email; } @@ -415,12 +405,12 @@ GtkWidget* build_iax_account_configuration(void) GtkWidget* table; GtkWidget * clearTextCheckbox; - wiz->iax_account = create_vbox(GTK_ASSISTANT_PAGE_CONFIRM , _("IAX2 account settings") , _("Please fill the following information")); + wiz->iax_account = create_vbox(GTK_ASSISTANT_PAGE_CONFIRM, _("IAX2 account settings"), _("Please fill the following information")); - table = gtk_table_new(6, 2 , FALSE/* homogeneous */); + table = gtk_table_new(6, 2, FALSE/* homogeneous */); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); - gtk_box_pack_start(GTK_BOX(wiz->iax_account) , table , TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(wiz->iax_account), table, TRUE, TRUE, 0); // alias field label = gtk_label_new_with_mnemonic(_("_Alias")); @@ -471,7 +461,7 @@ GtkWidget* build_iax_account_configuration(void) current -> state = ACCOUNT_STATE_UNREGISTERED; - g_signal_connect(G_OBJECT(wiz->assistant) , "apply" , G_CALLBACK(iax_apply_callback), NULL); + g_signal_connect(G_OBJECT(wiz->assistant), "apply", G_CALLBACK(iax_apply_callback), NULL); return wiz->iax_account; } @@ -481,20 +471,20 @@ GtkWidget* build_nat_settings(void) GtkWidget* label; GtkWidget* table; - wiz->nat = create_vbox(GTK_ASSISTANT_PAGE_CONFIRM , _("Network Address Translation (NAT)") , _("You should probably enable this if you are behind a firewall.")); + wiz->nat = create_vbox(GTK_ASSISTANT_PAGE_CONFIRM, _("Network Address Translation (NAT)"), _("You should probably enable this if you are behind a firewall.")); // table - table = gtk_table_new(2, 2 , FALSE/* homogeneous */); + table = gtk_table_new(2, 2, FALSE/* homogeneous */); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); - gtk_box_pack_start(GTK_BOX(wiz->nat), table , TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(wiz->nat), table, TRUE, TRUE, 0); // enable wiz->enable = gtk_check_button_new_with_mnemonic(_("E_nable STUN")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wiz->enable), FALSE); gtk_table_attach(GTK_TABLE(table), wiz->enable, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_set_sensitive(GTK_WIDGET(wiz->enable) , TRUE); - g_signal_connect(G_OBJECT(GTK_TOGGLE_BUTTON(wiz->enable)) , "toggled" , G_CALLBACK(enable_stun), NULL); + gtk_widget_set_sensitive(GTK_WIDGET(wiz->enable), TRUE); + g_signal_connect(G_OBJECT(GTK_TOGGLE_BUTTON(wiz->enable)), "toggled", G_CALLBACK(enable_stun), NULL); // server address label = gtk_label_new_with_mnemonic(_("_STUN server")); @@ -505,21 +495,20 @@ GtkWidget* build_nat_settings(void) gtk_table_attach(GTK_TABLE(table), wiz->addr, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_set_sensitive(GTK_WIDGET(wiz->addr), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wiz->enable))); - g_signal_connect(G_OBJECT(wiz->assistant) , "apply" , G_CALLBACK(sip_apply_callback), NULL); + g_signal_connect(G_OBJECT(wiz->assistant), "apply", G_CALLBACK(sip_apply_callback), NULL); return wiz->nat; } GtkWidget* build_summary() { - wiz->summary = create_vbox(GTK_ASSISTANT_PAGE_SUMMARY , _("Account Registration") , _("Congratulations!")); + wiz->summary = create_vbox(GTK_ASSISTANT_PAGE_SUMMARY, _("Account Registration"), _("Congratulations!")); strcpy(message,""); - wiz->label_summary = gtk_label_new(message) ; + wiz->label_summary = gtk_label_new(message); gtk_label_set_selectable(GTK_LABEL(wiz->label_summary), TRUE); gtk_misc_set_alignment(GTK_MISC(wiz->label_summary), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(wiz->label_summary), TRUE); - //gtk_widget_set_size_request(GTK_WIDGET(wiz->label_summary), 380, -1); gtk_box_pack_start(GTK_BOX(wiz->summary), wiz->label_summary, FALSE, TRUE, 0); return wiz->summary; @@ -528,9 +517,9 @@ GtkWidget* build_summary() GtkWidget* build_registration_error() { GtkWidget *label; - wiz->reg_failed = create_vbox(GTK_ASSISTANT_PAGE_SUMMARY , "Account Registration" , "Registration error"); + wiz->reg_failed = create_vbox(GTK_ASSISTANT_PAGE_SUMMARY, "Account Registration", "Registration error"); - label = gtk_label_new(" Please correct the information.") ; + label = gtk_label_new(" Please correct the information."); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_widget_set_size_request(GTK_WIDGET(label), 380, -1); @@ -549,7 +538,7 @@ void set_sip_infos_sentivite(gboolean b) void prefill_sip(void) { - if (use_sflphone_org == 1) { + if (use_sflphone_org) { char alias[300]; char *email; email = (char *) gtk_entry_get_text(GTK_ENTRY(wiz->mailbox)); @@ -579,7 +568,7 @@ typedef enum { PAGE_SUMMARY } assistant_state; -static gint forward_page_func(gint current_page , gpointer data UNUSED) +static gint forward_page_func(gint current_page, gpointer data UNUSED) { gint next_page = 0; @@ -589,9 +578,9 @@ static gint forward_page_func(gint current_page , gpointer data UNUSED) break; case PAGE_SFL: - if (use_sflphone_org) { + if (use_sflphone_org) next_page = PAGE_EMAIL; - } else + else next_page = PAGE_TYPE; break; @@ -600,8 +589,9 @@ static gint forward_page_func(gint current_page , gpointer data UNUSED) if (account_type == _SIP) { set_sip_infos_sentivite(TRUE); next_page = PAGE_SIP; - } else + } else { next_page = PAGE_IAX; + } break; case PAGE_SIP: @@ -629,18 +619,13 @@ static gint forward_page_func(gint current_page , gpointer data UNUSED) static GtkWidget* create_vbox(GtkAssistantPageType type, const gchar *title, const gchar *section) { - GtkWidget *vbox; - GtkWidget *label; - gchar *str; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width(GTK_CONTAINER(vbox), 24); gtk_assistant_append_page(GTK_ASSISTANT(wiz->assistant), vbox); gtk_assistant_set_page_type(GTK_ASSISTANT(wiz->assistant), vbox, type); - str = g_strdup_printf(" %s", title); + gchar *str = g_strdup_printf(" %s", title); gtk_assistant_set_page_title(GTK_ASSISTANT(wiz->assistant), vbox, str); - g_free(str); gtk_assistant_set_page_complete(GTK_ASSISTANT(wiz->assistant), vbox, TRUE); @@ -654,7 +639,7 @@ static GtkWidget* create_vbox(GtkAssistantPageType type, const gchar *title, con #endif if (section) { - label = gtk_label_new(NULL); + GtkWidget *label = gtk_label_new(NULL); str = g_strdup_printf("<b>%s</b>\n", section); gtk_label_set_markup(GTK_LABEL(label), str); g_free(str); diff --git a/gnome/src/config/audioconf.c b/gnome/src/config/audioconf.c index da8e18771b..092b7c543f 100644 --- a/gnome/src/config/audioconf.c +++ b/gnome/src/config/audioconf.c @@ -414,6 +414,7 @@ codec_active_toggled(GtkCellRendererToggle *renderer UNUSED, gchar *path, gpoint return; } + // Get active value and name at iteration gboolean active; gchar* name; gchar* srate; diff --git a/gnome/src/contacts/addrbookfactory.c b/gnome/src/contacts/addrbookfactory.c index 3db2562ffc..821adcf280 100644 --- a/gnome/src/contacts/addrbookfactory.c +++ b/gnome/src/contacts/addrbookfactory.c @@ -39,7 +39,6 @@ AddrBookHandle *addrbook = NULL; - /** * Callback called after all book have been processed */ @@ -93,7 +92,7 @@ void abook_init() void *handle = dlopen(PLUGINS_DIR"/libevladdrbook.so", RTLD_LAZY); if (handle == NULL) { - ERROR("Addressbook: Error: Could not load addressbook"); + DEBUG("Did not load addressbook"); return; } @@ -102,7 +101,7 @@ void abook_init() #define LOAD(func) do { \ addrbook-> func = dlsym(handle, "addressbook_" #func); \ if (addrbook-> func == NULL) \ - ERROR("Addressbook: Couldn't load " # func); \ + ERROR("Couldn't load " # func); \ } while(0) diff --git a/gnome/src/contacts/calllist.c b/gnome/src/contacts/calllist.c index 3c00fa83bd..fb54e10cf0 100644 --- a/gnome/src/contacts/calllist.c +++ b/gnome/src/contacts/calllist.c @@ -37,15 +37,19 @@ #include "logger.h" #include "eel-gconf-extensions.h" -static -gint is_callID_callstruct(gconstpointer a, gconstpointer b) +// Must return 0 when a match is found +static gint +is_callID_callstruct(gconstpointer a, gconstpointer b) { - const QueueElement *c = a; + const callable_obj_t *c = a; - if (c == NULL || c->type != HIST_CALL) + // if it's null or not a call it's not the call we're looking for + if (c == NULL) { + ERROR("NULL element in list"); return 1; + } - return utf8_case_cmp(c->elem.call->_callID, (const gchar *) b); + return g_strcmp0(c->_callID, (const gchar *) b); } // TODO : try to do this more generically @@ -86,17 +90,13 @@ void calllist_add_contact(gchar *contact_name, gchar *contact_phone, contact_typ } /* - * Function passed to calllist_clean to free every QueueElement. + * Function passed to calllist_clean to free every callable_obj_t. */ static void calllist_free_element(gpointer data, gpointer user_data UNUSED) { - QueueElement *element = data; - - g_assert(element->type == HIST_CALL); - free_callable_obj_t(element->elem.call); - - g_free(element); + callable_obj_t *call = data; + free_callable_obj_t(call); } void @@ -104,6 +104,7 @@ calllist_clean(calltab_t* tab) { g_queue_foreach(tab->callQueue, calllist_free_element, NULL); g_queue_free(tab->callQueue); + tab->callQueue = 0; } void @@ -116,19 +117,15 @@ calllist_reset(calltab_t* tab) void calllist_add_call(calltab_t* tab, callable_obj_t * c) { - QueueElement *element = g_new0(QueueElement, 1); - element->type = HIST_CALL; - element->elem.call = c; - g_queue_push_tail(tab->callQueue, (gpointer) element); + DEBUG("Adding call with callID %s to tab %s", c->_callID, tab->_name); + g_queue_push_tail(tab->callQueue, c); + DEBUG("Tab %s has %d calls", tab->_name, calllist_get_size(tab)); } void calllist_add_call_to_front(calltab_t* tab, callable_obj_t * c) { - QueueElement *element = g_new0(QueueElement, 1); - element->type = HIST_CALL; - element->elem.call = c; - g_queue_push_head(tab->callQueue, (gpointer) element); + g_queue_push_head(tab->callQueue, c); } void @@ -137,10 +134,9 @@ calllist_clean_history(void) guint size = calllist_get_size(history_tab); for (guint i = 0; i < size; i++) { - QueueElement* c = calllist_get_nth(history_tab, i); - - if (c->type == HIST_CALL) - calltree_remove_call(history_tab, c->elem.call); + callable_obj_t * c = calllist_get_nth(history_tab, i); + if (c) + calltree_remove_call(history_tab, c->_callID); } calllist_reset(history_tab); @@ -150,7 +146,7 @@ void calllist_remove_from_history(callable_obj_t* c) { calllist_remove_call(history_tab, c->_callID); - calltree_remove_call(history_tab, c); + calltree_remove_call(history_tab, c->_callID); } void @@ -161,23 +157,18 @@ calllist_remove_call(calltab_t* tab, const gchar * callID) if (c == NULL) return; - QueueElement *element = (QueueElement *) c->data; + callable_obj_t *call = c->data; - if (element->type != HIST_CALL) { - ERROR("CallList: Error: Element %s is not a call", callID); - return; - } - - g_queue_remove(tab->callQueue, element); + DEBUG("Removing call %s from tab %s", callID, tab->_name); + g_queue_remove(tab->callQueue, call); /* Don't save empty (i.e. started dialing, then deleted) calls */ - if (element->elem.call->_peer_number && strlen(element->elem.call->_peer_number) > 0) { - calllist_add_call(history_tab, element->elem.call); - calltree_add_history_entry(element->elem.call); + if (call->_peer_number && strlen(call->_peer_number) > 0) { + calllist_add_call(history_tab, call); + calltree_add_history_entry(call); } } - callable_obj_t * calllist_get_by_state(calltab_t* tab, call_state_t state) { @@ -191,7 +182,7 @@ calllist_get_size(const calltab_t* tab) return g_queue_get_length(tab->callQueue); } -QueueElement * +callable_obj_t* calllist_get_nth(calltab_t* tab, guint n) { return g_queue_peek_nth(tab->callQueue, n); @@ -203,16 +194,9 @@ calllist_get_call(calltab_t* tab, const gchar * callID) GList * c = g_queue_find_custom(tab->callQueue, callID, is_callID_callstruct); if (c == NULL) { - ERROR("CallList: Error: Could not find call %s", callID); - return NULL; - } - - QueueElement *element = c->data; - - if (element->type != HIST_CALL) { - ERROR("CallList: Error: Element %s is not a call", callID); + ERROR("Could not find call %s in tab %s", callID, tab->_name); return NULL; } - return element->elem.call; + return c->data; } diff --git a/gnome/src/contacts/calllist.h b/gnome/src/contacts/calllist.h index b69814b5e1..1cb3c5d268 100644 --- a/gnome/src/contacts/calllist.h +++ b/gnome/src/contacts/calllist.h @@ -39,18 +39,6 @@ * @brief A list to hold calls. */ -typedef enum { HIST_CALL } ElementType; - -typedef union { - callable_obj_t *call; - conference_obj_t *conf; -} callableElement; - -typedef struct { - ElementType type; - callableElement elem; -} QueueElement; - typedef struct { GtkTreeStore* store; GtkWidget* view; @@ -118,7 +106,7 @@ calllist_get_size(const calltab_t* tab); /** Return the call at the nth position in the list * @param n The position of the call you want * @return A call or NULL */ -QueueElement * +callable_obj_t* calllist_get_nth(calltab_t* tab, guint n); /** Return the call corresponding to the callID diff --git a/gnome/src/contacts/calltab.c b/gnome/src/contacts/calltab.c index af12e64274..e3ef874209 100644 --- a/gnome/src/contacts/calltab.c +++ b/gnome/src/contacts/calltab.c @@ -53,7 +53,7 @@ void calltab_select_call(calltab_t* tab, callable_obj_t * c) { g_assert(tab); - DEBUG("CallTab: Select call %s", c ? c->_callID : ""); + DEBUG("Select call %s", c ? c->_callID : ""); tab->selectedType = A_CALL; tab->selectedCall = c; @@ -65,7 +65,7 @@ void calltab_select_conf(calltab_t *tab, conference_obj_t * c) { g_assert(tab); - DEBUG("CallTab: Selected conf %s", c ? c->_confID : ""); + DEBUG("Selected conf %s", c ? c->_confID : ""); tab->selectedType = A_CONFERENCE; tab->selectedConf = c; @@ -98,9 +98,9 @@ calltab_create_searchbar(calltab_t* tab) { g_assert(tab); - if (utf8_case_equal(tab->_name, HISTORY)) + if (g_strcmp0(tab->_name, HISTORY) == 0) tab->searchbar = history_searchbar_new(); - else if (utf8_case_equal(tab->_name, CONTACTS)) + else if (g_strcmp0(tab->_name, CONTACTS) == 0) tab->searchbar = contacts_searchbar_new(); else ERROR("Current calls tab does not need a searchbar\n"); diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c index c8168e9006..44333ec14d 100644 --- a/gnome/src/contacts/calltree.c +++ b/gnome/src/contacts/calltree.c @@ -35,6 +35,7 @@ #include "str_utils.h" #include <string.h> #include <stdlib.h> +#include <gtk/gtk.h> #include "gtk2_wrappers.h" #include "eel-gconf-extensions.h" @@ -51,47 +52,33 @@ #include "imwindow.h" #include "searchbar.h" +#if !GLIB_CHECK_VERSION(2, 30, 0) +#define G_VALUE_INIT { 0, { { 0 } } } +#endif + +typedef struct { + gchar *source_ID; + gchar *dest_ID; +} PopupData; + +static PopupData *popup_data = NULL; + // Messages used in menu item static const gchar * const SFL_CREATE_CONFERENCE = "Create conference"; static const gchar * const SFL_TRANSFER_CALL = "Transfer call to"; -static GtkWidget *calltree_sw = NULL; -static GtkCellRenderer *calltree_rend = NULL; -static GtkTreeViewColumn *calltree_col = NULL; -static GtkTreeSelection *calltree_sel = NULL; - static GtkWidget *calltree_popupmenu = NULL; static GtkWidget *calltree_menu_items = NULL; -static CallType calltree_dragged_type = A_INVALID; -static CallType calltree_selected_type = A_INVALID; - -static const gchar *calltree_dragged_call_id = NULL; -static const gchar *calltree_selected_call_id = NULL; -static const gchar *calltree_dragged_path = NULL; -static const gchar *calltree_selected_path = NULL; - -static gint calltree_dragged_path_depth = -1; -static gint calltree_selected_path_depth = -1; - -static callable_obj_t *calltree_dragged_call = NULL; -static callable_obj_t *calltree_selected_call = NULL; - -static conference_obj_t *calltree_dragged_conf = NULL; -static conference_obj_t *calltree_selected_conf = NULL; - -static void drag_end_cb(GtkWidget *, GdkDragContext *, gpointer); static void drag_data_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer); -static void drag_history_received_cb(GtkWidget *, GdkDragContext *, gint, gint, GtkSelectionData *, guint, guint, gpointer); -static void menuitem_response(gchar *); - -enum { - COLUMN_ACCOUNT_PIXBUF = 0, - COLUMN_ACCOUNT_DESC, - COLUMN_ACCOUNT_SECURITY_PIXBUF, - COLUMN_ACCOUNT_PTR +static void menuitem_response(gchar * string); + +static GtkTargetEntry target_list[] = { + { "MY_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, 0 } }; +static const guint n_targets = G_N_ELEMENTS(target_list); + /** * Show popup menu */ @@ -103,12 +90,20 @@ popup_menu(GtkWidget *widget, return TRUE; } +/* Returns TRUE if row contains a conference object pointer */ +gboolean +is_conference(GtkTreeModel *model, GtkTreeIter *iter) +{ + gboolean result = FALSE; + gtk_tree_model_get(model, iter, COLUMN_IS_CONFERENCE, &result, -1); + return result; +} + /* Call back when the user click on a call in the list */ static void call_selected_cb(GtkTreeSelection *sel, void* data UNUSED) { - DEBUG("CallTree: Selection callback"); - GtkTreeModel *model = GTK_TREE_MODEL(active_calltree_tab->store); + GtkTreeModel *model = gtk_tree_view_get_model(gtk_tree_selection_get_tree_view(sel)); GtkTreeIter iter; @@ -116,77 +111,44 @@ call_selected_cb(GtkTreeSelection *sel, void* data UNUSED) return; if (active_calltree_tab == history_tab) - DEBUG("CallTree: Current call tree is history"); + DEBUG("Current call tree is history"); else if (active_calltree_tab == current_calls_tab) - DEBUG("CallTree: Current call tree is current calls"); - - // store info for dragndrop - GtkTreePath *path = gtk_tree_model_get_path(model, &iter); - gchar *string_path = gtk_tree_path_to_string(path); - calltree_selected_path_depth = gtk_tree_path_get_depth(path); + DEBUG("Current call tree is current calls"); - if (gtk_tree_model_iter_has_child(model, &iter)) { - DEBUG("CallTree: Selected a conference"); - calltree_selected_type = A_CONFERENCE; + /* Get ID of selected object, may be a call or a conference */ + gchar *id; + gtk_tree_model_get(model, &iter, COLUMN_ID, &id, -1); - GValue val; - val.g_type = 0; - gtk_tree_model_get_value(model, &iter, COLUMN_ACCOUNT_PTR, &val); + if (is_conference(model, &iter)) { + DEBUG("Selected a conference"); - calltree_selected_conf = (conference_obj_t*) g_value_get_pointer(&val); - g_value_unset(&val); + conference_obj_t *calltree_selected_conf = conferencelist_get(active_calltree_tab, id); + g_free(id); - if (calltree_selected_conf) { + if (calltree_selected_conf) calltab_select_conf(active_calltree_tab, calltree_selected_conf); - calltree_selected_call_id = calltree_selected_conf->_confID; - calltree_selected_path = string_path; - calltree_selected_call = NULL; - - if (calltree_selected_conf->_im_widget) - im_window_show_tab(calltree_selected_conf->_im_widget); - - DEBUG("CallTree: selected_path %s, selected_conf_id %s, selected_path_depth %d", - calltree_selected_path, calltree_selected_call_id, calltree_selected_path_depth); - } } else { - DEBUG("CallTree: Selected a call"); - calltree_selected_type = A_CALL; - - GValue val; - val.g_type = 0; - gtk_tree_model_get_value(model, &iter, COLUMN_ACCOUNT_PTR, &val); - - calltree_selected_call = g_value_get_pointer(&val); - g_value_unset(&val); + DEBUG("Selected a call"); - if (calltree_selected_call) { - calltab_select_call(active_calltree_tab, calltree_selected_call); - calltree_selected_call_id = calltree_selected_call->_callID; - calltree_selected_path = string_path; - calltree_selected_conf = NULL; + callable_obj_t *selected_call = calllist_get_call(active_calltree_tab, id); + g_free(id); - if (calltree_selected_call->_im_widget) - im_window_show_tab(calltree_selected_call->_im_widget); - - DEBUG("CallTree: selected_path %s, selected_call_id %s, selected_path_depth %d", - calltree_selected_path, calltree_selected_call_id, calltree_selected_path_depth); - } + if (selected_call) + calltab_select_call(active_calltree_tab, selected_call); } update_actions(); } /* A row is activated when it is double clicked */ -void -row_activated(GtkTreeView *tree_view UNUSED, - GtkTreePath *path UNUSED, - GtkTreeViewColumn *column UNUSED, - void * data UNUSED) +static void +row_activated_cb(GtkTreeView *tree_view UNUSED, + GtkTreePath *path UNUSED, + GtkTreeViewColumn *column UNUSED, + void * data UNUSED) { - DEBUG("CallTree: Double click action"); - if (calltab_get_selected_type(active_calltree_tab) == A_CALL) { - DEBUG("CallTree: Selected a call"); + DEBUG("Selected a call"); callable_obj_t *selectedCall = calltab_get_selected_call(active_calltree_tab); if (selectedCall) { @@ -223,7 +185,7 @@ row_activated(GtkTreeView *tree_view UNUSED, } } } else if (calltab_get_selected_type(active_calltree_tab) == A_CONFERENCE) { - DEBUG("CallTree: Selected a conference"); + DEBUG("Selected a conference"); if (active_calltree_tab == current_calls_tab) { conference_obj_t * selectedConf = calltab_get_selected_conf(current_calls_tab); @@ -246,7 +208,7 @@ row_activated(GtkTreeView *tree_view UNUSED, } } } else - WARN("CallTree: Selected a conference in history, should not be possible"); + WARN("Selected a conference in history, should not be possible"); } } @@ -256,18 +218,15 @@ row_single_click(GtkTreeView *tree_view UNUSED, void * data UNUSED) { gchar * displaySasOnce = NULL; - DEBUG("CallTree: Single click action"); - callable_obj_t *selectedCall = calltab_get_selected_call(active_calltree_tab); conference_obj_t *selectedConf = calltab_get_selected_conf(active_calltree_tab); if (active_calltree_tab == current_calls_tab) - DEBUG("CallTree: Active calltree is current_calls"); + DEBUG("Active calltree is current_calls"); else if (active_calltree_tab == history_tab) - DEBUG("CallTree: Active calltree is history"); + DEBUG("Active calltree is history"); if (calltab_get_selected_type(active_calltree_tab) == A_CALL) { - DEBUG("CallTree: Selected a call"); if (selectedCall) { account_t *account_details = account_list_get_by_id(selectedCall->_accountID); @@ -311,11 +270,10 @@ row_single_click(GtkTreeView *tree_view UNUSED, void * data UNUSED) } } } else if (calltab_get_selected_type(active_calltree_tab) == A_CONFERENCE) { - DEBUG("CallTree: Selected a conference"); if (selectedConf) - DEBUG("CallTree: There is actually a selected conf"); + DEBUG("There is actually a selected conf"); } else - WARN("CallTree: Warning: Unknown selection type"); + WARN("Unknown selection type"); } static gboolean @@ -342,32 +300,36 @@ static gchar *clean_display_number(gchar *name) name += (sizeof(SIP_PREFIX) - 1); else if (g_str_has_prefix(name, SIPS_PREFIX)) name += (sizeof(SIPS_PREFIX) - 1); + + gchar * pos = g_strrstr(name, ">"); + if (pos) + *pos = '\0'; return name; } -#ifdef SFL_VIDEO static gchar * -calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, - const gchar * const audio_codec, const gchar * const video_codec) +calltree_display_call_info(callable_obj_t * call, CallDisplayType display_type, + const gchar *const audio_codec, + const gchar *const video_codec) { - gchar display_number[strlen(c->_peer_number) + 1]; - strcpy(display_number, c->_peer_number); + gchar display_number[strlen(call->_peer_number) + 1]; + strcpy(display_number, call->_peer_number); - if (c->_type != CALL || !call_was_outgoing(c)) { + if (call->_type != CALL || !call_was_outgoing(call)) { // Get the hostname for this call (NULL if not existent) - gchar * hostname = g_strrstr(c->_peer_number, "@"); + gchar * hostname = g_strrstr(call->_peer_number, "@"); // Test if we are dialing a new number - if (*c->_peer_number && hostname) - display_number[hostname - c->_peer_number] = '\0'; + if (*call->_peer_number && hostname) + display_number[hostname - call->_peer_number] = '\0'; } - char *codec; // Different display depending on type - gchar *name, *details = NULL; + gchar *name = NULL; + gchar *details = NULL; - if (*c->_display_name) { - name = c->_display_name; + if (*call->_display_name) { + name = call->_display_name; details = display_number; } else { name = display_number; @@ -377,11 +339,12 @@ calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, gchar *desc = g_markup_printf_escaped("<b>%s</b> <i>%s</i> ", name, details); gchar *suffix = NULL; + gchar *codec = NULL; switch (display_type) { case DISPLAY_TYPE_CALL: - if (c->_state_code) - suffix = g_markup_printf_escaped ("\n<i>%s (%d)</i>", c->_state_code_description, c->_state_code); + if (call->_state_code) + suffix = g_markup_printf_escaped("\n<i>%s (%d)</i>", call->_state_code_description, call->_state_code); break; case DISPLAY_TYPE_STATE_CODE : if (video_codec && *video_codec) @@ -389,84 +352,20 @@ calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, else codec = g_strdup(audio_codec); - if (c->_state_code) - suffix = g_markup_printf_escaped ("\n<i>%s (%d)</i> <i>%s</i>", - c->_state_code_description, c->_state_code, - codec); + if (call->_state_code) + suffix = g_markup_printf_escaped("\n<i>%s (%d)</i> <i>%s</i>", + call->_state_code_description, call->_state_code, + codec); else - suffix = g_markup_printf_escaped ("\n<i>%s</i>", codec); - free(codec); - break; - case DISPLAY_TYPE_CALL_TRANSFER: - suffix = g_markup_printf_escaped ("\n<i>Transfer to:%s</i> ", c->_trsft_to); - break; - case DISPLAY_TYPE_SAS: - suffix = g_markup_printf_escaped ("\n<i>Confirm SAS <b>%s</b> ?</i>", c->_sas); - break; - case DISPLAY_TYPE_HISTORY : - default: - break; - } + suffix = g_markup_printf_escaped("\n<i>%s</i>", codec); - gchar *msg = g_strconcat(desc, suffix, NULL); - g_free(desc); - g_free(suffix); - return msg; -} -#else -static gchar * -calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, - const gchar * const audio_codec, const gchar * const video_codec UNUSED) -{ - gchar display_number[strlen(c->_peer_number) + 1]; - strcpy(display_number, c->_peer_number); - - if (c->_type != CALL || !call_was_outgoing(c)) { - // Get the hostname for this call (NULL if not existent) - gchar * hostname = g_strrstr(c->_peer_number, "@"); - - // Test if we are dialing a new number - if (*c->_peer_number && hostname) - display_number[hostname - c->_peer_number] = '\0'; - } - - char *codec; - // Different display depending on type - gchar *name, *details = NULL; - - if (*c->_display_name) { - name = c->_display_name; - details = display_number; - } else { - name = display_number; - name = clean_display_number(name); - details = ""; - } - - gchar *desc = g_markup_printf_escaped("<b>%s</b> <i>%s</i> ", name, details); - gchar *suffix = NULL; - - switch (display_type) { - case DISPLAY_TYPE_CALL: - if (c->_state_code) - suffix = g_markup_printf_escaped ("\n<i>%s (%d)</i>", c->_state_code_description, c->_state_code); - break; - case DISPLAY_TYPE_STATE_CODE : - codec = g_strdup(audio_codec); - - if (c->_state_code) - suffix = g_markup_printf_escaped ("\n<i>%s (%d)</i> <i>%s</i>", - c->_state_code_description, c->_state_code, - codec); - else - suffix = g_markup_printf_escaped ("\n<i>%s</i>", codec); - free(codec); + g_free(codec); break; case DISPLAY_TYPE_CALL_TRANSFER: - suffix = g_markup_printf_escaped ("\n<i>Transfer to:%s</i> ", c->_trsft_to); + suffix = g_markup_printf_escaped("\n<i>Transfer to:%s</i> ", call->_trsft_to); break; case DISPLAY_TYPE_SAS: - suffix = g_markup_printf_escaped ("\n<i>Confirm SAS <b>%s</b> ?</i>", c->_sas); + suffix = g_markup_printf_escaped("\n<i>Confirm SAS <b>%s</b> ?</i>", call->_sas); break; case DISPLAY_TYPE_HISTORY : default: @@ -478,7 +377,6 @@ calltree_display_call_info(callable_obj_t * c, CallDisplayType display_type, g_free(suffix); return msg; } -#endif void calltree_create(calltab_t* tab, int searchbar_type) @@ -490,22 +388,24 @@ calltree_create(calltab_t* tab, int searchbar_type) gtk_container_set_border_width(GTK_CONTAINER(tab->tree), 0); - calltree_sw = gtk_scrolled_window_new(NULL, NULL); + GtkWidget *calltree_sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(calltree_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(calltree_sw), GTK_SHADOW_IN); - tab->store = gtk_tree_store_new(4, + tab->store = gtk_tree_store_new(COLUMNS_IN_TREE_STORE, GDK_TYPE_PIXBUF, /* Icon */ G_TYPE_STRING, /* Description */ GDK_TYPE_PIXBUF, /* Security Icon */ - G_TYPE_POINTER /* Pointer to the Object */ + G_TYPE_STRING, /* ID of the object */ + G_TYPE_BOOLEAN /* True if this is conference */ ); tab->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tab->store)); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(tab->view), FALSE); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tab->view), FALSE); g_signal_connect(G_OBJECT(tab->view), "row-activated", - G_CALLBACK(row_activated), + G_CALLBACK(row_activated_cb), NULL); gtk_widget_set_can_focus(calltree_sw, TRUE); @@ -523,13 +423,10 @@ calltree_create(calltab_t* tab, int searchbar_type) G_CALLBACK(button_pressed), NULL); - if (tab != history_tab && tab != contacts_tab) { - // Make calltree reordable for drag n drop - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(tab->view), TRUE); - - // source widget drag n drop signals - g_signal_connect(G_OBJECT(tab->view), "drag_end", G_CALLBACK(drag_end_cb), NULL); + if (g_strcmp0(tab->_name, CURRENT_CALLS) == 0) { + gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(tab->view), GDK_BUTTON1_MASK, target_list, n_targets, GDK_ACTION_DEFAULT | GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(tab->view), target_list, n_targets, GDK_ACTION_DEFAULT); // destination widget drag n drop signals g_signal_connect(G_OBJECT(tab->view), "drag_data_received", G_CALLBACK(drag_data_received_cb), NULL); @@ -537,25 +434,21 @@ calltree_create(calltab_t* tab, int searchbar_type) calltree_menu_items = gtk_menu_item_new_with_label(SFL_TRANSFER_CALL); g_signal_connect_swapped(calltree_menu_items, "activate", - G_CALLBACK(menuitem_response), (gpointer) g_strdup(SFL_TRANSFER_CALL)); + G_CALLBACK(menuitem_response), g_strdup(SFL_TRANSFER_CALL)); gtk_menu_shell_append(GTK_MENU_SHELL(calltree_popupmenu), calltree_menu_items); gtk_widget_show(calltree_menu_items); calltree_menu_items = gtk_menu_item_new_with_label(SFL_CREATE_CONFERENCE); g_signal_connect_swapped(calltree_menu_items, "activate", - G_CALLBACK(menuitem_response), (gpointer) g_strdup(SFL_CREATE_CONFERENCE)); + G_CALLBACK(menuitem_response), g_strdup(SFL_CREATE_CONFERENCE)); gtk_menu_shell_append(GTK_MENU_SHELL(calltree_popupmenu), calltree_menu_items); gtk_widget_show(calltree_menu_items); - } else if (tab == history_tab) { - gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(tab->view), TRUE); - g_signal_connect(G_OBJECT(tab->view), "drag_data_received", G_CALLBACK(drag_history_received_cb), NULL); } gtk_widget_grab_focus(GTK_WIDGET(tab->view)); - calltree_rend = gtk_cell_renderer_pixbuf_new(); - calltree_col = gtk_tree_view_column_new_with_attributes("Icon", calltree_rend, "pixbuf", COLUMN_ACCOUNT_PIXBUF, - NULL); + GtkCellRenderer *calltree_rend = gtk_cell_renderer_pixbuf_new(); + GtkTreeViewColumn *calltree_col = gtk_tree_view_column_new_with_attributes("Icon", calltree_rend, "pixbuf", COLUMN_ACCOUNT_PIXBUF, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tab->view), calltree_col); calltree_rend = gtk_cell_renderer_text_new(); @@ -586,7 +479,7 @@ calltree_create(calltab_t* tab, int searchbar_type) g_object_unref(G_OBJECT(tab->store)); gtk_container_add(GTK_CONTAINER(calltree_sw), tab->view); - calltree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)); + GtkTreeSelection *calltree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)); g_signal_connect(G_OBJECT(calltree_sel), "changed", G_CALLBACK(call_selected_cb), NULL); @@ -604,39 +497,32 @@ calltree_create(calltab_t* tab, int searchbar_type) gtk_widget_show(tab->tree); } +static gboolean +remove_element_if_match(GtkTreeModel *model, GtkTreePath *path UNUSED, GtkTreeIter *iter, gpointer data) +{ + const gchar *target_id = (const gchar *) data; + gchar *id; + gtk_tree_model_get(model, iter, COLUMN_ID, &id, -1); + gboolean result = FALSE; + if (g_strcmp0(id, target_id) == 0) { + gtk_tree_store_remove(GTK_TREE_STORE(model), iter); + result = TRUE; // stop iterating, we found it + } + g_free(id); -static void -calltree_remove_call_recursive(calltab_t* tab, callable_obj_t * callable, GtkTreeIter *parent) + return result; +} + +void +calltree_remove_call(calltab_t* tab, const gchar *target_id) { GtkTreeStore *store = tab->store; GtkTreeModel *model = GTK_TREE_MODEL(store); + gtk_tree_model_foreach(model, remove_element_if_match, (gpointer) target_id); - if (!callable) - ERROR("CallTree: Error: Not a valid call"); - - DEBUG("CallTree: Remove call %s", callable->_callID); - - int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), parent); - - for (int i = 0; i < nbChild; i++) { - GtkTreeIter child; - - if (gtk_tree_model_iter_nth_child(model, &child, parent, i)) { - if (gtk_tree_model_iter_has_child(model, &child)) - calltree_remove_call_recursive(tab, callable, &child); - - GValue val = { .g_type = 0 }; - gtk_tree_model_get_value(model, &child, COLUMN_ACCOUNT_PTR, &val); - - callable_obj_t * iterCall = g_value_get_pointer(&val); - g_value_unset(&val); - - if (iterCall == callable) - gtk_tree_store_remove(store, &child); - } - } - - if (calltab_get_selected_call(tab) == callable) + /* invalidate selected call if it was our target */ + callable_obj_t *sel = calltab_get_selected_call(tab); + if (sel && g_strcmp0(sel->_callID, target_id) == 0) calltab_select_call(tab, NULL); update_actions(); @@ -644,12 +530,6 @@ calltree_remove_call_recursive(calltab_t* tab, callable_obj_t * callable, GtkTre statusbar_update_clock(""); } -void -calltree_remove_call(calltab_t* tab, callable_obj_t * c) -{ - calltree_remove_call_recursive(tab, c, NULL); -} - GdkPixbuf *history_state_to_pixbuf(const gchar *history_state) { gchar *svg_filename = g_strconcat(ICONS_DIR, "/", history_state, ".svg", NULL); @@ -658,171 +538,175 @@ GdkPixbuf *history_state_to_pixbuf(const gchar *history_state) return pixbuf; } -static void -calltree_update_call_recursive(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) +typedef struct { + calltab_t *tab; + callable_obj_t *call; +} CallUpdateCtx; + +typedef struct { + calltab_t *tab; + const conference_obj_t *conf; +} ConferenceRemoveCtx; + +static gboolean +update_call(GtkTreeModel *model, GtkTreePath *path UNUSED, GtkTreeIter *iter, gpointer data) { GdkPixbuf *pixbuf = NULL; GdkPixbuf *pixbuf_security = NULL; - GtkTreeIter iter; - GValue val; + CallUpdateCtx *ctx = (CallUpdateCtx*) data; + calltab_t *tab = ctx->tab; + callable_obj_t *call = ctx->call; GtkTreeStore* store = tab->store; gchar* srtp_enabled = NULL; gboolean display_sas = TRUE; account_t* account = NULL; - int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), parent); - - if (c) { - account = account_list_get_by_id(c->_accountID); + account = account_list_get_by_id(call->_accountID); - if (account != NULL) { - srtp_enabled = account_lookup(account, ACCOUNT_SRTP_ENABLED); - display_sas = utf8_case_equal(account_lookup(account, ACCOUNT_ZRTP_DISPLAY_SAS), "true"); - } else { - GHashTable * properties = sflphone_get_ip2ip_properties(); - if (properties != NULL) { - srtp_enabled = g_hash_table_lookup(properties, ACCOUNT_SRTP_ENABLED); - display_sas = utf8_case_equal(g_hash_table_lookup(properties, ACCOUNT_ZRTP_DISPLAY_SAS), "true"); - } + if (account != NULL) { + srtp_enabled = account_lookup(account, ACCOUNT_SRTP_ENABLED); + display_sas = utf8_case_equal(account_lookup(account, ACCOUNT_ZRTP_DISPLAY_SAS), "true"); + } else { + GHashTable * properties = sflphone_get_ip2ip_properties(); + if (properties != NULL) { + srtp_enabled = g_hash_table_lookup(properties, ACCOUNT_SRTP_ENABLED); + display_sas = utf8_case_equal(g_hash_table_lookup(properties, ACCOUNT_ZRTP_DISPLAY_SAS), "true"); } } - for (gint i = 0; i < nbChild; i++) { + gchar *id; + gtk_tree_model_get(model, iter, COLUMN_ID, &id, -1); - if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, parent, i)) { + callable_obj_t * iterCall = calllist_get_call(tab, id); + g_free(id); - if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(store), &iter)) - calltree_update_call_recursive(tab, c, &iter); - - val.g_type = 0; - gtk_tree_model_get_value(GTK_TREE_MODEL(store), &iter, COLUMN_ACCOUNT_PTR, &val); - - callable_obj_t * iterCall = (callable_obj_t*) g_value_get_pointer(&val); - g_value_unset(&val); - - if (iterCall != c) - continue; + if (iterCall != call) + return FALSE; - /* Update text */ - gchar * description = NULL; - gchar * audio_codec = call_get_audio_codec(c); + /* Update text */ + gchar * description = NULL; + gchar * audio_codec = call_get_audio_codec(call); + gchar * video_codec = call_get_video_codec(call); - if (c->_state == CALL_STATE_TRANSFER) - description = calltree_display_call_info(c, DISPLAY_TYPE_CALL_TRANSFER, "", ""); - else { - if (c->_sas && display_sas && c->_srtp_state == SRTP_STATE_ZRTP_SAS_UNCONFIRMED && !c->_zrtp_confirmed) - description = calltree_display_call_info(c, DISPLAY_TYPE_SAS, "", ""); - else - description = calltree_display_call_info(c, DISPLAY_TYPE_STATE_CODE, audio_codec, ""); - } - g_free(audio_codec); + if (call->_state == CALL_STATE_TRANSFER) + description = calltree_display_call_info(call, DISPLAY_TYPE_CALL_TRANSFER, "", ""); + else + if (call->_sas && display_sas && call->_srtp_state == SRTP_STATE_ZRTP_SAS_UNCONFIRMED && !call->_zrtp_confirmed) + description = calltree_display_call_info(call, DISPLAY_TYPE_SAS, "", ""); + else + description = calltree_display_call_info(call, DISPLAY_TYPE_STATE_CODE, audio_codec, video_codec); - /* Update icons */ - if (tab == current_calls_tab) { - DEBUG("Receiving in state %d", c->_state); + g_free(video_codec); + g_free(audio_codec); - switch (c->_state) { - case CALL_STATE_HOLD: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/hold.svg", NULL); - break; - case CALL_STATE_INCOMING: - case CALL_STATE_RINGING: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); - break; - case CALL_STATE_CURRENT: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL); - break; - case CALL_STATE_DIALING: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL); - break; - case CALL_STATE_FAILURE: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/fail.svg", NULL); - break; - case CALL_STATE_BUSY: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/busy.svg", NULL); - break; - case CALL_STATE_TRANSFER: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/transfer.svg", NULL); - break; - case CALL_STATE_RECORD: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/icon_rec.svg", NULL); - break; - default: - WARN("Update calltree - Should not happen!"); - } + /* Update icons */ + if (tab == current_calls_tab) { + DEBUG("Receiving in state %d", call->_state); - switch (c->_srtp_state) { - case SRTP_STATE_SDES_SUCCESS: - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); - break; - case SRTP_STATE_ZRTP_SAS_UNCONFIRMED: - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_unconfirmed.svg", NULL); - if (c->_sas != NULL) - DEBUG("SAS is ready with value %s", c->_sas); - break; - case SRTP_STATE_ZRTP_SAS_CONFIRMED: - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); - break; - case SRTP_STATE_ZRTP_SAS_SIGNED: - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_certified.svg", NULL); - break; - case SRTP_STATE_UNLOCKED: - if (utf8_case_equal(srtp_enabled, "true")) - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); - break; - default: - WARN("Update calltree srtp state #%d- Should not happen!", c->_srtp_state); - if (utf8_case_equal(srtp_enabled, "true")) - pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); - } + switch (call->_state) { + case CALL_STATE_HOLD: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/hold.svg", NULL); + break; + case CALL_STATE_INCOMING: + case CALL_STATE_RINGING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); + break; + case CALL_STATE_CURRENT: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL); + break; + case CALL_STATE_DIALING: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL); + break; + case CALL_STATE_FAILURE: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/fail.svg", NULL); + break; + case CALL_STATE_BUSY: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/busy.svg", NULL); + break; + case CALL_STATE_TRANSFER: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/transfer.svg", NULL); + break; + case CALL_STATE_RECORD: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/icon_rec.svg", NULL); + break; + default: + WARN("Update calltree - Should not happen!"); + } - } else if (tab == history_tab) { - // parent is NULL this is not a conference participant - if (parent == NULL) - pixbuf = history_state_to_pixbuf(c->_history_state); - else // parent is not NULL this is a conference participant - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL); - - g_free(description); - description = calltree_display_call_info(c, DISPLAY_TYPE_HISTORY, "", ""); - gchar * date = get_formatted_start_timestamp(c->_time_start); - gchar *duration = get_call_duration(c); - gchar *full_duration = g_strconcat(date , duration , NULL); - g_free(date); - g_free(duration); - - gchar *old_description = description; - description = g_strconcat(old_description, full_duration, NULL); - g_free(full_duration); - g_free(old_description); - } + switch (call->_srtp_state) { + case SRTP_STATE_SDES_SUCCESS: + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); + break; + case SRTP_STATE_ZRTP_SAS_UNCONFIRMED: + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_unconfirmed.svg", NULL); + if (call->_sas != NULL) + DEBUG("SAS is ready with value %s", call->_sas); + break; + case SRTP_STATE_ZRTP_SAS_CONFIRMED: + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); + break; + case SRTP_STATE_ZRTP_SAS_SIGNED: + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_certified.svg", NULL); + break; + case SRTP_STATE_UNLOCKED: + if (utf8_case_equal(srtp_enabled, "true")) + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + break; + default: + WARN("Update calltree srtp state #%d- Should not happen!", call->_srtp_state); + if (utf8_case_equal(srtp_enabled, "true")) + pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); + } - gtk_tree_store_set(store, &iter, - COLUMN_ACCOUNT_PIXBUF, pixbuf, - COLUMN_ACCOUNT_DESC, description, - COLUMN_ACCOUNT_SECURITY_PIXBUF, pixbuf_security, - COLUMN_ACCOUNT_PTR, c, - -1); + } else if (tab == history_tab) { + pixbuf = history_state_to_pixbuf(call->_history_state); + + g_free(description); + description = calltree_display_call_info(call, DISPLAY_TYPE_HISTORY, "", ""); + gchar *date = get_formatted_start_timestamp(call->_time_start); + gchar *duration = get_call_duration(call); + gchar *full_duration = g_strconcat(date , duration , NULL); + g_free(date); + g_free(duration); + + gchar *old_description = description; + description = g_strconcat(old_description, full_duration, NULL); + g_free(full_duration); + g_free(old_description); + } - g_free(description); + gtk_tree_store_set(store, iter, + COLUMN_ACCOUNT_PIXBUF, pixbuf, + COLUMN_ACCOUNT_DESC, description, + COLUMN_ACCOUNT_SECURITY_PIXBUF, pixbuf_security, + COLUMN_ID, call->_callID, + COLUMN_IS_CONFERENCE, FALSE, + -1); - if (pixbuf != NULL) - g_object_unref(G_OBJECT(pixbuf)); - if (pixbuf_security != NULL) - g_object_unref(G_OBJECT(pixbuf_security)); - } - } + g_free(description); - update_actions(); + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); + if (pixbuf_security != NULL) + g_object_unref(G_OBJECT(pixbuf_security)); + return TRUE; } -void calltree_update_call(calltab_t* tab, callable_obj_t * c) +void calltree_update_call(calltab_t* tab, callable_obj_t * call) { - calltree_update_call_recursive(tab, c, NULL); + if (!call) { + ERROR("Call is NULL, ignoring"); + return; + } + CallUpdateCtx ctx = {tab, call}; + GtkTreeStore *store = tab->store; + GtkTreeModel *model = GTK_TREE_MODEL(store); + gtk_tree_model_foreach(model, update_call, (gpointer) &ctx); + update_actions(); } -void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) +void calltree_add_call(calltab_t* tab, callable_obj_t * call, GtkTreeIter *parent) { g_assert(tab != history_tab); @@ -836,12 +720,12 @@ void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) // New call in the list - gchar *description = calltree_display_call_info(c, DISPLAY_TYPE_CALL, "", ""); + gchar *description = calltree_display_call_info(call, DISPLAY_TYPE_CALL, "", ""); gtk_tree_store_prepend(tab->store, &iter, parent); - if (c) { - account_details = account_list_get_by_id(c->_accountID); + if (call) { + account_details = account_list_get_by_id(call->_accountID); if (account_details) { srtp_enabled = g_hash_table_lookup(account_details->properties, ACCOUNT_SRTP_ENABLED); @@ -852,7 +736,7 @@ void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) DEBUG("Added call key exchange is %s", key_exchange); if (tab == current_calls_tab) { - switch (c->_state) { + switch (call->_state) { case CALL_STATE_INCOMING: pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); break; @@ -885,9 +769,9 @@ void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/secure_off.svg", NULL); } else if (tab == contacts_tab) - pixbuf = c->_contact_thumbnail; + pixbuf = call->_contact_thumbnail; else - WARN("CallTree: This widget doesn't exist - This is a bug in the application."); + WARN("This widget doesn't exist - This is a bug in the application."); //Resize it if (pixbuf && (gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32)) { @@ -906,7 +790,8 @@ void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) COLUMN_ACCOUNT_PIXBUF, pixbuf, COLUMN_ACCOUNT_DESC, description, COLUMN_ACCOUNT_SECURITY_PIXBUF, pixbuf_security, - COLUMN_ACCOUNT_PTR, c, + COLUMN_ID, call->_callID, + COLUMN_IS_CONFERENCE, FALSE, -1); g_free(description); @@ -922,21 +807,21 @@ void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)), &iter); } -void calltree_add_history_entry(callable_obj_t *c) +void calltree_add_history_entry(callable_obj_t *call) { if (!eel_gconf_get_integer(HISTORY_ENABLED)) return; // New call in the list - gchar * description = calltree_display_call_info(c, DISPLAY_TYPE_HISTORY, "", ""); + gchar * description = calltree_display_call_info(call, DISPLAY_TYPE_HISTORY, "", ""); GtkTreeIter iter; gtk_tree_store_prepend(history_tab->store, &iter, NULL); - GdkPixbuf *pixbuf = history_state_to_pixbuf(c->_history_state); + GdkPixbuf *pixbuf = history_state_to_pixbuf(call->_history_state); - gchar *date = get_formatted_start_timestamp(c->_time_start); - gchar *duration = get_call_duration(c); + gchar *date = get_formatted_start_timestamp(call->_time_start); + gchar *duration = get_call_duration(call); gchar * full_duration = g_strconcat(date, duration, NULL); g_free(date); g_free(duration); @@ -955,7 +840,8 @@ void calltree_add_history_entry(callable_obj_t *c) COLUMN_ACCOUNT_PIXBUF, pixbuf, COLUMN_ACCOUNT_DESC, full_description, COLUMN_ACCOUNT_SECURITY_PIXBUF, NULL, - COLUMN_ACCOUNT_PTR, c, + COLUMN_ID, call->_callID, + COLUMN_IS_CONFERENCE, FALSE, -1); g_free(full_description); @@ -974,11 +860,14 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) account_t *account_details = NULL; if (!conf) { - ERROR("Calltree: Error: Conference is null"); + ERROR("Conference is null"); + return; + } else if (!conf->_confID) { + ERROR("Conference ID is null"); return; } - DEBUG("Calltree: Add conference %s", conf->_confID); + DEBUG("Add conference %s", conf->_confID); GtkTreeIter iter; gtk_tree_store_append(current_calls_tab->store, &iter, NULL); @@ -1025,33 +914,33 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) conf->_conference_secured = TRUE; if (conf->participant_list) { - DEBUG("Calltree: Determine if at least one participant uses SRTP"); + DEBUG("Determine if at least one participant uses SRTP"); for (GSList *part = conf->participant_list; part; part = g_slist_next(part)) { - const gchar * const call_id = (gchar *) part->data; + const gchar * const call_id = (const gchar *) part->data; callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); if (call == NULL) - ERROR("Calltree: Error: Could not find call %s in call list", call_id); + ERROR("Could not find call %s in call list", call_id); else { account_details = account_list_get_by_id(call->_accountID); gchar *srtp_enabled = ""; if (!account_details) - ERROR("Calltree: Error: Could not find account %s in account list", call->_accountID); + ERROR("Could not find account %s in account list", call->_accountID); else srtp_enabled = g_hash_table_lookup(account_details->properties, ACCOUNT_SRTP_ENABLED); if (utf8_case_equal(srtp_enabled, "true")) { - DEBUG("Calltree: SRTP enabled for participant %s", call_id); + DEBUG("SRTP enabled for participant %s", call_id); conf->_conf_srtp_enabled = TRUE; break; } else - DEBUG("Calltree: SRTP is not enabled for participant %s", call_id); + DEBUG("SRTP is not enabled for participant %s", call_id); } } - DEBUG("Calltree: Determine if all conference participants are secured"); + DEBUG("Determine if all conference participants are secured"); if (conf->_conf_srtp_enabled) { for (GSList *part = conf->participant_list; part; part = g_slist_next(part)) { @@ -1060,11 +949,11 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) if (call) { if (call->_srtp_state == SRTP_STATE_UNLOCKED) { - DEBUG("Calltree: Participant %s is not secured", call_id); + DEBUG("Participant %s is not secured", call_id); conf->_conference_secured = FALSE; break; } else - DEBUG("Calltree: Participant %s is secured", call_id); + DEBUG("Participant %s is secured", call_id); } } } @@ -1072,10 +961,10 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) if (conf->_conf_srtp_enabled) { if (conf->_conference_secured) { - DEBUG("Calltree: Conference is secured"); + DEBUG("Conference is secured"); pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_confirmed.svg", NULL); } else { - DEBUG("Calltree: Conference is not secured"); + DEBUG("Conference is not secured"); pixbuf_security = gdk_pixbuf_new_from_file(ICONS_DIR "/lock_off.svg", NULL); } } @@ -1087,7 +976,8 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) COLUMN_ACCOUNT_PIXBUF, pixbuf, COLUMN_ACCOUNT_DESC, description, COLUMN_ACCOUNT_SECURITY_PIXBUF, pixbuf_security, - COLUMN_ACCOUNT_PTR, conf, + COLUMN_ID, conf->_confID, + COLUMN_IS_CONFERENCE, TRUE, -1); g_free(description); @@ -1101,7 +991,7 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) const gchar * const call_id = (gchar *) part->data; callable_obj_t *call = calllist_get_call(current_calls_tab, call_id); - calltree_remove_call(current_calls_tab, call); + calltree_remove_call(current_calls_tab, call->_callID); calltree_add_call(current_calls_tab, call, &iter); } @@ -1116,66 +1006,65 @@ void calltree_add_conference_to_current_calls(conference_obj_t* conf) } static -void calltree_remove_conference_recursive(calltab_t* tab, const conference_obj_t* conf, GtkTreeIter *parent) +gboolean +remove_conference(GtkTreeModel *model, GtkTreePath *path UNUSED, GtkTreeIter *iter, gpointer data) { - GtkTreeModel *model = GTK_TREE_MODEL(tab->store); - int nbChildren = gtk_tree_model_iter_n_children(model, parent); - - for (int i = 0; i < nbChildren; i++) { - GtkTreeIter iter_parent; - - /* if the nth child of parent has one or more children */ - if (gtk_tree_model_iter_nth_child(model, &iter_parent, parent, i)) { - /* RECURSION! */ - if (gtk_tree_model_iter_has_child(model, &iter_parent)) - calltree_remove_conference_recursive(tab, conf, &iter_parent); + if (!is_conference(model, iter)) + return FALSE; - GValue confval; - confval.g_type = 0; - gtk_tree_model_get_value(model, &iter_parent, COLUMN_ACCOUNT_PTR, &confval); + gchar *conf_id; + gtk_tree_model_get(model, iter, COLUMN_ID, &conf_id, -1); - conference_obj_t *tempconf = (conference_obj_t*) g_value_get_pointer(&confval); - g_value_unset(&confval); + ConferenceRemoveCtx * ctx = (ConferenceRemoveCtx *) data; + calltab_t *tab = ctx->tab; + conference_obj_t *tempconf = conferencelist_get(tab, conf_id); + g_free(conf_id); - /* if this is the conference we want to remove */ - if (tempconf == conf) { - int nbParticipants = gtk_tree_model_iter_n_children(model, &iter_parent); - DEBUG("CallTree: nbParticipants: %d", nbParticipants); + const conference_obj_t *conf = ctx->conf; + /* if this is not the conference we want to remove */ + if (tempconf != conf) + return FALSE; - for (int j = 0; j < nbParticipants; j++) { - GtkTreeIter iter_child; + int nbParticipants = gtk_tree_model_iter_n_children(model, iter); + DEBUG("nbParticipants: %d", nbParticipants); - if (gtk_tree_model_iter_nth_child(model, &iter_child, &iter_parent, j)) { - GValue callval; - callval.g_type = 0; - gtk_tree_model_get_value(model, &iter_child, COLUMN_ACCOUNT_PTR, &callval); + for (int j = 0; j < nbParticipants; j++) { + GtkTreeIter iter_child; - callable_obj_t *call = g_value_get_pointer(&callval); - g_value_unset(&callval); + if (gtk_tree_model_iter_nth_child(model, &iter_child, iter, j)) { + gchar *call_id; + gtk_tree_model_get(model, &iter_child, COLUMN_ID, &call_id, -1); - // do not add back call in history calltree when cleaning it - if (call && tab != history_tab) - calltree_add_call(tab, call, NULL); - } - } + callable_obj_t *call = calllist_get_call(tab, call_id); + g_free(call_id); - DEBUG("CallTree: Remove conference %s", conf->_confID); - gtk_tree_store_remove(tab->store, &iter_parent); - } + // do not add back call in history calltree when cleaning it + if (call && tab != history_tab) + calltree_add_call(tab, call, NULL); } } + gtk_tree_store_remove(GTK_TREE_STORE(model), iter); + if (calltab_get_selected_conf(tab) == conf) calltab_select_conf(tab, NULL); - - update_actions(); + return TRUE; } void calltree_remove_conference(calltab_t* tab, const conference_obj_t* conf) { - DEBUG("CallTree: Remove conference %s", conf->_confID); - calltree_remove_conference_recursive(tab, conf, NULL); - DEBUG("CallTree: Finished Removing conference"); + if(conf == NULL) { + ERROR("Could not remove conference, conference pointer is NULL"); + return; + } + + ConferenceRemoveCtx context = {tab, conf}; + GtkTreeStore *store = tab->store; + GtkTreeModel *model = GTK_TREE_MODEL(store); + gtk_tree_model_foreach(model, remove_conference, (gpointer) &context); + + update_actions(); + DEBUG("Finished removing conference %s", conf->_confID); } void calltree_display(calltab_t *tab) @@ -1201,7 +1090,7 @@ void calltree_display(calltab_t *tab) gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(contactButton_), TRUE); set_focus_on_addressbook_searchbar(); } else - ERROR("CallTree: Error: Not a valid call tab (%d, %s)", __LINE__, __FILE__); + ERROR("Not a valid call tab (%d, %s)", __LINE__, __FILE__); gtk_widget_hide(active_calltree_tab->tree); active_calltree_tab = tab; @@ -1219,10 +1108,10 @@ gboolean calltree_update_clock(gpointer data UNUSED) char timestr[20]; const gchar *msg = ""; long duration; - callable_obj_t *c = calltab_get_selected_call(current_calls_tab); + callable_obj_t *call = calltab_get_selected_call(current_calls_tab); - if (c) - switch (c->_state) { + if (call) + switch (call->_state) { case CALL_STATE_INVALID: case CALL_STATE_INCOMING: case CALL_STATE_RINGING: @@ -1231,7 +1120,7 @@ gboolean calltree_update_clock(gpointer data UNUSED) case CALL_STATE_BUSY: break; default: - duration = difftime(time(NULL), c->_time_start); + duration = difftime(time(NULL), call->_time_start); if (duration < 0) duration = 0; @@ -1245,362 +1134,193 @@ gboolean calltree_update_clock(gpointer data UNUSED) return TRUE; } - -static void drag_end_cb(GtkWidget * widget UNUSED, GdkDragContext * context UNUSED, gpointer data UNUSED) +static void cleanup_popup_data(PopupData **data) { - if (active_calltree_tab == history_tab) - return; - - DEBUG("CallTree: Drag end callback"); - DEBUG("CallTree: selected_path %s, selected_call_id %s, selected_path_depth %d", - calltree_selected_path, calltree_selected_call_id, calltree_selected_path_depth); - DEBUG("CallTree: dragged path %s, dragged_call_id %s, dragged_path_depth %d", - calltree_dragged_path, calltree_dragged_call_id, calltree_dragged_path_depth); - - GtkTreeModel *model = (GtkTreeModel*) current_calls_tab->store; - GtkTreePath *path = gtk_tree_path_new_from_string(calltree_dragged_path); - GtkTreePath *dpath = gtk_tree_path_new_from_string(calltree_dragged_path); - GtkTreePath *spath = gtk_tree_path_new_from_string(calltree_selected_path); - - GtkTreeIter iter; - GtkTreeIter parent_conference; // conference for which this call is attached - - GValue val; - - // Make sure drag n drop does not imply a dialing call for either selected and dragged call - if (calltree_selected_call && (calltree_selected_type == A_CALL)) { - DEBUG("CallTree: Selected a call"); - - if (calltree_selected_call->_state == CALL_STATE_DIALING || - calltree_selected_call->_state == CALL_STATE_INVALID || - calltree_selected_call->_state == CALL_STATE_FAILURE || - calltree_selected_call->_state == CALL_STATE_BUSY || - calltree_selected_call->_state == CALL_STATE_TRANSFER) { - - DEBUG("CallTree: Selected an invalid call"); - - calltree_remove_call(current_calls_tab, calltree_selected_call); - calltree_add_call(current_calls_tab, calltree_selected_call, NULL); - - calltree_dragged_call = NULL; - return; - } - - - if (calltree_dragged_call && (calltree_dragged_type == A_CALL)) { - - DEBUG("CallTree: Dragged on a call"); - - if (calltree_dragged_call->_state == CALL_STATE_DIALING || - calltree_dragged_call->_state == CALL_STATE_INVALID || - calltree_dragged_call->_state == CALL_STATE_FAILURE || - calltree_dragged_call->_state == CALL_STATE_BUSY || - calltree_dragged_call->_state == CALL_STATE_TRANSFER) { - - DEBUG("CallTree: Dragged on an invalid call"); - - calltree_remove_call(current_calls_tab, calltree_selected_call); - - if (calltree_selected_call->_confID) { - - gtk_tree_path_up(spath); - gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent_conference, spath); - - calltree_add_call(current_calls_tab, calltree_selected_call, &parent_conference); - } else - calltree_add_call(current_calls_tab, calltree_selected_call, NULL); - - calltree_dragged_call = NULL; - return; - } - } + if (data && *data) { + g_free((*data)->source_ID); + g_free((*data)->dest_ID); + g_free(*data); + *data = 0; } +} - // Make sure a conference is only dragged on another conference - if (calltree_selected_conf && (calltree_selected_type == A_CONFERENCE)) { - - DEBUG("CallTree: Selected a conference"); - - if (!calltree_dragged_conf && (calltree_dragged_type == A_CALL)) { - - DEBUG("CallTree: Dragged on a call"); - conference_obj_t* conf = calltree_selected_conf; - - calltree_remove_conference(current_calls_tab, conf); - calltree_add_conference_to_current_calls(conf); +static gboolean +has_parent(GtkTreeModel *model, GtkTreeIter *child) +{ + GtkTreeIter parent; + return gtk_tree_model_iter_parent(model, &parent, child); +} - calltree_dragged_call = NULL; - return; - } +static gboolean try_detach(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreeIter *dest_iter) +{ + gboolean result = FALSE; + if (has_parent(model, source_iter) && !has_parent(model, dest_iter)) { + GValue source_val = G_VALUE_INIT; + gtk_tree_model_get_value(model, source_iter, COLUMN_ID, &source_val); + const gchar *source_ID = g_value_get_string(&source_val); + sflphone_detach_participant(source_ID); + result = TRUE; + g_value_unset(&source_val); } + return result; +} - - if (calltree_selected_path_depth == 1) { - if (calltree_dragged_path_depth == 1) { - if (calltree_selected_type == A_CALL && calltree_dragged_type == A_CALL) { - if (gtk_tree_path_compare(dpath, spath) != 0) { - // dragged a single call on a single call - if (calltree_selected_call != NULL && calltree_dragged_call != NULL) { - calltree_remove_call(current_calls_tab, calltree_selected_call); - calltree_add_call(current_calls_tab, calltree_selected_call, NULL); - gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, - 0, 0); - } - } - } else if (calltree_selected_type == A_CALL && calltree_dragged_type == A_CONFERENCE) { - - // dragged a single call on a conference - if (!calltree_selected_call) { - DEBUG("Error: call dragged on a conference is null"); - return; - } - - g_free(calltree_selected_call->_confID); - calltree_selected_call->_confID = g_strdup(calltree_dragged_call_id); - - g_free(calltree_selected_call->_historyConfID); - calltree_selected_call->_historyConfID = g_strdup(calltree_dragged_call_id); - - sflphone_add_participant(calltree_selected_call_id, calltree_dragged_call_id); - } else if (calltree_selected_type == A_CONFERENCE && calltree_dragged_type == A_CALL) { - - // dragged a conference on a single call - conference_obj_t* conf = calltree_selected_conf; - - calltree_remove_conference(current_calls_tab, conf); - calltree_add_conference_to_current_calls(conf); - - } else if (calltree_selected_type == A_CONFERENCE && calltree_dragged_type == A_CONFERENCE) { - - // dragged a conference on a conference - if (gtk_tree_path_compare(dpath, spath) == 0) { - - if (!current_calls_tab) { - DEBUG("Error while joining the same conference\n"); - return; - } - - DEBUG("Joined the same conference!\n"); - gtk_tree_view_expand_row(GTK_TREE_VIEW(current_calls_tab->view), path, FALSE); - } else { - if (!calltree_selected_conf) - DEBUG("Error: selected conference is null while joining 2 conference"); - - if (!calltree_dragged_conf) - DEBUG("Error: dragged conference is null while joining 2 conference"); - - DEBUG("Joined conferences %s and %s!\n", calltree_dragged_path, calltree_selected_path); - dbus_join_conference(calltree_selected_conf->_confID, calltree_dragged_conf->_confID); - } +static gboolean +handle_drop_into(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreeIter *dest_iter) +{ + GValue source_val = G_VALUE_INIT; + gtk_tree_model_get_value(model, source_iter, COLUMN_ID, &source_val); + const gchar *source_ID = g_value_get_string(&source_val); + + GValue dest_val = G_VALUE_INIT; + gtk_tree_model_get_value(model, dest_iter, COLUMN_ID, &dest_val); + const gchar *dest_ID = g_value_get_string(&dest_val); + + gboolean result = FALSE; + + if (has_parent(model, source_iter)) { + DEBUG("Source is participant, should only be detached"); + result = FALSE; + } else if (!has_parent(model, dest_iter)) { + if (is_conference(model, dest_iter)) { + if (is_conference(model, source_iter)) { + DEBUG("dropped conference on conference, merging conferences"); + dbus_join_conference(source_ID, dest_ID); + result = TRUE; + } else { + DEBUG("dropped call on conference, adding a call to a conference"); + sflphone_add_participant(source_ID, dest_ID); + result = TRUE; } - - // TODO: dragged a single call on a NULL element (should do nothing) - // TODO: dragged a conference on a NULL element (should do nothing) - + } else if (is_conference(model, source_iter)) { + DEBUG("dropped conference on call, merging call into conference"); + sflphone_add_participant(dest_ID, source_ID); + result = TRUE; } else { - // dragged_path_depth == 2 - if (calltree_selected_type == A_CALL && calltree_dragged_type == A_CALL) { - // TODO: dragged a call on a conference call - calltree_remove_call(current_calls_tab, calltree_selected_call); - calltree_add_call(current_calls_tab, calltree_selected_call, NULL); - - } else if (calltree_selected_type == A_CONFERENCE && calltree_dragged_type == A_CALL) { - // TODO: dragged a conference on a conference call - calltree_remove_conference(current_calls_tab, calltree_selected_conf); - calltree_add_conference_to_current_calls(calltree_selected_conf); - } - - // TODO: dragged a single call on a NULL element - // TODO: dragged a conference on a NULL element + DEBUG("dropped call on call, creating new conference or transferring"); + calltree_remove_call(current_calls_tab, source_ID); + callable_obj_t *source_call = calllist_get_call(current_calls_tab, source_ID); + calltree_add_call(current_calls_tab, source_call, NULL); + cleanup_popup_data(&popup_data); + popup_data = g_new0(PopupData, 1); + popup_data->source_ID = g_strdup(source_ID); + popup_data->dest_ID = g_strdup(dest_ID); + gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, 0, 0); + result = TRUE; } } else { - - if (calltree_dragged_path_depth == 1) { - if (calltree_selected_type == A_CALL && calltree_dragged_type == A_CALL) { - - // dragged a conference call on a call - sflphone_detach_participant(calltree_selected_call_id); - - if (calltree_selected_call && calltree_dragged_call) - gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, - 0, 0); - - } else if (calltree_selected_type == A_CALL && calltree_dragged_type == A_CONFERENCE) { - // dragged a conference call on a conference - sflphone_detach_participant(calltree_selected_call_id); - - if (calltree_selected_call && calltree_dragged_conf) { - DEBUG("Adding a participant, since dragged call on a conference"); - sflphone_add_participant(calltree_selected_call_id, calltree_dragged_call_id); - } - } else { - // dragged a conference call on a NULL element - sflphone_detach_participant(calltree_selected_call_id); - } - - } else { - // dragged_path_depth == 2 - // dragged a conference call on another conference call (same conference) - // TODO: dragged a conference call on another conference call (different conference) - - gtk_tree_path_up(path); - gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &parent_conference, path); - - gtk_tree_path_up(dpath); - gtk_tree_path_up(spath); - - if (gtk_tree_path_compare(dpath, spath) == 0) { - - DEBUG("Dragged a call in the same conference"); - calltree_remove_call(current_calls_tab, calltree_selected_call); - calltree_add_call(current_calls_tab, calltree_selected_call, &parent_conference); - gtk_widget_hide(calltree_menu_items); - gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, - 0, 0); - } else { - DEBUG("Dragged a conference call onto another conference call %s, %s", gtk_tree_path_to_string(dpath), gtk_tree_path_to_string(spath)); - - conference_obj_t *conf = NULL; - val.g_type = 0; - - if (gtk_tree_model_get_iter(model, &iter, dpath)) { - gtk_tree_model_get_value(model, &iter, COLUMN_ACCOUNT_PTR, &val); - conf = (conference_obj_t*) g_value_get_pointer(&val); - } - - g_value_unset(&val); - - sflphone_detach_participant(calltree_selected_call_id); - - if (conf) - sflphone_add_participant(calltree_selected_call_id, conf->_confID); - else - DEBUG("didn't find a conf!"); + // Happens when we drag a call on anther call which participate to a conference + callable_obj_t *dest_call = calllist_get_call(current_calls_tab, dest_ID); + if (dest_call) { + gchar *conf_ID = dbus_get_conference_id(dest_call->_callID); + if (g_strcmp0(conf_ID, "") != 0) { + sflphone_add_participant(source_ID, conf_ID); + result = TRUE; } - - // TODO: dragged a conference call on another conference call (different conference) - // TODO: dragged a conference call on a NULL element (same conference) - // TODO: dragged a conference call on a NULL element (different conference) } } + g_value_unset(&source_val); + g_value_unset(&dest_val); + return result; } -void drag_history_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gint x UNUSED, gint y UNUSED, GtkSelectionData *selection_data UNUSED, guint info UNUSED, guint t UNUSED, gpointer data UNUSED) +static gboolean valid_drop(GtkTreeModel *model, GtkTreeIter *source_iter, GtkTreePath *dest_path) { - g_signal_stop_emission_by_name(G_OBJECT(widget), "drag_data_received"); + gboolean result = TRUE; + GtkTreePath *source_path = gtk_tree_model_get_path(model, source_iter); + if (!gtk_tree_path_compare(source_path, dest_path)) { + ERROR("invalid drop: source and destination are the same"); + result = FALSE; + } else if (gtk_tree_path_is_ancestor(source_path, dest_path)) { + ERROR("invalid drop: source is ancestor of destination"); + result = FALSE; + } else if (gtk_tree_path_is_descendant(source_path, dest_path)) { + ERROR("invalid drop: source is descendant of destination"); + result = FALSE; + } + gtk_tree_path_free(source_path); + return result; } -void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context UNUSED, gint x UNUSED, gint y UNUSED, GtkSelectionData *selection_data UNUSED, guint info UNUSED, guint t UNUSED, gpointer data UNUSED) +static gboolean +render_drop(GtkTreeModel *model, GtkTreePath *dest_path, GtkTreeViewDropPosition dest_pos, + GtkTreeIter *source_iter) { - GtkTreeView *tree_view = GTK_TREE_VIEW(widget); - GtkTreePath *drop_path; - GtkTreeViewDropPosition position; - GValue val; - - if (active_calltree_tab == history_tab) { - g_signal_stop_emission_by_name(G_OBJECT(widget), "drag_data_received"); - return; + GtkTreeIter dest_iter; + if (!gtk_tree_model_get_iter(model, &dest_iter, dest_path)) { + ERROR("Could not get destination iterator"); + return FALSE; } - GtkTreeModel* tree_model = gtk_tree_view_get_model(tree_view); - - GtkTreeIter iter; - - val.g_type = 0; - gtk_tree_view_get_drag_dest_row(tree_view, &drop_path, &position); - - if (drop_path) { - - gtk_tree_model_get_iter(tree_model, &iter, drop_path); - gtk_tree_model_get_value(tree_model, &iter, COLUMN_ACCOUNT_PTR, &val); - - - if (gtk_tree_model_iter_has_child(tree_model, &iter)) { - DEBUG("CallTree: Dragging on a conference"); - calltree_dragged_type = A_CONFERENCE; - calltree_dragged_call = NULL; - } else { - DEBUG("CallTree: Dragging on a call"); - calltree_dragged_type = A_CALL; - calltree_dragged_conf = NULL; - } - - switch (position) { - - case GTK_TREE_VIEW_DROP_AFTER: - DEBUG("CallTree: GTK_TREE_VIEW_DROP_AFTER"); - calltree_dragged_path = gtk_tree_path_to_string(drop_path); - calltree_dragged_path_depth = gtk_tree_path_get_depth(drop_path); - calltree_dragged_call_id = "NULL"; - calltree_dragged_call = NULL; - calltree_dragged_conf = NULL; - break; - - case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: - DEBUG("CallTree: GTK_TREE_VIEW_DROP_INTO_OR_AFTER"); - calltree_dragged_path = gtk_tree_path_to_string(drop_path); - calltree_dragged_path_depth = gtk_tree_path_get_depth(drop_path); - - if (calltree_dragged_type == A_CALL) { - calltree_dragged_call_id = ((callable_obj_t*) g_value_get_pointer(&val))->_callID; - calltree_dragged_call = (callable_obj_t*) g_value_get_pointer(&val); - } else { - calltree_dragged_call_id = ((conference_obj_t*) g_value_get_pointer(&val))->_confID; - calltree_dragged_conf = (conference_obj_t*) g_value_get_pointer(&val); - } - - break; - - case GTK_TREE_VIEW_DROP_BEFORE: - DEBUG("CallTree: GTK_TREE_VIEW_DROP_BEFORE"); - calltree_dragged_path = gtk_tree_path_to_string(drop_path); - calltree_dragged_path_depth = gtk_tree_path_get_depth(drop_path); - calltree_dragged_call_id = "NULL"; - calltree_dragged_call = NULL; - calltree_dragged_conf = NULL; - break; - - case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: - DEBUG("CallTree: GTK_TREE_VIEW_DROP_INTO_OR_BEFORE"); - calltree_dragged_path = gtk_tree_path_to_string(drop_path); - calltree_dragged_path_depth = gtk_tree_path_get_depth(drop_path); - - if (calltree_dragged_type == A_CALL) { - calltree_dragged_call_id = ((callable_obj_t*) g_value_get_pointer(&val))->_callID; - calltree_dragged_call = (callable_obj_t*) g_value_get_pointer(&val); - } else { - calltree_dragged_call_id = ((conference_obj_t*) g_value_get_pointer(&val))->_confID; - calltree_dragged_conf = (conference_obj_t*) g_value_get_pointer(&val); - } + gboolean result = FALSE; + switch (dest_pos) { + case GTK_TREE_VIEW_DROP_BEFORE: + case GTK_TREE_VIEW_DROP_AFTER: + DEBUG("dropped at position %d, detaching if appropriate", dest_pos); + result = try_detach(model, source_iter, &dest_iter); + break; - break; + case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: + case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: + DEBUG("DROP_INTO"); + if (valid_drop(model, source_iter, dest_path)) + result = handle_drop_into(model, source_iter, &dest_iter); + break; + } + return result; +} - default: - break; - } +void drag_data_received_cb(GtkWidget *widget, GdkDragContext *context, gint x UNUSED, + gint y UNUSED, GtkSelectionData *selection_data UNUSED, guint target_type UNUSED, guint etime, gpointer data UNUSED) +{ + GtkTreeView *tree_view = GTK_TREE_VIEW(widget); + GtkTreeModel *model = GTK_TREE_MODEL(gtk_tree_view_get_model(tree_view)); + GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(tree_view); + GtkTreeIter source_iter; + if (!gtk_tree_selection_get_selected(tree_selection, NULL, &source_iter)) { + ERROR("No tree element selected"); + return; } + GtkTreePath *dest_path; + GtkTreeViewDropPosition dest_pos; + if (!gtk_tree_view_get_dest_row_at_pos(tree_view, x, y, &dest_path, &dest_pos)) { + ERROR("No row at given position"); + return; + } + + gboolean success = render_drop(model, dest_path, dest_pos, &source_iter); + if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE) + gtk_drag_finish(context, success, TRUE, etime); } /* Print a string when a menu item is selected */ -static void menuitem_response(gchar *string) +static void +menuitem_response(gchar * string) { - if (g_strcmp0(string, SFL_CREATE_CONFERENCE) == 0) - dbus_join_participant(calltree_selected_call->_callID, - calltree_dragged_call->_callID); - else if (g_strcmp0(string, SFL_TRANSFER_CALL) == 0) { - DEBUG("Calltree: Transferring call %s, to %s", - calltree_selected_call->_peer_number, - calltree_dragged_call->_peer_number); - dbus_attended_transfer(calltree_selected_call, calltree_dragged_call); - calltree_remove_call(current_calls_tab, calltree_selected_call); + if (g_strcmp0(string, SFL_CREATE_CONFERENCE) == 0) { + dbus_join_participant(popup_data->source_ID, + popup_data->dest_ID); + calltree_remove_call(current_calls_tab, popup_data->source_ID); + calltree_remove_call(current_calls_tab, popup_data->dest_ID); + update_actions(); + } else if (g_strcmp0(string, SFL_TRANSFER_CALL) == 0) { + callable_obj_t * source_call = calllist_get_call(current_calls_tab, popup_data->source_ID); + callable_obj_t * dest_call = calllist_get_call(current_calls_tab, popup_data->dest_ID); + DEBUG("Transferring call %s, to %s", + source_call->_peer_number, + dest_call->_peer_number); + dbus_attended_transfer(source_call, dest_call); + calltree_remove_call(current_calls_tab, popup_data->source_ID); } else - DEBUG("CallTree: Error unknown option selected in menu %s", string); + ERROR("Unknown option in menu %s", string); - // Make sure the create conference opetion will appear next time the menu pops + // Make sure the create conference option will appear next time the menu pops // The create conference option will hide if tow call from the same conference are draged on each other gtk_widget_show(calltree_menu_items); + cleanup_popup_data(&popup_data); + DEBUG("%s", string); } diff --git a/gnome/src/contacts/calltree.h b/gnome/src/contacts/calltree.h index 4f4fde48c7..b9e9e49768 100644 --- a/gnome/src/contacts/calltree.h +++ b/gnome/src/contacts/calltree.h @@ -35,12 +35,10 @@ /** @file calltree.h * @brief The GtkTreeView that list calls in the main window. */ - typedef enum { A_CALL, A_CONFERENCE, - A_INVALID -} CallType; + } CallType; /** * Tags used to identify display type in calltree @@ -80,10 +78,10 @@ calltree_update_call (calltab_t *, callable_obj_t *); /** * Remove a call from the call tree - * @param c The call to remove + * @param c The ID of the call to remove */ void -calltree_remove_call(calltab_t *, callable_obj_t *); +calltree_remove_call(calltab_t *, const gchar*); /** * Add a callable object to history treeview @@ -102,21 +100,22 @@ calltree_remove_conference(calltab_t *, const conference_obj_t *); void calltree_display (calltab_t *); -void -row_activated (GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, void *); - /** * Update elapsed time based on selected calltree's call */ gboolean calltree_update_clock(gpointer); -/** - * @param The calltab (current_calls, history, contacts) - * @param The call - * @param The callID/confID - */ -void -calltree_(calltab_t *, callable_obj_t *, const gchar * const); +gboolean +is_conference(GtkTreeModel *model, GtkTreeIter *iter); + +enum { + COLUMN_ACCOUNT_PIXBUF = 0, + COLUMN_ACCOUNT_DESC, + COLUMN_ACCOUNT_SECURITY_PIXBUF, + COLUMN_ID, + COLUMN_IS_CONFERENCE, + COLUMNS_IN_TREE_STORE +}; #endif diff --git a/gnome/src/contacts/conferencelist.c b/gnome/src/contacts/conferencelist.c index a293b268c1..1436812e92 100644 --- a/gnome/src/contacts/conferencelist.c +++ b/gnome/src/contacts/conferencelist.c @@ -44,7 +44,7 @@ static gint is_confID_confstruct(gconstpointer a, gconstpointer b) void conferencelist_init(calltab_t *tab) { if (tab == NULL) { - ERROR("ConferenceList: Error: Call tab is NULL"); + ERROR("Call tab is NULL"); return; } @@ -55,7 +55,7 @@ void conferencelist_init(calltab_t *tab) void conferencelist_clean(calltab_t *tab) { if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab tab is NULL"); + ERROR("Calltab tab is NULL"); return; } @@ -65,7 +65,7 @@ void conferencelist_clean(calltab_t *tab) void conferencelist_reset(calltab_t *tab) { if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab tab is NULL"); + ERROR("Calltab tab is NULL"); return; } @@ -77,12 +77,12 @@ void conferencelist_reset(calltab_t *tab) void conferencelist_add(calltab_t *tab, const conference_obj_t* conf) { if (conf == NULL) { - ERROR("ConferenceList: Error: Conference is NULL"); + ERROR("Conference is NULL"); return; } if (tab == NULL) { - ERROR("ConferenceList: Error: Tab is NULL"); + ERROR("Tab is NULL"); return; } @@ -94,45 +94,41 @@ void conferencelist_add(calltab_t *tab, const conference_obj_t* conf) } -void conferencelist_remove(calltab_t *tab, const gchar* const conf) +void conferencelist_remove(calltab_t *tab, const gchar* const conf_id) { - DEBUG("ConferenceList: Remove conference %s", conf); + DEBUG("Remove conference %s", conf_id); - if (conf == NULL) { - ERROR("ConferenceList: Error: Conf id is NULL"); + if (conf_id == NULL) { + ERROR("Conf id is NULL"); return; } if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab is NULL"); + ERROR("Calltab is NULL"); return; } - gchar *c = (gchar*) conferencelist_get(tab, conf); + conference_obj_t *c = conferencelist_get(tab, conf_id); - if (c == NULL) { - ERROR("ConferenceList: Error: Could not find conference %s", conf); + if (c == NULL) return; - } g_queue_remove(tab->conferenceQueue, c); } conference_obj_t* conferencelist_get(calltab_t *tab, const gchar* const conf_id) { - DEBUG("ConferenceList: Conference list get %s", conf_id); + DEBUG("Conference list get %s", conf_id); if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab is NULL"); + ERROR("Calltab is NULL"); return NULL; } GList *c = g_queue_find_custom(tab->conferenceQueue, conf_id, is_confID_confstruct); - if (c == NULL) { - ERROR("ConferenceList: Error: Could not find conference %s", conf_id); + if (c == NULL) return NULL; - } return (conference_obj_t*) c->data; } @@ -140,14 +136,14 @@ conference_obj_t* conferencelist_get(calltab_t *tab, const gchar* const conf_id) conference_obj_t* conferencelist_get_nth(calltab_t *tab, guint n) { if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab is NULL"); + ERROR("Calltab is NULL"); return NULL; } conference_obj_t *c = g_queue_peek_nth(tab->conferenceQueue, n); if (c == NULL) { - ERROR("ConferenceList: Error: Could not fetch conference %d", n); + ERROR("Could not fetch conference %d", n); return NULL; } @@ -157,7 +153,7 @@ conference_obj_t* conferencelist_get_nth(calltab_t *tab, guint n) conference_obj_t *conferencelist_pop_head(calltab_t *tab) { if (tab == NULL) { - ERROR("ConferenceList: Error: Tab is NULL"); + ERROR("Tab is NULL"); return NULL; } @@ -167,7 +163,7 @@ conference_obj_t *conferencelist_pop_head(calltab_t *tab) guint conferencelist_get_size(calltab_t *tab) { if (tab == NULL) { - ERROR("ConferenceList: Error: Calltab is NULL"); + ERROR("Calltab is NULL"); return 0; } diff --git a/gnome/src/contacts/history.c b/gnome/src/contacts/history.c index 33b01177d9..681ae12e5b 100644 --- a/gnome/src/contacts/history.c +++ b/gnome/src/contacts/history.c @@ -54,45 +54,34 @@ search_type_matches_state(SearchType type, const gchar *state) static gboolean history_is_visible(GtkTreeModel* model, GtkTreeIter* iter, gpointer data UNUSED) { - gboolean ret = TRUE; - callable_obj_t *history_entry = NULL; - const gchar *text = NULL; + /* Skip conferences */ + if (is_conference(model, iter)) + return TRUE; // Fetch the call description - GValue val; - memset(&val, 0, sizeof val); - gtk_tree_model_get_value(GTK_TREE_MODEL(model), iter, 1, &val); - - if (G_VALUE_HOLDS_STRING(&val)) - text = (gchar *) g_value_get_string(&val); - - // Fetch the call type - GValue obj; - memset(&obj, 0, sizeof obj); - gtk_tree_model_get_value(GTK_TREE_MODEL(model), iter, 3, &obj); - - if (G_VALUE_HOLDS_POINTER(&obj)) - history_entry = (gpointer) g_value_get_pointer(&obj); + const gchar *text = NULL; + const gchar *id = NULL; + gtk_tree_model_get(model, iter, COLUMN_ACCOUNT_DESC, &text, COLUMN_ID, &id, -1); + callable_obj_t *history_entry = calllist_get_call(history_tab, id); + gboolean ret = TRUE; if (text && history_entry) { // Filter according to the type of call // MISSED, INCOMING, OUTGOING, ALL const gchar* search = gtk_entry_get_text(history_searchbar_widget); if (!search || !*search) - goto end; + return TRUE; SearchType search_type = get_current_history_search_type(); ret = g_regex_match_simple(search, text, G_REGEX_CASELESS, 0); if (search_type == SEARCH_ALL) - goto end; + return ret; else // We need a match on the history_state and the current search type ret = ret && search_type_matches_state(search_type, history_entry->_history_state); } -end: - g_value_unset(&val); return ret; } diff --git a/gnome/src/dbus/callmanager-introspec.xml b/gnome/src/dbus/callmanager-introspec.xml index 327a1d5884..534fda54f5 100644 --- a/gnome/src/dbus/callmanager-introspec.xml +++ b/gnome/src/dbus/callmanager-introspec.xml @@ -313,6 +313,24 @@ </arg> </method> + <method name="getConferenceId" tp:name-for-bindings="getConferenceId"> + <tp:added version="1.1.0"/> + <tp:docstring> + If thsi call participate to a conference, return the conference id. + Return an empty string elsewhere. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The call id. + </tp:docstring> + </arg> + <arg type="s" name="confID" direction="out"> + <tp:docstring> + A string containing the conference ID, or an empty string. + </tp:docstring> + </arg> + </method> + <method name="setRecording" tp:name-for-bindings="setRecording"> <tp:docstring> Start recording a call. @@ -375,6 +393,7 @@ <li>DISPLAY_NAME</li> <li>CALL_STATE</li> <li>CALL_TYPE</li> + <li>CONF_ID</li> </ul> </tp:docstring> </arg> @@ -682,7 +701,7 @@ <signal name="transferFailed" tp:name-for-bindings="transferFailed"> <tp:docstring> - <p>Transfer operation failed. Corespondin + <p>Transfer operation failed. Corresponding call is no longer accessible in SFLphone-daemon.</p> </tp:docstring> diff --git a/gnome/src/dbus/configurationmanager-introspec.xml b/gnome/src/dbus/configurationmanager-introspec.xml index 2021a4b3e5..a3de1b2053 100644 --- a/gnome/src/dbus/configurationmanager-introspec.xml +++ b/gnome/src/dbus/configurationmanager-introspec.xml @@ -37,9 +37,9 @@ <li>DISPLAY_NAMEL: The display name</li> <li>STUN_ENABLE: True or False (Default: False)</li> <li>STUN_SERVER: The STUN server address</li> - <li>REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> - <li>REGISTRATION_STATE_CODE</li> - <li>REGISTRATION_STATE_DESCRIPTION</li> + <li>ACCOUNT_REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> + <li>ACCOUNT_REGISTRATION_STATE_CODE</li> + <li>ACCOUNT_REGISTRATION_STATE_DESC</li> <li>SRTP_KEY_EXCHANGE</li> <li>SRTP_ENABLE: Whether or not voice communication are encrypted - True or False (Default: False)</li> <li>SRTP_RTP_FALLBACK</li> @@ -91,7 +91,6 @@ Get configuration settings of the IP2IP_PROFILE. They are sligthly different from account settings since no VoIP accounts are involved. </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <!--<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/>--> <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> <tp:docstring> Available parameters are: @@ -449,6 +448,9 @@ <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> </signal> + <signal name="historyChanged" tp:name-for-bindings="historyChanged"> + </signal> + <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> <arg type="s" name="accountID"/> <arg type="i" name="registration_state"/> diff --git a/gnome/src/dbus/dbus.c b/gnome/src/dbus/dbus.c index fc26fbf568..a5a1c8a1b2 100644 --- a/gnome/src/dbus/dbus.c +++ b/gnome/src/dbus/dbus.c @@ -29,7 +29,6 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -74,11 +73,10 @@ static DBusGProxy *instance_proxy; static GDBusProxy *session_manager_proxy; /* Returns TRUE if there was an error, FALSE otherwise */ -static gboolean -check_error(GError *error) +static gboolean check_error(GError *error) { if (error) { - DEBUG("DBUS: Error: %s", error->message); + ERROR("%s", error->message); g_error_free(error); return TRUE; } @@ -224,7 +222,7 @@ process_existing_call_state_change(callable_obj_t *c, const gchar *state) /** - * This function processes call state changes in case the call has not been created yet. + * This function process call state changes in case the call have not been created yet. * This mainly occurs when another SFLphone client takes actions. */ static void @@ -246,19 +244,12 @@ process_nonexisting_call_state_change(const gchar *callID, const gchar *state) g_strcmp0(state, "CURRENT") == 0 || g_strcmp0(state, "RECORD")) { - DEBUG("DBUS: New ringing call! accountID: %s", callID); - - // We fetch the details associated with the specified call - GHashTable *call_details = dbus_get_call_details(callID); - callable_obj_t *new_call = create_new_call_from_details(callID, call_details); - - if (utf8_case_equal(g_hash_table_lookup(call_details, "CALL_TYPE"), INCOMING_STRING)) - new_call->_history_state = g_strdup(INCOMING_STRING); - else - new_call->_history_state = g_strdup(OUTGOING_STRING); + DEBUG("New ringing call! accountID: %s", callID); - calllist_add_call(current_calls_tab, new_call); - calltree_add_call(current_calls_tab, new_call, NULL); + restore_call(callID); + callable_obj_t *new_call = calllist_get_call(current_calls_tab, callID); + if (new_call) + calltree_add_call(current_calls_tab, new_call, NULL); update_actions(); calltree_display(current_calls_tab); } @@ -273,7 +264,7 @@ call_state_cb(DBusGProxy *proxy UNUSED, const gchar *callID, if (c) process_existing_call_state_change(c, state); else { - WARN("DBUS: Call does not exist in %s", __func__); + WARN("Call does not exist in %s", __func__); process_nonexisting_call_state_change(callID, state); } } @@ -293,11 +284,12 @@ static void conference_changed_cb(DBusGProxy *proxy UNUSED, const gchar *confID, const gchar *state, void *foo UNUSED) { - DEBUG("DBUS: Conference state changed: %s\n", state); - conference_obj_t *changed_conf = conferencelist_get(current_calls_tab, confID); + DEBUG("Conference state changed: %s\n", state); + + conference_obj_t* changed_conf = conferencelist_get(current_calls_tab, confID); if (changed_conf == NULL) { - ERROR("DBUS: Conference is NULL in conference state changed"); + ERROR("Conference is NULL in conference state changed"); return; } @@ -335,23 +327,25 @@ conference_changed_cb(DBusGProxy *proxy UNUSED, const gchar *confID, static void conference_created_cb(DBusGProxy *proxy UNUSED, const gchar *confID, void *foo UNUSED) { - DEBUG("DBUS: Conference %s added", confID); + DEBUG("Conference %s added", confID); + conference_obj_t *new_conf = create_new_conference(CONFERENCE_STATE_ACTIVE_ATTACHED, confID); + gchar **participants = dbus_get_participant_list(new_conf->_confID); // Update conference list conference_participant_list_update(participants, new_conf); // Add conference ID in in each calls - for (gchar **p = participants; p && *p; ++p) { - callable_obj_t *call = calllist_get_call(current_calls_tab, *p); + for (gchar **part = participants; part && *part; ++part) { + callable_obj_t *call = calllist_get_call(current_calls_tab, *part); + im_widget_update_state(IM_WIDGET(call->_im_widget), FALSE); // if one of these participants is currently recording, the whole conference will be recorded if (call->_state == CALL_STATE_RECORD) new_conf->_state = CONFERENCE_STATE_ACTIVE_ATTACHED_RECORD; - call->_confID = g_strdup(confID); call->_historyConfID = g_strdup(confID); } @@ -367,8 +361,13 @@ static void conference_removed_cb(DBusGProxy *proxy UNUSED, const gchar *confID, void *foo UNUSED) { - DEBUG("DBUS: Conference removed %s", confID); + DEBUG("Conference removed %s", confID); conference_obj_t *c = conferencelist_get(current_calls_tab, confID); + if(c == NULL) { + ERROR("Could not find conference %s from list", confID); + return; + } + calltree_remove_conference(current_calls_tab, c); im_widget_update_state(IM_WIDGET(c->_im_widget), FALSE); @@ -378,8 +377,6 @@ conference_removed_cb(DBusGProxy *proxy UNUSED, const gchar *confID, callable_obj_t *call = calllist_get_call(current_calls_tab, p->data); if (call) { - g_free(call->_confID); - call->_confID = NULL; im_widget_update_state(IM_WIDGET(call->_im_widget), TRUE); } } @@ -391,17 +388,17 @@ static void record_playback_filepath_cb(DBusGProxy *proxy UNUSED, const gchar *id, const gchar *filepath) { - DEBUG("DBUS: Filepath for %s: %s", id, filepath); + DEBUG("Filepath for %s: %s", id, filepath); callable_obj_t *call = calllist_get_call(current_calls_tab, id); conference_obj_t *conf = conferencelist_get(current_calls_tab, id); if (call && conf) { - ERROR("DBUS: Two objects for this callid"); + ERROR("Two objects for this callid"); return; } if (!call && !conf) { - ERROR("DBUS: Could not get object"); + ERROR("Could not get object"); return; } @@ -414,19 +411,18 @@ record_playback_filepath_cb(DBusGProxy *proxy UNUSED, const gchar *id, static void record_playback_stopped_cb(DBusGProxy *proxy UNUSED, const gchar *filepath) { - DEBUG("DBUS: Playback stopped for %s", filepath); + DEBUG("Playback stopped for %s", filepath); const gint calllist_size = calllist_get_size(history_tab); - for (gint i = 0; i < calllist_size; ++i) { - QueueElement *element = calllist_get_nth(history_tab, i); + for (gint i = 0; i < calllist_size; i++) { + callable_obj_t *call = calllist_get_nth(history_tab, i); - if (element == NULL) { - ERROR("DBUS: ERROR: Could not find %dth call", i); + if (call == NULL) { + ERROR("Could not find %dth call", i); break; - } else if (element->type == HIST_CALL) { - if (g_strcmp0(element->elem.call->_recordfile, filepath) == 0) - element->elem.call->_record_is_playing = FALSE; } + if (g_strcmp0(call->_recordfile, filepath) == 0) + call->_record_is_playing = FALSE; } update_actions(); @@ -488,7 +484,7 @@ transfer_failed_cb(DBusGProxy *proxy UNUSED, void *foo UNUSED) static void secure_sdes_on_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUSED) { - DEBUG("DBUS: SRTP using SDES is on"); + DEBUG("SRTP using SDES is on"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) { @@ -500,7 +496,7 @@ secure_sdes_on_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUSE static void secure_sdes_off_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUSED) { - DEBUG("DBUS: SRTP using SDES is off"); + DEBUG("SRTP using SDES is off"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) { @@ -510,10 +506,10 @@ secure_sdes_off_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUS } static void -secure_zrtp_on_cb(DBusGProxy *proxy UNUSED, const gchar *callID, const gchar *cipher, - void *foo UNUSED) +secure_zrtp_on_cb(DBusGProxy *proxy UNUSED, const gchar *callID, + const gchar *cipher, void *foo UNUSED) { - DEBUG("DBUS: SRTP using ZRTP is ON secure_on_cb"); + DEBUG("SRTP using ZRTP is ON secure_on_cb"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) { @@ -526,7 +522,7 @@ secure_zrtp_on_cb(DBusGProxy *proxy UNUSED, const gchar *callID, const gchar *ci static void secure_zrtp_off_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUSED) { - DEBUG("DBUS: SRTP using ZRTP is OFF"); + DEBUG("SRTP using ZRTP is OFF"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) { @@ -539,7 +535,7 @@ static void show_zrtp_sas_cb(DBusGProxy *proxy UNUSED, const gchar *callID, const gchar *sas, gboolean verified, void *foo UNUSED) { - DEBUG("DBUS: Showing SAS"); + DEBUG("Showing SAS"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) @@ -549,7 +545,7 @@ show_zrtp_sas_cb(DBusGProxy *proxy UNUSED, const gchar *callID, const gchar *sas static void confirm_go_clear_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo UNUSED) { - DEBUG("DBUS: Confirm Go Clear request"); + DEBUG("Confirm Go Clear request"); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) @@ -569,10 +565,10 @@ zrtp_not_supported_cb(DBusGProxy *proxy UNUSED, const gchar *callID, void *foo U } static void -sip_call_state_cb(DBusGProxy *proxy UNUSED, const gchar* callID, +sip_call_state_cb(DBusGProxy *proxy UNUSED, const gchar *callID, const gchar *description, guint code, void *foo UNUSED) { - DEBUG("DBUS: Sip call state changed %s", callID); + DEBUG("Sip call state changed %s", callID); callable_obj_t *c = calllist_get_call(current_calls_tab, callID); if (c) @@ -602,9 +598,8 @@ error_alert(DBusGProxy *proxy UNUSED, int err, void *foo UNUSED) } GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(get_main_window()), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, "%s", msg); + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", msg); gtk_window_set_title(GTK_WINDOW(dialog), _("SFLphone Error")); @@ -615,11 +610,11 @@ error_alert(DBusGProxy *proxy UNUSED, int err, void *foo UNUSED) static void screensaver_dbus_proxy_new_cb (GObject * source UNUSED, GAsyncResult *result, gpointer user_data UNUSED) { - DEBUG("DBUS: Session manager connection callback"); + DEBUG("Session manager connection callback"); session_manager_proxy = g_dbus_proxy_new_for_bus_finish (result, NULL); if (session_manager_proxy == NULL) - ERROR("DBUS: Error, could not initialize gnome session manager"); + ERROR("could not initialize gnome session manager"); } #define GS_SERVICE "org.gnome.SessionManager" @@ -630,7 +625,7 @@ gboolean dbus_connect_session_manager(DBusGConnection *connection) { if (connection == NULL) { - ERROR("DBUS: Error connection is NULL"); + ERROR("connection is NULL"); return FALSE; } /* @@ -639,7 +634,7 @@ gboolean dbus_connect_session_manager(DBusGConnection *connection) "org.gnome.SessionManager.Inhibitor"); if(session_manager_proxy == NULL) { - ERROR("DBUS: Error, could not create session manager proxy"); + ERROR("Error, could not create session manager proxy"); return FALSE; } */ @@ -649,7 +644,7 @@ gboolean dbus_connect_session_manager(DBusGConnection *connection) NULL, GS_SERVICE, GS_PATH, GS_INTERFACE, NULL, screensaver_dbus_proxy_new_cb, NULL); - DEBUG("DBUS: Connected to gnome session manager"); + DEBUG("Connected to gnome session manager"); return TRUE; } @@ -668,7 +663,7 @@ gboolean dbus_connect(GError **error) DBusGConnection *connection = dbus_g_bus_get(DBUS_BUS_SESSION, error); if (connection == NULL) { - ERROR("DBUS: Error, could not establish connection with session bus"); + ERROR("could not establish connection with session bus"); return FALSE; } @@ -882,38 +877,34 @@ gboolean dbus_connect(GError **error) video_proxy = dbus_g_proxy_new_for_name(connection, "org.sflphone.SFLphone", "/org/sflphone/SFLphone/VideoControls", "org.sflphone.SFLphone.VideoControls"); - g_assert(video_proxy!= NULL); - /* Video related signals */ - dbus_g_proxy_add_signal(video_proxy, "deviceEvent", G_TYPE_INVALID); - dbus_g_proxy_connect_signal(video_proxy, "deviceEvent", - G_CALLBACK(video_device_event_cb), NULL, NULL); -#endif - - /* Marshaller for INT INT INT INT INT */ - dbus_g_object_register_marshaller( - g_cclosure_user_marshal_VOID__INT_INT_INT_INT_INT, G_TYPE_NONE, - G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID); - -#ifdef SFL_VIDEO - dbus_g_proxy_add_signal(video_proxy, "receivingEvent", G_TYPE_INT, - G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(video_proxy, "receivingEvent", - G_CALLBACK(receiving_video_event_cb), NULL, - NULL); -#endif - - /* Marshaller for INT INT */ - dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__INT_INT, + g_assert(video_proxy != NULL); + /* Video related signals */ + dbus_g_proxy_add_signal(video_proxy, "deviceEvent", G_TYPE_INVALID); + dbus_g_proxy_connect_signal(video_proxy, "deviceEvent", + G_CALLBACK(video_device_event_cb), NULL, NULL); + + /* Marshaller for INT INT INT INT INT */ + dbus_g_object_register_marshaller( + g_cclosure_user_marshal_VOID__INT_INT_INT_INT_INT, G_TYPE_NONE, + G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID); + + dbus_g_proxy_add_signal(video_proxy, "receivingEvent", G_TYPE_INT, + G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal(video_proxy, "receivingEvent", + G_CALLBACK(receiving_video_event_cb), NULL, + NULL); + + /* Marshaller for INT INT */ + dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__INT_INT, G_TYPE_NONE, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID); -#ifdef SFL_VIDEO - dbus_g_proxy_add_signal(video_proxy, "stoppedReceivingEvent", - G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(video_proxy, "stoppedReceivingEvent", - G_CALLBACK(stopped_receiving_video_event_cb), - NULL, NULL); + dbus_g_proxy_add_signal(video_proxy, "stoppedReceivingEvent", + G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal(video_proxy, "stoppedReceivingEvent", + G_CALLBACK(stopped_receiving_video_event_cb), + NULL, NULL); #endif /* Defines a default timeout for the proxies */ @@ -922,14 +913,11 @@ gboolean dbus_connect(GError **error) dbus_g_proxy_set_default_timeout(call_proxy, DEFAULT_DBUS_TIMEOUT); dbus_g_proxy_set_default_timeout(instance_proxy, DEFAULT_DBUS_TIMEOUT); dbus_g_proxy_set_default_timeout(config_proxy, DEFAULT_DBUS_TIMEOUT); -#ifdef SFL_VIDEO - dbus_g_proxy_set_default_timeout(video_proxy, DEFAULT_DBUS_TIMEOUT); -#endif #endif gboolean status = dbus_connect_session_manager(connection); if(status == FALSE) { - ERROR("DBUS: Error, could not connect to gnome session manager"); + ERROR("could not connect to gnome session manager"); return FALSE; } @@ -939,7 +927,7 @@ gboolean dbus_connect(GError **error) void dbus_clean() { #ifdef SFL_VIDEO - g_object_unref(video_proxy); + g_object_unref(video_proxy); #endif g_object_unref(call_proxy); g_object_unref(config_proxy); @@ -982,6 +970,7 @@ dbus_start_recorded_file_playback(const gchar *filepath) { GError *error = NULL; gboolean result; + org_sflphone_SFLphone_CallManager_start_recorded_file_playback(call_proxy, filepath, &result, &error); check_error(error); return result; @@ -1230,7 +1219,7 @@ void dbus_unregister(int pid) { GError *error = NULL; - org_sflphone_SFLphone_Instance_unregister(instance_proxy, pid, &error); + org_sflphone_SFLphone_Instance_unregister_async(instance_proxy, pid, NULL, NULL); check_error(error); } @@ -1241,7 +1230,6 @@ dbus_audio_codec_list() GArray *array = NULL; org_sflphone_SFLphone_ConfigurationManager_get_audio_codec_list(config_proxy, &array, &error); check_error(error); - return array; } @@ -1277,15 +1265,13 @@ dbus_set_active_video_codec_list(const gchar** list, const gchar *accountID) } #endif - -gchar** +gchar ** dbus_audio_codec_details(int payload) { GError *error = NULL; gchar **array; org_sflphone_SFLphone_ConfigurationManager_get_audio_codec_details(config_proxy, payload, &array, &error); check_error(error); - return array; } @@ -1327,7 +1313,8 @@ dbus_get_current_audio_codec_name(const callable_obj_t *c) gchar *codecName = NULL; GError *error = NULL; - org_sflphone_SFLphone_CallManager_get_current_audio_codec_name(call_proxy, c->_callID, &codecName, &error); + org_sflphone_SFLphone_CallManager_get_current_audio_codec_name(call_proxy, c->_callID, &codecName, + &error); check_error(error); DEBUG("%s: codecName : %s", __PRETTY_FUNCTION__, codecName); return codecName; @@ -1336,7 +1323,6 @@ dbus_get_current_audio_codec_name(const callable_obj_t *c) GArray * dbus_get_active_audio_codec_list(const gchar *accountID) { - GArray *array = NULL; GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_get_active_audio_codec_list(config_proxy, accountID, &array, @@ -1394,7 +1380,6 @@ dbus_get_audio_output_device_list() GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_get_audio_output_device_list(config_proxy, &array, &error); check_error(error); - return array; } @@ -1513,7 +1498,12 @@ dbus_set_noise_suppress_state(const gchar *state) { GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_set_noise_suppress_state(config_proxy, state, &error); - check_error(error); + + if (error) { + ERROR("Failed to call set_noise_suppress_state() on " + "ConfigurationManager: %s", error->message); + g_error_free(error); + } } gchar * @@ -1589,7 +1579,7 @@ dbus_is_iax2_enabled() void dbus_join_participant(const gchar *sel_callID, const gchar *drag_callID) { - DEBUG("DBUS: Join participant %s and %s\n", sel_callID, drag_callID); + DEBUG("Join participant %s and %s\n", sel_callID, drag_callID); GError *error = NULL; org_sflphone_SFLphone_CallManager_join_participant(call_proxy, sel_callID, drag_callID, &error); check_error(error); @@ -1606,7 +1596,7 @@ dbus_create_conf_from_participant_list(const gchar **list) void dbus_add_participant(const gchar *callID, const gchar *confID) { - DEBUG("DBUS: Add participant %s to %s\n", callID, confID); + DEBUG("Add participant %s to %s\n", callID, confID); GError *error = NULL; org_sflphone_SFLphone_CallManager_add_participant(call_proxy, callID, confID, &error); check_error(error); @@ -1615,7 +1605,6 @@ dbus_add_participant(const gchar *callID, const gchar *confID) void dbus_add_main_participant(const gchar *confID) { - DEBUG("DBUS: Add main participant %s\n", confID); GError *error = NULL; org_sflphone_SFLphone_CallManager_add_main_participant(call_proxy, confID, &error); check_error(error); @@ -1624,7 +1613,6 @@ dbus_add_main_participant(const gchar *confID) void dbus_detach_participant(const gchar *callID) { - DEBUG("DBUS: Detach participant %s\n", callID); GError *error = NULL; org_sflphone_SFLphone_CallManager_detach_participant(call_proxy, callID, &error); check_error(error); @@ -1654,6 +1642,7 @@ dbus_get_is_recording(const callable_obj_t *c) gboolean isRecording; org_sflphone_SFLphone_CallManager_get_is_recording(call_proxy, c->_callID, &isRecording, &error); check_error(error); + return isRecording; } @@ -1676,7 +1665,7 @@ dbus_get_record_path(void) return path; } -void dbus_set_is_always_recording(gboolean alwaysRec) +void dbus_set_is_always_recording(const gboolean alwaysRec) { GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_set_is_always_recording(config_proxy, alwaysRec, &error); @@ -1731,7 +1720,7 @@ dbus_set_audio_manager(const gchar *api) gchar * dbus_get_audio_manager(void) { - gchar *api = NULL; + gchar *api; GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_get_audio_manager(config_proxy, &api, &error); check_error(error); @@ -1944,6 +1933,7 @@ dbus_get_addressbook_list(void) gchar **array = NULL; org_sflphone_SFLphone_ConfigurationManager_get_addressbook_list(config_proxy, &array, &error); check_error(error); + return array; } @@ -1952,6 +1942,7 @@ dbus_set_addressbook_list(const gchar **list) { GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_set_addressbook_list(config_proxy, list, &error); + check_error(error); } @@ -1960,8 +1951,10 @@ dbus_get_hook_settings(void) { GError *error = NULL; GHashTable *results = NULL; + org_sflphone_SFLphone_ConfigurationManager_get_hook_settings(config_proxy, &results, &error); check_error(error); + return results; } @@ -1980,6 +1973,7 @@ dbus_get_call_details(const gchar *callID) GHashTable *details = NULL; org_sflphone_SFLphone_CallManager_get_call_details(call_proxy, callID, &details, &error); check_error(error); + return details; } @@ -2009,13 +2003,25 @@ gchar ** dbus_get_participant_list(const gchar *confID) { GError *error = NULL; - char **list = NULL; - DEBUG("DBUS: Get conference %s participant list", confID); + gchar **list = NULL; + + DEBUG("Get conference %s participant list", confID); org_sflphone_SFLphone_CallManager_get_participant_list(call_proxy, confID, &list, &error); check_error(error); + return list; } +gchar * +dbus_get_conference_id(const gchar *callID) +{ + gchar *confID = NULL; + GError *error = NULL; + org_sflphone_SFLphone_CallManager_get_conference_id(call_proxy, callID, &confID, &error); + check_error(error); + return confID; +} + GHashTable * dbus_get_conference_details(const gchar *confID) { @@ -2085,6 +2091,7 @@ dbus_get_supported_tls_method() gchar **array = NULL; org_sflphone_SFLphone_ConfigurationManager_get_supported_tls_method(config_proxy, &array, &error); check_error(error); + return array; } @@ -2120,7 +2127,8 @@ dbus_get_all_ip_interface(void) if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) ERROR("Caught remote method (get_all_ip_interface) exception %s: %s", dbus_g_error_get_name(error), error->message); else - ERROR("Error while calling get_all_ip_interface: %s", error->message); + ERROR("%s", error->message); + g_error_free(error); } else DEBUG("DBus called get_all_ip_interface() on ConfigurationManager"); @@ -2139,7 +2147,8 @@ dbus_get_all_ip_interface_by_name(void) ERROR("Caught remote method (get_all_ip_interface) exception %s: %s", dbus_g_error_get_name(error), error->message); else - ERROR("Error while calling get_all_ip_interface: %s", error->message); + ERROR("%s", error->message); + g_error_free(error); } @@ -2157,7 +2166,7 @@ dbus_get_shortcuts(void) ERROR("Caught remote method (get_shortcuts) exception %s: %s", dbus_g_error_get_name(error), error->message); else - ERROR("Error while calling get_shortcuts: %s", error->message); + ERROR("%s", error->message); g_error_free(error); } @@ -2214,12 +2223,11 @@ static guint cookie; static void screensaver_inhibit_cb(GObject * source_object, GAsyncResult * res, gpointer user_data UNUSED) { - DEBUG(__PRETTY_FUNCTION__); GDBusProxy *proxy = G_DBUS_PROXY(source_object); GError *error = NULL; GVariant *value = g_dbus_proxy_call_finish(proxy, res, &error); if (!value) { - ERROR("Screensaver: Error: inhibiting the screensaver: %s", error->message); + ERROR("%s", error->message); g_error_free(error); return; } @@ -2237,13 +2245,12 @@ static void screensaver_uninhibit_cb(GObject * source_object, GAsyncResult * res, gpointer user_data UNUSED) { - DEBUG(__PRETTY_FUNCTION__); GDBusProxy *proxy = G_DBUS_PROXY(source_object); GError *error = NULL; GVariant *value = g_dbus_proxy_call_finish(proxy, res, &error); if (!value) { - ERROR ("Screensaver: Error uninhibiting the screensaver: %s", + ERROR ("%s", error->message); g_error_free(error); return; @@ -2258,7 +2265,7 @@ void dbus_screensaver_inhibit(void) { const gchar *appname = g_get_application_name(); if (appname == NULL) { - ERROR("Screensaver: Could not retrieve application name"); + ERROR("could not retrieve application name"); return; } @@ -2267,7 +2274,7 @@ void dbus_screensaver_inhibit(void) "Phone call ongoing", GNOME_SESSION_NO_IDLE_FLAG); if (parameters == NULL) { - ERROR("Screensaver: Could not create session manager inhibit parameters"); + ERROR("Could not create session manager inhibit parameters"); return; } @@ -2281,11 +2288,11 @@ dbus_screensaver_uninhibit(void) { if (cookie == 0) return; - DEBUG("Screensaver: uninhibit"); + DEBUG("uninhibit"); GVariant *parameters = g_variant_new("(u)", cookie); if (parameters == NULL) { - ERROR("Screensaver: Could not create session manager uninhibit " + ERROR("Could not create session manager uninhibit " "parameters"); return; } diff --git a/gnome/src/dbus/dbus.h b/gnome/src/dbus/dbus.h index b8c2cfc5d4..26a641d7a4 100644 --- a/gnome/src/dbus/dbus.h +++ b/gnome/src/dbus/dbus.h @@ -432,6 +432,12 @@ void dbus_add_participant(const gchar *callID, const gchar *confID); */ gchar **dbus_get_participant_list(const gchar *confID); +/** + * If thsi call participate to a conference, return the conference id + * Return an empty string elsewhere + */ +gchar *dbus_get_conference_id(const gchar *callID); + /** * Toggle recording for this instance, may be call or conference */ diff --git a/gnome/src/logger.h b/gnome/src/logger.h index 330503be82..849785432e 100644 --- a/gnome/src/logger.h +++ b/gnome/src/logger.h @@ -39,10 +39,13 @@ void set_log_level (const int level); #define LOG_INFO 3 #define LOG_DEBUG 4 -#define ERROR(...) internal_log(LOG_ERR, __VA_ARGS__) -#define WARN(...) internal_log(LOG_WARN, __VA_ARGS__) -#define INFO(...) internal_log(LOG_INFO, __VA_ARGS__) -#define DEBUG(...) internal_log(LOG_DEBUG, __VA_ARGS__) +#define INTERNAL_LOG(M, LEVEL, ...) internal_log(LEVEL, "%s:%d: " M, __FILE__, \ + __LINE__, ##__VA_ARGS__) + +#define ERROR(M, ...) INTERNAL_LOG(M, LOG_ERR, ##__VA_ARGS__) +#define WARN(M, ...) INTERNAL_LOG(M, LOG_WARN, ##__VA_ARGS__) +#define INFO(M, ...) INTERNAL_LOG(M, LOG_INFO, ##__VA_ARGS__) +#define DEBUG(M, ...) INTERNAL_LOG(M, LOG_DEBUG, ##__VA_ARGS__) /* Prints an error message and returns if the pointer A is NULL */ #define RETURN_IF_NULL(A, M, ...) \ diff --git a/gnome/src/main.c b/gnome/src/main.c index 2be022a769..7fa0f8fdbd 100644 --- a/gnome/src/main.c +++ b/gnome/src/main.c @@ -87,7 +87,7 @@ main(int argc, char *argv[]) textdomain("sflphone-client-gnome"); if (!sflphone_init(&error)) { - ERROR(error->message); + ERROR("%s", error->message); GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(get_main_window()), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, @@ -116,8 +116,8 @@ main(int argc, char *argv[]) status_bar_display_account(); sflphone_fill_history(); - sflphone_fill_call_list(); sflphone_fill_conference_list(); + sflphone_fill_call_list(); history_search_init(); // Update the GUI diff --git a/gnome/src/mainwindow.c b/gnome/src/mainwindow.c index c57a325fc2..26c3118fa7 100644 --- a/gnome/src/mainwindow.c +++ b/gnome/src/mainwindow.c @@ -130,6 +130,7 @@ main_window_ask_quit() question = _("There is one call in progress."); else question = _("There are calls in progress."); + DEBUG("Currently %d calls in progress", calllist_get_size(current_calls_tab)); GtkWidget *dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s\n%s", diff --git a/gnome/src/sflphone_const.h b/gnome/src/sflphone_const.h index 62e2887a86..728b60dce5 100644 --- a/gnome/src/sflphone_const.h +++ b/gnome/src/sflphone_const.h @@ -60,6 +60,10 @@ #define ACCOUNT_MAILBOX "Account.mailbox" #define ACCOUNT_USERAGENT "Account.useragent" #define ACCOUNT_REGISTRATION_EXPIRE "Account.registrationExpire" +#define ACCOUNT_REGISTRATION_STATUS "Account.registrationStatus" +#define ACCOUNT_REGISTRATION_STATE_CODE "Account.registrationCode" +#define ACCOUNT_REGISTRATION_STATE_DESC "Account.registrationDescription" + #define ACCOUNT_SIP_STUN_SERVER "STUN.server" #define ACCOUNT_SIP_STUN_ENABLED "STUN.enable" #define ACCOUNT_DTMF_TYPE "Account.dtmfType" @@ -104,10 +108,6 @@ #define PUBLISHED_PORT "Account.publishedPort" #define PUBLISHED_ADDRESS "Account.publishedAddress" -#define REGISTRATION_STATUS "Registration.Status" -#define REGISTRATION_STATE_CODE "Registration.code" -#define REGISTRATION_STATE_DESCRIPTION "Registration.description" - #define SHORTCUT_PICKUP "pickUp" #define SHORTCUT_HANGUP "hangUp" #define SHORTCUT_POPUP "popupWindow" diff --git a/gnome/src/sliders.c b/gnome/src/sliders.c index d34f3979a6..68009271a4 100644 --- a/gnome/src/sliders.c +++ b/gnome/src/sliders.c @@ -124,14 +124,14 @@ void set_slider_value(const gchar *device, gdouble newval) if (g_strcmp0(device, "speaker") == 0) { dev = DEVICE_SPEAKER; - DEBUG("Slider: Set value for speaker: %f\n", newval); + DEBUG("Set value for speaker: %f\n", newval); } else if (g_strcmp0(device, "mic") == 0) { dev = DEVICE_MIC; - DEBUG("Slider: Set value for mic: %f\n", newval); + DEBUG("Set value for mic: %f\n", newval); } else { - ERROR("Slider: Unknown device: %s", device); + ERROR("Unknown device: %s", device); return; } @@ -148,14 +148,14 @@ void set_slider_no_update (const gchar * device, gdouble newval) if (g_strcmp0(device, "speaker") == 0) { dev = DEVICE_SPEAKER; - DEBUG("Slider: Set value no update for speaker: %f\n", newval); + DEBUG("Set value no update for speaker: %f\n", newval); } else if (g_strcmp0(device, "mic") == 0) { dev = DEVICE_MIC; - DEBUG("Slider: Set value no update for mic: %f\n", newval); + DEBUG("Set value no update for mic: %f\n", newval); } else { - ERROR("Slider: Unknown device: %s", device); + ERROR("Unknown device: %s", device); return; } @@ -172,8 +172,6 @@ void set_slider_no_update (const gchar * device, gdouble newval) void toggle_slider_mute_microphone(void) { - DEBUG("Slider: Mute/Unmute toggle"); - switch(device_state) { case DEVICE_STATE_ACTIVE: value[DEVICE_MIC] = gtk_range_get_value(GTK_RANGE(slider[DEVICE_MIC])); @@ -185,7 +183,7 @@ void toggle_slider_mute_microphone(void) device_state = DEVICE_STATE_ACTIVE; break; default: - ERROR("Slider: Unknown state"); + ERROR("Unknown state"); break; } } diff --git a/gnome/src/uimanager.c b/gnome/src/uimanager.c index 8010757981..02768a7a8b 100644 --- a/gnome/src/uimanager.c +++ b/gnome/src/uimanager.c @@ -134,7 +134,7 @@ static void add_to_toolbar(GtkWidget *toolbar, GtkWidget *item, int pos) static void call_mute(void) { - DEBUG("UIManager: Mute call button pressed"); + DEBUG("Mute call button pressed"); sflphone_mute_call(); } @@ -143,7 +143,7 @@ static void update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging_enabled) { int pos = 0; - DEBUG("UIManager: Update actions for call %s", selectedCall->_callID); + DEBUG("Update actions for call %s", selectedCall->_callID); if(selectedCall == NULL) { ERROR("Selected call is NULL while updating toolbar"); @@ -158,7 +158,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging switch (selectedCall->_state) { case CALL_STATE_INCOMING: { - DEBUG("UIManager: Call State Incoming"); + DEBUG("Call State Incoming"); // Make the button toolbar clickable gtk_action_set_sensitive(pickUpAction_, TRUE); gtk_action_set_sensitive(hangUpAction_, TRUE); @@ -174,7 +174,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging } case CALL_STATE_HOLD: { - DEBUG("UIManager: Call State Hold"); + DEBUG("Call State Hold"); gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_widget_set_sensitive(holdMenu_, TRUE); gtk_widget_set_sensitive(offHoldToolbar_, TRUE); @@ -194,7 +194,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging } case CALL_STATE_RINGING: { - DEBUG("UIManager: Call State Ringing"); + DEBUG("Call State Ringing"); gtk_action_set_sensitive(pickUpAction_, TRUE); gtk_action_set_sensitive(hangUpAction_, TRUE); pos = 1; @@ -204,7 +204,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging } case CALL_STATE_DIALING: { - DEBUG("UIManager: Call State Dialing"); + DEBUG("Call State Dialing"); gtk_action_set_sensitive(pickUpAction_, TRUE); if (active_calltree_tab == current_calls_tab) @@ -229,7 +229,10 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging } case CALL_STATE_CURRENT: { - DEBUG("UIManager: Call State Current"); + DEBUG("Call State Current"); + g_signal_handler_block(transferToolbar_, transferButtonConnId_); + g_signal_handler_block(recordWidget_, recordButtonConnId_); + gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_action_set_sensitive(recordAction_, TRUE); gtk_action_set_sensitive(muteAction_, TRUE); @@ -249,18 +252,20 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging if (instant_messaging_enabled) { add_to_toolbar(toolbar_, imToolbar_, pos++); - g_signal_handler_block(transferToolbar_, transferButtonConnId_); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(transferToolbar_), FALSE); - g_signal_handler_unblock(transferToolbar_, transferButtonConnId_); - g_signal_handler_block(recordWidget_, recordButtonConnId_); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(recordWidget_), FALSE); + + g_signal_handler_unblock(transferToolbar_, transferButtonConnId_); g_signal_handler_unblock(recordWidget_, recordButtonConnId_); break; } case CALL_STATE_RECORD: { - DEBUG("UIManager: Call State Record"); + DEBUG("Call State Record"); + g_signal_handler_block(transferToolbar_, transferButtonConnId_); + g_signal_handler_block(recordWidget_, recordButtonConnId_); + gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_action_set_sensitive(recordAction_, TRUE); gtk_action_set_sensitive(muteAction_, TRUE); @@ -280,11 +285,10 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging if (instant_messaging_enabled) add_to_toolbar(toolbar_, imToolbar_, pos++); - g_signal_handler_block(transferToolbar_, transferButtonConnId_); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(transferToolbar_), FALSE); - g_signal_handler_unblock(transferToolbar_, transferButtonConnId_); - g_signal_handler_block(recordWidget_, recordButtonConnId_); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(recordWidget_), TRUE); + + g_signal_handler_unblock(transferToolbar_, transferButtonConnId_); g_signal_handler_unblock(recordWidget_, recordButtonConnId_); break; } @@ -292,7 +296,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging case CALL_STATE_FAILURE: { pos = 1; - DEBUG("UIManager: Call State Busy/Failure"); + DEBUG("Call State Busy/Failure"); gtk_action_set_sensitive(hangUpAction_, TRUE); add_to_toolbar(toolbar_, hangUpWidget_, pos++); break; @@ -317,7 +321,7 @@ update_toolbar_for_call(callable_obj_t *selectedCall, gboolean instant_messaging break; } default: - ERROR("UIMAnager: Error: Unknown state in action update!"); + ERROR("Unknown state in action update!"); break; } } @@ -327,7 +331,7 @@ static void update_toolbar_for_conference(conference_obj_t * selectedConf, gboolean instant_messaging_enabled) { int pos = 0; - DEBUG("UIManager: Update actions for conference"); + DEBUG("Update actions for conference"); // update icon in systray show_status_hangup_icon(); @@ -336,12 +340,12 @@ update_toolbar_for_conference(conference_obj_t * selectedConf, gboolean instant_ case CONFERENCE_STATE_ACTIVE_ATTACHED: case CONFERENCE_STATE_ACTIVE_DETACHED: - DEBUG("UIManager: Conference State Active"); - + DEBUG("Conference State Active"); + g_signal_handler_block(recordWidget_, recordButtonConnId_); if (active_calltree_tab == current_calls_tab) { gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_widget_set_sensitive(holdToolbar_, TRUE); - gtk_action_set_sensitive(recordAction_, TRUE); + gtk_widget_set_sensitive(recordWidget_, TRUE); pos = 1; add_to_toolbar(toolbar_, hangUpWidget_, pos++); add_to_toolbar(toolbar_, holdToolbar_, pos++); @@ -360,15 +364,16 @@ update_toolbar_for_conference(conference_obj_t * selectedConf, gboolean instant_ add_to_toolbar(toolbar_, playRecordWidget_, pos); } } - + g_signal_handler_unblock(recordWidget_, recordButtonConnId_); break; case CONFERENCE_STATE_ACTIVE_ATTACHED_RECORD: case CONFERENCE_STATE_ACTIVE_DETACHED_RECORD: { + g_signal_handler_block(recordWidget_, recordButtonConnId_); pos = 1; - DEBUG("UIManager: Conference State Record"); + DEBUG("Conference State Record"); gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_widget_set_sensitive(holdToolbar_, TRUE); - gtk_action_set_sensitive(recordAction_, TRUE); + gtk_widget_set_sensitive(recordWidget_, TRUE); add_to_toolbar(toolbar_, hangUpWidget_, pos++); add_to_toolbar(toolbar_, holdToolbar_, pos++); add_to_toolbar(toolbar_, recordWidget_, pos++); @@ -377,16 +382,17 @@ update_toolbar_for_conference(conference_obj_t * selectedConf, gboolean instant_ gtk_action_set_sensitive(imAction_, TRUE); add_to_toolbar(toolbar_, imToolbar_, pos); } - + g_signal_handler_unblock(recordWidget_, recordButtonConnId_); break; } case CONFERENCE_STATE_HOLD: case CONFERENCE_STATE_HOLD_RECORD: { - DEBUG("UIManager: Conference State Hold"); + DEBUG("Conference State Hold"); + g_signal_handler_block(recordWidget_, recordButtonConnId_); pos = 1; gtk_action_set_sensitive(hangUpAction_, TRUE); gtk_widget_set_sensitive(offHoldToolbar_, TRUE); - gtk_action_set_sensitive(recordAction_, TRUE); + gtk_widget_set_sensitive(recordWidget_, TRUE); add_to_toolbar(toolbar_, hangUpWidget_, pos++); add_to_toolbar(toolbar_, offHoldToolbar_, pos++); add_to_toolbar(toolbar_, recordWidget_, pos++); @@ -395,11 +401,12 @@ update_toolbar_for_conference(conference_obj_t * selectedConf, gboolean instant_ gtk_action_set_sensitive(imAction_, TRUE); add_to_toolbar(toolbar_, imToolbar_, pos); } + g_signal_handler_unblock(recordWidget_, recordButtonConnId_); break; } default: - WARN("UIManager: Error: Should not happen in action update!"); + WARN("Should not happen in action update!"); break; } @@ -603,7 +610,7 @@ help_about(void * foo UNUSED) static void call_new_call(void * foo UNUSED) { - DEBUG("UIManager: New call button pressed"); + DEBUG("New call button pressed"); sflphone_new_call(); } @@ -638,7 +645,7 @@ call_hold(void* foo UNUSED) callable_obj_t * selectedCall = calltab_get_selected_call(current_calls_tab); conference_obj_t * selectedConf = calltab_get_selected_conf(current_calls_tab); - DEBUG("UIManager: Hold button pressed"); + DEBUG("Hold button pressed"); if (selectedCall) { if (selectedCall->_state == CALL_STATE_HOLD) @@ -698,10 +705,10 @@ conference_hold(void* foo UNUSED) { conference_obj_t * selectedConf = calltab_get_selected_conf(current_calls_tab); - DEBUG("UIManager: Hold button pressed for conference"); + DEBUG("Hold button pressed for conference"); if (selectedConf == NULL) { - ERROR("UIManager: No conference selected"); + ERROR("No conference selected"); return; } @@ -731,7 +738,7 @@ conference_hold(void* foo UNUSED) static void call_pick_up(void * foo UNUSED) { - DEBUG("UIManager: Pick up"); + DEBUG("Pick up"); if (calllist_get_size(current_calls_tab) > 0) { sflphone_pick_up(); @@ -758,7 +765,7 @@ call_pick_up(void * foo UNUSED) static void call_hang_up(void) { - DEBUG("UIManager: Hang up button pressed(call)"); + DEBUG("Hang up button pressed(call)"); /* * [#3020] Restore the record toggle button * We set it to FALSE, as when we hang up a call, the recording is stopped. @@ -770,7 +777,7 @@ call_hang_up(void) static void conference_hang_up(void) { - DEBUG("UIManager: Hang up button pressed(conference)"); + DEBUG("Hang up button pressed(conference)"); conference_obj_t * selectedConf = calltab_get_selected_conf(current_calls_tab); if (selectedConf) @@ -780,23 +787,23 @@ conference_hang_up(void) static void call_record(void) { - DEBUG("UIManager: Record button pressed"); + DEBUG("Record button pressed"); sflphone_rec_call(); } static void start_playback_record_cb(void) { - DEBUG("UIManager: Start playback button pressed"); + DEBUG("Start playback button pressed"); callable_obj_t *selectedCall = calltab_get_selected_call(history_tab); if (selectedCall == NULL) { - ERROR("UIManager: Error: No selected object in playback record callback"); + ERROR("No selected object in playback record callback"); return; } - DEBUG("UIManager: Start selected call file playback %s", selectedCall->_recordfile); + DEBUG("Start selected call file playback %s", selectedCall->_recordfile); selectedCall->_record_is_playing = dbus_start_recorded_file_playback(selectedCall->_recordfile); update_actions(); @@ -805,23 +812,23 @@ start_playback_record_cb(void) static void stop_playback_record_cb(void) { - DEBUG("UIManager: Stop playback button pressed"); + DEBUG("Stop playback button pressed"); callable_obj_t *selectedCall = calltab_get_selected_call(history_tab); if (selectedCall == NULL) { - ERROR("UIManager: Error: No selected object in history treeview"); + ERROR("No selected object in history treeview"); return; } if (selectedCall) { if (selectedCall->_recordfile == NULL) { - ERROR("UIManager: Error: Record file is NULL"); + ERROR("Record file is NULL"); return; } dbus_stop_recorded_file_playback(selectedCall->_recordfile); - DEBUG("UIManager: Stop selected call file playback %s", selectedCall->_recordfile); + DEBUG("Stop selected call file playback %s", selectedCall->_recordfile); selectedCall->_record_is_playing = FALSE; } @@ -839,14 +846,15 @@ remove_from_history(void * foo UNUSED) { callable_obj_t* call = calltab_get_selected_call(history_tab); - DEBUG("UIManager: Remove the call from the history"); + DEBUG("Remove the call from the history"); if (call == NULL) { - ERROR("UIManager: Error: Call is NULL"); + ERROR("Call is NULL"); return; } calllist_remove_from_history(call); + update_actions(); } static void @@ -854,10 +862,10 @@ call_back(void * foo UNUSED) { callable_obj_t *selected_call = calltab_get_selected_call(active_calltree_tab); - DEBUG("UIManager: Call back"); + DEBUG("Call back"); if (selected_call == NULL) { - ERROR("UIManager: Error: No selected call"); + ERROR("No selected call"); return; } @@ -890,14 +898,14 @@ edit_copy(void * foo UNUSED) GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); callable_obj_t * selectedCall = calltab_get_selected_call(current_calls_tab); - DEBUG("UIManager: Edit/Copy"); + DEBUG("Edit/Copy"); if (selectedCall == NULL) { - ERROR("UIManager: Error: No selected call", selectedCall); + ERROR("No selected call", selectedCall); return; } - DEBUG("UIManager: Clipboard number: %s\n", selectedCall->_peer_number); + DEBUG("Clipboard number: %s\n", selectedCall->_peer_number); gtk_clipboard_set_text(clip, selectedCall->_peer_number, strlen(selectedCall->_peer_number)); } @@ -971,7 +979,7 @@ edit_paste(void * foo UNUSED) gchar * old = selectedCall->_peer_number; selectedCall->_peer_number = g_strconcat(old, no, NULL); g_free(old); - DEBUG("UIManager: TO: %s", selectedCall->_peer_number); + DEBUG("TO: %s", selectedCall->_peer_number); g_free(selectedCall->_peer_info); selectedCall->_peer_info = g_strconcat("\"\" <", @@ -1324,7 +1332,7 @@ show_popup_menu(GtkWidget *my_widget, GdkEventButton *event) conference_obj_t * selectedConf = NULL; if (calltab_get_selected_type(current_calls_tab) == A_CALL) { - DEBUG("UIManager: Menus: Selected a call"); + DEBUG("Menus: Selected a call"); selectedCall = calltab_get_selected_call(current_calls_tab); if (selectedCall) { @@ -1360,13 +1368,13 @@ show_popup_menu(GtkWidget *my_widget, GdkEventButton *event) hangup = TRUE; break; default: - WARN("UIManager: Should not happen in show_popup_menu for calls!") + WARN("Should not happen in show_popup_menu for calls!") ; break; } } } else { - DEBUG("UIManager: Menus: selected a conf"); + DEBUG("Menus: selected a conf"); selectedConf = calltab_get_selected_conf(active_calltree_tab); if (selectedConf) { @@ -1383,7 +1391,7 @@ show_popup_menu(GtkWidget *my_widget, GdkEventButton *event) hangup_or_hold_conf = TRUE; break; default: - WARN("UIManager: Should not happen in show_popup_menu for conferences!") + WARN("Should not happen in show_popup_menu for conferences!") ; break; } @@ -1393,7 +1401,7 @@ show_popup_menu(GtkWidget *my_widget, GdkEventButton *event) GtkWidget *menu = gtk_menu_new(); if (calltab_get_selected_type(current_calls_tab) == A_CALL) { - DEBUG("UIManager: Build call menu"); + DEBUG("Build call menu"); if (copy) { GtkWidget *menu_items = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, get_accel_group()); @@ -1500,7 +1508,7 @@ show_popup_menu(GtkWidget *my_widget, GdkEventButton *event) } } else { - DEBUG("UIManager: Build conf menus"); + DEBUG("Build conf menus"); if (hangup_or_hold_conf) { GtkWidget *menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up")); diff --git a/gnome/src/widget/imwidget.c b/gnome/src/widget/imwidget.c index 130510e3af..bf03d84310 100644 --- a/gnome/src/widget/imwidget.c +++ b/gnome/src/widget/imwidget.c @@ -29,6 +29,7 @@ #include "imwindow.h" #include "logger.h" +#include "gtk2_wrappers.h" #include "imwidget.h" #include "dbus.h" #include "unused.h" diff --git a/kde/CMakeLists.txt b/kde/CMakeLists.txt index 30f36bf1da..5c3b446632 100755 --- a/kde/CMakeLists.txt +++ b/kde/CMakeLists.txt @@ -14,6 +14,9 @@ FIND_PACKAGE ( KdepimLibs REQUIRED ) FIND_PACKAGE ( KDE4 REQUIRED ) FIND_PACKAGE ( Qt4 REQUIRED ) +set(AKONADI_MIN_VERSION 1.0) +find_package(Akonadi QUIET NO_MODULE ${AKONADI_MIN_VERSION}) + INCLUDE ( KDE4Defaults ) MESSAGE("cmake install prefix is : ${CMAKE_INSTALL_PREFIX}") @@ -31,9 +34,7 @@ add_subdirectory(man) add_subdirectory(po) add_subdirectory(plasma) -# make dist target, see: -# https://agateau.wordpress.com/2009/08/09/cmake-and-make-dist-the-simple-version/ -set(PROJECT_VERSION "1.0.0") +set(PROJECT_VERSION "1.1.0") set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}) add_custom_target(dist COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD diff --git a/kde/data/sflphone-client-kdeui.rc b/kde/data/sflphone-client-kdeui.rc index c91fd23094..ca0c824b32 100755 --- a/kde/data/sflphone-client-kdeui.rc +++ b/kde/data/sflphone-client-kdeui.rc @@ -1,44 +1,45 @@ <?xml version="1.0" encoding="UTF-8"?> -<!--<gui name="tutorial3" - version="1" - xmlns="http://www.kde.org/standards/kxmlgui/1.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 - http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" > - --> + <!--<gui name="tutorial3" + version="1" + xmlns="http://www.kde.org/standards/kxmlgui/1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 + http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" > + --> <gui name="sflphone-client-kde" version="1"> - <MenuBar> - <Menu name="Actions" > - <text>Actions</text> - <Action name="action_accept" /> - <Action name="action_refuse" /> - <Action name="action_hold" /> - <Action name="action_transfer" /> - <Action name="action_record" /> - <Action name="action_mailBox" /> - <Separator /> - <Action name="action_close" /> - <Separator /> - <Action name="action_quit" /> - </Menu> - <Menu name="Settings" > - <text>Settings</text> - <Action name="action_displayVolumeControls" /> - <Action name="action_displayDialpad" /> - <Separator /> - <Action name="action_configureShortcut" /> - <Action name="action_configureSflPhone" /> - <Separator /> - <Action name="action_accountCreationWizard" /> - </Menu> - </MenuBar> - - <ToolBar name="mainToolBar" iconText="icononly" position="Top" noMerge="1" fullWidth="false" newline="true" > - <Action name="action_accept" /> - <Action name="action_mailBox" /> - <Action name="action_refuse" /> - <Action name="action_hold" /> - <Action name="action_transfer" /> - <Action name="action_record" /> - </ToolBar> + <MenuBar> + <Menu name="Actions" > + <text>Actions</text> + <Action name="action_accept" /> + <Action name="action_refuse" /> + <Action name="action_hold" /> + <Action name="action_transfer" /> + <Action name="action_record" /> + <Action name="action_mailBox" /> + <Separator /> + <Action name="action_close" /> + <Separator /> + <Action name="action_quit" /> + </Menu> + <Menu name="Settings" > + <text>Settings</text> + <Action name="action_displayVolumeControls" /> + <Action name="action_displayDialpad" /> + <Action name="action_displayMessageBox" /> + <Separator /> + <Action name="action_configureShortcut" /> + <Action name="action_configureSflPhone" /> + <Separator /> + <Action name="action_accountCreationWizard" /> + </Menu> + </MenuBar> + + <ToolBar name="mainToolBar" iconText="icononly" position="Top" noMerge="1" fullWidth="false" newline="true" > + <Action name="action_accept" /> + <Action name="action_mailBox" /> + <Action name="action_refuse" /> + <Action name="action_hold" /> + <Action name="action_transfer" /> + <Action name="action_record" /> + </ToolBar> </gui> diff --git a/kde/doc/index.docbook b/kde/doc/index.docbook index dc19819589..e33d6fe411 100755 --- a/kde/doc/index.docbook +++ b/kde/doc/index.docbook @@ -2,7 +2,7 @@ <!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [ <!ENTITY sflphone-client-kde "SFLPhone KDE Client"> <!ENTITY kappname "&sflphone-client-kde;"> - <!ENTITY sflphonerelease "0.9.6"> + <!ENTITY sflphonerelease "1.1.0"> <!ENTITY current-w "Current calls window"> <!ENTITY history-w "Call history window"> <!ENTITY address-w "Address book window"> diff --git a/kde/plasma/CMakeLists.txt b/kde/plasma/CMakeLists.txt index a671e1337f..d6bf292a7c 100644 --- a/kde/plasma/CMakeLists.txt +++ b/kde/plasma/CMakeLists.txt @@ -1,4 +1,3 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -add_subdirectory(dataengine) -add_subdirectory(plasmoid) +add_subdirectory(plasmoid-qml) diff --git a/kde/plasma/dataengine/sflphonEngine.cpp b/kde/plasma/dataengine/sflphonEngine.cpp deleted file mode 100644 index 4c7c51c90c..0000000000 --- a/kde/plasma/dataengine/sflphonEngine.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "sflphonEngine.h" - -#include <Plasma/DataContainer> - -#include "../../src/lib/Call.h" -#include "../../src/lib/dbus/metatypes.h" -#include "../../src/lib/instance_interface_singleton.h" -#include "../../src/lib/configurationmanager_interface_singleton.h" -#include "../../src/lib/callmanager_interface_singleton.h" -#include "../../src/lib/sflphone_const.h" - -SFLPhoneEngine::SFLPhoneEngine(QObject* parent, const QVariantList& args) - : Plasma::DataEngine(parent, args) -{ - Q_UNUSED(args) - m_pModel = new CallModelConvenience(CallModelConvenience::ActiveCall); - m_pModel->initCall(); - m_pModel->initHistory(); - - CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); - - connect(m_pModel , SIGNAL( callStateChanged(Call*)) , this , SLOT(callStateChangedSignal(Call*) )); - connect(&callManager , SIGNAL( incomingCall(Call*)) , this , SLOT(incomingCallSignal(Call*) )); - connect(&callManager , SIGNAL( conferenceCreated(Call*)) , this , SLOT(conferenceCreatedSignal(Call*) )); - connect(&callManager , SIGNAL( conferenceChanged(Call*)) , this , SLOT(conferenceChangedSignal(Call*) )); -} - -bool SFLPhoneEngine::sourceRequestEvent(const QString &name) -{ - if ( name == "history" ) { - updateHistory(); - } - else if ( name == "calls" ) { - updateCallList(); - } - else if ( name == "conferences" ) { - updateConferenceList(); - } - else if ( name == "info" ) { - updateInfo(); - } - return true;//updateSourceEvent(name); -} - -bool SFLPhoneEngine::updateSourceEvent(const QString &name) -{ - Q_UNUSED(name) - return true; -} - -QStringList SFLPhoneEngine::sources() const { - QStringList toReturn; - toReturn << "calls" << "history" << "conferences" << "info"; - return toReturn; -} - -QString SFLPhoneEngine::getCallStateName(call_state state) -{ - if (state == CALL_STATE_INCOMING) { - return I18N_NOOP("Ringing (in)"); - } else if (state == CALL_STATE_RINGING) { - return I18N_NOOP("Ringing (out)"); - } else if (state == CALL_STATE_CURRENT) { - return I18N_NOOP("Talking"); - } else if (state == CALL_STATE_DIALING) { - return I18N_NOOP("Dialing"); - } else if (state == CALL_STATE_HOLD) { - return I18N_NOOP("Hold"); - } else if (state == CALL_STATE_FAILURE) { - return I18N_NOOP("Failed"); - } else if (state == CALL_STATE_BUSY) { - return I18N_NOOP("Busy"); - } else if (state == CALL_STATE_TRANSFER) { - return I18N_NOOP("Transfer"); - } else if (state == CALL_STATE_TRANSF_HOLD) { - return I18N_NOOP("Transfer hold"); - } else if (state == CALL_STATE_OVER) { - return I18N_NOOP("Over"); - } else if (state == CALL_STATE_ERROR) { - return I18N_NOOP("Error"); - } - return ""; -} - -void SFLPhoneEngine::updateHistory() -{ - foreach (Call* oldCall, m_pModel->getHistory()) { - historyCall[oldCall->getCallId()][ "Name" ] = oldCall->getPeerName(); - historyCall[oldCall->getCallId()][ "Number" ] = oldCall->getPeerPhoneNumber(); - historyCall[oldCall->getCallId()][ "Date" ] = oldCall->getStopTimeStamp(); - setData("history", I18N_NOOP(oldCall->getCallId()), historyCall[oldCall->getCallId()]); - } -} - -void SFLPhoneEngine::updateCallList() -{ - foreach (Call* call, m_pModel->getCalls()) { - if ((!m_pModel->isConference(call)) && (call->getState() != CALL_STATE_OVER)) { - currentCall[call->getCallId()][ "Name" ] = call->getPeerName(); - currentCall[call->getCallId()][ "Number" ] = call->getPeerPhoneNumber(); - currentCall[call->getCallId()][ "StateName" ] = getCallStateName(call->getState()); - currentCall[call->getCallId()][ "State" ] = call->getState(); - setData("calls", call->getCallId(), currentCall[call->getCallId()]); - } - } -} - -void SFLPhoneEngine::updateConferenceList() -{ - foreach (Call* call, m_pModel->getCalls()) { - if (m_pModel->isConference(call)) { - CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); - currentConferences[call->getConfId()] = callManager.getParticipantList(call->getConfId()); - setData("conferences", call->getConfId(), currentConferences[call->getConfId()]); - } - } -} - -void SFLPhoneEngine::updateContacts() -{ - -} - -void SFLPhoneEngine::updateInfo() -{ - qDebug() << "Currentaccount: " << m_pModel->getCurrentAccountId(); - setData("info", I18N_NOOP("Account"), m_pModel->getCurrentAccountId()); -} - -void SFLPhoneEngine::callStateChangedSignal(Call* call) -{ - Q_UNUSED(call) - updateCallList(); -} - -void SFLPhoneEngine::incomingCallSignal(Call* call) -{ - Q_UNUSED(call) - updateCallList(); -} - -void SFLPhoneEngine::conferenceCreatedSignal(Call* conf) -{ - Q_UNUSED(conf) - updateConferenceList(); -} - -void SFLPhoneEngine::conferenceChangedSignal(Call* conf) -{ - Q_UNUSED(conf) - updateConferenceList(); -} - -void SFLPhoneEngine::incomingMessageSignal(const QString& accountId, const QString& message) -{ - Q_UNUSED(accountId) - Q_UNUSED(message) - //TODO -} - -void SFLPhoneEngine::voiceMailNotifySignal(const QString& accountId, int count) -{ - Q_UNUSED(accountId) - Q_UNUSED(count) - //TODO -} - -void SFLPhoneEngine::accountChanged() -{ - -} - -K_EXPORT_PLASMA_DATAENGINE(sflphone, SFLPhoneEngine) diff --git a/kde/plasma/dataengine/sflphonEngine.h b/kde/plasma/dataengine/sflphonEngine.h deleted file mode 100644 index 9a234f2540..0000000000 --- a/kde/plasma/dataengine/sflphonEngine.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ - -#ifndef SFLPHONEENGINE_H -#define SFLPHONEENGINE_H - -#include <Plasma/DataEngine> -#include <QHash> - -#include "../../src/lib/CallModel.h" - -typedef QHash<QString,QVariant> HashStringString; -class Call; - -class SFLPhoneEngine : public Plasma::DataEngine -{ - Q_OBJECT - - public: - SFLPhoneEngine(QObject* parent, const QVariantList& args); - virtual QStringList sources() const; - - protected: - bool sourceRequestEvent(const QString& name); - bool updateSourceEvent(const QString& source); - - private: - QHash<QString, HashStringString > historyCall ; - QHash<QString, HashStringString > currentCall ; - QHash<QString, QStringList> currentConferences ; - CallModelConvenience* m_pModel; - QString getCallStateName(call_state state); - void updateHistory (); - void updateCallList (); - void updateContacts (); - void updateConferenceList (); - void updateInfo(); - private slots: - void callStateChangedSignal (Call* call); - void incomingCallSignal (Call* conf); - void conferenceCreatedSignal (Call* conf); - void conferenceChangedSignal (Call* conf); - //void conferenceRemovedSignal(const QString& confId); - void incomingMessageSignal( const QString& accountId, const QString& message ); - void voiceMailNotifySignal( const QString& accountId, int count ); - void accountChanged(); -}; - -#endif // SFLPHONEENGINE_H diff --git a/kde/plasma/plasmoid-qml/CMakeLists.txt b/kde/plasma/plasmoid-qml/CMakeLists.txt new file mode 100644 index 0000000000..ca220e06a3 --- /dev/null +++ b/kde/plasma/plasmoid-qml/CMakeLists.txt @@ -0,0 +1,11 @@ +project(sflphone-qml) + +find_package(KDE4 REQUIRED) + +include(KDE4Defaults) + +install(DIRECTORY package/ + DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.sflphone) + +install(FILES package/metadata.desktop + DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-sflphone.desktop) \ No newline at end of file diff --git a/kde/plasma/plasmoid-qml/package/contents/images/configure.svgz b/kde/plasma/plasmoid-qml/package/contents/images/configure.svgz new file mode 100644 index 0000000000000000000000000000000000000000..548cfcd9884ebb1ee8df577ca5d8b2281dab40f7 GIT binary patch literal 13090 zcmb2|=3sz;x3$^D(w5Vne*YyJ^L6^l2&2~Ok7ZM{m9|->B`K{+RxaC>Y+trQ<<hln zI#wFHa;~qxUp%oUWs;`R<fcj6g2L=o1Uyyv^xiQau>JA#{{EUB(tizOZSI_Ve?Kl@ zp`P32->-k3efxL!cJco|e%JdPI{G59vb4Uq)O`Q^eS3GzkN@*q-~P`Zd$q|I*LT0X zT2y8Ht7dnN{jc@E>uqD=Yv=U+d;7QO=f|^8pFTf7zx#G*qG9}=-G2&AX8!qfnBU(1 z&&PM|7c*MQ-pk*+6SIGBgzblqmmlec?%BC-&OKjypZC-Gr-xj4dUV^buiJiY-BS1a z_?N1G4-fzOr)XRG|HE{zr$^7`1V`U{w%Kp0#<7Z(KPFW+Nlk8F|NZo8{mH);R~%pF z9;sQ{d48Me?W<LvpYjFR{4#oZIqP-9f8~F>D-&V^Y|hy0u3K(wW2yUY`RUX9|NUJ* zn_qp^j>vl<`_g*r*517};ZA(*47-{=yXM)&tUG=A^Zfk$Y3~(zWiHKszkK`qd-~h! z@88?A*Wtg1_WXZw`w!0Um09Uj99jBx>(zcAjS|Pjt~>{qdYOJ)UHkCtpQw8u-yZ$? zr>^YxyUR&Y3m)3Pj<@~4<<F1IpXXmrfBI$LAGt4UFJ1gnSd|xC@sWGq!{@VKzH!{Q z^3B9Qt$IhlNZQ@4`R~5x-tm`PIie$Xe`-3tzA1n2Dn0hZkk|i?*Vj4Tch7e__n>~o z#$(qvu{qX#s9&}5-26-lzMAu|MAbeYeY-n4Vd5)Ey*YnAe@(ye+UxlmQ}M;8L*FY- zy1e>mz23UKJVU|N{#WcTUTYUks(6)X`G3bc?kUsa-#7G$_^o?h{`u(a{V^N={F&1A zY{H(~Pp_MQxqS57%%3^m3|iN$^opEhZnH2qV77VA<y#>q{kyNN*lBw2QDNl!vh*oi zUN>CgJ$?S9#>)$wOOIWPYEB8Uo8VE-kSX@`dCG(nWz3yVo~HyV)hl_u&g{Lu<FH9> zbz$lEpRZmYKKj_eifb8n&&&Ir28(pBa~@lEEhJjvV$=&>x3Xp3N!3C<Z*t6!ep8XS zcxz?XTI-%$3@7##OgUCH#XWPKf8!OsGKZk0_3GYBzFpxwx$K!$$C7VW(`6I0o8Izj zm^`ay;W~TtpNn7hvwIU<l9#!wT%2=Stw_e?Yntwb8Shv^I38-<2yS#LHWLqcviAL= zBlB29q_}Oh3^Vm+3n{zE$4<F%xxp#<?vxo@uSM5t1!TMnQQgKr<=wOQW_*Q`vex3! z%FA|F?eiDby}SIicgha)`{KPX<>tm`>P1KRpL+Fg%gjy7W}8({x;6dTrc7h;73Pga zjk`}yo_Ff}O2f<t|C%(Vt<RoT-<fPyHfNfDP(g<7?KLJ(s=F;NhM60GP)T&o{u{~Y zyKcMX>XY9ym@h<`B|g59IrBxPV35rgpOBSLXYJdd!0bM6&fXV)+8n-}oVDP>MNRph zyf?XtHzaa<^WSVcy`YmzeyZ}@*%$TJm@oZ*kK;un>(^7!MUTyYKM4IW(Z6ADKp^|^ zM&k$ft?qQ&uH!TMb^ZPuLt816Ez<&z7fipqc)6}#NB2di8(T9)$~e23GHWAl$X~qo zcWpy>?d<2%3tt&k`A;c)we9<N7s=;xi9CT{*^)c%DEBDNl1qHECH}ujtdP~a>-M=p z?UTR1_HVrSO)PoAS~>Hr7jCUIbYu3~b$ZUyFYi;Pd}*|dUMVV9*mtqe-+fN9d1>(e z^`X0X_%wfJUiSR4<WtzXjhoj!4m;WVXHG>8<AS-X7D%}`m0CVAd^-E}?AMcBosOC* zIr=V-RY?fE_d<ZL`-pPzZr{zjHr_m-_vu&0-Nk3`oymK2HuLN)<-_+b+}b*AzI$}_ zDxZx1D`u_8xo+xr=Urgv@t?E!*2K=WD&F$`;+E{&kJHw^EnR=@+3i(VcXdC#rem+Z zcnN>RyIkGNdlDAcTw-w-xo|ee>vHYto6BxKW9?Qp`ye>=PYC-{LFpIF+C`^K7G+z> zmE>HT>3h~~X--G)>cCqilWS^K?bWpf?mp&JzWY40zmC5;#pd<GmB9+9J{22zT`?5M z%~;FqHRb&I$H#N4$|95QAN#s~_a)Km^PP^&kPEC%dGega^z_2Wvy--8bhmr-{9)!F z8_(NW>h^Dy_(XX#uS*mayjbyl%AYM+W(sEv9c?e=%(ms{JDV8Gp(XK0{rwF)*M`~s z5w^2u&nW7?w<q2wJzxLdr3ak0cFl%WxBKs}<@#S(zq_WQ`s2&QT|e?YWq#fN{=Z^I zp7i4F;==rfT#8}OE{BU)$5&*hEXva|*1FwsYKiu5z4)C`KO^i;1@F?AdX?}!_V~N? z*?(&bOaB|p*0<ZUH{#U#^6=9y_xpA{xafGf=j8tgXP?<hLeas8wPzj5Uc7hh!_>7k ztl?%qSk~p<ecs}I=APpYC;I})=na9_t{?3Vh?Fie-SKU8S3zN-#@pt3!n%vAoKH{u zs(0mq5?^bO+Pi~Wqo*%jr|Z;nb#d?cM)A*ydv+{8`GVVJc2>GsmA27iEjPChml!K% zo)Qt=v1C<$U*Gdfw%ReVq2<gm^6RE`-_}2nWwX#pS?p?|m7@K!Lz3d6kNM4ywd?Hb z`Mjrpsk4lz=8v)nDeuNVmIt=DA9$0+;bon{<tkJjVx6CqC^LIUGOP2!Q%C2Xv(C^z z5MrxU-FL1$^!3Wmer@+oHU7JG;kVP#9g9n6y_)9y{-k#Oy?eLUWX<9_?Kit&X0pLb zlfO5(OfO#53JbZUc*CW>Z~<4&C%5qO%Ea4+b6@!~Y~#6AwX`nd4R_HD)<rdsB9fQg znDMV5IdsW|V?DWz|4scGwkG!`JzKH;L0rAyo;?xfM$zG)f4#oloxr8$@pD_rwpD9* zmaGrbnOZ9NKr~$Jo%p0Jc|2>9uQuDWKl&+Br+q|S?%<+tHVH?JTi9a-mN#vgae0YN zTW3WZ$KuI7izC>D?-VGOOTLL$KOuSaUW9GJiRx{0mu)C`zE^skT6yhlKdq+b>0<0U zPi&?Ak4*G=)28#JR@%QL`u73mZvwUFk4<)6JE4o&ZBP2`pItlN-!F4xw_$&y@arG5 zzuOx7g#4r5^R1tzG;kkowfT}`eKC9el<mxJd%o|utRXJSd%dh}UhZ=Jrp{wLk{|E+ zrt{pZG)`E1Y5PkP)&o3Q2NKh5nqQhM`BTtp^DW0}<pr<JavL@aRh!LS-*J4Nue$h~ z9GOkda@A&YJ3b4(<f{m83VA;*SaYXq;(?Cud6vyGizEyl?3MP*?|t-8ZlS`}%@41% zem|qhAf@%lR@yIE<K`Rb4L!l{t><1_RI%grW0$?_ud$^z$-jH)yy%|p@{LXjb_qwS z<JbOOCQ#p2!mfCKrP991?;J|JHnk^5KINNwZn=+mxP*9atFz-Ku?tQMEoSYVVv{>{ z)t#&lGLO_!LfVh?8cS_F)TvN;LX7+Wd};p=vp?%C^>=-(DE7Eh_wuSI=J7KUd}6OD ziK|(yQmN=zA$ek5XUI+KS*F+KnqCw2ES^xlc9E_A4av9RY8#SW<|MsNC>C6^s)+fF z)a!Fnuj{N6(oJF`54iOtEiinvE=4$CZH3w9W4ksV+jXDshUD5Xu?@b0rrOEn2g7Eq z++=H>y~a9w&F{AjbM>z@^9G%=^gF)!XmCUMfesT98`j(><qy`Zomvvn_9If)Gr+1s z{;k|2H)X4bv9XUr*9g@?tTa>pC!^P7>%rx?YxPtS@y02WC1$>kd|@W`X6r_4y(X?h zGtYk2DameKWF7J%_xz=w>%vyQ*`qfnxbM~6?X6~R7xSJUO;uS|^?c<Amq*^V>Ccl} z4=&vJdHID#3m-N9{`K!<vUGhe?w)yox3qPt!_tKNHu*{gChk`CUVIic4-(d{%i&i) zAF)n4D0E+s{_2qO^xk#-dlnwzvcLG5Eoq}rrfKF)nJaSAy4;VC&RL}QbWOTpX38Ar zKdOxq>~4V*?xbnduZYsHP2IaXJEB|Tkh@Xob&1O=F8&+eNm++#{7Bs;*Ai(tE4g;f z?qk~mQZ9V@yy$HE#dD6ln;d7~RJtI_?v(j{?F=1tb?-=?Sz1kQ7ue4qlooMk-G1os z57yX&zaKtMsw(}w{pF{>F>z&9lliW@D?gHSi0to7eW9}~bj@yw-&51iPOX;ie{lHW z#}hlRu<0`&JG<nv=Lg+I!Kr>iZnjI$YzWj8<zMuEiukHt+46Hgm|ke!E7VI!YT{D7 zw!tm7qQCC`++xPOtlYnhlT{{Gv3x(n7i;t8LaK_MVAdqATa#mV@b;{VDGJ?W_{1?f zc#X$pw%pW{a<10<L%qX)$ZX1*`li?A29vt?Z!OuCH?%Ewvw1~d{i&|BY}w|%S8vSK zoYrny8L-c$R77;2z(L;Lsejh|H`ug6%)&=K>RX8}Tjc+WFb!+@2=N1JZ&-#ujqrTq z;})_csC1o4x08Fyt2^;xUC|szzb`*q&hu0=&P-X%`OK47`@}Y;D6V=iUuE}wohj}b ze@>M8<<@zM)V=tp-5OsVWOd-H*Td_KYh_;UJ-qM(bKH87y15Tdc|APdT6*!;hNKV4 z-3J2rTMqI^@J&C+KUdzMSw80Mny4u5@2ZRTh@X3)?yg#N>>)>xO@p!aTj9MA5A1H& zpA-D!tF&cJA>WD3dbL}cWHze*J~(d?^Ak&diLH%uxZgJ$HQQ==>18`*Sf6lSvVwiK z0EBZ?X?fqDgwIh7mG_@bet6LRbhGVO{u95==Zh>}esB^W^QV7j)o-bo-&hjhaBu(5 zDY3@3G3po7&vNB1k5Gy(I$SDLdu_{w@DtIF_qP8`v7G&mU8eTenwbl86|OVfRCpwB z@T7LO{}inT!-S)gOwG6OK3R6*$SvM!CEOFf%hy&te>_3({r##c@k0g0=NK#RUkm=y z)oF7_mg~Ny?U$F=E+3AU{7|&>{LCr0F1f21l^uwyJa^{Gwm8cKX@du~x6d79zPJBr zh?<*y!s(fY{#&>9NcSDyyQ`<>xyx0ae+%z$S=>3xdEe6Z+smN76_@#^$4gK6o^R88 zy|108^8YjAsMB>js(;%hGZk5%SSzFWoKb%H2g%J7ZhKjBZI#_{e3I$K9lTHcF6}wg zu)X<Hn)LSKh#G~zYXi>AW&ZTf+;+d_iTR4Gj|^7JE6D4umaqJM>eY4S8|&B9**5(} zWomDftu&7bvoERJv8L|DpMuE07k)n6^lRezgWo=$dbQp0x58@qpE5a$>(|unjQDFH zSE+v?z{x%Mo_fPc+0x1lwTEB3voKz3e)@It^s_tP1Rt*6#BT9s!qv9+({I@Kd_Jlj zyW`xdG9&fb4<Z+yNmuu8HB#Ss*K*+*$77#dG>U`t=81aE<@NfJW#^K%_fXN-<1J2t zC)+yiD~0I1{Nc3l%yMo2)=x)$K2(%x>=)i#+_TGg&K8x=Nh_?KpS#Xv^OWK%O@Fbc zr&uXQziF58m!sUjomN;o#~<0C-@MB>CFb?afUbPQ)IG7XMFkugms?LYKX}J8S3E0D zpgjG>o}5pUc33<2x%RBRHSw*O=wt8Y?|3AyYhMzTy69FmX9~aghwil>zY2#5|8Nc4 zEx>-dMbt<yXUh>8J#j~!_G%}~Crel4Hd=~LC=|cjaMb4WTbtuYW5n-8F0)85JYSWt zjrUp58j)IU^|bSimG{*|&ZTusxv`#oRn(_RSGEZk3pw>OuAa6>XREG3Icv(D84rV& zwe8W_ntSAqXq?%~%mXvN=Q=)|U0k3kT(e@r_gn{d{>n4n!MF8TdVS3JrfX|Fd%7}L z^%>I<^T}t*_)b)tF9_LiE$cw$CPV$e+|^UXj$Y)q5Vv`zx+<4(r<+O2V##&0B|ZyX z-S#<B<l)vf?WdKUS<#MiDjyRL=y}I2yEQFu(FUI%jM>wSZ}_jRmDn`nd#-&XpJ0Y* z%(v|`rmy-Y`pIm<_gwpjs#Ug6vX3RjZMzkw*S)dsgkMtJu3KRp#+#)+d~G$<kImH% zUB~>>;6dryJtbS$DyZ+=oO~c#r}AZ1v_l@(>ZVQ1Wf7k)UES6cbHn0F!OG*wAl-IK z(my(w&E|ttc~)L2JRxpy6r_8OOQP08#@C<rlx)2(|K$7xfx?!P#%0e|*E;&lGgL2r zqdob#;RfSb8^YDjD<{+!%WT!3aniUBN~b+pQJeZnN6_9UP10KU>OKXv^EYN%d}B4N zJT{rbIgVp;x=rWdudN1^$7G(!ulJcJy@lTx#8zDIGw<dMn`Ae+=t;dAWqQ*jy<!A1 zeST?8UfyZYVH2Zve#XQ*D!RWzKFoW=n8$T3(E9sYgUWf1cT-Y6O<7#wra7PQY2=ED z9*geHZCae%n#3!0`@)UG?>8TNz42;m<I|;#nzNIaT}xNlkz6>__e!QoONRQ<eyM}J zY>bDS4Ac}>HJ;jjuH8^mJ0!J6FSwd*{W{~L&Ux$C9o0y>#jwx9ucq}Hr|ZLA8NrL@ z8VI!;Y^&%_Fl>3wBVv`l{W+gV(ZW?iZ)Ltr(Y_)1be{ON<b&x;cR%N}Gd{?5eHn+= zuO-uaKK&?9OE|xG$wcmmV;+${|2OI>o$h^6@TuPB^{<#S8RraM&b-<3@z-{jv+I~@ zI;Xr|r24sDCTXE!jLv?Af-k>fvWxdFKC6|yYsC&8pUkeV<7YA>L!@`;Z{mCPG$@Cq zJ3!AcYCgwj=A8y}mZmr4{$`a{v|>8^;8?)?M>pPZeLH<OnDN?Arw?Hf?F`c;^74bU zABFIwZJr<+cs^pc6BA>`JEqw3nr*Qk?wyZjcwKyd&aAVaAC#D{liTdNWBu9BRweB# z&(5?m4%w%YRUC1eM?0f=p&5IOt>MA_ELp|NWJG!oFEnG1vkg4BpCjw@tmXep-aFsn z<<D1^{o-@wnPXoBU(2mID~+E&JiXA&{ki|6(t61&&wMN^7_zTCJ9VLJ(Tk@=vzfQ8 zIjJMK&wOI+e9LgYRUYp@=Sc6E*qqAA`YdvD<gG+L`$M-6F57JIT=jEybESajq9#c# zZ*GJ0v(8^)D-O<Rjc1$P#C>M-v*v9FW0?JxUr8`N+gN$uYzo)6g?sjAteEgU&uQm| zgFF!@K2Q3&Rj8;-D)424;`_UGUGp`bC$sld-v2h4D}5_x^WGIq6Tau$vGf0wJhQye zd7rck$A&8LVqqrUX_0&#^AFZ-n)6$B)0FuK>zK|xEDB@#RIKxmO}NcFiu25Gvjyue z$Q(}4oImsPrJq|J=5(*%;s2hc>rlt`d*y<#I}P78KYjYSb<6x~eAD^FLD_oeh6~zN z2c8-0&%dwzL|5Vb>F3v(igdZ3nekNU>*>#r=RUF5!*cb(IBEV9zs=?c=m<L5-OxUx zs=c=S#MH}6*x#r;dm@zcQstJ%J-!>BXHII|;41R0+g!K7<hH|}{MReF*Do%17W=es z?Q*eQYPK=|>Ykl@)8yZ7qw%_}X3Zkw<%w;*7A^6K2X^f-p8SZrdC&hEj&qe8_A7+x zoY}3C8RBEs82djv*mFmc?8FUW0Xj-LS^7JLpEvB#zV805W%jk?=f@6Bk-231eBZa< z%bHUBqQ&xD7P@@tdTadLMBXjD+|G8M_4L(;kKCBa*?ZZ^Ihgf~RNJp2KYR0C?U(sV z-HiJGKKb!iNPJ;vujnbqa1Ql(E45qSt1*6*SR=XF^7aP-i-)1XXOe?juT9we-q`(H z0oS&3Cof!N3$=VLyJsWEp{GH{yC?tsem5mczS%T>$8^qX?;G?UaEP}qtG%@&oi%ig zX-%AeXPV#St=9jpeRql~obkw|+|F+1{6|Z+ItwVgT4XkvJ>X~QXTwF)oep1aTK&d$ z&(!Bn*H{b9eR=1(in8_N4AHrcvz(HY*WI5Ysj&QT?6-?M`#twL)yaH1qn+!nIDO~a zJ+gV{W}K__+Qj-qW{TtoyQ$}DeKxT^IoQtlKKSLG<tqJ3eD|+!lHD>Ped|2ULkjP& z-<y@XsoI@y&()_6JfffWtyTA$`aSK$gzvewwue5Q$l6gk(dxb8NwF^002cA~>IDDi zw#qm8K4#o$_&fEEyGnFM(PNpH59L^{?d<meJ7iz4x~SfyPUbe7?}8^6Pw*Ft+{?-Q zO|V#gQjX%Y4I3KS_w>#9Jt2iVl}}&u#=~V2FYdIf^k<9hd_JrBF=O(*?Tn)HQ*UH% z-|6ouCthqhKYi=+hh3G=v)38_=oInFwF@zPf4jl&(x<g@2GxttRU9qLz8~|$h<(qr z8DGWThM&0YFz>tC+p-DLmS?OVJU!A@9C&`Ox8RM*@&y)8&L=o@_G~)5^!x=${oefc zN{u;p#Ox9@-`}m9<z$#``(W!@8S$5;hh-v8OkB(8{?{_^@oTBC%2Hif2LkK+tpDyx zl;e7zBk{@0yRVvYx7G6{@n4qmw(YTO*ts&UM{BR@dhXnvMS*ilrX?rt>DyM<`?>CJ zWOD46tKvs~zijz^IE`D>ly%zVi%Tw@%n;*NxGjAs_^eZv5R>K3__<H2N`wu&PKh22 z%lEX?u{+<fy?3hc+20knBP?gk_^@r6!u#aET}8cet0SKJLi?UKofhQp$vk0_HA~B@ zj*HPw;tyB&Jqfcvu?J>eW?l2p;Z#zadvC_2)h~K~Z@k}F?G_Tdz<I^41G}BHwl}dY zi;7>XZDOf$b?&}*pq{L2yzfN4=XocL@5#&PpPX=S=@+w09}Y+=yLK&>wSLj_z;&kc zQ8B+y%b8F0e7(Pqp?dyTvvrGwe^yVwqx_7g;90R^(alBa=BuAy7CB%&|6lDRk@v2F zbA?~^Xui{3*jBDn!y}W(B)eB;MSs@Bp3L`mw{VD_V>x+aSpdtm-81T!M?F~~cxHy+ z{$!Tcq!|`>FYri~IKG~q%+r5B%HUvp;@New4B2)`bHd*iT=~HGzUEfqgSPh_$2!hE z6Mh@s8`x+%pC#X<O>2r?X&cApOG{5xTorfNt^M-e>U|X~SwUgPnIj$-Cui?Xeb&;w z{_C`s<erjNznp6k<<}y@ml-N_oZ1@Y{LJaM!zl?#lU~k6Q$D=XSbRe$@lMm{d)@+> zCTtT+ml&>8FzLGLx^J_tWMN19Hcyt%HB5S+mMIo69A;+RmK<HdCgWs#WFJF~(v1r@ z+Z6sBIk2H)q28m4EA9uPudBF;>#f+J{Ah)=$<b5S{^kT<5AvPtuv)Ucoa<d>>zp%= zt37x&2ffa3`FZi+n>QSp9Rj~2ZmyXN9$|2;SDYD_{r>yjZ_5gWi?jC3U~G-I4cR|~ zF@Me1zT+D&OnSEJxY8r3%Mx)*yNV_TztDN~bLAcmu{Q$K#qHLgVO;p~)5Z@M_U$`& zDb*>l^n<9CUgFEH(xyXyz5M5!#8s~~$c$lhxV%z5@kdI(eE7e0CpKP8Uif~}>r+cy zWEB6ev59kcy?LbP=j#cM&!;R@X=Y2C<g3~ICgeh%%z~J;j6P1sU*2%l5X#_x`{rEN zm(Ayw7k3#coG-6op5*R$u#5BMva6H0CR<EzR#q*4#M<LpFwse7v$H5Wdn*smqHoqE zt0L8|%yhN9AGKd=PErM{cHp*y>s)STAJMUC%WYY_=#hjYTa8}ewj5oXyRpGPF1cFX zFS2)u^h@6$b0y)Do1aIuC9Cj5Z*JXc&C`4W{gR1G8fDueKl9xDeJ|x^Ti5ej3a7=k z?NW2QCoXhn=Pn6L<>MZ6R(4+mWy-rECJr+!SN)ya;vUkQqbxSzd&a`6s$UWpPZ85f zH1a!~zwA);HO6TH2XD3={mmwmv9s+(!WALG6IUOwMNCqQyLm=v$6gsJC!HYY>iw_Q ztkgQdm&6(Bz2@Uo6+eqRg+`0+O>Jx9)J$$pI-nob{n8{cM`82975Pdb4_7@fi+wGy zWj%M9#+He}r@sa`KFUcC{cCU)<f_<&+*U)|HnWF{GKPFzsjV(gZYEDy<6(9u`IDY* zgk<7jS^qT!tXYdMt*s33+9q{t{@L<rHC=~!9`8%CaJ4<<DOR!4`qjiE@u3AWS+6E8 z$ZAYk+UnxAH~jm_)y*qKb63PfCN?edU%bF@N2W+a*#t+WJ$tSnN!01tadF|X&%Z9X zU$ePkF;)Lx+Qa0qgQr}sPZYi=tX}EN@bJ`q%}s`3)22tf+wx$_T8XJ^tL1tE4(|%E zjsF&!^nzjIwZ2!cE5Rct+1dK%S9&IV=AY?NBllV@NPDNQVu;ZHrTaJSI&(1N+tz>Y z!snTW$GsG?h`!QxHgewfxWb)m(y>=096j{6uqB9Cw%un-4?5;^Zq_k@g}yP0+nV;b zdd!i%_hW)tp()#kCFVX4dlyDrRtu|gFKlm-UACqmz}@<mi+F)a?TH;Pf6wr{e_gHU z*mbE~Rh>^2+{@=rkNiC&=J%ZKH@1qq>uZY_G@r5PI4|gPr}Jd>jJW3^kL;dr&3YR? zr*uk=*o)$dbABuC?Y(#P(Xxj0+}HCo{y6QNa%SeQs8@AQBa5Hz+p@##4d2_AhsFDg z@5x+hxZryI??DOH*(a=L2UM4)_m-Z%E4cLJ>@dE>TPv0vI`L?mZfHx_rnS#P8a<}$ zYn`!-chgT6tBYv|zke&z4C$CRH|D^Muo;TmAMI4FKU($t;Vub|7#EfI$8^r^Y+CdG z#(RbN`KM#bVvW<+9xybBGvaZ6)NcONx94H0b}ei9KGhZ1FPpoUUuJYYvpw11!`m-n z5zlWg`NTTMF5_L{u5aG2OWXyj*UowK@mRt_mj!t#|5iVl)xn*AH*V8`@7&)DV<&xN z^HIJz+i+!O#5s+RyS%(YPP^V!J9N9OXzN^^(^emi8oK>|H|jff%WR)CH~)~0$Ww)N zjuz~Oe0@{3VuiWC=7jF7Ym!<rH>QI1`khJJovx=pjhC3P@`~1cGecJsw?i+NxHera z2t1~_NBK;WhlL&YnIAWzr*Rc|uMn(N2rX;9qrg(KZC$X1!(W%><qr2(gGN1lIV!)J z?X_!-`NEJ^bIU8Z!?L;7GN?}H!@=EYF;nmHvL0=lBpP^Z{lS*ITh_g|*uc1^eTk%E zye;RHod>2U-?}-eB!K7Ov0vxTg0j+G*GX#xoF`XW6fB9@xUeIB?VX3YzTaD~7$2B9 zwepPy-`<`ZlFMyBobl|sRLA<Fdj2=vhO=`g{^82u%&9PQc9mkB>vCDxGRs`UnsvR& zcBP7oU0*HcoS(oHa!9kiHO0D5P&<0j^yZbfZOy~;4~6m@FMlav5bIp}HPKY|;mz>% z;q$?zx9?@cRV!9BPWxNPy2w&Xwcf|%bk4W?jrvb5wLjip-J|BSS?IT{_`0}f2O~e8 zc|V^|`uv@;%oi2Ut}WD;KEK#Z({8r(ucX{df<DdFd}Z6k`(940l#jW_?GyiRkA2_s z)pO5xr@LAIKd~|3y`g2Y*NrJW`a4C%YTcjjos;dw{&dZ~yEAJq&PczqdHsy-n{zGS zr`E6(hdHjEap}c_cY;ed?@I|;u<@yrcIum(I`@^`Z+@T57deTqJ~H&jPw-T9OxSdx zkX13dR#IovH@9oHt&aM(;ZK#h?rML7d7!E3Gne+y54tGRa9?l#zJ>G6-dAj}%**KG zGcRBJWcj^0x6HnOPTl)lw(-)NugMl$-|W^}6MD;SeZ3XaGbv78&*}Y-u5P=z3^Zvy zpIdL!yOjlj(NivjsZX)nzdzQ`{|HBJ>S2#==DHNU7pt6qE}6NU@5~<cUXO(_1&t== zol}ax#GJi#>|2h_x`eFC-D|&|77UobCVr8X7SC0U9cvA0=H9z|*1r7up^P(gm@d6P zch~0Dt;vp;-dT7|-LUOz&&SS~Cn8g%o<BF7()6dqHM6XG`y9QfYX47NPn8e(Z*0vq z`+I)1KR^HW@bCX$zq`EX($eI3jo6((Uw`Spz540fKXJ<xYGgj<-96{CW_!am?Y@(# zKfThGw_Vsb>yL8XH2p=v+v+O3`4+kd@10$8Eu{2XMChgsJ`X*j_si#)rcDjpuu4Uu zNondF{>1zSt<R2nPpA3>eSEQ2TY|4qMo8r~H|zZk)$h){bQ0NG$EG-`IeyKeo2J{W zjYPJ-^>6E&>(XNtpSM(NQTPYl@WbaPDli=4de{>-X?o8GC50su9-mdo7C)tBer;pH zDGRIHYdQS|7AMSi6%YJyN>R*K$^D?cn!EqYpqgoVokgju9|``IQnq!T|Hznk@|=0! ztFBkxetl{2;VZwRngV&lGv?Uc?KQq==*hHN;6%k<yH9T~r!3bHSDR_LacW4|<a6@U zW`S?@7F+Ax;FR>v-BcYv!8!46(NY~jlcem)cW+Kv9Q)kqRl4Ngf>nGvamPwa;w`ux zVou4Itr4BFV#BJ)ll;pPS|(p)v+UGyf3ZhX=j6vKE<xiB59|8HXKzy8@cevc!R<M0 z_f$+T)P*(cNY0pYRl#TK?(Z#oFI<srv{64F<(+<rsrbaQ?o*ofYBLpm-sM#C{++y* zv3&OXJsNkuHb^LN@UJjf<NCNnX|2d7Q`Xw`hr0@RFEd{A&)a(`FfaO|)4pd97{j+# z*InBBnPE=w21Ns{RSOobNu13y<!RS!!%bWV*K)q)*(ls}&82Bk!v~47kjQJZ;$`+p z{#>MTFXY&!lvTS9bu^`E%?x{J?%=EP%|Z3}0?Get0<K8D7W{oGto}g8h0TwC^Sowp zk9fm!e@@`MGKm27<zIr2#g@oT^66Xi)JRw>f@5n%wb|3G==n2VEC~0#^YQn*slM;m z_{ASnnHRo%{a*G-6K_4K{_60nU3Oi@wK;FYZ`?kZ_bE+q|Dk(g-{!D<ys!AiKK`Ch zI{(Y<?LW`Hb^r7I?BA>HFVD(vzkJ?4r{MSBEarp9SC?PjlE|{<^x5NA+4r9pH@|%J zm-6&~SM8$SYMy-cE9!=Mv-bU6KVwYm|9$xPD(#=7;^%km_2-^Tu$`QF{bEjq)%GUk zEw_2z`))J*W~UQA$Ehbe?DpIC`C{BXU!S~t^;%@E*Z=M7zI>?r_w%mPfk-_&-}3o; zX2#e5Qs}SKTKe+w^t)1@-aPq!|9N~?{Dgg9FTXweW#P~2%jv)SbM5}uRP*<!f!Fw` zuFZdZ`^~iq`@OZ_>t@c7{caE$`g7CW`FH+$964?G>1O+C{q6F3|L5F0@mO2)w?S;& z-5A~V+l032DJrtYXgAEhIs5<T>;G@)e29zR|8xK6qx-Kt;%0PfU48%g{15kLrzTw4 zy|Yf)_+!@3({I^NoP2s%{{6q_)A`FMygkdl_0;M0^2=}Q>+UZztesIG72|(DZcn_P z{l1-h{`|-+3_m0O{)6g|^X<`<FFx&`zP-HsziMxYSz>s6)$TpB|4q83Qy=^NQPI`j zue%DDPPdO=m*`Qy_x7P+;jO%f%ER~jzrPpvM@_!(n_cbp8TG$@B-R<n+U{%n`uOUn zzrRAmZ|^fMd3-iL<k$Dfe*$lQ@U7RgyX$-3=l_g*=krtU*BJi4{)Ly}=l1<385iWk zMZH#5GxI7R=_p9Q`f7e`xWL<<@Y-haz57>+{oDWZZS7u>27mE#fhA9+H|yQr_juKV zXIxf^8+ZKr^{lSW{%>aWlFluw{@<3n#;~Ja`lyEB5?RH7_Qjd*`}-Cde3&iJJH@g8 zu>N!-?+@3KwVW&b9Zx-R)RT97A^)hOwV^qu%HiOo<?lQ0%?#PU<~8?w&&^j_Pbjm= zx>}mFSDg2lX>fN@mdLq!ZPvca(GT+{rOpTund+XcaXA0tuE0n4d9DR&J^m7NrS9tj z*BxF#Ze1xK<4*O&?4CJqv)Ak|d~R3g^K9Z!nXRZC%fZ?y$-48ibLLuihu-EkTj!e{ z7hHZ$>sYl|<_phCpNz-3TFxta?@ip$H%p*I%e%lkkn?xk#1Bu{JVIqMD+Sko*cZnq zd+N62y`Jga9AA~0S(~d2G8kVR+$Q+zjoXV&M?%zk<`~>M{at(djCD^UTNSts^Q0m+ z8F8_#_cUPQFwb<6d1}|haG~^P(2*Y(ru@j5bXMs77mph@x-6{v5)6y^1ted0CvY<K zHK|DUtkLrdxoFFOM`zcfHM|Y;QrqXwm5yAPP-bMHr20a2*R)xGb4AYXdcN(#N|hT| zXV2InwdsC}0YlhLe;ek9lZ!0f=2^|@TC?ZJt7vD9rSfu3TG}jIe}#E5O}{5`)$r8> z^DiD|hu4-c>31n5o@hRDTH5;n*UOt-u>pL}2RE6dO_{3adXw9wQ(5)1_PY2Q+g1CM z3VgICD|JbPORkULcx&F<vfAfbPRa(0&YjcU&GtVIUXVYxr>gOzNluE=v?AZBnu_6< zT{MOL6_f5wacvCV9{J2>`63oR?&f#TJSTek#C@DMWzx(B!>)Uige51I{5X*zC!Bg@ z+XK;-l@6ZU1D>tzm^OujKUZthwP~uU%|T5YJvO~Q)x>L8^i}xu71n^vqi**OWFP0t zKkD>N?U$CAC)*6OMf<dxDo$VIX?__kb}&$P`J6dhrYh}r(q3oM&(p~p7!bZla-n6z z&bZD_|4Tc5Z|~s>_{=xi`C3Jf%IBVz&Ur596sI3!thg7vzrOEZ+cv`<Pn|Pvd8zlN z1~W$Fw6uQMX0}S<Q}@MVB09@Ae!AG-BUDssVfr%mN%oUj8$~xLW`^@Vxy12z+LARg zd2748BD3OGC;gR^nDj|-Py0=U7N-@R6XN)cU8h&EzY;vuVB{~ba;lyd>%DcqwC}(0 z?v>4URsB_QaO<{-(*@(=b$9tsDd<_5%#&%dC{c;?NKlYg=hP=lwKnP`ZH!*oa@A|9 z1#kA$u1N>hY&rePvPCFWP$X)NeTE3r)L+fg7C{S*S3AwvAL0@?RrS^yu50IWqg5g< zZqk@?*v;?bs!4Mm>72e4@x~@YGv}1g&!i>c@k@Pve%kUsVyTL!`lF^4w?#+tmF7O3 zF(W9h&Ufk}wU?fe-ACgBI=2-z{XI8-|FWhnKPP$FEaKKW9g%Fci07ibTHVhDkuNLu z*9CcND65{Uu3R2EbA_{Z`;J9t)PI_7bxO6i{-A5%7Wd?y635p$%LLWDJk&%LS3EYk zeX3LRnzR1)X{`EEXSqvv35I(-OKG{$`C?J=y`Lf5W-Uwnyx?2F)l@;tz3ZMFad(_4 z!?|fI``K;2iP`2s9Sqk3Z>nTZ-FMblp@?^tqe$DDzGdfrZ@p5jxUzlrlp3Z!KE94A zoNW8P2v2d}WBjQsRYa@*)FQJfnUk0!gb#AK3DycaZaXO!F@ybww(1juH)X%qC{~)R zotT|F=~aQ8V5*O>#3KFRyKCnOTz(p^#uQQAZ2s)Y0+$;hy02~@m^b56jKz=OswrQh zgD!gA@!TnY_<{Sr_&t`AI{Kfd_y|Ss&^MC*bIL$E-fP<RO^eniy;`ceIz*&F;p;?; zg^E>Ezc29pb#rZ8lumQ>OmPX%#aqJ-r%I^{Z2WNP!1Z3whlk32ABXwHzpPqmSvS=w zae|n1$2*IP2`cy1KS{=3`ZR%QqgCB!1Ch-oaoxLkL&AzGN<aGSee!*Z-^_@47jG>I zjhZs?f>tS`nC!Z}9u`x0Z8lA?Quubx<m;F7fw_{NN?N)nU*6uj`sLTOqggjkyk?)h zBq>Vz(4Tg5fz;=xBHlK8M>8lU**RCJ$`<Sv*~0lw?EjRhU0x^R|GznXF8yh0z@wj+ z%l7;A-TC42GT2gUM<ho>xQ=*Zj`*3dZjO_U&6oEVyD`hE1)n_-**fjE0uQt1!s}`x z+RmrXC8l$|oi*`Zc2F7XM}3=(Cq-VGy~%m!vdin;?VdG?4zs`g>MZ%*&g9s7Pu4PV zeVAkDHCFRx-S4L(K80TV!1A`W!#}+BM4QOTF!Ne|kGqPQu{CSu%Jb(a^R=CtR@{=R ze8p8)y;#8^VEs!s{+lYzNxIKHexGD-H`#P&xoX}dnG+>NM<r`kG<4=&7FWJhy3p?X ztNcGxW@@|>z2dRvAn#t4-#2-a7fVR3*(AJ6*6-r6ZJBam%X0TmKD6tvCu8j^LGShd zU+z;oYQ8`@r@5~oqI$-H9skPBWEu4jzTupzW9L|TL(NiUXGO^MC1EqxDQ;V+cK_)) zw>PftCjwQYUvUTv^em4FZ(}>wu<WoxN9Mv?cl!D=B3RZ&tm<V77uB@57!)cdWxwQT zpTcXF$5Sl28SeD0a~I~kP+EC@(Vf5PZo&`!+nn{%b9<-%u#5FvApEdMQqD)9_ki>? z<6V4wEo=69SeX`-7v1Fv+5RI@^Kg`nt7VSJp2j^lFUm4~5pnNNUFdA(tvpw0W69F? zHNjK6#a`a=xfvA|H}Oht#pcu!L$lNq1-6q+ja?S0$qG(f;AvC$Q*Nn`l~>TOoxfdQ zKFU(O(S5md;{GR12^O<2d;anf7O7j6^5jVWoG|U|rPjYbT#H#h)lXCVs9~s=$<<Fr zX|dUhwBAnpUBs1`@$3JmT`Fa#dP9O;S-4(iKWtgH-<KoiZ(JewW$~r`iM6J4D*lKG zPW)XGJ-h3}ewGtOGU{bprxluex%*!(Z8l^L6pm+8VG7yVQyyElU32{}z38Zg2R2PG ziF~}FDu3r5*OM(C?dPBTTc?m(w0z-|%*ejUUzPXxR&|=FX`0Pg(=a95>8a4QO$|#A z9FXp5@~qmrVVaER!~V8Y%LHzml4{qSo1?sU%DNM`oRbyf7&s=zaO-w=x{1Z87j5af zWIbcS8XalB4AJ<d;=0c3?A_&4)_ThnF&vKB=f5h3>vdIS>ZT}NiT1CLj1JBJShd#c zNcfCjg4~KxlT`OR^~I_#3ex_)ZPT2PLt5(jVH*$3uV!R;)^huL*7eWT8DF2)81DSH z<;UZ!pP7bt-!;E|weW1;>py8)zrFeM_1CRm|2^u_D^vT-|4D~*9OuO-zS#3aQ0dG5 z(C)n*EAGSw>EFAyuEpf4??NNqoy$I6DzX&WQ=a`bL(59Q>;3tcNpY7Ot;Gt$cdzmh zD>(ij)a!K5akc25M<y;f)!LG&GRJqf;RF%OlW$Yze%|i2P)zgdt?OLort!xgEC?-A z`93#a_T(k4<z;fFC*2pG5M4C)%Ew<S+vb=(Ia07R`ylT><6ojr_f7cS{_3gl@t413 zT<j+^Y<9fIvTAzQv2Thhz5$xw{np)%oVr}}*Mg_tp5^{rAC$*^zUY0~(wa$mZBu`T zKh;}uW!d+wLC>{v!%n6CoL&1tueN+?OcZ}XX_ju#%|+!~zu%trFYNHDFuiwuG2VNl zd2;!!BenmTN=j*bj>_C+dH(XZyRTAb*Zm38ysPv#d+Qb%QTgj{XWaUc8=o2d<F>NX zg$?&u&dkelTUD+)T}VPRH;%D?i}v%=b$MQqCzokR$7|ocR(myGou@f%Yx-HwviXac zA33u4l})N&EzW*3>)W2_J?s8j2`%q&F|k%&xK`#eM^WMWIq?skgywQTEUtRqyH+$W zYhT|%&SVDnxn*Y;3A?`Rc{1&^-As3z*(Rx5?}+<_y)Ey)ewE!`jD7k6ogVRDdm<-& zvbSyXQ@`#d?l-w+espbq!TqMqTO<Fkiu2kN_wQEpx1g&}*LB9!@alVAzqUI;Jo4N3 zE6UOi>nqgv+zct&ar@C+KKsy)2|{<GL=9$z_N|`$M?Ux=pH^sZnBv^b3En18Bm_^# z{m!?3>euHYu{nI-I{S*);$>SyEsu+OvYPwNez4?$+{s6MQ@hzU*XC#m*IM077o9Ba zy=K9aBNA$T6J1qqe)+QLvF_@4#fdjg1TtH1s$lyZ%J(_ia+ml6o6`^XKDf9<<XBVh zoS%{tbC$U4^Sim-Ikf3WYVCy5gIiu@aWJ;FcosQZ?`hLG&A7?VV?#pnq`&DmS5IGY z{(<gP`DkTviBp}Pnjsw=AKq!CJYRH?*E^6yRC~9Ry52r>|HbX??SGf^>lOX2`T1_T XeBCtX8~gu!_|JILdK1I<FeU~7KLWu` literal 0 HcmV?d00001 diff --git a/kde/plasma/plasmoid-qml/package/contents/images/contact.svg b/kde/plasma/plasmoid-qml/package/contents/images/contact.svg new file mode 100644 index 0000000000..32ef7e3e32 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/contact.svg @@ -0,0 +1,542 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="128" + height="128" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.3.1 r9886" + version="1.0" + sodipodi:docname="contact.svg" + inkscape:output_extension="org.inkscape.output.svgz.inkscape" + inkscape:export-filename="/home/nuno/Área de Trabalho/wall/tmp/meeting-participant.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="50" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="4.5007615" + inkscape:cx="76.851724" + inkscape:cy="39.653881" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="128px" + height="128px" + showgrid="false" + showborder="true" + inkscape:window-width="1918" + inkscape:window-height="1147" + inkscape:window-x="1" + inkscape:window-y="36" + inkscape:grid-bbox="true" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-nodes="true" + inkscape:snap-global="false" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2502.6085,203.19934)" + id="g4640" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,641.1926,210.3962)" + id="g4748" /> + <g + id="g6931" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,192.21026,-157.69167)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2364.6913,357.18806)" + id="g6943" /> + <g + id="g6945" + transform="matrix(-0.7690129,0,0,0.6392557,-2364.6913,357.18806)" + style="opacity:0.40163933" /> + <g + id="g7565" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,143.59421,-208.7631)" /> + <g + id="g7567" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,143.59421,-208.7631)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2413.3071,306.11663)" + id="g7579" /> + <g + id="g7581" + transform="matrix(-0.7690129,0,0,0.6392557,-2413.3071,306.11663)" + style="opacity:0.40163933" /> + <g + id="g7583" + transform="matrix(0.9821429,0,0,0.6392557,730.49387,313.31363)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,730.49387,313.31363)" + id="g7585" /> + <g + id="g8400" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-236.74048,-87.22295)" /> + <g + id="g8402" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-236.74048,-87.22295)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2793.6413,427.65677)" + id="g8414" /> + <g + id="g8416" + transform="matrix(-0.7690129,0,0,0.6392557,-2793.6413,427.65677)" + style="opacity:0.40163933" /> + <g + id="g8418" + transform="matrix(0.9821429,0,0,0.6392557,350.15925,434.85377)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,350.15925,434.85377)" + id="g8420" /> + <g + id="g9110" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,11.14464,86.01919)" /> + <g + id="g9112" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,11.14464,86.01919)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2545.7571,600.89892)" + id="g9124" /> + <g + id="g9126" + transform="matrix(-0.7690129,0,0,0.6392557,-2545.7571,600.89892)" + style="opacity:0.40163933" /> + <g + id="g9128" + transform="matrix(0.9821429,0,0,0.6392557,598.0443,608.09592)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,598.0443,608.09592)" + id="g9130" /> + <g + id="g3639" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-87.70776,-143.37353)" /> + <g + id="g3641" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-87.70776,-143.37353)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2644.6085,371.5062)" + id="g3653" /> + <g + id="g3655" + transform="matrix(-0.7690129,0,0,0.6392557,-2644.6085,371.5062)" + style="opacity:0.40163933" /> + <g + id="g3657" + transform="matrix(0.9821429,0,0,0.6392557,499.192,378.7032)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,499.192,378.7032)" + id="g3659" /> + <g + id="g10467" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-85.73605,-144.28181)" /> + <g + id="g10469" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,-85.73605,-144.28181)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2642.6371,370.59791)" + id="g10481" /> + <g + id="g10483" + transform="matrix(-0.7690129,0,0,0.6392557,-2642.6371,370.59791)" + style="opacity:0.40163933" /> + <g + id="g10485" + transform="matrix(0.9821429,0,0,0.6392557,501.1637,377.79491)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,501.1637,377.79491)" + id="g10487" /> + <g + id="g2885" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,77.72672,-189.17867)" /> + <g + id="g2887" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,77.72672,-189.17867)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2479.1742,325.70106)" + id="g2899" /> + <g + id="g2901" + transform="matrix(-0.7690129,0,0,0.6392557,-2479.1742,325.70106)" + style="opacity:0.40163933" /> + <g + id="g2903" + transform="matrix(0.9821429,0,0,0.6392557,664.62627,332.89791)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,664.62627,332.89791)" + id="g2905" /> + <g + id="g2913" + inkscape:label="box" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,215.64408,-35.18995)" /> + <g + id="g2915" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(0.9821429,0,0,0.9821429,215.64408,-35.18995)" /> + <g + style="opacity:0.40163933" + transform="matrix(-0.7690129,0,0,0.6392557,-2341.2571,479.68977)" + id="g2927" /> + <g + id="g2929" + transform="matrix(-0.7690129,0,0,0.6392557,-2341.2571,479.68977)" + style="opacity:0.40163933" /> + <g + id="g2931" + transform="matrix(0.9821429,0,0,0.6392557,802.54367,486.88677)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(0.9821429,0,0,0.6392557,802.54367,486.88677)" + id="g2933" /> + <g + id="g4117" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-359.18677,-434.74393)" /> + <g + id="g4119" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-359.18677,-434.74393)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3830.3757,264.24448)" + id="g4131" /> + <g + id="g4133" + transform="matrix(-1.0439929,0,0,0.8678386,-3830.3757,264.24448)" + style="opacity:0.40163933" /> + <g + id="g4135" + transform="matrix(1.3333329,0,0,0.8678386,437.5741,274.01477)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,437.5741,274.01477)" + id="g4137" /> + <g + id="g4145" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-171.95348,-225.69253)" /> + <g + id="g4147" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-171.95348,-225.69253)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3643.1428,473.29606)" + id="g4159" /> + <g + id="g4161" + transform="matrix(-1.0439929,0,0,0.8678386,-3643.1428,473.29606)" + style="opacity:0.40163933" /> + <g + id="g4163" + transform="matrix(1.3333329,0,0,0.8678386,624.8076,483.06649)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,624.8076,483.06649)" + id="g4165" /> + <g + id="g4173" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-237.95348,-295.02573)" /> + <g + id="g4175" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-237.95348,-295.02573)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3709.1428,403.96263)" + id="g4188" /> + <g + id="g4190" + transform="matrix(-1.0439929,0,0,0.8678386,-3709.1428,403.96263)" + style="opacity:0.40163933" /> + <g + id="g4192" + transform="matrix(1.3333329,0,0,0.8678386,558.8077,413.73306)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,558.8077,413.73306)" + id="g4194" /> + <g + id="g4202" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-754.28678,-130.02581)" /> + <g + id="g4204" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-754.28678,-130.02581)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-4225.4757,568.96263)" + id="g4216" /> + <g + id="g4218" + transform="matrix(-1.0439929,0,0,0.8678386,-4225.4757,568.96263)" + style="opacity:0.40163933" /> + <g + id="g4220" + transform="matrix(1.3333329,0,0,0.8678386,42.47424,578.73306)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,42.47424,578.73306)" + id="g4222" /> + <g + id="g4230" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-417.76392,105.16362)" /> + <g + id="g4232" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-417.76392,105.16362)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3888.9528,804.15219)" + id="g4244" /> + <g + id="g4246" + transform="matrix(-1.0439929,0,0,0.8678386,-3888.9528,804.15219)" + style="opacity:0.40163933" /> + <g + id="g4248" + transform="matrix(1.3333329,0,0,0.8678386,378.9971,813.92249)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,378.9971,813.92249)" + id="g4250" /> + <g + id="g4258" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-551.96349,-206.25453)" /> + <g + id="g4260" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-551.96349,-206.25453)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-4023.1514,492.73406)" + id="g4272" /> + <g + id="g4274" + transform="matrix(-1.0439929,0,0,0.8678386,-4023.1514,492.73406)" + style="opacity:0.40163933" /> + <g + id="g4276" + transform="matrix(1.3333329,0,0,0.8678386,244.79767,502.50449)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,244.79767,502.50449)" + id="g4278" /> + <g + id="g4290" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-549.28678,-207.48753)" /> + <g + id="g4292" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-549.28678,-207.48753)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-4020.4757,491.50092)" + id="g4304" /> + <g + id="g4306" + transform="matrix(-1.0439929,0,0,0.8678386,-4020.4757,491.50092)" + style="opacity:0.40163933" /> + <g + id="g4308" + transform="matrix(1.3333329,0,0,0.8678386,247.47424,501.27135)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,247.47424,501.27135)" + id="g4310" /> + <g + id="g4364" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-327.37363,-268.43854)" /> + <g + id="g4366" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-327.37363,-268.43854)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3798.5628,430.55006)" + id="g4378" /> + <g + id="g4380" + transform="matrix(-1.0439929,0,0,0.8678386,-3798.5628,430.55006)" + style="opacity:0.40163933" /> + <g + id="g4382" + transform="matrix(1.3333329,0,0,0.8678386,469.3874,440.32034)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,469.3874,440.32034)" + id="g4384" /> + <g + id="g4392" + inkscape:label="box" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-140.14019,-59.3871)" /> + <g + id="g4394" + inkscape:label="zip_app" + style="display:inline" + transform="matrix(1.3333329,0,0,1.3333329,-140.14019,-59.3871)" /> + <g + style="opacity:0.40163933" + transform="matrix(-1.0439929,0,0,0.8678386,-3611.3299,639.60149)" + id="g4406" /> + <g + id="g4408" + transform="matrix(-1.0439929,0,0,0.8678386,-3611.3299,639.60149)" + style="opacity:0.40163933" /> + <g + id="g4410" + transform="matrix(1.3333329,0,0,0.8678386,656.6208,649.37192)" + style="opacity:0.40163933" /> + <g + style="opacity:0.40163933" + transform="matrix(1.3333329,0,0,0.8678386,656.6208,649.37192)" + id="g4412" /> + <g + transform="matrix(0.1463445,-0.02678525,0.01010528,0.1292785,98.97435,-19.70366)" + style="fill:url(#radialGradient4876);fill-opacity:1" + id="g3561" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.09" + d="M 71.625 16.46875 C 68.975829 16.555654 66.104326 17.427546 63.375 18.5625 C 54.54404 22.234737 41.71107 11.053731 43.0625 37.3125 C 42.8012 36.459092 42.559285 35.662792 42.34375 34.875 C 42.438843 36.010402 42.536845 37.160215 42.65625 38.34375 C 42.491696 37.989967 42.339792 37.635033 42.15625 37.28125 C 42.011531 35.537271 39.366886 35.745452 39.5625 37.71875 C 41.156633 45.193422 42.5832 47.537818 44 48.28125 C 45.233669 53.391831 47.384936 56.929269 49.53125 59.59375 C 50.226815 63.527907 50.585392 67.524071 49.75 70.3125 C 51.75862 73.718074 56.993441 78.894368 61.90625 81.625 L 62.375 82.3125 L 61.71875 83 C 62.036383 83.05904 62.333301 83.131857 62.65625 83.1875 L 64.15625 83.1875 C 64.625393 83.106668 65.073394 82.994439 65.53125 82.90625 L 64.96875 82.3125 L 65.53125 81.5 C 70.762659 78.791195 74.7074 74.551563 77.1875 70.53125 C 76.113442 67.287019 76.74008 62.288734 77.6875 57.65625 C 77.695607 57.644593 77.710649 57.636685 77.71875 57.625 C 79.627235 54.872131 81.351427 51.369566 82.15625 46.75 C 83.462664 45.806244 84.783205 43.252631 86.25 36.375 C 86.445628 34.401702 83.80097 34.2248 83.65625 35.96875 C 83.422483 36.419344 83.203122 36.861906 83 37.3125 C 83.055443 36.676569 83.103409 36.089435 83.15625 35.46875 C 82.7184 36.625799 82.258284 37.790431 81.71875 39 C 83.729935 21.046028 78.395103 16.246662 71.625 16.46875 z " + id="path3845-1" /> + <path + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.127" + id="path2732" + d="m 43.064538,37.32247 c -1.35143,-26.258769 11.46845,-15.098262 20.29941,-18.770499 9.70427,-4.035393 21.14975,-4.530611 18.35158,20.448829 6.74768,-15.127474 5.60568,-26.21512 -4.99221,-31.5731804 -4.27221,-6.068276 -13.16356,-6.71760699 -20.73823,-4.540857 -9.77918,2.648904 -14.57429,9.6018524 -15.44669,19.2945004 -0.14032,3.660106 0.43574,8.313947 2.52614,15.141207 z" + sodipodi:nodetypes="csccccc" /> + <path + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.03" + id="path4552" + d="m 49.400844,69.744091 -2.109892,3.560443 c -8.659631,16.505037 -3.446539,32.489826 4.582411,47.175756 3.398622,0.0704 6.656999,0.10223 9.560434,0.0989 0.514709,-5.8e-4 1.087411,0 1.582408,0 0.35431,1.1e-4 0.72496,0 1.054938,0 0.531488,-2e-4 1.055261,-5.6e-4 1.582423,0 2.846131,0.003 6.038799,7e-5 9.36262,-0.066 5.893611,-14.10037 15.093119,-28.741623 4.615382,-47.538379 l -1.945064,-3.230758 c -2.712544,4.734786 -7.55792,9.954492 -14.14283,12.692321 -5.591427,-2.480012 -12.230987,-8.958397 -14.14283,-12.692292 z" /> + <path + inkscape:connector-curvature="0" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.04" + id="path4582" + d="m 49.400844,69.744091 -2.109892,3.560443 c -0.898016,1.71161 -1.629782,3.410327 -2.241748,5.10988 l 6.758231,15.26371 10.582401,-11.373613 -0.494513,-0.692297 C 56.710436,78.730356 51.127751,73.116782 49.400844,69.744091 z m 28.28566,0 c -2.431261,4.243793 -6.589868,8.88254 -12.164809,11.769224 l -0.560441,0.791196 10.516473,11.373613 6.75823,-15.131839 c -0.68115,-1.821011 -1.543951,-3.669023 -2.604389,-5.571421 l -1.945064,-3.230773 z" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.127" + d="M 79.75 73.1875 C 79.806745 73.290652 79.850685 73.397097 79.90625 73.5 C 80.263536 74.161675 80.596581 74.817215 80.90625 75.46875 C 80.972094 75.605058 81.061189 75.739142 81.125 75.875 C 81.210772 76.060835 81.292985 76.252473 81.375 76.4375 C 81.490952 76.694706 81.610345 76.962832 81.71875 77.21875 C 81.847293 77.526625 81.975369 77.850581 82.09375 78.15625 C 82.142614 78.281995 82.203041 78.405709 82.25 78.53125 L 82.25 78.5625 C 88.293623 94.730611 80.327542 107.82871 75.03125 120.5 C 78.484785 120.43143 82.137434 120.27482 85.875 119.96875 C 90.100181 110.93681 92.237688 104.97101 95.46875 95.375 L 92.0625 90.4375 A 0.50005001 0.50005001 0 0 1 92.3125 89.65625 L 97.625 88.28125 C 95.506388 85.375003 94.155712 83.292131 93.03125 81.5 C 88.039293 79.375569 83.565072 77.280397 81.125 75.46875 L 79.75 73.1875 z M 47.28125 73.3125 L 45.96875 75.46875 C 43.568546 77.250801 39.205004 79.317292 34.3125 81.40625 C 33.173222 83.216678 31.781289 85.324507 29.625 88.28125 L 34.9375 89.65625 A 0.50005001 0.50005001 0 0 1 35.1875 90.4375 L 31.78125 95.375 C 35.009186 104.96172 37.15801 110.92023 41.375 119.9375 C 44.990398 120.22753 48.527756 120.39941 51.875 120.46875 C 44.675248 107.29952 39.760957 93.102905 45.0625 78.40625 C 45.366642 77.563125 45.68947 76.721199 46.0625 75.875 C 46.20927 75.535271 46.372231 75.184335 46.53125 74.84375 C 46.571224 74.759372 46.615565 74.678157 46.65625 74.59375 C 46.858542 74.168757 47.056746 73.740403 47.28125 73.3125 z M 32.78125 82.0625 C 26.244144 84.801413 19.024849 87.52935 14.21875 89.6875 C 11.163805 91.05929 10.983465 92.582336 10.09375 95 C 7.3801645 102.37349 8.09375 109.6875 8.09375 109.6875 L 9.6875 111.53125 C 12.393238 113.07158 15.234855 114.34839 18.1875 115.40625 C 17.687524 107.70141 16.655858 100.21547 12.625 91.9375 C 15.630634 92.733759 17.880408 106.54593 18.21875 115.40625 C 25.282877 117.93342 32.880852 119.22452 40.1875 119.875 C 36.073201 111.0168 34.003518 105.0434 30.78125 95.46875 A 0.50005001 0.50005001 0 0 1 30.84375 95 L 33.96875 90.46875 L 28.65625 89.09375 A 0.50005001 0.50005001 0 0 1 28.40625 88.3125 C 30.337249 85.693587 31.703217 83.722676 32.78125 82.0625 z M 94.53125 82.15625 C 95.59562 83.798452 96.948172 85.741655 98.84375 88.3125 A 0.50005001 0.50005001 0 0 1 98.59375 89.09375 L 93.28125 90.46875 L 96.40625 95 A 0.50005001 0.50005001 0 0 1 96.46875 95.46875 C 93.245041 105.04769 91.149234 111.01022 87.03125 119.875 C 94.329247 119.21378 101.9178 117.91908 108.96875 115.375 C 109.31129 106.51335 111.56044 92.732813 114.5625 91.9375 C 110.53723 100.20398 109.50078 107.68145 109 115.375 C 111.91219 114.32268 114.73364 113.05272 117.40625 111.53125 L 119 109.6875 C 119 109.6875 119.68233 102.37349 116.96875 95 C 116.07903 92.582336 115.92996 91.05929 112.875 89.6875 C 108.12327 87.553763 101.0096 84.864055 94.53125 82.15625 z " + id="path3875-4" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;opacity:0.08" + d="m 62.152815,82.027815 -3.46875,3.90625 2.8125,4.46875 0.03125,0 c -2.923998,10.119605 -4.31947,17.449605 -6,29.875005 5.617857,0.073 10.109613,0.0462 15.25,0 -1.944765,-12.5718 -3.509791,-21.262906 -5.84375,-29.843755 -0.0027,-0.0098 0.0027,-0.02145 0,-0.03125 l 3.125,-4.75 -3.34375,-3.59375 -2.5625,-0.03125 z" + id="path5035" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/favorites.svg b/kde/plasma/plasmoid-qml/package/contents/images/favorites.svg new file mode 100644 index 0000000000..8c3070ef01 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/favorites.svg @@ -0,0 +1,1286 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="128" + height="128" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.3.1 r9886" + version="1.0" + sodipodi:docname="favorites.svgz" + inkscape:output_extension="org.inkscape.output.svgz.inkscape" + inkscape:export-filename="/home/pinheiro/pics/oxygen/scalable/actions/rating.png" + inkscape:export-xdpi="11.25" + inkscape:export-ydpi="11.25"> + <defs + id="defs4"> + <linearGradient + id="linearGradient3640"> + <stop + id="stop3643" + offset="0" + style="stop-color:#7e0000;stop-opacity:0.50990099" /> + <stop + id="stop3645" + offset="1" + style="stop-color:#673400;stop-opacity:0;" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 64 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="128 : 64 : 1" + inkscape:persp3d-origin="64 : 42.666667 : 1" + id="perspective102" /> + <linearGradient + id="linearGradient3946"> + <stop + style="stop-color:#7e0000;stop-opacity:1;" + offset="0" + id="stop3948" /> + <stop + style="stop-color:#673400;stop-opacity:0;" + offset="1" + id="stop3950" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3844"> + <stop + style="stop-color:#faff64;stop-opacity:1;" + offset="0" + id="stop3846" /> + <stop + style="stop-color:#faff64;stop-opacity:0;" + offset="1" + id="stop3848" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3379"> + <stop + style="stop-color:#fffc07;stop-opacity:1;" + offset="0" + id="stop3381" /> + <stop + style="stop-color:#fffc07;stop-opacity:0;" + offset="1" + id="stop3383" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3363"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3365" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3367" /> + </linearGradient> + <linearGradient + id="linearGradient3309"> + <stop + style="stop-color:#f4ff3f;stop-opacity:1;" + offset="0" + id="stop3311" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3313" /> + </linearGradient> + <linearGradient + id="linearGradient26907" + gradientUnits="userSpaceOnUse" + x1="-84.002403" + y1="-383.9971" + x2="-12.0029" + y2="-383.9971" + gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)"> + <stop + offset="0" + style="stop-color:#888a85;stop-opacity:1;" + id="stop26909" /> + <stop + offset="1" + style="stop-color:#2e3436;stop-opacity:1;" + id="stop26911" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)" + y2="-383.9975" + x2="-23.516129" + y1="-383.9971" + x1="-84.002403" + gradientUnits="userSpaceOnUse" + id="linearGradient3711"> + <stop + id="stop3713" + style="stop-color:white;stop-opacity:1;" + offset="0" /> + <stop + id="stop3715" + style="stop-color:white;stop-opacity:0;" + offset="1" /> + </linearGradient> + <linearGradient + id="linearGradient3081"> + <stop + id="stop3083" + offset="0" + style="stop-color:#28691f;stop-opacity:1;" /> + <stop + id="stop3085" + offset="1" + style="stop-color:#00bf00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3290"> + <stop + style="stop-color:yellow;stop-opacity:1;" + offset="0" + id="stop3292" /> + <stop + style="stop-color:#f07800;stop-opacity:1;" + offset="1" + id="stop3294" /> + </linearGradient> + <linearGradient + id="linearGradient3638"> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0" + id="stop3640" /> + <stop + id="stop3661" + offset="0.06868132" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop3659" + offset="0.5" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3642" /> + </linearGradient> + <linearGradient + id="linearGradient1563"> + <stop + id="stop1565" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop1567" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3273"> + <stop + id="stop3275" + offset="0" + style="stop-color:#ffffff;stop-opacity:0.55035973;" /> + <stop + id="stop3277" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient12948"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop12950" /> + <stop + style="stop-color:#c0c0c0;stop-opacity:0;" + offset="1" + id="stop12952" /> + </linearGradient> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.111111,0,138.1081)" + r="64.796692" + fy="177.29686" + fx="80.738739" + cy="155.37218" + cx="80.738739" + id="radialGradient5079" + xlink:href="#linearGradient5073" + inkscape:collect="always" /> + <linearGradient + id="linearGradient5073" + inkscape:collect="always"> + <stop + id="stop5075" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop5077" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <foreignObject + id="foreignObject7221" + height="1" + width="1" + y="0" + x="0" + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf" /> + </foreignObject> + <linearGradient + id="XMLID_1_" + gradientUnits="userSpaceOnUse" + x1="95.693398" + y1="141.1738" + x2="32.308601" + y2="77.789001"> + <stop + offset="0" + style="stop-color:#ffc60a;stop-opacity:1;" + id="stop7227" /> + <stop + offset="1" + style="stop-color:#b03b00;stop-opacity:1;" + id="stop7233" /> + </linearGradient> + <linearGradient + id="XMLID_3_" + gradientUnits="userSpaceOnUse" + x1="63.9995" + y1="92.865196" + x2="63.9995" + y2="120.8652" + gradientTransform="translate(175.0067,11.74752)"> + <stop + offset="0" + style="stop-color:#888A85" + id="stop7261" /> + <stop + offset="0.3226" + style="stop-color:#A6A7A3" + id="stop7263" /> + <stop + offset="1" + style="stop-color:#EEEEEC" + id="stop7265" /> + </linearGradient> + <linearGradient + id="XMLID_4_" + gradientUnits="userSpaceOnUse" + x1="64.000504" + y1="108.8652" + x2="64.000504" + y2="92.865196"> + <stop + offset="0" + style="stop-color:#EEEEEC" + id="stop7270" /> + <stop + offset="1" + style="stop-color:#FFFFFF" + id="stop7272" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3081" + id="linearGradient2149" + gradientUnits="userSpaceOnUse" + x1="62.112335" + y1="90.513916" + x2="67.887672" + y2="39.095695" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient26907" + id="linearGradient3226" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)" + x1="-70.002899" + y1="-383.9971" + x2="-11.91648" + y2="-383.9971" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3711" + id="radialGradient3228" + gradientUnits="userSpaceOnUse" + cx="343.99899" + cy="92" + fx="343.99899" + fy="92" + r="36" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3711" + id="linearGradient3230" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0,1.022977,-1.022977,0,111.9686,137.8125)" + x1="-88.058083" + y1="-131.93112" + x2="-45.096584" + y2="-131.93112" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3290" + id="radialGradient2906" + cx="69.526619" + cy="60.115833" + fx="69.526619" + fy="89.655701" + r="111.65377" + gradientTransform="matrix(0.9439139,-0.3301918,0.332644,0.9509241,-16.097695,27.249949)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3290" + id="radialGradient3304" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.5227399,0,-1.554444e-8,0.5266221,349.81061,60.575712)" + cx="69.526619" + cy="60.115833" + fx="69.526619" + fy="60.115833" + r="111.65377" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient3315" + x1="219.22163" + y1="28.149843" + x2="219.22163" + y2="116.41813" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-170.08594,0)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="linearGradient3345" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-37.771032,-0.1213203)" + x1="261.50107" + y1="77.652245" + x2="200.17728" + y2="31.10997" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient3369" + x1="177.42397" + y1="22.377773" + x2="177.60074" + y2="93.022789" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3379" + id="linearGradient3385" + x1="216.88614" + y1="122.5867" + x2="216.88614" + y2="37.969955" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-152,0)" /> + <filter + inkscape:collect="always" + id="filter3391"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.55939545" + id="feGaussianBlur3393" /> + </filter> + <filter + inkscape:collect="always" + id="filter3401"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.11157909" + id="feGaussianBlur3403" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient3800" + x1="63.948792" + y1="12.034382" + x2="67.219337" + y2="12.034382" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" /> + <filter + inkscape:collect="always" + id="filter3838" + x="-0.17816916" + width="1.3563383" + y="-0.15506857" + height="1.3101371"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.46259975" + id="feGaussianBlur3840" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient3850" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" /> + <filter + inkscape:collect="always" + id="filter3928"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.18346262" + id="feGaussianBlur3930" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient3934" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient3956" + cx="64.35347" + cy="98.207405" + fx="64.35347" + fy="98.207405" + r="60.700505" + gradientTransform="matrix(9.1358439e-2,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="linearGradient2475" + gradientUnits="userSpaceOnUse" + x1="64.07962" + y1="-14.227339" + x2="64.07962" + y2="120.44466" /> + <filter + inkscape:collect="always" + id="filter3259"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.23739589" + id="feGaussianBlur3261" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="radialGradient3263" + cx="64.07962" + cy="66.197433" + fx="64.07962" + fy="66.197433" + r="60.700504" + gradientTransform="matrix(1,0,0,0.9554688,0,2.9478533)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient3267" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4443044,1.2598841e-8,0,0.1825067,35.563425,89.646593)" + cx="64.35347" + cy="106.71302" + fx="64.35347" + fy="106.71302" + r="60.700505" /> + <filter + inkscape:collect="always" + id="filter3285"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.26585998" + id="feGaussianBlur3287" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient3300" + cx="26.573795" + cy="73.493042" + fx="35.587811" + fy="102.79941" + r="60.700562" + gradientTransform="matrix(4.6812453,-5.2700969e-7,3.571426e-8,0.3172375,-85.242554,44.725131)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3362"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.3785028" + id="feGaussianBlur3364" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient3372" + cx="64.101562" + cy="48.703125" + fx="64.101562" + fy="48.703125" + r="56.812496" + gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient3382" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3564" + x="-0.18218182" + width="1.3643636" + y="-0.1679142" + height="1.3358284"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.40814561" + id="feGaussianBlur3566" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient3570" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <filter + inkscape:collect="always" + id="filter3604" + x="-0.11538182" + width="1.2307636" + y="-0.10634566" + height="1.2126913"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.25849222" + id="feGaussianBlur3606" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient3618" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient3620" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3640" + id="radialGradient3638" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3663"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.24178075" + id="feGaussianBlur3665" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient3669" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient3673" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <radialGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="radialGradient6039" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.9554688,0,2.9478533)" + cx="64.07962" + cy="66.197433" + fx="64.07962" + fy="66.197433" + r="60.700504" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3290" + id="radialGradient6041" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9439139,-0.3301918,0.332644,0.9509241,-16.097695,27.249949)" + cx="69.526619" + cy="60.115833" + fx="69.526619" + fy="89.655701" + r="111.65377" /> + <linearGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="linearGradient6043" + gradientUnits="userSpaceOnUse" + x1="64.07962" + y1="-14.227339" + x2="64.07962" + y2="120.44466" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6045" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="63.948792" + y1="12.034382" + x2="67.219337" + y2="12.034382" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6047" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" + cx="64.101562" + cy="48.703125" + fx="64.101562" + fy="48.703125" + r="56.812496" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6049" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6051" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-170.08594,0)" + x1="219.22163" + y1="28.149843" + x2="219.22163" + y2="116.41813" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6053" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6055" + gradientUnits="userSpaceOnUse" + x1="177.42397" + y1="22.377773" + x2="177.60074" + y2="93.022789" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="linearGradient6057" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-37.771032,-0.1213203)" + x1="261.50107" + y1="77.652245" + x2="200.17728" + y2="31.10997" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient6059" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6061" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.09135844,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" + cx="64.35347" + cy="98.207405" + fx="64.35347" + fy="98.207405" + r="60.700505" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3379" + id="linearGradient6063" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-152,0)" + x1="216.88614" + y1="122.5867" + x2="216.88614" + y2="37.969955" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6065" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6067" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6069" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6071" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3379" + id="linearGradient6073" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-152,0)" + x1="216.88614" + y1="122.5867" + x2="216.88614" + y2="37.969955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient6075" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6077" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4443044,1.2598841e-8,0,0.1825067,35.563425,89.646593)" + cx="64.35347" + cy="106.71302" + fx="64.35347" + fy="106.71302" + r="60.700505" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6079" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(4.6812453,-5.2700969e-7,3.571426e-8,0.3172375,-85.242554,44.725131)" + cx="26.573795" + cy="73.493042" + fx="35.587811" + fy="102.79941" + r="60.700562" /> + <radialGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="radialGradient6081" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.9554688,0,2.9478533)" + cx="64.07962" + cy="66.197433" + fx="64.07962" + fy="66.197433" + r="60.700504" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3290" + id="radialGradient6083" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9439139,-0.3301918,0.332644,0.9509241,-16.097695,27.249949)" + cx="69.526619" + cy="60.115833" + fx="69.526619" + fy="89.655701" + r="111.65377" /> + <linearGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="linearGradient6085" + gradientUnits="userSpaceOnUse" + x1="64.07962" + y1="-14.227339" + x2="64.07962" + y2="120.44466" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6087" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="63.948792" + y1="12.034382" + x2="67.219337" + y2="12.034382" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6089" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" + cx="64.101562" + cy="48.703125" + fx="64.101562" + fy="48.703125" + r="56.812496" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6091" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6093" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-170.08594,0)" + x1="219.22163" + y1="28.149843" + x2="219.22163" + y2="116.41813" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6095" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.75,0,9.9581557)" + cx="41.233166" + cy="39.832623" + fx="41.409943" + fy="44.369892" + r="8.1317282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6097" + gradientUnits="userSpaceOnUse" + x1="177.42397" + y1="22.377773" + x2="177.60074" + y2="93.022789" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="linearGradient6099" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-37.771032,-0.1213203)" + x1="261.50107" + y1="77.652245" + x2="200.17728" + y2="31.10997" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient6101" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6103" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.09135844,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" + cx="64.35347" + cy="98.207405" + fx="64.35347" + fy="98.207405" + r="60.700505" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3379" + id="linearGradient6105" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-152,0)" + x1="216.88614" + y1="122.5867" + x2="216.88614" + y2="37.969955" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6107" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6109" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6111" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6113" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3379" + id="linearGradient6115" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-152,0)" + x1="216.88614" + y1="122.5867" + x2="216.88614" + y2="37.969955" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3844" + id="linearGradient6117" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="28.637825" + y1="120.84999" + x2="31.289474" + y2="122.08743" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6119" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4443044,1.2598841e-8,0,0.1825067,35.563425,89.646593)" + cx="64.35347" + cy="106.71302" + fx="64.35347" + fy="106.71302" + r="60.700505" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6121" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(4.6812453,-5.2700969e-7,3.571426e-8,0.3172375,-85.242554,44.725131)" + cx="26.573795" + cy="73.493042" + fx="35.587811" + fy="102.79941" + r="60.700562" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3946" + id="radialGradient6135" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.09135844,-2.9656957e-8,4.5207376e-8,0.1392616,58.276716,94.261412)" + cx="64.35347" + cy="98.207405" + fx="64.35347" + fy="98.207405" + r="60.700505" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6143" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-170.08594,0)" + x1="219.22163" + y1="28.149843" + x2="219.22163" + y2="116.41813" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3309" + id="radialGradient6147" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.6476898,0,17.158608)" + cx="64.101562" + cy="48.703125" + fx="64.101562" + fy="48.703125" + r="56.812496" /> + <linearGradient + inkscape:collect="always" + xlink:href="#XMLID_1_" + id="linearGradient6151" + gradientUnits="userSpaceOnUse" + x1="64.07962" + y1="-14.227339" + x2="64.07962" + y2="120.44466" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6155" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6157" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6161" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2248115,-0.5961364,0.2773621,1.0351295,-163.57967,70.62501)" + cx="121.58587" + cy="52.85474" + fx="121.58587" + fy="52.85474" + r="3.1883843" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="radialGradient6163" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2538745,-0.4598801,0.2575547,0.7022291,-43.321636,71.69735)" + cx="122.69361" + cy="52.672272" + fx="122.55822" + fy="51.026066" + r="3.1883843" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6167" + gradientUnits="userSpaceOnUse" + x1="177.42397" + y1="22.377773" + x2="177.60074" + y2="93.022789" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="linearGradient6169" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-37.771032,-0.1213203)" + x1="261.50107" + y1="77.652245" + x2="200.17728" + y2="31.10997" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1563" + id="linearGradient6172" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-170.07031,-0.1213203)" + x1="261.50107" + y1="77.652245" + x2="200.17728" + y2="31.10997" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3363" + id="linearGradient6175" + gradientUnits="userSpaceOnUse" + x1="177.42397" + y1="22.377773" + x2="177.60074" + y2="93.022789" + gradientTransform="translate(-132.29928,0)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8284271" + inkscape:cx="-15.061653" + inkscape:cy="49.822074" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1918" + inkscape:window-height="1147" + inkscape:window-x="0" + inkscape:window-y="35" + showgrid="true" + inkscape:grid-points="true" + inkscape:window-maximized="0"> + <inkscape:grid + type="xygrid" + id="grid2302" + spacingx="4px" + spacingy="4px" + empspacing="2" + visible="true" + enabled="true" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + transform="matrix(0.4934214,0.1726044,-0.1726044,0.4934214,42.377875,49.908537)" + d="M 153.09403,94.713757 C 144.53658,107.09689 92.616372,93.013297 78.414631,98.001518 64.21289,102.98974 32.50348,146.4474 18.082028,142.13539 3.6605746,137.82337 1.0106378,84.092245 -8.1220219,72.127031 -17.254681,60.161818 -68.384124,43.433534 -68.739625,28.385431 c -0.3555,-15.048104 49.926959,-34.1721736 58.484406,-46.555303 8.557447,-12.38313 8.6671236,-66.179444 22.868864,-71.167664 14.201742,-4.988221 47.927947,36.923576 62.3494,41.235595 14.421453,4.312018 65.618675,-12.207649 74.751335,-0.242435 9.13266,11.965214 -20.30585,56.9921987 -19.95035,72.040303 0.3555,15.048103 31.88745,58.634701 23.33,71.01783 z" + inkscape:randomized="0" + inkscape:rounded="0.20136392" + inkscape:flatsided="false" + sodipodi:arg2="1.2330172" + sodipodi:arg1="0.60469864" + sodipodi:r2="76.832565" + sodipodi:r1="121.72647" + sodipodi:cy="25.510532" + sodipodi:cx="52.952892" + sodipodi:sides="5" + id="path3574" + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;opacity:0.127" + sodipodi:type="star" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/history.svgz b/kde/plasma/plasmoid-qml/package/contents/images/history.svgz new file mode 100644 index 0000000000000000000000000000000000000000..82f07092567531c579b0086b1632797cdf896d69 GIT binary patch literal 3656 zcmb2|=3sz;yHSzFw>>7+<^AR2`JHMtjp4Q3jY(=bCyOi=RWD1vb9|qr!Um7RSu7F^ zB^UPB85cIQWL&(vdAFg<4W>=2j5hB(b>@_n-v4i#?pFBgoxSE+W4e%WW`$ngq@z}G zvA%Ubf1WcJ)<1o?LNIUAjac7DDWA5#?moT$$G-3Pj_UD#R+(F!FLrY8XS*D;{>Zoq zHm8_`CanDa@%s0ByQjxadUnr$_VKCz6~8q#{m9lVez&qg;QiajRhvJkh#snWUb(Nn zwy<!f?OHvX^USP|bL7&)C%4<&KbyYUg4=0|xXa11Z-zBR<(|K0@1EcIX|w0;BtcW% zvi_H99+$4>2%f!jEH`#edcfSW)$X}pHA)lr)fFA6pWR@RBbk1`Olx^}YVhx$KP@Ys zxvFNZohxXTe5PHhZd?E74@cjdx5n|BrnXFwoU+w4K0N#1rpV*_`?Z3nlr24c;@yMz z%L~+4B0tS=%j49I71&)<_WN^g@QcX_6ZNff8ZyONt*=jx7WUqAXzl5;#3!2~ef4jZ z`}B&ne0`Ml$$3Zl%jKVbSMEI_zhK79N1qR_4d<`?{dY^*`TWV#S95;kkeK=LRTGPa zzWK?|SD$3gUHjgAsfBp^hgbL8FTP)GQrY7e@n+uM!^bYHu3Y%`YRdFoXO{Y>ewJ#e zTx`Z^q5XAT)m2>~wFit}gR*;GZI4$GRAQ=FYh2J@%h3E|=Xv$YGv)n1)xS^Ly(5Lg zqRc_JYh&yM<}I1;x%59zf8DF?dRA`I+SzZf879n7`yiCM`AO>jqK`aLIRY~xC7vp1 z&AyuT_R&>^>(h_&<+NRDIC=0>?eagriXKjjwB7c@k2C0?NbHP#{)dlB$q1Z2Emdok zE~edVwR;oSf*J44FUYI>4BXV%@cC`g#u%-CwT@m153c>J^V>iFitePRM#TxHOBOCr zSi}3~>yg>Dkq#eUb1NKYdNF|^nq$V--=(#k`VXJ&`2YX!V}AKO`%Zt+)f_$1Gkzu4 zn=-yn-m-8>xUgpPx9ZT3zb$zm^V}(~Hoe(axvTD{Hs_jcIbI(c!_}5gDdyPL;w#D7 z6ZU2|v)uk8uVo&cQ?@wZ{-v${$o`af2?l)&WgYxCN1w{?->BFo+j!rAXUCL3BH?=X z?_8Lzxb6{4xa(Srqf_rhdY%yoFKt>q?UzY-Qr?M%pMuG5J1<@4`8wONZQ7J)*UZ-! z7Qeo1IsJ?Mi4Qs(!%kn^abdx+gO~PYNlZIq`CW>!i;w?w_F{!Z_P_beJc8;>cN@-K z{9BZ{Sa~l0@B4xa{8)A|GJ3g%Ty9RVlwo1t9q+GpAn&o#1hKq%hik(+b&6*Ebbh7q z{8w4RCW)gLHaJJiZrdDKeePqa@UwU8?Ve`63TBMdJt(s^te45?7F&pM82>4`%pT_! zgH_A+8mu|aoZYc*;vHt+lMFioquh=<_S-VgZthGuaMO3{o*Gl7sqL2!?Nn@K?wfWq zleIskF{P*by_F#Af|o5KvC-Eyg>QKymbgIE`Tc~A3OSe9ZUv}WzcA|13FA<*UR)5t z%YN+80SWCZ+D$W*dJgr39NqZqw7A)W3z^CWGdvxxe7N4a+0Z(5Rp&}|pV%(9mw~e# z&MZ1x^*wlo{gz8vTtA$1`%N=--o2AzQ|*quxrdkA;rGR4kx#LwI_3ol3Y^~hCC`RK z?g3xh#%UgFnNEm^2WK&>E?E>S<-@xy<L0Cm4vQYarwUDMvji<!FB^qq=QXG>WonuR zA7$qJ#JzIEy_7prrdM?yxOjS5|KTyY7BgvG#BH;8FWgHKRFAyNGuPms5)!ca^8Gfp zMV2c6oTBcn)l7J0a;rr0+LFEpUCVM8FZ`e|!QoWWjyX<y7PJYRY+x&7Pn!FxR8mVS zwSnVC#KM&UvTd>)*#~(qtS!4*(2=M9Do|SD?)mn~4#IDkC6u#grrbaLE1CIoL5u&# zi!+Nh+4$C#f41n1{rXP)v~7ldHdB<X#P>ZBYfC%-dtED>zbp2+-rY41&&OQZ;yS~2 zO7XQhY%B{mT)WcRtCnm3iZyDEPRzdhmLJ+Qx;OFsbA8Ga_WRW8<#}2^ri&XK>I~>w zA9)}^(ckB;o7`s(jl>=;UH<m<(_{22Rr*A&6g&Ann(nwb6qN=Er1s5M?cn1On&6>b z>%}K3qV!GtDbKQ7KYl;D!L#P?iVN%gs|(bW?`obYd9Ej0@_g-PqnVAGZigPk$Jcy5 zYwmkLd+x#&ErkpnyLXp=oweB1<HdamW$R-ZJ9&-^<X+T~+;5a>^C~I5u7=mmHh`b; zJ+GUg*I&Kwdq0~LnA$9uZ+U24zL)dL-9b4lJEm<^sTZ(5@#xEqEM}oSpTnfTv(3N$ zd%NKAf3;PdW*ba{IV<kYJ3W6^Q1RmP2D|@H*ZjIa`|nZRzsVQ==&#?Owj-P~?A8;O zhu3rq4*y)led)7RoXYvS&4#^(^(&nAPRw2Ta{Bv2Q%}nsVtp67`SGGtOA04x|IPWj zqwS8$O$!I+@)eoE6Ph|0tBU^XOB`J|>9<Pkjx7@%s-GO%o6r&ZQJX7Z{;Zf?vBFjF z4!=oY{#86FXX5gOEYl(v#dnmQ4pG<|cu7vAQOzJOCff0>!W8{d7Ym(+X)&?|)jq)+ zl<J$)xxy!lHuvo5S;v3USgFi3vTe5WUG2KtA6PG)JfGLdv|fL9Qcidj@3W5Z$<u9v ztfuwP_ql0hu<I>fzi^lHmRpXik~z1$I)3Zf>BpU}{nL&<T(_z_=Hl{AD)-*3_R3hn zT(wZ>{lnLKzT51V_Hlf@_|#G(p!#FOBhOuNYm;rfZ|?o#@mp`@D~>!qxl7+-qjJ?J zcw8$BVlec0FJU<~_b%Ve*^D|j=l4H-bK~xMeZB2^{Njmn*RI9Y7oTC#`>2rnGv>^W zAG;#m^|aN${Sv<Y_I2l{rFE7zXRIt<Yem)VU}b90i7nvxefG$`$(K8RM#$XSd(<`X zTd2}|;SS;3@^_5>yBmJeHJCahW%^?GmI|Mc=#a}-ZG6J@)}K7F-v8jfDOnFzUXeZW zMIhwo%lGeRYS^FJv+BXsg<?GhU*0<vJk7W-8T5cT+wOXCQpUvHvrnCR*A?&BKUv;d zHFo*&ROK^vywiiag`W1wrP`;v%i6B~9}>x`T^*LY`TudozzObamY76;nR2>h<DCDW zzrFiq)b(t?>dW_`aZFb}*j2I^e7IpSOW(WlwXTm%#f87|`nP${oc3kBcF-eidHV^4 z(x*4SJ}CUJbZgzlgKv`e-OI64xPR#F#Pe47cf4+@{u`y)e*4?jeVcE6{pfY5(CVh# zgO^60IzlEvY+5pg9(qiEt7H^i?{90Ia@FWB_j7sibRA2#O^@DrHLkj}@%8f=mMTFt zC8j$f9u)^MtybYFNITM}$AACsosHHvpQjwN?96IT%y{_q*}G@&wjJ-BT<AB!tWW=; z)c?%wN?d;K=~nRuJjL@8Z~SLI{b1L&9>v)WccLGzyUg+b_tCw(?a#(vxb}%Hw>ffY zkK}g#nqM+sf2=4v>VJdXrq-`)im-W`)G4>{=gekGFEz|hzO<~Gsy?N8PLIIjeP6zD zXluG#^p?Gmtv!D4qn)sA)}Q0qr>^~YyF7eG@x+Y>Hl6Ki=+^qEJ*|)>#wA3rDcgcs zn<MV&=N)y;Y(hPsZR#Z?Opl&(_3&DmDzB)j)xu|{xUWG#HQiCg`o#x1gAJQrF*e_? zmzZJr+=5-gcR!!RuXKjR%xRU~-8y#vHFT<S=1I4<M*rKk=}lYbPpgO<ksDU<=`3nJ zD)QYhDkkJ-t(d{F8RpCEb7y~C;MyTKH|K0`WqQv1%Mllt{3ZnS7gl}#cJ}OSX1~Y5 ztWT3n?(Upu{>tr(Wv{<z&!vl;pT6nZ{C$vjd^xAz3k^SkI}cwLOS#8f5PsR)=Kj^P zS6T1sk9+^_>e|)%C3nm>o;>aPi?%zD9~E6q437UZr~G}bShdmFYyNh7mabT~<9EW+ zjh}YkTloFP%7l=A;rV(p^BRR>Wn`|VFSu%W>4#*-QTFZPHb<FNMYam@r<yLj)@?JN zwZ+Tx#}w8H@`c(q^PRiaC499rO(=4Sx~3Q?C$O5+TyAENgh|%NKhsY!e7|vZ%B%xi zZSF5V99wcgnrEBU2DZSMpmPmtuT9c?_0v~1po9C^k~bGD7$uc9ERgHsSn(jBA*gj) zlL7yfM@KyRyd0SY9_8Bb9h?!IxXg~>yhTBejYv=R?h6b;zMQ;?HX8GPNv-d5oG#5& z@TjY)ydgtgMRVoWfCW={rfgz*pJuSf#bc%E+Eos$sgVg?yeWG&Dk=z6%}shCpSB~W zypz{R!MkbGl*l*sI+86HS(RVJIyV2yTo$oVzJP7Ptm044UbSpsE;oO4!?kkKuZzjQ zM4t7pT<v##S6f9!(iF|;IT`h>orMN0hg!D;GYEyr_i&pS?NL10vN5>nuQuPW<rPyU zT>|e;TD9MxD@BWWPndH@)3>8{B~lo|!nbC<lG`5IsM_#qiip}N<~Kd9h9MPK8BVr3 ziCww8D8yr?ll(f~(7E{%OT1=o%3RtRu%YGChpJ_dd`!Rg&59J$c*Cgc5+?L;@2VHm znM$AU7JX5!@@uI_chq8^dtqPuZ*RM+qqE~>T{qXOpaqdHf)+gw-?3@hC0U;R_EKLf zq~3+{mPX%~fAAnW&d5Q>t~$EE%WJNZyTXYZB3jMz4_Jk!I3=!JwPb<Zy&r7?S<BZX zJepenYJIQzf&Hb-C0BF2URBlI-KS`x>wVn0@!5$O1+yv4U0Ydr9M_6}*nG(7OT7TA zBs<%*Pse!nZHd2-@A%QqXKmD7q5ZF-ZumN{&Ew21=BZyAb0IAwV7H?JtABgQ;eVEn z4H@1FZ&rP7KF~jJ;nRffm8`#0qM9Q$Hz*jCMLV3aRNhnKJfro^6*iv?KE}C@&(<V( zv351dNO86Zwu;v>AC^d{llW$m%jdH1%46ZrdVfy!{u0f*X1{jbfA+hAvWvHvFfafB D&b$Oe literal 0 HcmV?d00001 diff --git a/kde/plasma/plasmoid-qml/package/contents/images/phone.svg b/kde/plasma/plasmoid-qml/package/contents/images/phone.svg new file mode 100644 index 0000000000..105b67a1da --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/phone.svg @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="503.1152" + height="546.65369" + id="svg3552" + version="1.1" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="phone.svg"> + <defs + id="defs3554" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="252.27189" + inkscape:cy="124.7554" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="1" + fit-margin-right="1" + fit-margin-bottom="1" + fit-margin-left="1" + inkscape:window-width="1855" + inkscape:window-height="1176" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" /> + <metadata + id="metadata3557"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-154.15669,-139.03536)"> + <path + style="opacity:0.12716763;fill:#000000;fill-opacity:1;stroke:none" + d="m 312.23151,497.37847 c 83.07152,95.20715 187.81978,138.84618 243.76561,88.63617 2.49448,-2.23873 22.31269,-31.68075 27.78663,-44.08056 3.6189,-8.1979 -2.85778,-16.27339 -7.03961,-19.07986 l -76.34156,-51.36225 c -4.73694,-3.17917 -18.25495,-6.51426 -26.46252,0.85182 l -39.1988,35.17995 c -5.17068,4.6406 -12.75029,2.22188 -17.63336,-1.09183 -39.19137,-26.59552 -82.17543,-80.598 -101.4196,-116.23561 -2.82208,-5.22622 -4.06266,-13.20708 1.10802,-17.84769 l 39.4201,-35.37857 c 7.2668,-6.52175 7.70076,-18.62456 4.28697,-25.56699 L 319.2248,227.42218 c -2.23426,-4.5439 -9.9927,-12.45314 -17.61021,-8.82948 -19.12457,9.09768 -40.90036,17.67551 -46.44309,22.64994 -55.94573,50.21001 -26.01157,160.92868 57.06001,256.13583 z" + id="path3214" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ssscccsssscccsss" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/.directory b/kde/plasma/plasmoid-qml/package/contents/images/state/.directory new file mode 100644 index 0000000000..86f073d615 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/.directory @@ -0,0 +1,3 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2012,5,16,14,55,58 diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/busy.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/busy.svg new file mode 100755 index 0000000000..3f9adf3e27 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/busy.svg @@ -0,0 +1,781 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="current (copie).svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#ff9e54;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#903e00;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#903e00;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#ff750c;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2491" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="12.113755" + x2="7.293807" + y1="16.110582" + x1="11.408385" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2489" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2487" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.949513" + x2="2.7672646" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2485" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="3.0470817" + x2="23.496424" + y1="10.387442" + x1="1.267894" + gradientUnits="userSpaceOnUse" + id="linearGradient2483" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2416"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2418" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2420" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + id="stop2424" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2426" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2428"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2430" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2432" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2434" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9220986,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2436" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.9107675,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2438" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2440" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.1362892,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2444" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <radialGradient + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2342" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2340" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2338" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2336" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2334" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2332" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2326"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2328" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2330" /> + </linearGradient> + <linearGradient + id="linearGradient2320"> + <stop + id="stop2322" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2324" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2314"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2316" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2318" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2312" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2310" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2308" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2306" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2304" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2302" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2300" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2292" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2294" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + id="stop2286" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2288" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2278"> + <stop + id="stop2280" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2282" + offset="1" + style="stop-color:#fefee7;stop-opacity:0.89308178" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="16" + inkscape:cx="13.429637" + inkscape:cy="14.062082" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="5" + inkscape:window-y="425" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(12.25524,-3.4355522)"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#903e00;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#903e00;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#903e00;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + <g + id="g2266" + style="opacity:1;fill:#ff7105;fill-opacity:1;stroke:#903e00;stroke-opacity:1" + transform="matrix(1.2687892,0,0,1.2687892,-6.6211534,-0.9357295)"> + <g + id="g3252"> + <path + sodipodi:type="arc" + style="opacity:1;fill:#2d2d2d;fill-opacity:0.52037615;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3240" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.7168524,0,0,0.7168524,28.665086,-2.8957295)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ff7105;fill-opacity:1;stroke:#903e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2260" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.4763157,0,0,0.4763157,23.987745,-0.7675302)" /> + </g> + <g + id="g3248" + transform="translate(-0.3694459,0)"> + <path + sodipodi:type="arc" + style="opacity:1;fill:#2d2d2d;fill-opacity:0.52037617;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3244" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.7168524,0,0,0.7168524,32.753628,-2.8464698)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ff7105;fill-opacity:1;stroke:#903e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3246" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.4763157,0,0,0.4763157,28.076287,-0.7182706)" /> + </g> + <g + style="opacity:1;fill:#ff7105;fill-opacity:1;stroke:#903e00;stroke-opacity:1" + id="g3256" + transform="translate(7.438193,4.925971e-2)"> + <path + sodipodi:type="arc" + style="opacity:1;fill:#2d2d2d;fill-opacity:0.52037617;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3258" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.7168524,0,0,0.7168524,28.665086,-2.8957295)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ff7105;fill-opacity:1;stroke:#903e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3260" + sodipodi:cx="-19.445436" + sodipodi:cy="8.8477116" + sodipodi:rx="2.2728431" + sodipodi:ry="2.2728431" + d="M -17.172593 8.8477116 A 2.2728431 2.2728431 0 1 1 -21.71828,8.8477116 A 2.2728431 2.2728431 0 1 1 -17.172593 8.8477116 z" + transform="matrix(0.4763157,0,0,0.4763157,23.987745,-0.7675302)" /> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/call.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/call.svg new file mode 100755 index 0000000000..9b46bcf1bf --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/call.svg @@ -0,0 +1,488 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="call.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2483" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2485" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2487" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2489" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2491" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="8" + inkscape:cx="22.991745" + inkscape:cy="-5.4508769" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="5" + inkscape:window-y="504"> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient4051);fill-opacity:1;stroke:none;stroke-width:5.69999981;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3162" + sodipodi:cx="19.285715" + sodipodi:cy="9.8571424" + sodipodi:rx="8.0357141" + sodipodi:ry="8.0357141" + d="M 27.321429 9.8571424 A 8.0357141 8.0357141 0 1 1 11.250001,9.8571424 A 8.0357141 8.0357141 0 1 1 27.321429 9.8571424 z" + transform="matrix(0.723409,0,0,0.723409,1.772732,0.64261)" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 15.724195,5.2432362 L 15.724195,1.880704" + id="path2257" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 17.657019,6.380202 L 20.569056,4.6989359" + id="path2259" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 17.657019,8.8683213 L 20.569056,10.549588" + id="path2261" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 15.724195,10.005288 L 15.724195,13.36782" + id="path2263" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 13.807083,8.868322 L 10.895045,10.549587" + id="path2265" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" + d="M 13.807083,6.3802018 L 10.895046,4.698936" + id="path2267" + sodipodi:nodetypes="cc" /> + <g + id="g2446" + inkscape:label="Calque 1" + transform="translate(20.193677,1.1140386)"> + <g + style="fill:none;stroke:#000000;stroke-opacity:0.44968555" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + id="g2181"> + <path + sodipodi:nodetypes="csccczccsccccc" + id="path2183" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" /> + </g> + <g + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + id="g2451"> + <path + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + id="path2453" + sodipodi:nodetypes="cccsccsccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + id="path2455" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + id="path2457" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + id="path2459" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + id="path2461" + sodipodi:nodetypes="cccsccc" /> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/current.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/current.svg new file mode 100755 index 0000000000..5ca655c2e7 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/current.svg @@ -0,0 +1,737 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="current.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective4757" /> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2491" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="12.113755" + x2="7.293807" + y1="16.110582" + x1="11.408385" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2489" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2487" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.949513" + x2="2.7672646" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2485" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2483" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2416"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2418" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2420" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + id="stop2424" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2426" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2428"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2430" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2432" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2434" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9220986,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2436" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.9107675,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2438" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2440" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.1362892,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2444" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <radialGradient + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2342" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2340" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2338" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2336" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2334" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2332" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2326"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2328" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2330" /> + </linearGradient> + <linearGradient + id="linearGradient2320"> + <stop + id="stop2322" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2324" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2314"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2316" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2318" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2312" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2310" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2308" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2306" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2304" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2302" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2300" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2292" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2294" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + id="stop2286" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2288" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2278"> + <stop + id="stop2280" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2282" + offset="1" + style="stop-color:#fefee7;stop-opacity:0.89308178" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="7.919596" + inkscape:cx="15.568279" + inkscape:cy="13.617397" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1600" + inkscape:window-height="926" + inkscape:window-x="0" + inkscape:window-y="24" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="11.237947" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(14.730114,-3.4355522)"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="csc" + id="path3488" + d="M 18.019888,12.625004 C 18.48189,11.534667 18.765826,10.027007 18.765826,8.3750001 C 18.765826,6.7229936 18.48189,5.2153338 18.019888,4.1249963" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:0.50400000000000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;visibility:visible;display:inline;overflow:visible" /> + <path + sodipodi:nodetypes="csc" + id="path5545" + d="M 14.647708,13.095398 C 15.139397,12.256607 15.441578,11.096773 15.441578,9.8258928 C 15.441578,8.555013 15.139397,7.3951783 14.647708,6.5563874" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#3c8d54;stroke-width:0.45574296;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + sodipodi:nodetypes="csc" + id="path6056" + d="M 17.127031,13.875004 C 17.589033,12.784667 17.872969,11.277007 17.872969,9.6250001 C 17.872969,7.9729936 17.589033,6.4653338 17.127031,5.3749963" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#3c8d54;stroke-width:0.50367486;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + sodipodi:nodetypes="csc" + id="path6058" + d="M 19.694973,14.744562 C 20.280188,13.356696 20.639849,11.437627 20.639849,9.3348217 C 20.639849,7.2320171 20.280188,5.3129485 19.694973,3.9250808" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#3c8d54;stroke-width:0.63955802;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/dial.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/dial.svg new file mode 100755 index 0000000000..f7e490dfb6 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/dial.svg @@ -0,0 +1,546 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="dial.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:0.69469029;" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient3208" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3280" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-3.0304576)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3282" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(6.2851708,-3.030458)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3284" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(12.57034,-3.030458)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3292" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(5.8366603,5.1770313)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3294" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(12.121831,5.1770309)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3296" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(18.407,5.1770309)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3298" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-3.0304576)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3300" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(6.2851708,-3.030458)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1368" + id="linearGradient3302" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(12.57034,-3.030458)" + x1="3.9194174" + y1="7.8426361" + x2="6.5609155" + y2="14.340417" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="7.919596" + inkscape:cx="33.634789" + inkscape:cy="18.879033" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="901" + inkscape:window-y="49" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3259" + transform="matrix(0.9652036,0,0,0.9652036,-1.6371275,-0.5352586)"> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="3.661803" + height="3.914341" + width="3.914341" + id="rect2210" + style="opacity:1;fill:url(#linearGradient3298);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="9.9469738" + height="3.914341" + width="3.914341" + id="rect3191" + style="opacity:1;fill:url(#linearGradient3300);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="16.232143" + height="3.914341" + width="3.914341" + id="rect3195" + style="opacity:1;fill:url(#linearGradient3302);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <g + id="g3222" + transform="matrix(0.9652036,0,0,0.9652036,-7.2433958,-2.1004447)" + style="opacity:1"> + <rect + ry="0.73531199" + rx="0.73531199" + y="13.519668" + x="9.4984636" + height="3.914341" + width="3.914341" + id="rect3210" + style="opacity:1;fill:url(#linearGradient3292);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="13.519668" + x="15.783634" + height="3.914341" + width="3.914341" + id="rect3212" + style="opacity:1;fill:url(#linearGradient3294);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="13.519668" + x="22.068804" + height="3.914341" + width="3.914341" + id="rect3214" + style="opacity:1;fill:url(#linearGradient3296);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <g + id="g3264" + transform="matrix(0.9652036,0,0,0.9652036,-1.6234791,12.178165)" + style="opacity:1"> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="3.661803" + height="3.914341" + width="3.914341" + id="rect3266" + style="opacity:1;fill:url(#linearGradient3280);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="9.9469738" + height="3.914341" + width="3.914341" + id="rect3268" + style="opacity:1;fill:url(#linearGradient3282);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="0.73531199" + rx="0.73531199" + y="5.3121786" + x="16.232143" + height="3.914341" + width="3.914341" + id="rect3270" + style="opacity:1;fill:url(#linearGradient3284);fill-opacity:1;stroke:#137300;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <g + id="g3199" + transform="translate(-0.3156731,-1.2626907)"> + <path + transform="matrix(0.723409,0,0,0.723409,4.2981133,0.64261)" + d="M 27.321429 9.8571424 A 8.0357141 8.0357141 0 1 1 11.250001,9.8571424 A 8.0357141 8.0357141 0 1 1 27.321429 9.8571424 z" + sodipodi:ry="8.0357141" + sodipodi:rx="8.0357141" + sodipodi:cy="9.8571424" + sodipodi:cx="19.285715" + id="path3162" + style="fill:url(#radialGradient3208);fill-opacity:1;stroke:none;stroke-width:5.69999981;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + <path + sodipodi:nodetypes="cc" + id="path2257" + d="M 18.249576,5.2432362 L 18.249576,1.880704" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + <path + sodipodi:nodetypes="cc" + id="path2259" + d="M 20.1824,6.380202 L 23.094437,4.6989359" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + <path + sodipodi:nodetypes="cc" + id="path2261" + d="M 20.1824,8.8683213 L 23.094437,10.549588" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + <path + sodipodi:nodetypes="cc" + id="path2263" + d="M 18.249576,10.005288 L 18.249576,13.36782" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + <path + sodipodi:nodetypes="cc" + id="path2265" + d="M 16.332464,8.868322 L 13.420426,10.549587" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + <path + sodipodi:nodetypes="cc" + id="path2267" + d="M 16.332464,6.3802018 L 13.420427,4.698936" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2a6f1d;stroke-width:0.51589537px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.49408282" /> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/fail.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/fail.svg new file mode 100755 index 0000000000..f3751ca765 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/fail.svg @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="fail.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#b00014;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#70000c;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4167" + id="linearGradient4173" + x1="7.1249466" + y1="23.946518" + x2="20.06057" + y2="16.478132" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(6.313453e-2,-0.384275)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="13.59101" + inkscape:cy="12.669149" + inkscape:document-units="px" + inkscape:current-layer="g3157" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="5" + inkscape:window-y="49"> + <sodipodi:guide + orientation="horizontal" + position="8.0357143" + id="guide3144" /> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3157" + transform="matrix(0.8678614,0.8678614,-0.8678614,0.8678614,11.185569,-9.9643113)"> + <path + style="opacity:1;fill:#7e001a;fill-opacity:1;stroke:#3b000b;stroke-width:1.22734141;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.60188085" + d="M 5.25 2.1875 C 4.8395257 2.1875 4.4395267 2.3417233 4.125 2.65625 L 2.59375 4.1875 C 1.9646967 4.8165533 1.9646968 5.8084466 2.59375 6.4375 L 8.3125 12.1875 L 2.59375 17.90625 C 1.9646967 18.535303 1.9646968 19.527197 2.59375 20.15625 L 4.125 21.6875 C 4.7540533 22.316553 5.7771965 22.316553 6.40625 21.6875 L 12.125 15.96875 L 17.84375 21.6875 C 18.472803 22.316553 19.495947 22.316553 20.125 21.6875 L 21.65625 20.15625 C 22.285303 19.527197 22.285303 18.535304 21.65625 17.90625 L 15.9375 12.1875 L 21.65625 6.4375 C 22.285303 5.8084467 22.285303 4.8165534 21.65625 4.1875 L 20.125 2.65625 C 19.495947 2.0271967 18.472803 2.0271966 17.84375 2.65625 L 12.125 8.375 L 6.40625 2.65625 C 6.0917233 2.3417233 5.6604743 2.1875 5.25 2.1875 z " + transform="matrix(0.5761289,-0.5761289,0.5761289,0.5761289,-0.7036018,12.185056)" + id="rect2182" /> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/hang_up.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/hang_up.svg new file mode 100755 index 0000000000..8fa89cfe6e --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/hang_up.svg @@ -0,0 +1,772 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="hang_up.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient2500"> + <stop + style="stop-color:#800000;stop-opacity:1;" + offset="0" + id="stop2502" /> + <stop + style="stop-color:#800000;stop-opacity:0;" + offset="1" + id="stop2504" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective127" /> + <linearGradient + id="linearGradient4357" + inkscape:collect="always"> + <stop + id="stop4359" + offset="0" + style="stop-color:#b00000;stop-opacity:1" /> + <stop + id="stop4361" + offset="1" + style="stop-color:#b02100;stop-opacity:0" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4269"> + <stop + style="stop-color:#b00014;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#b00014;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#70000c;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4167" + id="linearGradient4173" + x1="7.1249466" + y1="23.946518" + x2="20.06057" + y2="16.478132" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(6.313453e-2,-0.384275)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4357" + id="linearGradient4275" + x1="15.630395" + y1="22.874208" + x2="15.806232" + y2="6.6770978" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.158192,0,0,1.158192,-6.593576,-2.538854)" /> + <linearGradient + id="linearGradient2278"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop2280" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop2282" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2286" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop2288" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + id="stop2292" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2294" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2392"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2394" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2396" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2390" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2304" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2306" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2386" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2310" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2312" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2380"> + <stop + id="stop2316" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2318" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2376"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2322" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2324" /> + </linearGradient> + <linearGradient + id="linearGradient2326"> + <stop + id="stop2328" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2330" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2332" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2334" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2336" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2338" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2340" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient2342" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <radialGradient + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient4051" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1414" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient1412" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient1410" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient1408" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient1406" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1362"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1364" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop1366" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + id="stop1370" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1372" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient1374"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop1376" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop1378" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1380" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1382" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1384" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1386" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1388" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2325" + x1="15.630395" + y1="22.874208" + x2="15.806232" + y2="6.6770978" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2224" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2322" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + id="linearGradient2320" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2318" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + id="linearGradient2316" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + id="linearGradient2314" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2308"> + <stop + id="stop2310" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2312" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2302"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2304" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2306" /> + </linearGradient> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2300" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient4045"> + <stop + id="stop4047" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop4049" + offset="1" + style="stop-color:#fcfbcb;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient2506" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="22.4" + inkscape:cx="16.277456" + inkscape:cy="16.683708" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="722" + inkscape:window-x="5" + inkscape:window-y="49" + showgrid="false"> + <sodipodi:guide + orientation="horizontal" + position="8.0357143" + id="guide3144" /> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:1;fill:url(#linearGradient4275);fill-opacity:1;stroke:none;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 7.4133112,3.7940921 L 7.4133112,15.267435 L 3.6853797,15.267435 L 11.9375,23.953878 L 20.18962,15.267435 L 16.461688,15.267435 L 16.461688,3.7940921 L 7.4133112,3.7940921 z " + id="rect4262" /> + <g + id="g2407" + inkscape:label="Calque 1" + transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,28.570435,0.9317453)" + style="fill:url(#linearGradient2506);fill-opacity:1"> + <g + transform="translate(14.730114,-3.4355522)" + inkscape:label="Calque 1" + id="g2364" + style="fill:url(#linearGradient2506);fill-opacity:1.0"> + <g + id="g2446" + inkscape:label="Calque 1" + transform="translate(7.9455775,4.2707653)" + style="fill:url(#linearGradient2506);fill-opacity:1.0"> + <g + style="fill:url(#linearGradient2506);stroke:#000000;stroke-opacity:0.44968554999999999;fill-opacity:1.0" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + id="g2181"> + <path + sodipodi:nodetypes="csccczccsccccc" + id="path2183" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:#000000;stroke-width:0.65573961000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968554999999999" /> + </g> + <g + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + id="g2451" + style="fill:url(#linearGradient2506);fill-opacity:1.0"> + <path + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:#561500;stroke-width:0.62500000000000000;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + id="path2453" + sodipodi:nodetypes="cccsccsccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:#561500;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + id="path2455" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:#561500;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + id="path2457" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:none;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + id="path2459" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2506);fill-opacity:1.0;stroke:none;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + id="path2461" + sodipodi:nodetypes="cccsccc" /> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/hold.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/hold.svg new file mode 100755 index 0000000000..d074c3356c --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/hold.svg @@ -0,0 +1,818 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="hold.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#00a6b0;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#00a6b0;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#00a5b0;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#00595f;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,-1.726592e-17,-1.726592e-17,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.632388,0,0,0.632388,3.258093,0.894991)" /> + <linearGradient + id="linearGradient2278"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop2280" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop2282" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2286" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop2288" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + id="stop2292" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2395" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2296"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2298" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2391" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2302" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2306" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2308" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2376"> + <stop + id="stop2316" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2318" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2372"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2322" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2324" /> + </linearGradient> + <linearGradient + id="linearGradient2326"> + <stop + id="stop2328" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2330" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2332" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2334" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2336" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2338" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2340" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient2342" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2483" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2485" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="2.7672646" + y2="12.949513" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2487" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2489" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="11.408385" + y1="16.110582" + x2="7.293807" + y2="12.113755" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2491" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient4051" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1414" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient1412" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient1410" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient1408" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient1406" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1362"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1364" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop1366" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + id="stop1370" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1372" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient1374"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop1376" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop1378" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1380" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1382" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1384" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1386" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1388" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4275" + x1="15.630395" + y1="22.874208" + x2="15.806232" + y2="6.6770978" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2320" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2318" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + id="linearGradient2316" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2314" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + id="linearGradient2312" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + id="linearGradient2310" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2304"> + <stop + id="stop2306" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2308" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2298"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2300" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2302" /> + </linearGradient> + <linearGradient + id="linearGradient2292"> + <stop + id="stop2294" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2296" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient4045"> + <stop + id="stop4047" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop4049" + offset="1" + style="stop-color:#fcfbcb;stop-opacity:1" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8284271" + inkscape:cx="-65.93937" + inkscape:cy="-1.0287473" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="5" + inkscape:window-y="49"> + <sodipodi:guide + orientation="horizontal" + position="8.0357143" + id="guide3144" /> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:0.63862927;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 21.038321,3.4034084 L 15.10969,4.9843766 L 15.10969,11.031579 C 14.669707,10.938077 14.114787,11.043637 13.588009,11.347773 C 12.710044,11.854667 12.265301,12.744435 12.599904,13.323983 C 12.934506,13.903532 13.915531,13.949451 14.793496,13.442556 C 15.520561,13.022784 15.945002,12.351704 15.880412,11.802301 L 15.900174,11.802301 L 15.900174,6.0120062 L 20.228074,4.8460419 L 20.228074,9.5494222 C 19.790115,9.4608922 19.227685,9.5646472 18.706392,9.8656162 C 17.828428,10.372509 17.383684,11.262277 17.718288,11.841826 C 18.05289,12.421374 19.033915,12.467291 19.911881,11.960398 C 20.638946,11.540626 21.083149,10.869547 21.018559,10.320144 L 21.038321,10.320144 L 21.038321,4.6286588 L 21.038321,3.4034084 z " + id="path3384" /> + <path + style="fill:url(#linearGradient2224);fill-opacity:1;stroke:#1d6a6f;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 20.490646,2.9897742 L 14.562015,4.5707424 L 14.562015,10.617945 C 14.122032,10.524443 13.567112,10.630003 13.040334,10.934139 C 12.162369,11.441033 11.717626,12.330801 12.052229,12.910349 C 12.386831,13.489898 13.367856,13.535817 14.245821,13.028922 C 14.972886,12.60915 15.397327,11.93807 15.332737,11.388667 L 15.352499,11.388667 L 15.352499,5.5983718 L 19.680399,4.4324077 L 19.680399,9.1357875 C 19.24244,9.047258 18.68001,9.1510128 18.158717,9.4519815 C 17.280753,9.9588749 16.836009,10.848643 17.170613,11.428192 C 17.505215,12.00774 18.48624,12.053657 19.364206,11.546764 C 20.091271,11.126992 20.535474,10.455913 20.470884,9.9065097 L 20.490646,9.9065097 L 20.490646,4.2150246 L 20.490646,2.9897742 z " + id="path1328" /> + <g + id="g2403" + inkscape:label="Calque 1" + transform="translate(-3.1142216,0.1467125)"> + <g + transform="translate(14.730114,-3.4355522)" + inkscape:label="Calque 1" + id="g2364"> + <g + id="g2446" + inkscape:label="Calque 1" + transform="translate(7.9455775,4.2707653)"> + <g + style="fill:none;stroke:#000000;stroke-opacity:0.44968555" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + id="g2181"> + <path + sodipodi:nodetypes="csccczccsccccc" + id="path2183" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" /> + </g> + <g + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + id="g2451"> + <path + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#005653;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + id="path2453" + sodipodi:nodetypes="cccsccsccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + id="path2455" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + id="path2457" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + id="path2459" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + id="path2461" + sodipodi:nodetypes="cccsccc" /> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/icon_accept.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/icon_accept.svg new file mode 100755 index 0000000000..14453ca697 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/icon_accept.svg @@ -0,0 +1,412 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home-local/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="icon_accept.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient2433"> + <stop + style="stop-color:#008000;stop-opacity:1;" + offset="0" + id="stop2435" /> + <stop + style="stop-color:#008000;stop-opacity:0;" + offset="1" + id="stop2437" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient2439" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" + gradientUnits="userSpaceOnUse" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 8 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="16 : 8 : 1" + inkscape:persp3d-origin="8 : 5.3333333 : 1" + id="perspective4283" /> + <linearGradient + id="linearGradient3370"> + <stop + style="stop-color:#d7d7d7;stop-opacity:1;" + offset="0" + id="stop3372" /> + <stop + style="stop-color:#7c7c7c;stop-opacity:1;" + offset="1" + id="stop3374" /> + </linearGradient> + <linearGradient + id="linearGradient3362"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3364" /> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop3366" /> + </linearGradient> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.0511112,0,0,-0.7528043,-6.3612105,18.68452)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient4318" + gradientUnits="userSpaceOnUse" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient4320" + gradientUnits="userSpaceOnUse" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient4322" + gradientUnits="userSpaceOnUse" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient4324" + gradientUnits="userSpaceOnUse" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient4326" + gradientUnits="userSpaceOnUse" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="11.313708" + inkscape:cx="20.635709" + inkscape:cy="3.1660007" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="16px" + height="16px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="722" + inkscape:window-x="336" + inkscape:window-y="209" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="24.821428" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:1;fill:url(#linearGradient4275);fill-opacity:1;stroke:none;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 4.8702645,10.451388 L 4.8702645,4.699571 L 2.2608109,4.699571 L 8.0370775,0.3448829 L 13.813346,4.699571 L 11.203891,4.699571 L 11.203891,10.451388 L 4.8702645,10.451388 z" + id="rect4262" /> + <g + id="g2181" + transform="matrix(0.5647782,0,0,0.5334707,-7.4066678,15.009203)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z" + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g4160" + transform="matrix(0.5678511,0,0,0.5363064,-1.0543503,8.261584)" + style="fill:url(#linearGradient2439);fill-opacity:1"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path3153" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z" + style="opacity:1;fill:url(#linearGradient4318);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path3161" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z" + style="opacity:1;fill:url(#linearGradient4320);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4140" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z" + style="opacity:1;fill:url(#linearGradient4322);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4246" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.8978659,7.4805434 C 9.1610575,8.1588394 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z" + style="opacity:1;fill:url(#linearGradient4324);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4258" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z" + style="opacity:1;fill:url(#linearGradient4326);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/icon_unhold.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/icon_unhold.svg new file mode 100755 index 0000000000..a4535824bd --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/icon_unhold.svg @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home-local/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="icon_unhold.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient2500"> + <stop + style="stop-color:#800000;stop-opacity:1;" + offset="0" + id="stop2502" /> + <stop + style="stop-color:#800000;stop-opacity:0;" + offset="1" + id="stop2504" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient2506" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2433"> + <stop + style="stop-color:#008000;stop-opacity:1;" + offset="0" + id="stop2435" /> + <stop + style="stop-color:#008000;stop-opacity:0;" + offset="1" + id="stop2437" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient2439" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" + gradientUnits="userSpaceOnUse" /> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 8 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="16 : 8 : 1" + inkscape:persp3d-origin="8 : 5.3333333 : 1" + id="perspective4283" /> + <linearGradient + id="linearGradient3370"> + <stop + style="stop-color:#d7d7d7;stop-opacity:1;" + offset="0" + id="stop3372" /> + <stop + style="stop-color:#7c7c7c;stop-opacity:1;" + offset="1" + id="stop3374" /> + </linearGradient> + <linearGradient + id="linearGradient3362"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3364" /> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop3366" /> + </linearGradient> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient3326" + gradientUnits="userSpaceOnUse" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient3338" + gradientUnits="userSpaceOnUse" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient3340" + gradientUnits="userSpaceOnUse" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2500" + id="linearGradient3342" + gradientUnits="userSpaceOnUse" + x1="4.9409747" + y1="16.528652" + x2="6.2092013" + y2="-3.3282857" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="11.313708" + inkscape:cx="20.635709" + inkscape:cy="3.1660007" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="16px" + height="16px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="722" + inkscape:window-x="336" + inkscape:window-y="209" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="24.821428" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2453" + inkscape:label="Calque 1" + transform="matrix(0.7134153,0,0,0.6688126,-0.1384675,-7.9825942e-2)" + style="fill:#008080"> + <path + id="path3384" + d="M 21.038321,3.4034084 L 15.10969,4.9843766 L 15.10969,11.031579 C 14.669707,10.938077 14.114787,11.043637 13.588009,11.347773 C 12.710044,11.854667 12.265301,12.744435 12.599904,13.323983 C 12.934506,13.903532 13.915531,13.949451 14.793496,13.442556 C 15.520561,13.022784 15.945002,12.351704 15.880412,11.802301 L 15.900174,11.802301 L 15.900174,6.0120062 L 20.228074,4.8460419 L 20.228074,9.5494222 C 19.790115,9.4608922 19.227685,9.5646472 18.706392,9.8656162 C 17.828428,10.372509 17.383684,11.262277 17.718288,11.841826 C 18.05289,12.421374 19.033915,12.467291 19.911881,11.960398 C 20.638946,11.540626 21.083149,10.869547 21.018559,10.320144 L 21.038321,10.320144 L 21.038321,4.6286588 L 21.038321,3.4034084 z" + style="opacity:0.08099688;fill:#008080;fill-opacity:1;stroke:#000000;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path2456" + d="M 20.490646,2.9897742 L 14.562015,4.5707424 L 14.562015,10.617945 C 14.122032,10.524443 13.567112,10.630003 13.040334,10.934139 C 12.162369,11.441033 11.717626,12.330801 12.052229,12.910349 C 12.386831,13.489898 13.367856,13.535817 14.245821,13.028922 C 14.972886,12.60915 15.397327,11.93807 15.332737,11.388667 L 15.352499,11.388667 L 15.352499,5.5983718 L 19.680399,4.4324077 L 19.680399,9.1357875 C 19.24244,9.047258 18.68001,9.1510128 18.158717,9.4519815 C 17.280753,9.9588749 16.836009,10.848643 17.170613,11.428192 C 17.505215,12.00774 18.48624,12.053657 19.364206,11.546764 C 20.091271,11.126992 20.535474,10.455913 20.470884,9.9065097 L 20.490646,9.9065097 L 20.490646,4.2150246 L 20.490646,2.9897742 z" + style="opacity:0.32398753;fill:#008080;fill-opacity:1;stroke:#1d6a6f;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <g + transform="translate(-3.1142216,0.1467125)" + inkscape:label="Calque 1" + id="g2403" + style="fill:#008080"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(14.730114,-3.4355522)" + style="fill:#008080"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446" + style="fill:#008080"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:#008080;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:#008080;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z" + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + style="fill:#008080"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z" + style="opacity:1;fill:#008080;fill-opacity:1;stroke:#005653;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z" + style="opacity:1;fill:#008080;fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z" + style="opacity:1;fill:#008080;fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z" + style="opacity:1;fill:#008080;fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z" + style="opacity:1;fill:#008080;fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1418" + inkscape:label="Calque 1" + transform="matrix(0.4731337,0,0,0.4435535,21.103584,1.7278131)" + style="fill:#008080;stroke:#006c73;stroke-width:3.68368101;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"> + <g + id="g1444" + transform="matrix(0.491592,0,0,0.491592,-26.9581,-0.76797)" + style="fill:#008080;stroke:#006c73;stroke-width:7.49337053;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:#008080;fill-opacity:0.75;fill-rule:evenodd;stroke:#006c73;stroke-width:7.49337053;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 5.3208165,5.0274423 L 27.017246,26.72387" + id="path1332" + sodipodi:nodetypes="cc" /> + <path + style="fill:#008080;fill-opacity:0.75;fill-rule:evenodd;stroke:#006c73;stroke-width:7.49337053;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 5.3208161,26.72387 L 27.017246,5.0274427" + id="path1334" + sodipodi:nodetypes="cc" /> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/incoming.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/incoming.svg new file mode 100755 index 0000000000..7f68789769 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/incoming.svg @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="incoming.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient2772"> + <stop + style="stop-color:#008000;stop-opacity:1;" + offset="0" + id="stop2774" /> + <stop + style="stop-color:#008000;stop-opacity:0;" + offset="1" + id="stop2776" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2505"> + <stop + style="stop-color:#008000;stop-opacity:1;" + offset="0" + id="stop2507" /> + <stop + style="stop-color:#008000;stop-opacity:0;" + offset="1" + id="stop2509" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective4177" /> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2505" + id="linearGradient2511" + x1="17.620802" + y1="9.4159222" + x2="-3.8121746" + y2="9.3760633" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.668614,0,0,1,3.7748346,0.1767767)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2772" + id="linearGradient2778" + x1="26.420586" + y1="3.4565225" + x2="20.291727" + y2="-5.2758617" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="11.313708" + inkscape:cx="18.87396" + inkscape:cy="2.756874" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1331" + inkscape:window-height="922" + inkscape:window-x="169" + inkscape:window-y="24" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:1;fill:url(#linearGradient2511);fill-opacity:1;stroke:none;stroke-width:0.62500000000000000;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 1.2259613,4.6445578 L 9.5484692,4.6445578 L 9.5484692,0.60013384 L 15.849421,9.5528402 L 9.5484692,18.505547 L 9.5484692,14.461122 L 1.2259613,14.461122 L 1.2259613,4.6445578 z" + id="rect4262" /> + <g + id="g4160" + transform="matrix(0.3274903,-0.8169208,-0.8169208,-0.3274903,19.715453,28.330727)" + style="fill:url(#linearGradient2778);fill-opacity:1"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path3153" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z" + style="opacity:1;fill:url(#linearGradient2778);fill-opacity:1.0;stroke:#0f5600;stroke-width:0.62500000000000000;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path3161" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z" + style="opacity:1;fill:url(#linearGradient2778);fill-opacity:1.0;stroke:#0f5600;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4140" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z" + style="opacity:1;fill:url(#linearGradient2778);fill-opacity:1.0;stroke:#0f5600;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4246" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.8978659,7.4805434 C 9.1610575,8.1588394 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z" + style="opacity:1;fill:url(#linearGradient2778);fill-opacity:1.0;stroke:none;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path4258" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z" + style="opacity:1;fill:url(#linearGradient2778);fill-opacity:1.0;stroke:none;stroke-width:0.57204323999999995;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/new_call.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/new_call.svg new file mode 100755 index 0000000000..651034f77f --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/new_call.svg @@ -0,0 +1,844 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.3.1 r9886" + version="1.0" + sodipodi:docname="new_call.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2483" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2485" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2487" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2489" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2491" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#XMLID_4_" + id="linearGradient4284" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,174,-145.99998)" + x1="-13.757333" + y1="76.708466" + x2="-62.424866" + y2="104.80668" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9792,0,0,0.9725,133.0002,20.8762)" + r="55.147999" + cy="-0.2148" + cx="48" + id="XMLID_4_"> + <stop + id="stop3082" + style="stop-color:#72D13D" + offset="0" /> + <stop + id="stop3084" + style="stop-color:#35AC1C" + offset="0.3553" /> + <stop + id="stop3086" + style="stop-color:#0F9508" + offset="0.6194" /> + <stop + id="stop3088" + style="stop-color:#008C00" + offset="0.7574" /> + <stop + id="stop3090" + style="stop-color:#007A00" + offset="1" /> + </radialGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4299" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="73.742638" + y1="15.336544" + x2="80" + y2="19.281664" /> + <linearGradient + id="linearGradient3260" + inkscape:collect="always"> + <stop + id="stop3262" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop3264" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <filter + color-interpolation-filters="sRGB" + id="filter3387" + height="1.249912" + y="-0.12495601" + width="1.2041403" + x="-0.10207015" + inkscape:collect="always"> + <feGaussianBlur + id="feGaussianBlur3389" + stdDeviation="0.44655691" + inkscape:collect="always" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4297" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="73.742638" + y1="15.336544" + x2="80" + y2="19.281664" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5412" + id="linearGradient3003" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="73.742638" + y1="15.336544" + x2="80" + y2="19.281664" /> + <linearGradient + id="linearGradient5412" + gradientUnits="userSpaceOnUse" + x1="28" + y1="57.5" + x2="28" + y2="0"> + <stop + offset="0" + style="stop-color:#fff14d;stop-opacity:1;" + id="stop5414" /> + <stop + offset="1" + style="stop-color:#f8ffa0;stop-opacity:0;" + id="stop5416" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3207" + id="linearGradient3005" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(1.039383,0.9621093)" + x1="64.341988" + y1="18.50366" + x2="76.284439" + y2="18.50366" /> + <linearGradient + id="linearGradient3207"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3209" /> + <stop + style="stop-color:#252525;stop-opacity:0;" + offset="1" + id="stop3211" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4291" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="73.742638" + y1="15.336544" + x2="80" + y2="19.281664" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3030" + id="radialGradient4275" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,174,-145.99998)" + cx="-44" + cy="84" + fx="-60" + fy="100" + r="24" /> + <linearGradient + id="linearGradient3030" + inkscape:collect="always"> + <stop + id="stop3032" + offset="0" + style="stop-color:#000000;stop-opacity:0.77902622" /> + <stop + id="stop3034" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4289" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + x1="73.742638" + y1="15.336544" + x2="80" + y2="19.281664" /> + <radialGradient + inkscape:collect="always" + xlink:href="#XMLID_4_" + id="radialGradient4271" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,174,-145.99998)" + cx="-44" + cy="84" + fx="-40" + fy="96" + r="20" /> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.9792,0,0,0.9725,133.0002,20.8762)" + r="55.147999" + cy="-0.2148" + cx="48" + id="radialGradient4180"> + <stop + id="stop4182" + style="stop-color:#72D13D" + offset="0" /> + <stop + id="stop4184" + style="stop-color:#35AC1C" + offset="0.3553" /> + <stop + id="stop4186" + style="stop-color:#0F9508" + offset="0.6194" /> + <stop + id="stop4188" + style="stop-color:#008C00" + offset="0.7574" /> + <stop + id="stop4190" + style="stop-color:#007A00" + offset="1" /> + </radialGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3202" + id="linearGradient4268" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,17.28126,-145.99998)" + x1="11.68106" + y1="60.539303" + x2="11.68106" + y2="108.0104" /> + <linearGradient + id="linearGradient3202"> + <stop + style="stop-color:#cbff9c;stop-opacity:1;" + offset="0" + id="stop3204" /> + <stop + style="stop-color:#65c171;stop-opacity:0" + offset="1" + id="stop3206" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4265" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,17.25592,-145.99998)" + x1="6.6976352" + y1="52" + x2="11.68106" + y2="96.001434" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3260" + id="linearGradient4262" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.4999996,0,0,2.4999996,17.25592,-145.99998)" + x1="26.697636" + y1="96" + x2="14.697635" + y2="72" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3225" + id="linearGradient4259" + gradientUnits="userSpaceOnUse" + x1="97.622581" + y1="77.512512" + x2="98.097946" + y2="105.10625" + gradientTransform="translate(-36.000006,-20.000008)" /> + <linearGradient + id="linearGradient3225"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3227" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3229" /> + </linearGradient> + <filter + color-interpolation-filters="sRGB" + id="filter3191" + inkscape:collect="always"> + <feGaussianBlur + id="feGaussianBlur3193" + stdDeviation="0.2025" + inkscape:collect="always" /> + </filter> + <linearGradient + y2="105.10625" + x2="98.097946" + y1="77.512512" + x1="97.622581" + gradientTransform="translate(-36.000006,-20.000008)" + gradientUnits="userSpaceOnUse" + id="linearGradient4230" + xlink:href="#linearGradient3225" + inkscape:collect="always" /> + <filter + id="filter5237" + inkscape:label="Desaturate" + x="0" + y="0" + width="1" + height="1" + inkscape:menu="Color" + inkscape:menu-tooltip="Render in shades of gray by reducing saturation to zero" + color-interpolation-filters="sRGB"> + <feColorMatrix + id="feColorMatrix5239" + type="saturate" + values="0" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568543" + inkscape:cx="5.6944947" + inkscape:cy="-4.4505153" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1918" + inkscape:window-height="1147" + inkscape:window-x="0" + inkscape:window-y="35" + showgrid="false" + inkscape:window-maximized="0"> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2446" + inkscape:label="Calque 1" + transform="translate(20.193677,1.1140386)" + style="filter:url(#filter5237)"> + <g + style="fill:none;stroke:#000000;stroke-opacity:0.44968555" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + id="g2181"> + <path + sodipodi:nodetypes="csccczccsccccc" + id="path2183" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" /> + </g> + <g + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + id="g2451"> + <path + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + id="path2453" + sodipodi:nodetypes="cccsccsccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + id="path2455" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + id="path2457" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + id="path2459" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + id="path2461" + sodipodi:nodetypes="cccsccc" /> + </g> + </g> + <g + transform="matrix(0.09332679,0,0,0.09332679,11.892124,11.981828)" + id="g4088"> + <path + inkscape:connector-curvature="0" + clip-path="none" + sodipodi:nodetypes="ccccccccccccccccccccc" + id="path3012" + d="M 59.156262,4 C 50.862445,4 44.000004,10.862442 44.000004,19.156248 l 0,24.843745 -24.843745,0 c -8.293807,0 -15.1562478,6.862442 -15.1562478,15.156243 l 0,9.687499 c 0,8.293824 6.8624408,15.156248 15.1562478,15.156248 l 24.843745,0 0,24.843767 c 0,8.2938 6.862447,15.15625 15.156258,15.15625 l 9.687503,0 c 8.29379,0 15.15624,-6.86245 15.15624,-15.15625 l 0,-24.843767 24.843755,0 c 8.2938,0 15.15624,-6.862424 15.15624,-15.156248 l 0,-9.687499 c 0,-8.293801 -6.86244,-15.156243 -15.15624,-15.156243 l -24.843755,0 0,-24.843745 C 84.000005,10.862442 77.137555,4 68.843765,4 l -9.687503,0 z" + style="fill:url(#linearGradient4284);fill-opacity:1;stroke:none" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + style="fill:url(#linearGradient4299);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 68.465655,24.133449 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + id="path3091" + transform="matrix(-1.2499999,0,0,1.2499999,144.00001,-10.102078)" + sodipodi:nodetypes="cccccc" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + sodipodi:nodetypes="cccccc" + transform="matrix(1.2499999,0,0,1.2499999,-15.110921,-10.102078)" + id="path3095" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 68.172686,21.789699 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + style="fill:url(#linearGradient4297);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" /> + <path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccc" + transform="matrix(-1.2499999,0,0,-1.2499999,144.00001,139.07195)" + id="path3197" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 69.051593,23.742824 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + style="opacity:0.68164804;fill:url(#linearGradient3003);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" /> + <path + inkscape:connector-curvature="0" + style="opacity:0.70786516;fill:url(#linearGradient3005);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 67.782061,23.547512 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + id="path3199" + transform="matrix(1.2499999,0,0,-1.2499999,-15.110911,139.07195)" + sodipodi:nodetypes="cccccc" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + style="opacity:0.55056176;fill:url(#linearGradient4291);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 68.465655,24.133449 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + id="path3221" + transform="matrix(1.2499999,0,0,1.2499999,24.889073,28.928032)" + sodipodi:nodetypes="cccccc" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + style="opacity:0.58052434;fill:url(#radialGradient4275);fill-opacity:1;stroke:none" + d="M 59.156262,4 C 50.862445,4 44.000004,10.862442 44.000004,19.156248 l 0,24.843745 -24.843745,0 c -8.293807,0 -15.156252,3.134775 -15.156252,11.428576 1e-6,-2.365685 3e-6,8.477828 4e-6,13.415166 0,8.293824 6.862441,15.156248 15.156248,15.156248 l 24.843745,0 0,24.843767 c 0,8.2938 6.862447,15.15625 15.156258,15.15625 l 9.687503,0 c 8.293795,0 15.156245,-6.86245 15.156245,-15.15625 l 0,-24.843767 24.84375,0 c 8.2938,0 15.15624,-6.862424 15.15624,-15.156248 l 0,-9.687499 c 0,-8.293801 -6.86244,-15.156243 -15.15624,-15.156243 l -24.84375,0 0,-24.843745 C 84.00001,10.862442 77.13756,4 68.843765,4 l -9.687503,0 z" + id="path3028" + sodipodi:nodetypes="ccccccccccccccccccccc" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + sodipodi:nodetypes="cccccc" + transform="matrix(-1.2499999,0,0,1.2499999,103.11092,28.928032)" + id="path3217" + d="m 69.875971,12.057888 c -1.077088,0.06528 -2.528221,0.219164 -3,0.9375 L 68.465655,24.133449 79,23.37409 79,22.90534 C 80.740958,20.33518 74.219552,11.998548 69.875971,12.057888 z" + style="opacity:0.55056176;fill:url(#linearGradient4289);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3387)" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + id="rect2407" + d="m 59.156262,13.999998 c -2.834926,0 -5.156258,2.321328 -5.156258,5.15625 l 0,34.843745 -34.843745,0 c -2.834923,0 -5.156249,2.321319 -5.156249,5.156243 l 0,9.687499 c 0,2.834923 2.321326,5.156249 5.156249,5.156249 l 34.843745,0 0,34.843766 c 0,2.83493 2.321332,5.15625 5.156258,5.15625 l 9.687503,0 c 2.83492,0 5.156239,-2.32132 5.156239,-5.15625 l 0,-34.843766 34.843756,0 c 2.83492,0 5.15625,-2.321326 5.15625,-5.156249 l 0,-9.687499 c 0,-2.834924 -2.32133,-5.156243 -5.15625,-5.156243 l -34.843756,0 0,-34.843745 c 0,-2.834922 -2.321319,-5.15625 -5.156239,-5.15625 l -9.687503,0 z" + style="fill:url(#radialGradient4271);fill-opacity:1;stroke:none" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + id="path3038" + d="m 59.156262,13.999998 c -2.834926,0 -5.156258,2.321328 -5.156258,5.15625 l 0,34.843745 -34.843745,0 c -2.834923,0 -5.156249,2.321319 -5.156249,5.156243 l 0,9.687499 c 0,0.2745 0.114369,0.518049 0.156249,0.78125 8.144214,1.173923 16.728351,1.875 25.624996,1.875 28.75393,0 54.5146,-6.574575 71.484365,-16.874997 -0.72309,-0.387875 -1.54836,-0.624995 -2.42186,-0.624995 l -34.843756,0 0,-34.843745 c 0,-2.834922 -2.321319,-5.15625 -5.156239,-5.15625 l -9.687503,0 z" + style="fill:url(#linearGradient4268);fill-opacity:1;stroke:none" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + sodipodi:nodetypes="cccccccccsssssssccccccccccccscssscsscccc" + id="path3062" + d="m 59.156262,13.999998 c -2.834926,0 -5.156258,2.321328 -5.156258,5.15625 l 0,2.5 c 0,-2.834923 3.321333,-6.656249 6.156257,-6.656249 l 9.687505,0 c 0.708719,0 1.414969,0.128705 2.031239,0.390625 0.275649,0.623795 1.21875,2.811445 1.21875,3.531249 l 0.906249,35.07812 0.07813,-34.843745 c 0,-1.43907 -0.602651,-2.733952 -1.562501,-3.671874 -0.219429,-0.219426 -0.447579,-0.447555 -0.703129,-0.625001 -0.01922,-0.01302 -0.05872,0.01277 -0.07812,0 -0.2552,-0.172827 -0.49668,-0.343174 -0.78125,-0.46875 -0.02165,-0.0092 -0.05633,0.0089 -0.07813,0 -0.2865,-0.121756 -0.62777,-0.244077 -0.937489,-0.312499 -0.0256,-0.0053 -0.0524,0.0049 -0.07813,0 -0.309169,-0.06373 -0.61137,-0.07302 -0.9375,-0.07813 l -0.07812,0 -1.17188,0 -8.515623,0 z M 19.156259,53.999993 c -2.834923,0 -5.156249,2.321319 -5.156249,5.156243 l 0,2.5 c 0,-2.834925 2.321326,-6.656248 5.156249,-6.656248 l 34.843745,-0.999995 -34.843745,0 z m 54.843745,0 34.399416,1.279294 c -16.897985,9.067749 -44.55616,15.986348 -71.274415,15.986322 -4.448322,0 -8.848855,-0.224875 -13.124996,-0.546874 5.150982,0.4673 10.448531,0.78125 15.859372,0.78125 26.925154,0 51.209374,-5.809275 68.125009,-14.999998 0.0199,-0.0108 0.0582,0.01082 0.0781,0 1.1064,-0.603076 2.16156,-1.242775 3.20312,-1.874999 -0.34076,-0.182801 -0.71323,-0.36195 -1.09374,-0.46875 -0.025,-0.0066 -0.053,0.0063 -0.0781,0 -0.38094,-0.101125 -0.76344,-0.149451 -1.17187,-0.156245 l -0.0781,0 -1.17188,0 -33.671876,0 z" + style="fill:url(#linearGradient4265);fill-opacity:1;stroke:none" /> + <path + inkscape:connector-curvature="0" + clip-path="none" + style="fill:url(#linearGradient4262);fill-opacity:1;stroke:none" + d="m 59.156262,13.999998 c -2.834926,0 -5.156258,2.321328 -5.156258,5.15625 l 0,2.5 c 0,-2.834923 3.321333,-6.656249 6.156257,-6.656249 l 9.687505,0 c 0.708719,0 1.414969,0.128705 2.031239,0.390625 0.275649,0.623795 1.21875,2.811445 1.21875,3.531249 l 0.906249,35.07812 0.07813,-34.843745 c 0,-1.43907 -0.602651,-2.733952 -1.562501,-3.671874 -0.219429,-0.219426 -0.447579,-0.447555 -0.703129,-0.625001 -0.01922,-0.01302 -0.05872,0.01277 -0.07812,0 -0.2552,-0.172827 -0.49668,-0.343174 -0.78125,-0.46875 -0.02165,-0.0092 -0.05633,0.0089 -0.07813,0 -0.2865,-0.121756 -0.62777,-0.244077 -0.937489,-0.312499 -0.0256,-0.0053 -0.0524,0.0049 -0.07813,0 -0.309169,-0.06373 -0.61137,-0.07302 -0.9375,-0.07813 l -0.07812,0 -1.17188,0 -8.515623,0 z M 19.156259,53.999993 c -2.834923,0 -5.156249,2.321319 -5.156249,5.156243 l 0,2.5 c 0,-2.834925 2.321326,-6.656248 5.156249,-6.656248 l 34.843745,-0.999995 -34.843745,0 z m 54.843745,0 34.643556,1.279294 c -16.897975,9.067749 -44.8003,15.986348 -71.518555,15.986322 -4.448322,0 -8.848855,-0.224875 -13.124996,-0.546874 5.150982,0.4673 10.448531,0.78125 15.859372,0.78125 26.925154,0 51.209374,-5.809275 68.125009,-14.999998 0.0199,-0.0108 0.0582,0.01082 0.0781,0 1.1064,-0.603076 2.16156,-1.242775 3.20312,-1.874999 -0.34076,-0.182801 -0.71323,-0.36195 -1.09374,-0.46875 -0.025,-0.0066 -0.053,0.0063 -0.0781,0 -0.38094,-0.101125 -0.76344,-0.149451 -1.17187,-0.156245 l -0.0781,0 -1.17188,0 -33.671876,0 z" + id="path3087" + sodipodi:nodetypes="cccccccccsssssssccccccccccccscssscsscccc" /> + <path + inkscape:connector-curvature="0" + transform="matrix(2.4999996,0,0,2.4999996,-95.999962,-95.99996)" + clip-path="none" + style="fill:none;stroke:url(#linearGradient4230);stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:1.08779998;filter:url(#filter3191)" + d="m 62.0625,43.999992 c -1.13397,0 -2.062504,0.928531 -2.062504,2.0625 l 0,13.9375 -13.9375,0 c -1.133969,0 -2.0625,0.928528 -2.0625,2.062498 l 0,3.875 c 0,1.13397 0.928531,2.0625 2.0625,2.0625 l 13.9375,0 0,13.93751 c 0,1.13397 0.928534,2.0625 2.062504,2.0625 l 3.875,0 C 67.07147,84 68,83.07147 68,81.9375 l 0,-13.93751 13.9375,0 c 1.13397,0 2.0625,-0.92853 2.0625,-2.0625 l 0,-3.875 c 0,-1.13397 -0.92853,-2.062498 -2.0625,-2.062498 l -13.9375,0 0,-13.9375 c 0,-1.133969 -0.92853,-2.0625 -2.0625,-2.0625 l -3.875,0 z" + id="path3099" /> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/rec_call.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/rec_call.svg new file mode 100755 index 0000000000..45b6bf69ab --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/rec_call.svg @@ -0,0 +1,1406 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="rec_call.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective4757" /> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2491" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="12.113755" + x2="7.293807" + y1="16.110582" + x1="11.408385" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2489" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2487" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.949513" + x2="2.7672646" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2485" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2483" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2416"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2418" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2420" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + id="stop2424" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2426" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2428"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2430" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2432" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2434" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9220986,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2436" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.9107675,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2438" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2440" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.1362892,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2444" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <radialGradient + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2342" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2340" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2338" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2336" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2334" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2332" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2326"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2328" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2330" /> + </linearGradient> + <linearGradient + id="linearGradient2320"> + <stop + id="stop2322" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2324" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2314"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2316" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2318" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2312" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2310" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2308" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2306" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2304" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2302" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2300" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2292" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2294" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + id="stop2286" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2288" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2278"> + <stop + id="stop2280" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2282" + offset="1" + style="stop-color:#fefee7;stop-opacity:0.89308178" /> + </linearGradient> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="355.44769" + x2="189.20502" + y1="118.36168" + x1="192.86734" + id="linearGradient2702" + xlink:href="#linearGradient3169" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3308"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop3310" /> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="1" + id="stop3312" /> + </linearGradient> + <linearGradient + id="linearGradient3289" + inkscape:collect="always"> + <stop + id="stop3291" + offset="0" + style="stop-color:#999999;stop-opacity:1" /> + <stop + id="stop3293" + offset="1" + style="stop-color:#000000;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3193"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop3195" /> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="1" + id="stop3197" /> + </linearGradient> + <linearGradient + id="linearGradient3181"> + <stop + id="stop3183" + offset="0" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + style="stop-color:#ff0000;stop-opacity:0.65271967" + offset="0.11529652" + id="stop3185" /> + <stop + id="stop3187" + offset="1" + style="stop-color:#000000;stop-opacity:0.15481172" /> + </linearGradient> + <linearGradient + id="linearGradient3169"> + <stop + id="stop3171" + offset="0" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop3173" + offset="1" + style="stop-color:#ff0000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2385"> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0" + id="stop2387" /> + <stop + id="stop3175" + offset="0.87037039" + style="stop-color:#ff0000;stop-opacity:0.55172414;" /> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="1" + id="stop2389" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2385" + id="radialGradient3163" + cx="184.85791" + cy="163.42795" + fx="184.85791" + fy="163.42795" + r="140.91121" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3181" + id="linearGradient3179" + x1="175.76654" + y1="316.97113" + x2="184.85791" + y2="23.016739" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3199" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3203" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3211" + gradientUnits="userSpaceOnUse" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3213" + gradientUnits="userSpaceOnUse" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3287" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3301" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,376.2049,402.98248)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3306" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3322" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3324" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3326" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,747.63347,397.26819)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3336" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3338" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3340" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,558.73494,665.96877)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3360" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient2641" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3364" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,558.73494,665.96877)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3366" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3368" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient2646" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,747.63347,397.26819)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3372" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3374" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2845" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2843" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2841" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2839" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2837" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2831"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2833" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2835" /> + </linearGradient> + <linearGradient + id="linearGradient2825"> + <stop + id="stop2827" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2829" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2819"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2821" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2823" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2817" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2815" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2813" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2811" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2809" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2807" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2801"> + <stop + id="stop2803" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2805" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2795"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2797" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2799" /> + </linearGradient> + <linearGradient + id="linearGradient2789"> + <stop + id="stop2791" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2793" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2783"> + <stop + id="stop2785" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2787" + offset="1" + style="stop-color:#fcfbcb;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient3362"> + <stop + id="stop3364" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop3366" + offset="1" + style="stop-color:#ffffff;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3370"> + <stop + id="stop3372" + offset="0" + style="stop-color:#d7d7d7;stop-opacity:1;" /> + <stop + id="stop3374" + offset="1" + style="stop-color:#7c7c7c;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + id="perspective4283" + inkscape:persp3d-origin="8 : 5.3333333 : 1" + inkscape:vp_z="16 : 8 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 8 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="16.739393" + x2="32.578228" + y1="-0.80084854" + x1="2.965755" + id="linearGradient2439" + xlink:href="#linearGradient2433" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2433" + inkscape:collect="always"> + <stop + id="stop2435" + offset="0" + style="stop-color:#008000;stop-opacity:1;" /> + <stop + id="stop2437" + offset="1" + style="stop-color:#008000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2770" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2768" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2766" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2764" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2762" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2917" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2919" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="2.7672646" + y2="12.949513" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2921" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2923" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="11.408385" + y1="16.110582" + x2="7.293807" + y2="12.113755" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2925" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="7.919596" + inkscape:cx="15.568279" + inkscape:cy="13.617397" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1600" + inkscape:window-height="926" + inkscape:window-x="0" + inkscape:window-y="220" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="11.237947" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(14.730114,-3.4355522)"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + <path + sodipodi:nodetypes="csc" + id="path3488" + d="M 18.019888,12.625004 C 18.48189,11.534667 18.765826,10.027007 18.765826,8.3750001 C 18.765826,6.7229936 18.48189,5.2153338 18.019888,4.1249963" + style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:0.50400000000000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;visibility:visible;display:inline;overflow:visible" /> + <g + id="g2892" + inkscape:label="Calque 1" + transform="translate(-53.149937,4.9260696)"> + <g + transform="matrix(4.9064853e-2,-8.3536268e-2,8.8523433e-2,4.8433051e-2,48.54228,7.2086084)" + inkscape:label="Layer 1" + id="g2651"> + <g + id="g3342" + transform="matrix(0.4480735,0,0,0.4170774,98.907461,118.01666)"> + <path + transform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + d="M 301.02545,162.41779 A 100.0051,100.0051 0 1 1 101.01526,162.41779 A 100.0051,100.0051 0 1 1 301.02545,162.41779 z" + sodipodi:ry="100.0051" + sodipodi:rx="100.0051" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3209" + style="opacity:1;fill:url(#linearGradient3372);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + transform="matrix(0.9122383,-0.2444335,0.2444335,0.9122383,-91.758986,25.004372)" + d="M 301.02545,162.41779 A 100.0051,100.0051 0 1 1 101.01526,162.41779 A 100.0051,100.0051 0 1 1 301.02545,162.41779 z" + sodipodi:ry="100.0051" + sodipodi:rx="100.0051" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3201" + style="opacity:0.24886876;fill:url(#linearGradient3374);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + transform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + d="M 279.30514,162.41779 A 78.284782,79.05574 0 1 1 122.73557,162.41779 A 78.284782,79.05574 0 1 1 279.30514,162.41779 z" + sodipodi:ry="79.05574" + sodipodi:rx="78.284782" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3295" + style="opacity:0.59728507;fill:url(#linearGradient2702);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/record.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/record.svg new file mode 100755 index 0000000000..9147567fec --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/record.svg @@ -0,0 +1,1057 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="rec_call2.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective77" /> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2483" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2485" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2487" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2489" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2491" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="355.44769" + x2="189.20502" + y1="118.36168" + x1="192.86734" + id="linearGradient2702" + xlink:href="#linearGradient3169" + inkscape:collect="always" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3308"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop3310" /> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="1" + id="stop3312" /> + </linearGradient> + <linearGradient + id="linearGradient3289" + inkscape:collect="always"> + <stop + id="stop3291" + offset="0" + style="stop-color:#999999;stop-opacity:1" /> + <stop + id="stop3293" + offset="1" + style="stop-color:#000000;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3193"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop3195" /> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="1" + id="stop3197" /> + </linearGradient> + <linearGradient + id="linearGradient3181"> + <stop + id="stop3183" + offset="0" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + style="stop-color:#ff0000;stop-opacity:0.65271967" + offset="0.11529652" + id="stop3185" /> + <stop + id="stop3187" + offset="1" + style="stop-color:#000000;stop-opacity:0.15481172" /> + </linearGradient> + <linearGradient + id="linearGradient3169"> + <stop + id="stop3171" + offset="0" + style="stop-color:#ff0000;stop-opacity:1;" /> + <stop + id="stop3173" + offset="1" + style="stop-color:#ff0000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2385"> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0" + id="stop2387" /> + <stop + id="stop3175" + offset="0.87037039" + style="stop-color:#ff0000;stop-opacity:0.55172414;" /> + <stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="1" + id="stop2389" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2385" + id="radialGradient3163" + cx="184.85791" + cy="163.42795" + fx="184.85791" + fy="163.42795" + r="140.91121" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3181" + id="linearGradient3179" + x1="175.76654" + y1="316.97113" + x2="184.85791" + y2="23.016739" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3199" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3203" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3211" + gradientUnits="userSpaceOnUse" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3213" + gradientUnits="userSpaceOnUse" + x1="204.55589" + y1="262.45413" + x2="204.55589" + y2="62.412689" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3287" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3301" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,376.2049,402.98248)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3306" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3322" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3324" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3326" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,747.63347,397.26819)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3336" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3338" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3340" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,558.73494,665.96877)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3360" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient2641" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3364" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,558.73494,665.96877)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3366" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3368" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient2646" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,747.63347,397.26819)" + x1="160.2529" + y1="-5.1353641" + x2="224.82684" + y2="168.2903" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3289" + id="linearGradient3372" + gradientUnits="userSpaceOnUse" + x1="224.26379" + y1="259.7438" + x2="172.07999" + y2="66.61824" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3193" + id="linearGradient3374" + gradientUnits="userSpaceOnUse" + x1="175.13184" + y1="259.03506" + x2="226.90887" + y2="65.800499" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2809" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2807" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2805" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2803" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2801" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2795"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2797" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2799" /> + </linearGradient> + <linearGradient + id="linearGradient2789"> + <stop + id="stop2791" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2793" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2783"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2785" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2787" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2781" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2779" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2777" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2775" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2773" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2771" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2765"> + <stop + id="stop2767" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2769" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2759"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2761" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2763" /> + </linearGradient> + <linearGradient + id="linearGradient2753"> + <stop + id="stop2755" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2757" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2747"> + <stop + id="stop2749" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2751" + offset="1" + style="stop-color:#fcfbcb;stop-opacity:1" /> + </linearGradient> + <linearGradient + id="linearGradient3362"> + <stop + id="stop3364" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + id="stop3366" + offset="1" + style="stop-color:#ffffff;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3370"> + <stop + id="stop3372" + offset="0" + style="stop-color:#d7d7d7;stop-opacity:1;" /> + <stop + id="stop3374" + offset="1" + style="stop-color:#7c7c7c;stop-opacity:1;" /> + </linearGradient> + <inkscape:perspective + id="perspective4283" + inkscape:persp3d-origin="8 : 5.3333333 : 1" + inkscape:vp_z="16 : 8 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 8 : 1" + sodipodi:type="inkscape:persp3d" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="16.739393" + x2="32.578228" + y1="-0.80084854" + x1="2.965755" + id="linearGradient2439" + xlink:href="#linearGradient2433" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2433" + inkscape:collect="always"> + <stop + id="stop2435" + offset="0" + style="stop-color:#008000;stop-opacity:1;" /> + <stop + id="stop2437" + offset="1" + style="stop-color:#008000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2734" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2732" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2730" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2728" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2726" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="8" + inkscape:cx="22.991745" + inkscape:cy="-5.4508769" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="726" + inkscape:window-x="513" + inkscape:window-y="291" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient4051);fill-opacity:1;stroke:none;stroke-width:5.69999981;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3162" + sodipodi:cx="19.285715" + sodipodi:cy="9.8571424" + sodipodi:rx="8.0357141" + sodipodi:ry="8.0357141" + d="M 27.321429,9.8571424 A 8.0357141,8.0357141 0 1 1 11.250001,9.8571424 A 8.0357141,8.0357141 0 1 1 27.321429,9.8571424 z" + transform="matrix(0.723409,0,0,0.723409,6.772732,3.51761)" /> + <g + id="g2856" + inkscape:label="Calque 1" + transform="matrix(2.1932723,0,0,2.2300726,-70.331114,24.270266)"> + <g + transform="matrix(4.3630449e-2,-7.2802504e-2,7.8718613e-2,4.2209779e-2,17.455978,-1.2908081)" + inkscape:label="Layer 1" + id="g2651"> + <g + id="g3342" + transform="matrix(0.4480735,0,0,0.4170774,98.907461,118.01666)"> + <path + transform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + d="M 301.02545,162.41779 A 100.0051,100.0051 0 1 1 101.01526,162.41779 A 100.0051,100.0051 0 1 1 301.02545,162.41779 z" + sodipodi:ry="100.0051" + sodipodi:rx="100.0051" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3209" + style="opacity:1;fill:url(#linearGradient3372);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + transform="matrix(0.9122383,-0.2444335,0.2444335,0.9122383,-91.758986,25.004372)" + d="M 301.02545,162.41779 A 100.0051,100.0051 0 1 1 101.01526,162.41779 A 100.0051,100.0051 0 1 1 301.02545,162.41779 z" + sodipodi:ry="100.0051" + sodipodi:rx="100.0051" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3201" + style="opacity:0.24886876;fill:url(#linearGradient3374);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + <path + transform="matrix(-1.1122783,-0.2980341,0.2980341,-1.1122783,306.50437,364.59668)" + d="M 279.30514,162.41779 A 78.284782,79.05574 0 1 1 122.73557,162.41779 A 78.284782,79.05574 0 1 1 279.30514,162.41779 z" + sodipodi:ry="79.05574" + sodipodi:rx="78.284782" + sodipodi:cy="162.41779" + sodipodi:cx="201.02036" + id="path3295" + style="opacity:0.59728507;fill:url(#linearGradient2702);fill-opacity:1;stroke:none" + sodipodi:type="arc" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/ring.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/ring.svg new file mode 100755 index 0000000000..0dec317e11 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/ring.svg @@ -0,0 +1,999 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="ring.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective7024" /> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2224" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + id="linearGradient2278"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop2280" /> + <stop + style="stop-color:#fefee7;stop-opacity:0.89308178" + offset="1" + id="stop2282" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2286" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop2288" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + id="stop2292" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2294" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2296"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2298" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2300" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2302" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2304" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2306" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2308" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2310" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2312" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2314"> + <stop + id="stop2316" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2318" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2320"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2322" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2324" /> + </linearGradient> + <linearGradient + id="linearGradient2326"> + <stop + id="stop2328" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2330" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2332" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2334" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2336" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2338" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2340" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient2342" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" /> + <linearGradient + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" + gradientUnits="userSpaceOnUse" + y2="8.5305319" + x2="15.630395" + y1="22.874208" + x1="15.630395" + id="linearGradient2444" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2442" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.1362892,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient2440" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2438" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-1.9107675,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient2436" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.9220986,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient2434" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2428"> + <stop + id="stop2430" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2432" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2424" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop2426" /> + </linearGradient> + <linearGradient + id="linearGradient2416"> + <stop + id="stop2418" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2420" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2483" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2485" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="2.7672646" + y2="12.949513" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2487" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2489" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="11.408385" + y1="16.110582" + x2="7.293807" + y2="12.113755" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2491" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2393" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2391" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2389" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2387" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2385" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2383" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2377"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2379" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2381" /> + </linearGradient> + <linearGradient + id="linearGradient2371"> + <stop + id="stop2373" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2375" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2365"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2367" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2369" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2363" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2361" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2359" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2357" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2355" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2353" + x1="15.630395" + y1="22.874208" + x2="15.806232" + y2="6.6770978" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2351" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2349" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + id="linearGradient2347" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2345" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + id="linearGradient2343" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + id="linearGradient2341" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2335"> + <stop + id="stop2337" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2339" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2329"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2331" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2333" /> + </linearGradient> + <linearGradient + id="linearGradient2323"> + <stop + id="stop2325" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2327" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2317"> + <stop + id="stop2319" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2321" + offset="1" + style="stop-color:#fcfbcb;stop-opacity:1" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="32" + inkscape:cx="13.031222" + inkscape:cy="10.297614" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1032" + inkscape:window-height="893" + inkscape:window-x="81" + inkscape:window-y="53" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="11.294643" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2466" + style="opacity:0.43925234;stroke:#000000;stroke-opacity:1" + transform="translate(-0.243068,-0.1767767)"> + <path + sodipodi:nodetypes="csc" + id="path2460" + d="M 5.0151915,4.7165621 C 7.3887105,1.7063043 12.651556,0.67372518 16.762612,2.4116984 C 18.132964,2.9910227 19.11915,3.7131419 19.910323,4.7165611" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.14272487;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="csc" + id="path2462" + d="M 7.3705045,6.5535915 C 9.0033055,4.4827619 12.623746,3.7724256 15.451841,4.9680197 C 16.39454,5.3665509 17.072961,5.8633143 17.617228,6.5535907" + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.78610826;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="csc" + id="path2464" + d="M 8.9856345,8.3807798 C 10.075244,6.9988638 12.491253,6.5248389 14.378511,7.3226878 C 15.007597,7.5886378 15.460324,7.9201408 15.823527,8.3807788" + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52458936;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <path + style="fill:none;fill-opacity:1;stroke:#137300;stroke-width:1.14272487;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 4.7534689,4.2728302 C 7.1269878,1.2625724 12.389832,0.22999334 16.500888,1.9679665 C 17.87124,2.5472908 18.857426,3.26941 19.648599,4.2728292" + id="path2210" + sodipodi:nodetypes="csc" /> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#1fc200;stroke-width:0.78610826;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 7.1087815,6.1098596 C 8.7415829,4.03903 12.362022,3.3286937 15.190117,4.5242878 C 16.132816,4.922819 16.811237,5.4195824 17.355504,6.1098588" + id="path3184" + sodipodi:nodetypes="csc" /> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#6dff50;stroke-width:0.52458936;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 8.7239117,7.9370475 C 9.8135207,6.5551319 12.229529,6.081107 14.116787,6.8789564 C 14.745873,7.1449061 15.1986,7.4764085 15.561803,7.937047" + id="path3186" + sodipodi:nodetypes="csc" /> + <g + id="g2448" + inkscape:label="Calque 1" + transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,28.365079,10.128174)"> + <g + transform="translate(14.730114,-3.4355522)" + inkscape:label="Calque 1" + id="g2364"> + <g + id="g2446" + inkscape:label="Calque 1" + transform="translate(7.9455775,4.2707653)"> + <g + style="fill:none;stroke:#000000;stroke-opacity:0.44968555" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + id="g2181"> + <path + sodipodi:nodetypes="csccczccsccccc" + id="path2183" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z" + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" /> + </g> + <g + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)" + id="g2451"> + <path + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#0f5600;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z" + id="path2453" + sodipodi:nodetypes="cccsccsccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z" + id="path2455" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#0f5600;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z" + id="path2457" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z" + id="path2459" + sodipodi:nodetypes="cccsccc" /> + <path + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z" + id="path2461" + sodipodi:nodetypes="cccsccc" /> + </g> + </g> + </g> + </g> + <g + id="g3440" + style="opacity:0.43925237;stroke:#000000;stroke-opacity:1" + transform="matrix(-1,0,0,-1,24.45343,24.686251)"> + <path + sodipodi:nodetypes="csc" + id="path3442" + d="M 5.0151915,4.7165621 C 7.3887105,1.7063043 12.651556,0.67372518 16.762612,2.4116984 C 18.132964,2.9910227 19.11915,3.7131419 19.910323,4.7165611" + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.14272487;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="csc" + id="path3444" + d="M 7.3705045,6.5535915 C 9.0033055,4.4827619 12.623746,3.7724256 15.451841,4.9680197 C 16.39454,5.3665509 17.072961,5.8633143 17.617228,6.5535907" + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.78610826;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="csc" + id="path3446" + d="M 8.9856345,8.3807798 C 10.075244,6.9988638 12.491253,6.5248389 14.378511,7.3226878 C 15.007597,7.5886378 15.460324,7.9201408 15.823527,8.3807788" + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52458936;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + <path + style="fill:none;fill-opacity:1;stroke:#137300;stroke-width:1.14272487;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 19.456893,19.611644 C 17.083374,22.621902 11.82053,23.654481 7.709474,21.916508 C 6.339122,21.337184 5.352936,20.615064 4.561763,19.611645" + id="path3448" + sodipodi:nodetypes="csc" /> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#1fc200;stroke-width:0.78610826;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 17.10158,17.774615 C 15.468779,19.845444 11.84834,20.555781 9.020245,19.360187 C 8.077546,18.961655 7.399125,18.464892 6.854858,17.774616" + id="path3450" + sodipodi:nodetypes="csc" /> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#6dff50;stroke-width:0.52458936;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 15.48645,15.947427 C 14.396841,17.329343 11.980833,17.803367 10.093575,17.005518 C 9.464489,16.739568 9.011762,16.408066 8.648559,15.947427" + id="path3452" + sodipodi:nodetypes="csc" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/transfert.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/transfert.svg new file mode 100755 index 0000000000..84db1e97ae --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/transfert.svg @@ -0,0 +1,892 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="transfert.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#1268ff;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#1268ff;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#4f8fff;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#00318a;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4181" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4195" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient4203" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4256" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4260" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,1.130281e-17,1.130281e-17,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4275" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="6.2345462" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.360718e-8,1.128928,1.128928,-1.360718e-8,-1.7295474,-9.642166)" /> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient2292"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2294" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop2296" /> + </linearGradient> + <linearGradient + id="linearGradient2298"> + <stop + id="stop2300" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2302" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2304"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2306" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2308" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2310" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2312" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2425" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2316" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2318" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2421" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient2419" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1408" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1410" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1412" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient1414" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2491" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="12.113755" + x2="7.293807" + y1="16.110582" + x1="11.408385" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2489" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2487" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.949513" + x2="2.7672646" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2485" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2483" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2416"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2418" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2420" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + id="stop2424" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2426" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2428"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2430" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2432" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2434" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9220986,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2436" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.9107675,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2438" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2440" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.1362892,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2444" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <radialGradient + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2342" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2340" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2338" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2336" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2373" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2370" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2366"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2328" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2330" /> + </linearGradient> + <linearGradient + id="linearGradient2372"> + <stop + id="stop2362" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2364" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2376"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2357" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2359" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2380" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2382" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2352" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2306" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2386" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2302" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2391" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2292" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2395" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + id="stop2286" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2288" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2278"> + <stop + id="stop2280" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2282" + offset="1" + style="stop-color:#fefee7;stop-opacity:0.89308178" /> + </linearGradient> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,-1.726592e-17,-1.726592e-17,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2334" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + id="linearGradient2332" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2330" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + id="linearGradient2328" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + id="linearGradient2326" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2320"> + <stop + id="stop2322" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2324" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2314"> + <stop + style="stop-color:#00a5b0;stop-opacity:1;" + offset="0" + id="stop2316" /> + <stop + style="stop-color:#00595f;stop-opacity:1;" + offset="1" + id="stop2318" /> + </linearGradient> + <linearGradient + id="linearGradient2308"> + <stop + id="stop2310" + offset="0" + style="stop-color:#00a6b0;stop-opacity:1;" /> + <stop + id="stop2312" + offset="1" + style="stop-color:#00a6b0;stop-opacity:0;" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="2.1796211" + inkscape:cy="7.7965211" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="1091" + inkscape:window-x="5" + inkscape:window-y="49" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="opacity:1;fill:url(#linearGradient4275);fill-opacity:1.0;stroke:none;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 4.4433805,4.0108013 L 15.626822,4.0108014 L 15.626822,0.3770651 L 24.09378,8.4206747 L 15.626822,16.464286 L 15.626823,12.83055 L 4.4433806,12.83055 L 4.4433805,4.0108013 z " + id="rect4262" /> + <g + id="g2441" + inkscape:label="Calque 1" + transform="translate(-0.6011619,-0.1264495)"> + <g + transform="translate(-3.1142216,0.1467125)" + inkscape:label="Calque 1" + id="g2403"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(14.730114,-3.4355522)"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#20246f;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#20246f;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#20246f;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/state/unhold.svg b/kde/plasma/plasmoid-qml/package/contents/images/state/unhold.svg new file mode 100755 index 0000000000..99af96c926 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/state/unhold.svg @@ -0,0 +1,980 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="unhold.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#00a6b0;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#00a6b0;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#00a5b0;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#00595f;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1416" + xlink:href="#linearGradient4250" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1414" + xlink:href="#linearGradient4250" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1412" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1410" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1408" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(6.313453e-2,-0.384275)" + gradientUnits="userSpaceOnUse" + y2="16.478132" + x2="20.06057" + y1="23.946518" + x1="7.1249466" + id="linearGradient4173" + xlink:href="#linearGradient4167" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1401"> + <stop + id="stop1403" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1405" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1395"> + <stop + style="stop-color:#b00014;stop-opacity:1;" + offset="0" + id="stop1397" /> + <stop + style="stop-color:#70000c;stop-opacity:1;" + offset="1" + id="stop1399" /> + </linearGradient> + <linearGradient + id="linearGradient4250" + inkscape:collect="always"> + <stop + id="stop4252" + offset="0" + style="stop-color:#b00014;stop-opacity:1;" /> + <stop + id="stop4254" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient4045"> + <stop + style="stop-color:#ffffff;stop-opacity:0" + offset="0" + id="stop4047" /> + <stop + style="stop-color:#fcfbcb;stop-opacity:1" + offset="1" + id="stop4049" /> + </linearGradient> + <linearGradient + id="linearGradient2292"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2294" /> + <stop + style="stop-color:#1db000;stop-opacity:0;" + offset="1" + id="stop2296" /> + </linearGradient> + <linearGradient + id="linearGradient2298"> + <stop + id="stop2300" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2302" + offset="1" + style="stop-color:#0f5f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2304"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2306" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2308" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2310" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2312" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2314" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2316" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2318" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2320" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" /> + <linearGradient + gradientTransform="matrix(1.62913,0,0,-1.62913,-10.06608,39.71987)" + gradientUnits="userSpaceOnUse" + y2="6.6770978" + x2="15.806232" + y1="22.874208" + x1="15.630395" + id="linearGradient4275" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient1388" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + id="linearGradient1386" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient1384" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="12.535715" + x2="31.31678" + y1="12.535715" + x1="24.397505" + id="linearGradient1382" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.825893" + x2="7.9239235" + y1="12.825893" + x1="1.0046476" + id="linearGradient1380" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient1374"> + <stop + id="stop1376" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop1378" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient1368"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop1370" /> + <stop + style="stop-color:#145f00;stop-opacity:1;" + offset="1" + id="stop1372" /> + </linearGradient> + <linearGradient + id="linearGradient1362"> + <stop + id="stop1364" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop1366" + offset="1" + style="stop-color:#26b000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient1406" + gradientUnits="userSpaceOnUse" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2417" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" + x1="10.57493" + y1="12.115559" + x2="-0.68574232" + y2="12.115559" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2415" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" + x1="31.692968" + y1="11.264216" + x2="23.888865" + y2="13.35532" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2413" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" + x1="7.8517423" + y1="15.912388" + x2="7.1114841" + y2="11.597325" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2411" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4045" + id="radialGradient4051" + cx="19.285715" + cy="9.8571424" + fx="19.285715" + fy="9.8571424" + r="10.885714" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="matrix(0.418975,0,0,0.418975,11.20548,5.727248)" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2491" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="12.113755" + x2="7.293807" + y1="16.110582" + x1="11.408385" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2489" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2487" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.949513" + x2="2.7672646" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2485" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2483" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2416"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2418" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2420" /> + </linearGradient> + <linearGradient + id="linearGradient2422"> + <stop + id="stop2424" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2426" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2428"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2430" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2432" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2434" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.9220986,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2436" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-1.9107675,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2438" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2440" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.1362892,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2442" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,31.179578,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2444" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <radialGradient + gradientTransform="matrix(0.418975,2.444023e-18,-2.444023e-18,0.418975,11.20548,5.727248)" + spreadMethod="reflect" + gradientUnits="userSpaceOnUse" + r="10.885714" + fy="9.8571424" + fx="19.285715" + cy="9.8571424" + cx="19.285715" + id="radialGradient2342" + xlink:href="#linearGradient4045" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2340" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + id="linearGradient2338" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + id="linearGradient2336" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + id="linearGradient2334" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + gradientUnits="userSpaceOnUse" + id="linearGradient2332" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2326"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop2328" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop2330" /> + </linearGradient> + <linearGradient + id="linearGradient2372"> + <stop + id="stop2322" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop2324" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient2376"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop2316" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop2318" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2380" + x1="1.0046476" + y1="12.825893" + x2="7.9239235" + y2="12.825893" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(1.262691,-1.100752)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2382" + x1="24.397505" + y1="12.535715" + x2="31.31678" + y2="12.535715" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-0.947018,-0.885198)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2308" + x1="15.647213" + y1="2.7028866" + x2="14.013638" + y2="10.576721" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2306" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.426158,-2.762136)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient2386" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,32.04188,-2.86473)" + x1="2.0651877" + y1="12.625902" + x2="6.8378897" + y2="13.920053" /> + <linearGradient + gradientTransform="matrix(0.875025,0,0,0.875025,0.666703,0.177907)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2302" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2296"> + <stop + id="stop2298" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2391" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2290"> + <stop + style="stop-color:#1db000;stop-opacity:1;" + offset="0" + id="stop2292" /> + <stop + style="stop-color:#0f5f00;stop-opacity:1;" + offset="1" + id="stop2395" /> + </linearGradient> + <linearGradient + id="linearGradient2284"> + <stop + id="stop2286" + offset="0" + style="stop-color:#1db000;stop-opacity:1;" /> + <stop + id="stop2288" + offset="1" + style="stop-color:#1db000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2278"> + <stop + id="stop2280" + offset="0" + style="stop-color:#ffffff;stop-opacity:0" /> + <stop + id="stop2282" + offset="1" + style="stop-color:#fefee7;stop-opacity:0.89308178" /> + </linearGradient> + <linearGradient + gradientTransform="matrix(0.632388,0,0,0.632388,3.258093,0.894991)" + gradientUnits="userSpaceOnUse" + y2="22.512505" + x2="27.5625" + y1="6.7288713" + x1="16.826796" + id="linearGradient2355" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + y2="13.920053" + x2="6.8378897" + y1="12.625902" + x1="2.0651877" + gradientTransform="matrix(-1,-1.726592e-17,-1.726592e-17,1,32.04188,-2.86473)" + gradientUnits="userSpaceOnUse" + id="linearGradient2353" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(0.426158,-2.762136)" + gradientUnits="userSpaceOnUse" + y2="11.597325" + x2="7.1114841" + y1="15.912388" + x1="7.8517423" + id="linearGradient2351" + xlink:href="#linearGradient4269" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="10.576721" + x2="14.013638" + y1="2.7028866" + x1="15.647213" + id="linearGradient2349" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(-0.947018,-0.885198)" + gradientUnits="userSpaceOnUse" + y2="13.35532" + x2="23.888865" + y1="11.264216" + x1="31.692968" + id="linearGradient2347" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + gradientTransform="translate(1.262691,-1.100752)" + gradientUnits="userSpaceOnUse" + y2="12.115559" + x2="-0.68574232" + y1="12.115559" + x1="10.57493" + id="linearGradient2345" + xlink:href="#linearGradient4183" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2339"> + <stop + id="stop2341" + offset="0" + style="stop-color:#80000e;stop-opacity:1;" /> + <stop + id="stop2343" + offset="1" + style="stop-color:#b00014;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2333"> + <stop + style="stop-color:#00a5b0;stop-opacity:1;" + offset="0" + id="stop2335" /> + <stop + style="stop-color:#00595f;stop-opacity:1;" + offset="1" + id="stop2337" /> + </linearGradient> + <linearGradient + id="linearGradient2327"> + <stop + id="stop2329" + offset="0" + style="stop-color:#00a6b0;stop-opacity:1;" /> + <stop + id="stop2331" + offset="1" + style="stop-color:#00a6b0;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4183" + id="linearGradient2469" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.684918,0,0,0.684918,2.618701,-0.775487)" + x1="16.826796" + y1="6.7288713" + x2="27.5625" + y2="22.512505" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="16.940055" + inkscape:cy="2.9986718" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1014" + inkscape:window-height="691" + inkscape:window-x="5" + inkscape:window-y="49"> + <sodipodi:guide + orientation="horizontal" + position="8.0357143" + id="guide3144" /> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2453" + inkscape:label="Calque 1" + transform="translate(0.8512452,-8.3578138e-2)"> + <path + id="path3384" + d="M 21.038321,3.4034084 L 15.10969,4.9843766 L 15.10969,11.031579 C 14.669707,10.938077 14.114787,11.043637 13.588009,11.347773 C 12.710044,11.854667 12.265301,12.744435 12.599904,13.323983 C 12.934506,13.903532 13.915531,13.949451 14.793496,13.442556 C 15.520561,13.022784 15.945002,12.351704 15.880412,11.802301 L 15.900174,11.802301 L 15.900174,6.0120062 L 20.228074,4.8460419 L 20.228074,9.5494222 C 19.790115,9.4608922 19.227685,9.5646472 18.706392,9.8656162 C 17.828428,10.372509 17.383684,11.262277 17.718288,11.841826 C 18.05289,12.421374 19.033915,12.467291 19.911881,11.960398 C 20.638946,11.540626 21.083149,10.869547 21.018559,10.320144 L 21.038321,10.320144 L 21.038321,4.6286588 L 21.038321,3.4034084 z " + style="opacity:0.08099688;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <path + id="path2456" + d="M 20.490646,2.9897742 L 14.562015,4.5707424 L 14.562015,10.617945 C 14.122032,10.524443 13.567112,10.630003 13.040334,10.934139 C 12.162369,11.441033 11.717626,12.330801 12.052229,12.910349 C 12.386831,13.489898 13.367856,13.535817 14.245821,13.028922 C 14.972886,12.60915 15.397327,11.93807 15.332737,11.388667 L 15.352499,11.388667 L 15.352499,5.5983718 L 19.680399,4.4324077 L 19.680399,9.1357875 C 19.24244,9.047258 18.68001,9.1510128 18.158717,9.4519815 C 17.280753,9.9588749 16.836009,10.848643 17.170613,11.428192 C 17.505215,12.00774 18.48624,12.053657 19.364206,11.546764 C 20.091271,11.126992 20.535474,10.455913 20.470884,9.9065097 L 20.490646,9.9065097 L 20.490646,4.2150246 L 20.490646,2.9897742 z " + style="fill:url(#linearGradient2469);fill-opacity:1;stroke:#1d6a6f;stroke-width:0.45169228;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.32398754" /> + <g + transform="translate(-3.1142216,0.1467125)" + inkscape:label="Calque 1" + id="g2403"> + <g + id="g2364" + inkscape:label="Calque 1" + transform="translate(14.730114,-3.4355522)"> + <g + transform="translate(7.9455775,4.2707653)" + inkscape:label="Calque 1" + id="g2446"> + <g + id="g2181" + transform="matrix(-0.4376782,-0.758081,0.7581751,-0.4377326,3.5952686,30.820492)" + style="fill:none;stroke:#000000;stroke-opacity:0.44968555"> + <path + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.65573961;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.44968555" + d="M 41.109694,-0.41817229 C 40.505298,0.20454826 39.040867,0.77635346 37.592239,0.77635106 C 36.102089,0.77635106 34.114653,0.15682998 33.532659,-0.49267807 L 33.569913,-2.0031726 L 33.569913,-3.0835065 C 31.027414,-3.5787101 30.997014,-3.8285637 27.525623,-3.8285643 C 24.054233,-3.8285649 23.830777,-3.5759718 21.29017,-3.0462535 L 21.29017,-0.3436665 C 20.685773,0.27905404 19.221343,0.87609843 17.772714,0.87609724 C 16.282564,0.87609724 14.623294,0.43325774 13.915083,-0.41817229 L 14.138601,-5.7646408 C 18.129172,-7.3187814 22.030595,-8.3970767 27.437882,-8.5586077 C 32.38601,-8.450833 36.259126,-7.7053161 40.886177,-5.8763994 L 41.109694,-0.41817229 z " + id="path2183" + sodipodi:nodetypes="csccczccsccccc" /> + </g> + <g + id="g2451" + transform="matrix(-0.4400595,-0.7622054,0.7622054,-0.4400595,-10.917299,27.830684)"> + <path + sodipodi:nodetypes="cccsccsccsccc" + id="path2453" + d="M 16.100095,4.59375 C 10.946289,4.7477067 7.2256019,5.7999634 3.4220983,7.28125 L 3.2345983,10.227679 C 3.7846813,10.972881 5.0136533,11.508929 6.4220983,11.508929 C 7.7912983,11.508929 8.9758403,11.004648 9.5470983,10.290179 L 9.5470983,9.1875 C 11.968608,8.682612 12.862258,8.4375 16.125,8.4375 C 19.479577,8.4375001 20.38467,8.6842603 22.807982,9.15625 L 22.807982,10.165179 C 23.37924,10.879648 24.563781,11.383929 25.932982,11.383929 C 27.341427,11.383929 28.53915,10.847881 29.089232,10.102679 L 28.901732,7.15625 C 24.491586,5.413068 20.816266,4.6964725 16.100095,4.59375 z " + style="opacity:1;fill:url(#linearGradient2483);fill-opacity:1;stroke:#005653;stroke-width:0.625;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2455" + d="M 6.4075414,13.019293 C 7.7882612,13.019293 8.983936,12.610489 9.5600003,12.01696 L 9.5600003,10.430989 C 8.8231919,11.109285 7.789205,11.494948 6.4075414,11.494948 C 4.9854414,11.494948 3.9881276,11.13019 3.2127675,10.48174 L 3.2127675,11.966208 C 3.7674786,12.585269 4.9872465,13.019293 6.4075414,13.019293 z " + style="opacity:1;fill:url(#linearGradient2485);fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2457" + d="M 25.967532,12.944669 C 27.348252,12.944669 28.543927,12.535865 29.119991,11.942336 L 29.119991,10.356365 C 28.383183,11.034661 27.349196,11.420324 25.967532,11.420324 C 24.545432,11.420324 23.548118,11.055566 22.772758,10.407116 L 22.772758,11.891584 C 23.327469,12.510645 24.547237,12.944669 25.967532,12.944669 z " + style="opacity:1;fill:url(#linearGradient2487);fill-opacity:1;stroke:#005653;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2459" + d="M 6.6822725,11.157918 C 8.0629923,11.157918 8.7535908,10.73333 9.3296551,10.139801 L 9.0644746,7.3100024 C 8.3276662,7.9882984 8.1270706,8.5445024 6.745407,8.5445024 C 5.323307,8.5445024 4.4996132,8.1797444 3.7242531,7.5312944 L 3.4874986,10.104833 C 4.0422097,10.723894 5.2619776,11.157918 6.6822725,11.157918 z " + style="opacity:1;fill:url(#linearGradient2489);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="cccsccc" + id="path2461" + d="M 25.633599,11.055324 C 24.252879,11.055324 23.56228,10.630736 22.986216,10.037207 L 22.418005,7.3779497 C 23.154814,8.0562457 24.188801,8.4419087 25.570464,8.4419087 C 26.992564,8.4419087 27.816258,8.0771507 28.591618,7.4287007 L 28.828373,10.002239 C 28.273662,10.6213 27.053894,11.055324 25.633599,11.055324 z " + style="opacity:1;fill:url(#linearGradient2491);fill-opacity:1;stroke:none;stroke-width:0.57204324;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1418" + inkscape:label="Calque 1" + transform="matrix(0.6631953,0,0,0.6631953,30.626397,2.6191805)" + style="stroke:#006c73;stroke-width:3.68368111;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"> + <g + id="g1444" + transform="matrix(0.491592,0,0,0.491592,-26.9581,-0.76797)" + style="stroke:#006c73;stroke-width:7.49337075;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#006c73;stroke-width:7.49337075;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 5.3208165,5.0274423 L 27.017246,26.72387" + id="path1332" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#006c73;stroke-width:7.49337075;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 5.3208161,26.72387 L 27.017246,5.0274427" + id="path1334" + sodipodi:nodetypes="cc" /> + </g> + </g> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/images/transfertarrow.svg b/kde/plasma/plasmoid-qml/package/contents/images/transfertarrow.svg new file mode 100644 index 0000000000..b7dfeea50a --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/images/transfertarrow.svg @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1267.2902" + height="543.88452" + id="svg2" + version="1.1" + inkscape:version="0.48.2 r9819" + sodipodi:docname="transfertarrow.svg"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient3013"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3015" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3017" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3013" + id="linearGradient3019" + x1="521.41046" + y1="1700.8801" + x2="224.25386" + y2="1700.8801" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-84.852814,185.86807)" /> + <filter + inkscape:collect="always" + id="filter3817" + color-interpolation-filters="sRGB"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="12.671464" + id="feGaussianBlur3819" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.24748737" + inkscape:cx="-83.497178" + inkscape:cy="-159.28411" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1918" + inkscape:window-height="1147" + inkscape:window-x="0" + inkscape:window-y="35" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0"> + <sodipodi:guide + orientation="1,0" + position="-788.40925,2236.1701" + id="guide2987" /> + <sodipodi:guide + orientation="0,1" + position="-1882.695,2219.0272" + id="guide2989" /> + <sodipodi:guide + orientation="1,0" + position="-454.12353,1930.4557" + id="guide2991" /> + <sodipodi:guide + orientation="0,1" + position="-1742.695,2319.0272" + id="guide2993" /> + <sodipodi:guide + orientation="0,1" + position="-1971.2664,2121.8843" + id="guide2995" /> + <sodipodi:guide + orientation="0,1" + position="-1522.695,2467.5986" + id="guide2999" /> + <sodipodi:guide + orientation="0,1" + position="-2188.4093,1967.5986" + id="guide3001" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-111.26639,-1627.5049)"> + <path + style="opacity:0.35205994;fill:url(#linearGradient3019);fill-opacity:1;stroke:none;filter:url(#filter3817)" + d="m 141.6779,1819.068 0,152.533 c 0,11.4516 9.20732,24.6643 24.99727,24.6643 l 836.40633,0 c 13.2009,0 21.4536,4.3878 21.4536,17.7621 l 0,114.1473 c 0,14.2454 7.7974,16.5115 20.1022,7.2566 l 293.8567,-221.0204 c 13.3512,-9.1629 11.9007,-18.8749 1.4521,-29.3235 l -302.8417,-225.1901 c -8.4642,-4.8868 -12.5693,-0.761 -12.5693,12.6986 l 0,104.0457 c 0,12.9665 -12.6903,22.4808 -26.50441,22.4808 l -833.37583,0 c -11.77182,0 -22.97696,8.2567 -22.97696,19.9456 z" + id="path3003" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccc" + inkscape:export-filename="/home/lepagee/sflphone/kde/src/icons/transferarraw.png" + inkscape:export-xdpi="17.615274" + inkscape:export-ydpi="17.615274" /> + </g> +</svg> diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/.TabBar.qml.kate-swp b/kde/plasma/plasmoid-qml/package/contents/ui/.TabBar.qml.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..44bb20e16ce8c1b5117460a8e57a98a6de92ae6e GIT binary patch literal 174 zcmZQzV36@nEJ;-eE>A2_aLdd|RnS!kOD!tS%+FIW)H4Y7WME(jW`F=@eSHO2xQG-3 y0|R3|f-eo?mm&BvAbu)>FAL%qA^372ehz{!58@}f1_wcH1evb@<A5B%><R#~sux87 literal 0 HcmV?d00001 diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/BookmarkTab.qml b/kde/plasma/plasmoid-qml/package/contents/ui/BookmarkTab.qml new file mode 100644 index 0000000000..98ddffcc29 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/BookmarkTab.qml @@ -0,0 +1,153 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Plasma.Page { + id: bookmarkTab + height:parent.height-50 + width: parent.width + + property int selectedItem: -1 + + Component { + id: contactDelegate + Rectangle { + id:bookmarkItemRect + width:parent.parent.width + height: 50 + color: "#1a000000" + radius: 5 + Row { + spacing: 2 + anchors.margins: 4 + anchors.leftMargin: 50 + Rectangle { + width: 10 + height: 48 + color: "#AAAAAA" + border.color: "black" + border.width: 1 + radius: 10 + anchors.leftMargin: 10 + Column { + anchors.centerIn: parent + Repeater { + model:3 + Rectangle { + width:3 + height:3 + radius:2 + color:"black" + } + } + } + } + Image { + source: "plasmapackage:/images/contact.svg"; + width:48 + fillMode: Image.PreserveAspectFit + height:48 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + Column { + Text { text: '<b>Name:</b> ' + peerName;color: theme.textColor } + Text { text: '<b>Number:</b> ' + peerNumber;color: theme.textColor } + //Text { text: '<b>E-Mail:</b>' + preferredEmail;color: theme.textColor } + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + selectedItem = id; + } + } + states: [ + State { + name: "selected" + when: (id==selectedItem) + PropertyChanges {target: bookmarkItemRect; color: theme.highlightColor} + } + ] + } + } + + PlasmaCore.DataSource { + id: bookmarkSource + engine: "sflphone" + interval: 250 + connectedSources: ["bookmark"] + onDataChanged: { + plasmoid.busy = false + } + } + + PlasmaCore.SortFilterModel { + id: filter + filterRole: "listPriority" + sortRole: "listPriority" + sortOrder: "DescendingOrder" + sourceModel:PlasmaCore.SortFilterModel { + filterRole: "peerName" + sortRole: "peerName" + sortOrder: "AscendingOrder" + sourceModel: PlasmaCore.DataModel { + dataSource: bookmarkSource + keyRoleFilter: "[\\d]*" + } + } + } + + anchors { + top: tabs.bottom; + left: parent.left; + right: parent.right; + bottom: parent.bottom; + } + + Image { + source: "plasmapackage:/images/favorites.svg"; + width:parent.width + fillMode: Image.PreserveAspectFit + height:parent.height-50 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + ListView { + id: callList + width:parent.width + height:parent.height-50 + model: filter + delegate: contactDelegate + focus: true + section { + property: "section" + delegate: ListSectiondelegate {} + } + } + + Rectangle { + width:parent.width + height:50 + anchors { + top: callList.bottom; + left: parent.left; + right: parent.right; + } + Row { + width:parent.width + height:parent.height + Plasma.Button { + width:parent.width + height:parent.height + iconSource: "call-start" + onClicked: { + call("112") + } + } + } + } +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/CallTab.qml b/kde/plasma/plasmoid-qml/package/contents/ui/CallTab.qml new file mode 100644 index 0000000000..b73349f4ae --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/CallTab.qml @@ -0,0 +1,399 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Plasma.Page { + anchors.top: tabs.bottom + width:parent.width + height:parent.height - tabs.height + id:callTab + + property string currentCall: "" + property string currentCallId: "" + property bool requestNumberOverlay: false + + Component { + id: callDelegate + Rectangle { + id:bookmarkItemRect + width:parent.parent.width + height: 50 + color: "#1a000000" + radius: 5 + Row { + spacing: 2 + anchors.margins: 4 + anchors.leftMargin: 50 + Rectangle { + width: 10 + height: 48 + color: "#AAAAAA" + border.color: "black" + border.width: 1 + radius: 10 + anchors.leftMargin: 10 + Column { + anchors.centerIn: parent + Repeater { + model:3 + Rectangle { + width:3 + height:3 + radius:2 + color:"black" + } + } + } + } + Image { + property string callState: "" + width:48 + fillMode: Image.PreserveAspectFit + height:48 + sourceSize.width: parent.width + sourceSize.height: parent.width + Image { + property string callState: stateName + source: "plasmapackage:/images/contact.svg"; + width:48 + fillMode: Image.PreserveAspectFit + height:48 + sourceSize.width: parent.width + sourceSize.height: parent.width + onCallStateChanged: { + if (callState == "Ringing (out)") { + source="plasmapackage:/images/state/ring.svg"; + } + else if (callState == "Talking") { + source="plasmapackage:/images/state/current.svg"; + } + else if (callState == "Hold") { + source="plasmapackage:/images/state/hold.svg"; + } + else if (callState == "Busy") { + source="plasmapackage:/images/state/busy.svg"; + } + else if (callState == "Failed") { + source="plasmapackage:/images/state/fail.svg"; + } + else if (callState == "Ringing (in)") { + source="plasmapackage:/images/state/incoming.svg"; + } + else if (callState == "Dialing") { + source="plasmapackage:/images/state/dial.svg"; + } + else if (callState == "Transfer") { + source="plasmapackage:/images/state/transfert.svg"; + } + else { + console.log("Unknow state") + } + } + Component.onCompleted: { + if (callState == "Ringing (out)") { + source="plasmapackage:/images/state/ring.svg"; + } + else if (callState == "Talking") { + source="plasmapackage:/images/state/current.svg"; + } + else if (callState == "Hold") { + source="plasmapackage:/images/state/hold.svg"; + } + else if (callState == "Busy") { + source="plasmapackage:/images/state/busy.svg"; + } + else if (callState == "Failed") { + source="plasmapackage:/images/state/fail.svg"; + } + else if (callState == "Ringing (in)") { + source="plasmapackage:/images/state/incoming.svg"; + } + else if (callState == "Dialing") { + source="plasmapackage:/images/state/dial.svg"; + } + else if (callState == "Transfer") { + source="plasmapackage:/images/state/transfert.svg"; + } + else { + console.log("Unknow state "+callState+" end"+stateName) + } + } + } + } + + Column { + Text { text: '<b>Name:</b> ' + peerName;color: theme.textColor } + Text { text: '<b>Number:</b> ' + peerNumber;color: theme.textColor } + //Text { text: '<b>E-Mail:</b>' + preferredEmail;color: theme.textColor } + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + currentCallId = id; + currentCall = peerNumber; + } + } + states: [ + State { + name: "selected" + when: (id==currentCallId) + PropertyChanges {target: bookmarkItemRect; color: theme.highlightColor} + } + ] + } + } + + PlasmaCore.DataSource { + id: callSource + engine: "sflphone" + interval: 250 + connectedSources: ["calls"] + onDataChanged: { + console.log("CALL LIST CHANGED") + plasmoid.busy = false + } + } + + /*PlasmaCore.SortFilterModel { + id: filter + filterRole: "listPriority" + sortRole: "listPriority" + sortOrder: "DescendingOrder" + sourceModel:PlasmaCore.SortFilterModel { + filterRole: "peerName" + sortRole: "peerName" + sortOrder: "AscendingOrder" + sourceModel: + } + }*/ + + + ListView { + id: callList + model: PlasmaCore.DataModel { + dataSource: callSource + keyRoleFilter: "[\\d]*" + } + width:parent.width + height:parent.height-280 + delegate: callDelegate + //anchors.fill:parent + focus: true + section { + property: "section" + delegate: ListSectiondelegate {} + } + onCountChanged: { + if (count == 0) { + currentCall = "" + currentCallId = "" + } + } + } + + Plasma.TextArea { + id:display + width:parent.width + height:40 + focus:true + readOnly:true + anchors { + top: callList.bottom; + left: parent.left; + right: parent.right; + } + + function addText(text) { + display.text = display.text+text + } + + Keys.onPressed: { + console.log("Key pressed") + display.addText(event.key) + } + Keys.onReturnPressed: { + console.log("Call") + + } + } + + Image { + source: "plasmapackage:/images/phone.svg"; + width:parent.width + fillMode: Image.PreserveAspectFit + height:parent.height-250 + } + + DialPad { + anchors { + top: display.bottom; + left: parent.left; + right: parent.right; + } + id: dialPad + width:parent.width + height:200 + } + + Rectangle { + width:parent.width + height:50 + anchors { + top: dialPad.bottom; + left: parent.left; + right: parent.right; + } + Row { + width:parent.width + height:parent.height + Plasma.Button { + id:addContactButton + width:parent.width/5 + height:parent.height + iconSource: "list-add-user" + onClicked: { + call("112") + } + } + Plasma.Button { + id:newCallButton + width:parent.width/6 + height:parent.height + iconSource: "plasmapackage:/images/state/new_call.svg" + visible:false + onClicked: { + currentCall = "" + currentCallId = "" + } + } + Plasma.Button { + id: buttonCall + width:parent.width/5 * 3 + height:parent.height + iconSource: "call-start" + onClicked: { + currentCall = display.text + display.text = "" + call(currentCall) + } + } + Plasma.Button { + id:buttonTransfer + width:parent.width/5 + height:parent.height + visible:false + iconSource: "plasmapackage:/images/state/transfert.svg" + onClicked: { + if (currentCall != "") { + requestNumberOverlay = true + } + } + } + Plasma.Button { + id:buttonHangUp + width:parent.width/5 + height:parent.height + visible:false + iconSource: "plasmapackage:/images/state/hang_up.svg" + onClicked: { + console.log("Attempt to hangup "+currentCallId) + if (currentCallId != "") { + hangUp(currentCallId) + } + } + } + Plasma.Button { + id:buttonHold + width:parent.width/5 + height:parent.height + visible:false + iconSource: "plasmapackage:/images/state/hold.svg" + onClicked: { + if (currentCall != "") { + hold(currentCallId) + } + } + } + Plasma.Button { + id:buttonRecord + width:parent.width/5 + height:parent.height + visible:false + iconSource: "plasmapackage:/images/state/record.svg" + onClicked: { + if (currentCall != "") { + record(currentCallId) + } + } + } + Plasma.Button { + id:buttonClear + width:parent.width/5 + height:parent.height + iconSource: "edit-clear-locationbar-rtl" + onClicked: { + currentCall = "" + display.text = "" + } + } + } + } + + states: [ + State { + name: "dialing" + when: (currentCall == "") + PropertyChanges { + target: buttonCall + } + }, + State { + name: "active" + when: (currentCall != "") + PropertyChanges { + target: buttonHangUp + visible:true + width:parent.width/3 + } + PropertyChanges { + target: addContactButton + visible:false + } + PropertyChanges { + target: newCallButton + visible:true + } + PropertyChanges { + target: buttonRecord + visible:true + width:parent.width/6 + } + PropertyChanges { + target: buttonTransfer + visible:true + width:parent.width/6 + } + PropertyChanges { + target: buttonHold + visible:true + width:parent.width/6 + } + PropertyChanges { + target: buttonCall + //width:parent.width/5 + visible:false + } + PropertyChanges { + target: buttonClear + //width:parent.width/5 + visible:false + } + }, + State { + name: "requestTransferOverlay" + when: (requestNumberOverlay == true) + } + ] +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/ContactTab.qml b/kde/plasma/plasmoid-qml/package/contents/ui/ContactTab.qml new file mode 100644 index 0000000000..047ecf70fe --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/ContactTab.qml @@ -0,0 +1,303 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Plasma.Page { + id: contactTab + height:parent.height-50 + width: parent.width + + property string selectedItem: "-1" + property string callNumber: "" + property int selectedPCount: 0 + property bool requestNumberOverlay: false + + Component { + id: contactDelegate + Rectangle { + id:contactItemRect + width:parent.parent.width + height: 50 + color: "#1a000000" + radius:5 + Row { + spacing: 2 + anchors.margins: 4 + anchors.leftMargin: 50 + Rectangle { + width: 10 + height: 48 + color: "#AAAAAA" + border.color: "black" + border.width: 1 + radius: 10 + anchors.leftMargin: 10 + Column { + anchors.centerIn: parent + Repeater { + model:3 + Rectangle { + width:3 + height:3 + radius:2 + color:"black" + } + } + } + } + Image { + source: "plasmapackage:/images/contact.svg"; + width:48 + fillMode: Image.PreserveAspectFit + height:48 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + Column { + Text { text: '<b>Name:</b> ' + formattedName;color: theme.textColor } + Text { text: '<b>Organisation:</b> ' + organization ;color: theme.textColor } + Text { text: '<b>Number:</b>' + phoneNumber ;color: theme.textColor } + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + selectedItem = uid; + if (phoneCount > 1) { + //requestNumberOverlay = true + selectedPCount = phoneCount + + } + else if (phoneCount == 1) { + callNumber = phoneNumber + } + } + } + states: [ + State { + name: "selected" + when: (uid==selectedItem) + PropertyChanges {target: contactItemRect; color: theme.highlightColor} + } + ] + } + } + + anchors { + top: tabs.bottom; + left: parent.left; + right: parent.right; + bottom: parent.bottom; + } + + PlasmaCore.DataSource { + id: contactSource + engine: "sflphone" + interval: 250 + connectedSources: ["contacts"] + onDataChanged: { + plasmoid.busy = false + } + } + + PlasmaCore.SortFilterModel { + id: nameFilter + filterRole: "formattedName" + sortRole: "formattedName" + sortOrder: "AscendingOrder" + sourceModel: PlasmaCore.DataModel { + dataSource: contactSource + keyRoleFilter: "[\\d]*" + } + } + + PlasmaCore.SortFilterModel { + id: orgFilter + filterRole: "organization" + sortRole: "organization" + sortOrder: "AscendingOrder" + sourceModel: nameFilter + } + + PlasmaCore.SortFilterModel { + id: depFilter + filterRole: "department" + sortRole: "department" + sortOrder: "AscendingOrder" + sourceModel: nameFilter + } + + Image { + source: "plasmapackage:/images/contact.svg"; + width:parent.width + fillMode: Image.PreserveAspectFit + height:parent.height-50 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + ListView { + id: callList + width:parent.width + height:parent.height-80 + anchors.top: sortTab.bottom + model: nameFilter + delegate: contactDelegate + focus: true + section { + criteria: ViewSection.FirstCharacter + property: "formattedName" + delegate: ListSectiondelegate {} + } + } + + Plasma.TabBar { + id:sortTab + width:parent.width + height:30 + /*Repeater { + model:5 + Plasma.TabButton { + text: Array("Name","Organisation","Recent","Department","Group")[index]; + onPressedChanged: { + + } + } + }*/ + Plasma.TabButton { + text: "Name"; + onPressedChanged: { + callList.section.criteria = ViewSection.FirstCharacter + callList.section.property = "formattedName" + callList.model = nameFilter + } + } + Plasma.TabButton { + text: "Organisation"; + onPressedChanged: { + callList.section.criteria = ViewSection.FullString + callList.section.property = "organization" + callList.model = orgFilter + } + } + Plasma.TabButton { + text: "Recent"; + onPressedChanged: { + callList.section.criteria = ViewSection.FullString + } + } + Plasma.TabButton { + text: "Department"; + onPressedChanged: { + callList.section.criteria = ViewSection.FullString + callList.section.property = "department" + callList.model = depFilter + } + } + Plasma.TabButton { + text: "Group"; + onPressedChanged: { + + } + } + } + + Rectangle { + width:parent.width + height:50 + anchors { + top: callList.bottom; + left: parent.left; + right: parent.right; + } + Row { + width:parent.width + height:parent.height + Plasma.Button { + id:addContact + width:parent.width + height:parent.height + iconSource: "list-add-user" + onClicked: { + call("112") + } + } + Plasma.Button { + id:callContact + width:parent.width/3 + height:parent.height + iconSource: "call-start" + visible:false + onClicked: { + if (callNumber != "" && selectedItem != "-1") { + call(callNumber) + } + else if (selectedItem != "-1" && selectedPCount > 1) { + requestNumberOverlay = true + } + } + } + Plasma.Button { + id:editContact + width:parent.width/3 + height:parent.height + iconSource: "document-edit" + visible:false + onClicked: { + call("112") + } + } + } + states: [ + State { + name: "itemSelected" + when: (selectedItem != -1) + PropertyChanges { + target: addContact; + width:parent.width/3 + } + PropertyChanges { + target: callContact + visible:true + width:parent.width/3 + } + PropertyChanges { + target: editContact + visible:true + width:parent.width/3 + } + }, + State { + name: "noItem" + when: (selectedItem == -1) + /*PropertyChanges { target: clearButton; width: parent.width } + PropertyChanges { target: clearButton; visible: false } + PropertyChanges { target: clearButton; visible: false }*/ + } + ] + } + + states: [ + State { + name: "default" + when: (requestNumberOverlay == false) + }, + State { + name: "requestNumberOverlay" + when: (requestNumberOverlay == true) + } + ] + onRequestNumberOverlayChanged: { + if (requestNumberOverlay == false) + reset() + } + + function reset() { + selectedItem = "-1" + callNumber = "" + selectedPCount = 0 + requestNumberOverlay = false + } +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/DialPad.qml b/kde/plasma/plasmoid-qml/package/contents/ui/DialPad.qml new file mode 100644 index 0000000000..ac3f2df0fe --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/DialPad.qml @@ -0,0 +1,37 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma + +Rectangle { + id:dialPad + width:parent.width + height:200 + color:theme.viewBackgroundColor + + signal numbrePressed(string number) + function getNumber(idx) { + var nb = new Array("1","2","3","4","5","6","7","8","9","*","0","#") + return nb[idx] + } + Grid { + columns: 3 + spacing: 3 + width:parent.width + height:50*4 + Repeater { + model: 12 + Plasma.Button { + width:parent.width/3 -1 + height:48 + text:getNumber(index)+ "\n" + Array("","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz","","+","","")[index] + onClicked: { + playDMTF(index) + dialPad.numbrePressed(dialPad.getNumber(index)) + } + } + } + } + + Component.onCompleted: { + dialPad.numbrePressed.connect(display.addText) + } +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/HistoryTab.qml b/kde/plasma/plasmoid-qml/package/contents/ui/HistoryTab.qml new file mode 100644 index 0000000000..555ae584b7 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/HistoryTab.qml @@ -0,0 +1,257 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Plasma.Page { + id: historyTab + width: parent.width + + property int selectedItem: -1 + property string callNumber: "" + + Component { + id: historyDelegate + Rectangle { + width:parent.parent.width + height: 50 + color: "#1a000000" + radius: 5 + id:historyItemRect + Row { + spacing: 2 + anchors.margins: 4 + anchors.leftMargin: 50 + Rectangle { + width: 10 + height: 48 + color: "#AAAAAA" + border.color: "black" + border.width: 1 + radius: 10 + anchors.leftMargin: 10 + Column { + anchors.centerIn: parent + Repeater { + model:3 + Rectangle { + width:3 + height:3 + radius:2 + color:"black" + } + } + } + } + Image { + source: "plasmapackage:/images/contact.svg"; + width:48 + fillMode: Image.PreserveAspectFit + height:48 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + Column { + Text { text: '<b>Name:</b> ' + peerName;color:theme.textColor } + Text { text: '<b>Number:</b> ' + peerNumber;color:theme.textColor } + Text { text: '<b>Date:</b>' + date;color:theme.textColor } + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + selectedItem = id + callNumber = peerNumber + } + } + states: [ + State { + name: "selected" + when: (id==selectedItem) + PropertyChanges {target: historyItemRect; color: theme.highlightColor} + } + ] + } + } + + Image { + source: "plasmapackage:/images/history.svgz"; + width:parent.width + fillMode: Image.PreserveAspectFit + height:parent.height-50 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + anchors { + top: tabs.bottom; + left: parent.left; + right: parent.right; + bottom: parent.bottom; + } + + PlasmaCore.DataSource { + id: historySource + engine: "sflphone" + interval: 5000 + connectedSources: ["history"] + onDataChanged: { + plasmoid.busy = false + } + } + + PlasmaCore.SortFilterModel { + id: dateFilter + filterRole: "date" + sortRole: "date" + sortOrder: "DescendingOrder" + //filterRegExp: toolbarFrame.searchQuery + sourceModel: PlasmaCore.DataModel { + dataSource: historySource + keyRoleFilter: "[\\d]*" + } + } + + PlasmaCore.SortFilterModel { + id: nameFilter + filterRole: "peerName" + sortRole: "peerName" + sortOrder: "AscendingOrder" + //filterRegExp: toolbarFrame.searchQuery + sourceModel: PlasmaCore.DataModel { + dataSource: historySource + keyRoleFilter: "[\\d]*" + } + } + + PlasmaCore.SortFilterModel { + id: lengthFilter + filterRole: "length" + sortRole: "length" + sortOrder: "AscendingOrder" + //filterRegExp: toolbarFrame.searchQuery + sourceModel: PlasmaCore.DataModel { + dataSource: historySource + keyRoleFilter: "[\\d]*" + } + } + + ListView { + id: callList + width:parent.width + height:parent.height-80 + model: dateFilter + anchors.top:sortTab.bottom + delegate: historyDelegate + focus: true + section { + property: "section" + criteria: ViewSection.FullString + delegate: ListSectiondelegate {} + } + } + + Plasma.TabBar { + id:sortTab + width:parent.width + height:30 + /*Repeater { + model:5 + Plasma.TabButton { + text: Array("Name","Organisation","Recent","Department","Group")[index]; + onPressedChanged: { + + } + } + }*/ + Plasma.TabButton { + text: "Date"; + onPressedChanged: { + console.log("Date pressed") + callList.section.property = "section" + callList.model = dateFilter + } + } + Plasma.TabButton { + text: "Name"; + onPressedChanged: { + console.log("Name pressed") + callList.section.property = "peerName" + callList.model = nameFilter + } + } + Plasma.TabButton { + text: "Popularity"; + onPressedChanged: { + console.log("Popularity pressed") + } + } + Plasma.TabButton { + text: "Length"; + onPressedChanged: { + console.log("Length pressed") + callList.section.property = "" + callList.model = lengthFilter + } + } + } + + Rectangle { + width:parent.width + height:50 + anchors { + top: callList.bottom; + left: parent.left; + right: parent.right; + } + Row { + width:parent.width + height:parent.height + Plasma.Button { + id:clearButton + width:parent.width + height:parent.height + iconSource: "edit-clear" + onClicked: { + //call("112") + } + } + Plasma.Button { + id:callButton + width:parent.width + height:parent.height + visible:false + iconSource: "call-start" + onClicked: { + if (callNumber != "") { + console.log("Calling: "+callNumber) + call(callNumber) + } + } + } + } + + states: [ + State { + name: "itemSelected" + when: (selectedItem != -1) + PropertyChanges { + target: clearButton; + width:parent.width/2 + } + PropertyChanges { + target: callButton + visible:true + width:parent.width/2 + } + }, + State { + name: "noItem" + when: (selectedItem == -1) + PropertyChanges {target: clearButton;width:parent.width} + PropertyChanges {target: callButton;visible:false} + } + ] + } +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/ListSectiondelegate.qml b/kde/plasma/plasmoid-qml/package/contents/ui/ListSectiondelegate.qml new file mode 100644 index 0000000000..d6a4d95d54 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/ListSectiondelegate.qml @@ -0,0 +1,24 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Rectangle { + id: listSectiondelegate + height:20 + gradient: Gradient { + GradientStop { position: 1.0; color: theme.backgroundColor } + GradientStop { position: 0.0; color: theme.buttonBackgroundColor } + } + width: parent.width + //height: childrenRect.height + 4 + radius:2 + Text { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin : 10 + //font.pixelSize: 16 + font.bold: true + text: section + color:theme.buttonTextColor + } +} \ No newline at end of file diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/NumberOverlay.qml b/kde/plasma/plasmoid-qml/package/contents/ui/NumberOverlay.qml new file mode 100644 index 0000000000..af0eb36cd2 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/NumberOverlay.qml @@ -0,0 +1,83 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Rectangle { + id:numberOverlay + + property string contactId: "" + + color:"#BB000000" + width:parent.width + height:parent.height + + MouseArea { + anchors.fill: parent + onClicked: { + parent.visible=false + } + } + + Plasma.Button { + x:parent.x+parent.width-30 + y:5 + height:30 + width:30 + iconSource:"dialog-close" + onClicked: { + parent.visible=false + } + } + + PlasmaCore.DataSource { + id: contactNumberSource + engine: "sflphone" + interval: 5000 + onDataChanged: { + plasmoid.busy = false + } + } + + Column { + width:parent.width + anchors.centerIn : parent + + spacing:10 + Repeater { + model: PlasmaCore.DataModel { + dataSource: contactNumberSource + keyRoleFilter: "[\\d]*" + } + Item { + width:parent.width + height:50 + Plasma.Button { + anchors.fill:parent + clip:true + text:"<b>"+type+"</b> ("+number+")" + onClicked: { + call(number); + numberOverlay.visible = false + } + } + } + } + } + + states: [ + State { + name: "active" + when: (visible == true) + + PropertyChanges { + target:contactNumberSource + connectedSources: ["Number:"+contactId] + } + }, + State { + name: "innactive" + when: (visible == false) + //PropertyChanges {target: clearButton;width:parent.width} + } + ] +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/Settingstab.qml b/kde/plasma/plasmoid-qml/package/contents/ui/Settingstab.qml new file mode 100644 index 0000000000..cea7b46f44 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/Settingstab.qml @@ -0,0 +1,154 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Plasma.Page { + id:settingsTab + + property string defaultaccount: "IP2IP" + + anchors { + top: tabs.bottom; + left: parent.left; + right: parent.right; + bottom: parent.bottom; + } + + Image { + source: "plasmapackage:/images/configure.svgz"; + width:parent.width + fillMode: Image.PreserveAspectFit + height:parent.height-50 + sourceSize.width: parent.width + sourceSize.height: parent.width + } + + PlasmaCore.DataSource { + id: accountSource + engine: "sflphone" + interval: 250 + connectedSources: ["accounts"] + onDataChanged: { + plasmoid.busy = false + } + } + + PlasmaCore.DataSource { + id: infoSource + engine: "sflphone" + interval: 250 + connectedSources: ["info"] + onDataChanged: { + plasmoid.busy = false + defaultaccount = infoSource.data["info"]["Current_account"] + } + } + + PlasmaCore.SortFilterModel { + id: accountFilter + filterRole: "alias" + sortRole: "alias" + sortOrder: "AscendingOrder" + sourceModel: PlasmaCore.DataModel { + dataSource: accountSource + keyRoleFilter: "[\\d]*" + } + } + + Column { + width:parent.width + spacing:3 + + Plasma.Label { + text: "Default account" + } + + Rectangle { + height:1 + width:parent.width -30 + color:theme.textColor + anchors.bottomMargin:10 + } + + Repeater { + model: accountFilter + Plasma.RadioButton { + id:checkbox2 + text:alias + width:parent.width + onCheckedChanged: { + if (checkbox2.checked == false && defaultaccount != id) { + return + } + if (defaultaccount == id) { + checkbox2.checked = true + } + defaultaccount = id; + } + states: [ + State { + name: "selected" + when: (id==defaultaccount) + PropertyChanges {target: checkbox2;checked:true} + }, + State { + name: "unselected" + when: (id!=defaultaccount) + PropertyChanges {target: checkbox2;checked:false} + } + ] + } + } + + Item { + height:15 + width:1 + anchors.bottomMargin:10 + } + + Plasma.Label { + text: "Bookmark" + } + + Rectangle { + height:1 + width:parent.width -30 + color:theme.textColor + anchors.bottomMargin:10 + } + + Plasma.CheckBox { + text:"Show popular as bookmark" + width:parent.width + } + + Item { + height:15 + width:1 + anchors.bottomMargin:10 + } + + Plasma.Label { + text: "Advanced" + } + + Rectangle { + height:1 + width:parent.width -30 + color:theme.textColor + anchors.bottomMargin:10 + } + + Item { + height:5 + width:1 + anchors.bottomMargin:10 + } + + Plasma.Button { + text:"Configure sflphone" + anchors.margins : 10 + width:parent.width + } + } +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/TabBar.qml b/kde/plasma/plasmoid-qml/package/contents/ui/TabBar.qml new file mode 100644 index 0000000000..8c0ed1d374 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/TabBar.qml @@ -0,0 +1,99 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma + +//Plasma.TagGroup { +Plasma.TabBar { + id:tabBar + width:parent.width + + function displayTabs(index) { + switch (index) { + case 0: + contactList.visible = false + callList.visible = true + historyList.visible = false + bookmarkList.visible= false + settingsTab.visible = false + break; + case 1: + contactList.visible = true + callList.visible = false + historyList.visible = false + bookmarkList.visible= false + settingsTab.visible = false + break; + case 2: + contactList.visible = false + historyList.visible = true + callList.visible = false + bookmarkList.visible= false + settingsTab.visible = false + break; + case 3: + contactList.visible = false + historyList.visible = false + callList.visible = false + bookmarkList.visible= true + settingsTab.visible = false + break; + case 4: + contactList.visible = false + callList.visible = false + historyList.visible = false + bookmarkList.visible= false + settingsTab.visible = true + break + } + } + + //Buggy, awaiting fix upstream, test often + /*Repeater { + model:5 + Plasma.TabButton { + text: Array("New calls","Contacts","History","Bookmarks","Settings")[index] + onPressedChanged: { + tabBar.displayTabs(index) + } + } + }*/ + Plasma.TabButton { + text: "New calls" + iconSource: "call-start" + onPressedChanged: { + tabBar.displayTabs(0) + } + } + + Plasma.TabButton { + text: "Contacts" + iconSource: "user-identity" + onPressedChanged: { + tabBar.displayTabs(1) + } + } + + Plasma.TabButton { + text: "History" + iconSource: "view-history" + onPressedChanged: { + tabBar.displayTabs(2) + } + } + + Plasma.TabButton { + text: "Bookmarks" + iconSource: "favorites" + onPressedChanged: { + tabBar.displayTabs(3) + } + } + + Plasma.TabButton { + iconSource: "configure" + text:"Configure" + onPressedChanged: { + tabBar.displayTabs(4) + } + } +} +//} \ No newline at end of file diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/TransferOverlay.qml b/kde/plasma/plasmoid-qml/package/contents/ui/TransferOverlay.qml new file mode 100644 index 0000000000..1a9f05c172 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/TransferOverlay.qml @@ -0,0 +1,124 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Rectangle { + id:transferOverlay + + property string callId: "" + + color:"#BB000000" + width:parent.width + height:parent.height + + MouseArea { + anchors.fill: parent + onClicked: { + parent.visible=false + } + } + + Plasma.Button { + x:parent.x+parent.width-30 + y:5 + height:30 + width:30 + iconSource:"dialog-close" + onClicked: { + parent.visible=false + } + } + + /*Column { + width:parent.width + anchors.centerIn : parent + + spacing:10 + Repeater { + model: PlasmaCore.DataModel { + dataSource: contactNumberSource + keyRoleFilter: "[\\d]*" + } + Item { + width:parent.width + height:50 + Plasma.Button { + anchors.fill:parent + clip:true + text:"<b>"+type+"</b> ("+number+")" + onClicked: { + call(number); + numberOverlay.visible = false + } + } + } + } + }*/ + + + Image { + source: "plasmapackage:/images/transfertarrow.svg"; + width:100 + fillMode: Image.PreserveAspectFit + height:60 + y:parent.height+parent.y - 60 + x:parent.width+parent.x-100 + sourceSize.width: 100 + sourceSize.height: 60 + } + + Item { + anchors.fill: parent + Column { + anchors.centerIn : parent + width:parent.width -20 + height:190 + Plasma.TextArea { + id:transferText + width:parent.width + height:40 + focus:true + + /*Keys.onPressed: { + console.log("Key pressed") + text += event.key + }*/ + + Keys.onReturnPressed: { + console.log("Time to transfer"+transferText.text) + } + } + + Item { + height:100 + width:1 + } + + Plasma.Button { + text: "Transfer" + //width:parent.width/2 + height:50 + anchors.horizontalCenter: parent.horizontalCenter + iconSource: "plasmapackage:/images/transfertarrow.svg" + onClicked: { + transfer(callId,transferText.text) + callId = "" + transferText.text = "" + transferOverlay.visible = false + } + } + } + } + + states: [ + State { + name: "active" + when: (visible == true) + }, + State { + name: "innactive" + when: (visible == false) + //PropertyChanges {target: clearButton;width:parent.width} + } + ] +} diff --git a/kde/plasma/plasmoid-qml/package/contents/ui/main.qml b/kde/plasma/plasmoid-qml/package/contents/ui/main.qml new file mode 100644 index 0000000000..6562efe5be --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/contents/ui/main.qml @@ -0,0 +1,125 @@ +import QtQuick 1.1 +import org.kde.plasma.components 0.1 as Plasma +import org.kde.plasma.core 0.1 as PlasmaCore + +Rectangle { + width: 350; height: 650 + + color:theme.viewBackgroundColor + + PlasmaCore.DataSource { + id: dataSource + engine: "sflphone" + connectedSources: ["calls","history","contacts"] + interval: 500 + } + + CallTab { + id:callList + visible:true + onRequestNumberOverlayChanged: { + if (requestNumberOverlay == true) { + transferOverlay.callId = callList.currentCallId + transferOverlay.visible = true + } + } + } + + ContactTab { + id:contactList + visible:false + onRequestNumberOverlayChanged: { + console.log("OVERLAY "+contactList.requestNumberOverlay) + if (contactList.requestNumberOverlay == true) { + numberOverlay.contactId = contactList.selectedItem + numberOverlay.visible=true + } + } + } + + Settingstab { + id:settingsTab + visible:false + } + + HistoryTab { + id:historyList + visible:false + } + + BookmarkTab { + id:bookmarkList + visible:false + } + + TabBar { + id:tabs + width:parent.width + height:50 + } + + NumberOverlay { + id:numberOverlay + visible:false + onVisibleChanged: { + if (numberOverlay.visible == false) { + numberOverlay.contactId = "" + contactList.reset() + } + } + } + + TransferOverlay { + id:transferOverlay + visible:false + onVisibleChanged: { + if (transferOverlay.visible == false) { + callList.requestNumberOverlay = false + } + } + } + + function call(number) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("Call") + operation.AccoutId = settingsTab.defaultaccount + operation.Number = number + var job = service.startOperationCall(operation) + } + + function playDMTF(number) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("DMTF") + operation.str = number + var job = service.startOperationCall(operation) + } + + function transfer(callId,transferNumber) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("Transfer") + operation.callid = callId + operation.transfernumber = transferNumber + var job = service.startOperationCall(operation) + } + + function hangUp(callId) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("Hangup") + operation.callid = callId + var job = service.startOperationCall(operation) + } + + function hold(callId) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("Hold") + operation.callid = callId + var job = service.startOperationCall(operation) + } + + function record(callId) { + var service = dataSource.serviceForSource("calls") + var operation = service.operationDescription("Record") + operation.callid = callId + var job = service.startOperationCall(operation) + } +} diff --git a/kde/plasma/plasmoid-qml/package/metadata.desktop b/kde/plasma/plasmoid-qml/package/metadata.desktop new file mode 100644 index 0000000000..83e54cffd7 --- /dev/null +++ b/kde/plasma/plasmoid-qml/package/metadata.desktop @@ -0,0 +1,21 @@ +[Desktop Entry] +Name=SFLPhone plasmoid +Comment=Plasma client for SFLPhone daemon +Icon=chronometer + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml +X-Plasma-DefaultSize=350,650 + +X-KDE-PluginInfo-Author=Emmanuel Lepage Vallee +X-KDE-PluginInfo-Email=emmanuel.lepage@savoirfairelinux.com +X-KDE-PluginInfo-Website=http://sflphone.org/ +X-KDE-PluginInfo-Category=Phone +X-KDE-PluginInfo-Name=org.kde.sflphone +X-KDE-PluginInfo-Version=0.1 + +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=GPL +X-KDE-PluginInfo-EnabledByDefault=true +X-KDE-ServiceTypes=Plasma/Applet +Type=Service diff --git a/kde/plasma/plasmoid/CMakeLists.txt b/kde/plasma/plasmoid/CMakeLists.txt deleted file mode 100644 index 7ecfe0d700..0000000000 --- a/kde/plasma/plasmoid/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -# Project Needs a name ofcourse -project(sflphone-plasmoid) - -# Find the required Libaries -find_package(KDE4 REQUIRED) -include(KDE4Defaults) - -add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) -include_directories( - ${CMAKE_SOURCE_DIR} - ${CMAKE_BINARY_DIR} - ${KDE4_INCLUDES} - ) - -# We add our source code here -set(tutorial1_SRCS - SFLPhonePlasmoid.cpp - CallItem.cpp - ConferenceItem.cpp - DialPage.cpp - ViewItem.h - MainWidget.cpp) - -install( FILES - ../../src/icons/refuse.svg - ../../src/icons/ring.svg - ../../src/icons/incoming.svg - ../../src/icons/outgoing.svg - ../../src/icons/missed.svg - ../../src/icons/dial.svg - ../../src/icons/current.svg - ../../src/icons/busy.svg - ../../src/icons/hold.svg - ../../src/icons/fail.svg - ../../src/icons/transfert.svg - ../../src/icons/hang_up.svg - ../../src/icons/call.svg - ../../src/icons/sflphone.svg - ../../src/icons/sflphone_notif.svg -DESTINATION ${DATA_INSTALL_DIR}/sflphone-plasmoid/icons/ ) - -# Now make sure all files get to the right place -kde4_add_plugin(plasma_applet_sflphone ${tutorial1_SRCS}) -target_link_libraries(plasma_applet_sflphone - qtsflphone - ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS}) - -install(TARGETS plasma_applet_sflphone - DESTINATION ${PLUGIN_INSTALL_DIR}) - -install(FILES plasma-applet-sflphone.desktop - DESTINATION ${SERVICES_INSTALL_DIR}) - -#set(sflphone-plasmoid_SRCS -# SFLPhonePlasmoid.cpp) -# -#kde4_add_plugin(plasma_applet_sflphone ${sflphone-plasmoid_SRCS}) -#target_link_libraries(plasma_applet_sflphone ${KDE4_PLASMA_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KDEUI_LIBS}) -# -#install(TARGETS plasma_applet_sflphone DESTINATION ${PLUGIN_INSTALL_DIR}) -#install(FILES plasma-applet-sflphone.desktop DESTINATION ${SERVICES_INSTALL_DIR}) diff --git a/kde/plasma/plasmoid/CallItem.cpp b/kde/plasma/plasmoid/CallItem.cpp deleted file mode 100644 index 339b3c8173..0000000000 --- a/kde/plasma/plasmoid/CallItem.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "CallItem.h" - -#include <KStandardDirs> -#include <QDebug> -#include <time.h> - -#include "../../src/lib/sflphone_const.h" - -CallItem::CallItem() : frmDate(0), parentItem(0) -{ - setMinimumSize(QSizeF(24,64)); - setMaximumSize(QSizeF(10000000,64)); - - frmCallerName = new Plasma::Frame(this); - frmCallerNumber = new Plasma::Frame(this); - frmStateIcon = new Plasma::Frame(this); - frmStateIcon->setMinimumSize(QSizeF(24,24)); - frmStateIcon->setMaximumSize(QSizeF(24,24)); - changed = false; - - mainLayout = new QGraphicsGridLayout(); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(5); - setLayout(mainLayout); - - //Plasma::Frame* infoFrame = new Plasma::Frame(this); - - //QGraphicsLinearLayout* infoLayout = new QGraphicsLinearLayout(Qt::Vertical); - //infoLayout->setContentsMargins(0, 0, 0, 0); - //infoLayout->setSpacing(5); - //infoFrame->setLayout(infoLayout); - mainLayout->addItem(frmStateIcon,0,0,2,1); - mainLayout->addItem(frmCallerName,0,1); - mainLayout->addItem(frmCallerNumber,1,1); - - -} - -QString CallItem::getCallId() -{ - return callId; -} - -void CallItem::setCallId(QString _callId) -{ - this->callId = _callId; -} - -bool CallItem::isChanged() -{ - return changed; -} - -void CallItem::setCallerName(QString value) -{ - frmCallerName->setText(value); -} - -void CallItem::setCallerNumber(QString value) -{ - frmCallerNumber->setText(value); -} - -void CallItem::setState(int state) -{ -qDebug() << "State:" << KStandardDirs::locate("data", "icons/hold.svg"); - if (state == CALL_STATE_INCOMING) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/incoming.svg"/*KStandardDirs::locate("appdata", "icons/incoming.svg")*/); - } else if (state == CALL_STATE_RINGING) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/outgoing.svg"/*KStandardDirs::locate("appdata", "icons/outgoing.svg")*/); - } else if (state == CALL_STATE_CURRENT) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/call.svg"/*KStandardDirs::locate("appdata", "icons/call.svg")*/); - } else if (state == CALL_STATE_DIALING) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/dial.svg"/*KStandardDirs::locate("appdata", "icons/dial.svg")*/); - } else if (state == CALL_STATE_HOLD) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/hold.svg"/*KStandardDirs::locate("appdata", "icons/hold.svg")*/); - } else if (state == CALL_STATE_FAILURE) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/fail.svg"/*KStandardDirs::locate("appdata", "icons/fail.svg")*/); - } else if (state == CALL_STATE_BUSY) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/busy.svg"/*KStandardDirs::locate("appdata", "icons/busy.svg")*/); - } else if (state == CALL_STATE_TRANSFER) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/transfert.svg"/*KStandardDirs::locate("appdata", "icons/transfert.svg")*/); - } else if (state == CALL_STATE_TRANSF_HOLD) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/hold.svg"/*KStandardDirs::locate("appdata", "icons/hold.svg")*/); - } else if (state == CALL_STATE_OVER) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/hang_up.svg"/*KStandardDirs::locate("appdata", "icons/hang_up.svg")*/); - } else if (state == CALL_STATE_ERROR) { - frmStateIcon->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/fail.svg"/*KStandardDirs::locate("appdata", "icons/fail.svg")*/); - } -} - -ViewItem* CallItem::parent() -{ - return parentItem; -} - -void CallItem::setParent(ViewItem* parent) -{ - parentItem = parent; -} - -void CallItem::setDate(int date) -{ - if (!frmDate) { - frmDate = new Plasma::Frame(this); - mainLayout->addItem(frmDate,2,1); - } - time_t date2 = date; - frmDate->setText(asctime(gmtime(&date2))); -} diff --git a/kde/plasma/plasmoid/CallItem.h b/kde/plasma/plasmoid/CallItem.h deleted file mode 100644 index bf55b76d0f..0000000000 --- a/kde/plasma/plasmoid/CallItem.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PLASMOID_CALL_ITEM -#define PLASMOID_CALL_ITEM - -#include <Plasma/Svg> -#include <QGraphicsGridLayout> -#include <Plasma/Frame> -#include "ViewItem.h" - -class CallItem : public Plasma::Frame, public ViewItem -{ - Q_OBJECT - public: - CallItem(); - QString getCallId(); - void setCallId(QString _callId); - bool isChanged(); - void setCallerName(QString value); - void setCallerNumber(QString value); - void setState(int state); - void setDate(int date); - ViewItem* parent(); - void setParent(ViewItem* parent); - bool isConference() - { - return false; - } - private: - Plasma::Frame* frmCallerName; - Plasma::Frame* frmCallerNumber; - Plasma::Frame* frmDate; - Plasma::Frame* frmStateIcon; - bool changed; - QString callId; - ViewItem* parentItem; - QGraphicsGridLayout* mainLayout; - -}; - -#endif diff --git a/kde/plasma/plasmoid/ConferenceItem.cpp b/kde/plasma/plasmoid/ConferenceItem.cpp deleted file mode 100644 index 04bdf6f3c3..0000000000 --- a/kde/plasma/plasmoid/ConferenceItem.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "ConferenceItem.h" - -ConferenceItem::ConferenceItem() : Plasma::Frame() -{ - setEnabledBorders(Plasma::FrameSvg::AllBorders); - setFrameShadow(Plasma::Frame::Sunken); - //setStyleSheet("background-color:red;"); - - header = new Plasma::Frame(this); - header->setText("Conference"); - - conferenceLayout = new QGraphicsLinearLayout(Qt::Vertical); - - conferenceLayout->addItem(header); - - setLayout(conferenceLayout); -} - -void ConferenceItem::setCallList(QList<CallItem*> list) -{ - for (int i=0; i < conferenceLayout->count(); i++) { - if (conferenceLayout->itemAt(i) != header) { - CallItem* item = (CallItem*) conferenceLayout->itemAt(i); - conferenceLayout->removeAt(i); - item->setParent(0); - } - } - - foreach (CallItem* item, list) { - conferenceLayout->addItem(item); - item->setParent(this); - } - header->setText("Conference (" + QString::number(list.count())+")"); -} - -void ConferenceItem::setConfId(QString value) -{ - confId = value; -} diff --git a/kde/plasma/plasmoid/ConferenceItem.h b/kde/plasma/plasmoid/ConferenceItem.h deleted file mode 100644 index 1ca61d170b..0000000000 --- a/kde/plasma/plasmoid/ConferenceItem.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef CONFERENCE_ITEM_H -#define CONFERENCE_ITEM_H - -#include <Plasma/Frame> -#include <Plasma/FrameSvg> -#include <QGraphicsLinearLayout> - -#include "ViewItem.h" -#include "CallItem.h" - -class ConferenceItem : public Plasma::Frame, public ViewItem -{ - public: - ConferenceItem(); - bool isConference() - { - return true; - } - void setCallList(QList<CallItem*> list); - void setConfId(QString value); - - private: - QString confId; - QGraphicsLinearLayout* conferenceLayout; - Plasma::Frame* header; -}; - -#endif diff --git a/kde/plasma/plasmoid/DialPage.cpp b/kde/plasma/plasmoid/DialPage.cpp deleted file mode 100644 index 6b9906f338..0000000000 --- a/kde/plasma/plasmoid/DialPage.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "DialPage.h" - -#include <Plasma/PushButton> -#include <Plasma/FrameSvg> -#include <QGraphicsGridLayout> -#include <QLabel> -#include <KPushButton> -#include <QHBoxLayout> -#include <QDebug> - -DialPage::DialPage() -{ - QGraphicsGridLayout* mainLayout = new QGraphicsGridLayout(); - setLayout(mainLayout); - currentNumber = new Plasma::Frame(this); - currentNumber->setText("Dial"); - currentNumber->setFrameShadow(Plasma::Frame::Sunken); - currentNumber->setMinimumSize(0,50); - currentNumber->setStyleSheet("background-color:#AAAAFF;border-size:2px;border-style:sunken;"); - //currentNumber->setEnabledBorders(FrameSvg::EnabledBorders::Raised); - mainLayout->addItem(currentNumber,0,0,1,6); - - QString numbers[12] = - {"1", "2", "3", - "4", "5", "6", - "7", "8", "9", - "*", "0", "#"}; - - QString texts[12] = - { "" , "abc", "def" , - "ghi" , "jkl", "mno" , - "pqrs", "tuv", "wxyz", - "" , "" , "" }; - - for(int i = 0 ; i < 12 ; i++) { - DialButton* newButton = new DialButton(this); - newButton->setMinimumHeight(40); - newButton->setLetter(numbers[i]); - newButton->setText(numbers[i]+((!texts[i].isEmpty())?("\n"+texts[i]):"")); - mainLayout->addItem(newButton,1+i/3,2*(i%3),1,2); - connect(newButton,SIGNAL(typed(QString)),this, SLOT(charTyped(QString))); - } - - Plasma::PushButton* newButton = new Plasma::PushButton(this); - newButton->setText("Call"); - newButton->setIcon(KIcon("/usr/share/kde4/apps/sflphone-plasmoid/icons/outgoing.svg")); - mainLayout->addItem(newButton,5,0,1,3); - - Plasma::PushButton* cancelButton = new Plasma::PushButton(this); - cancelButton->setText("Cancel"); - cancelButton->setIcon(KIcon("/usr/share/kde4/apps/sflphone-plasmoid/icons/hang_up.svg")); - mainLayout->addItem(cancelButton,5,3,1,3); - - connect(newButton, SIGNAL(clicked()), this, SLOT(call())); - connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel())); -} - -void DialPage::charTyped(QString value) -{ - currentNumber2 += value; - currentNumber->setText(currentNumber2); -} - -void DialPage::call() -{ - emit call(currentNumber2); - currentNumber2 = ""; - currentNumber->setText("Dial"); -} - -void DialPage::cancel() -{ - currentNumber2 = ""; - currentNumber->setText("Dial"); -} diff --git a/kde/plasma/plasmoid/DialPage.h b/kde/plasma/plasmoid/DialPage.h deleted file mode 100644 index 88e553c77d..0000000000 --- a/kde/plasma/plasmoid/DialPage.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef DIAL_PAGE -#define DIAL_PAGE - -#include <Plasma/Frame> -#include <Plasma/PushButton> - -class DialButton : public Plasma::PushButton -{ - Q_OBJECT - - public: - DialButton(QGraphicsWidget* parent) : Plasma::PushButton(parent) { - connect(this, SIGNAL(clicked()), this, SLOT(clicked2())); - } - void setLetter(QString value) { - letter = value; - } - private slots: - void clicked2() { - emit typed(letter); - } - signals: - void typed(QString); - private: - QString letter; -}; - -class DialPage : public Plasma::Frame -{ - Q_OBJECT - public: - DialPage(); - - private slots: - void charTyped(QString value); - void call(); - void cancel(); - - private: - Plasma::Frame* currentNumber; - QString currentNumber2; - - signals: - void typed(QString); - void call(QString); - -}; - -#endif diff --git a/kde/plasma/plasmoid/MainWidget.cpp b/kde/plasma/plasmoid/MainWidget.cpp deleted file mode 100644 index ff3a9567c5..0000000000 --- a/kde/plasma/plasmoid/MainWidget.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "MainWidget.h" - -#include "../../src/lib/sflphone_const.h" -#include "../../src/lib/callmanager_interface_singleton.h" -#include "../../src/lib/CallModel.h" - -MainWidget::MainWidget() : Plasma::Frame(), m_mainLayout(0), frmCalls(0), frmContact(0), frmHistory(0),currentMode(CALL) -{ - mainTabs = new Plasma::TabBar ( this ); - frmCalls = new Plasma::Frame ( this ); - callLayout = new QGraphicsLinearLayout ( Qt::Vertical ); - callScrollArea = new Plasma::ScrollWidget ( this ); - frmContact = new Plasma::Frame ( this ); - contactScrollArea = new Plasma::ScrollWidget ( this ); - frmHistory = new Plasma::Frame ( this ); - historyLayout = new QGraphicsLinearLayout ( Qt::Vertical ); - historyScrollArea = new Plasma::ScrollWidget ( this ); - - mainLayout()->addItem(mainTabs); - //connect(mainTabs, SIGNAL(currentChanged(int)), this, SLOT(modeChanged(int))); - - frmCalls->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - frmCalls->setLayout(callLayout); - - callScrollArea->setWidget(frmCalls); - - frmContact->setText("Contact"); - frmContact->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - contactScrollArea->setWidget(frmContact); - - frmHistory->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - frmHistory->setLayout(historyLayout); - - historyScrollArea->setWidget(frmHistory); - - dialPage = new DialPage(); - connect(dialPage, SIGNAL(call(QString)), this, SLOT(call(QString))); - - QGraphicsLinearLayout* callTabLayout = new QGraphicsLinearLayout( Qt::Vertical ); - QGraphicsLinearLayout* historyTabLayout = new QGraphicsLinearLayout( Qt::Vertical ); - QGraphicsLinearLayout* contactTabLayout = new QGraphicsLinearLayout( Qt::Vertical ); - QGraphicsLinearLayout* addTabLayout = new QGraphicsLinearLayout( Qt::Vertical ); - - callTabLayout->addItem ( callScrollArea ); - historyTabLayout->addItem ( historyScrollArea ); - contactTabLayout->addItem ( contactScrollArea ); - addTabLayout->addItem(dialPage); - - mainTabs->addTab( "Call" , callTabLayout ); - mainTabs->addTab( "History" , historyTabLayout ); - mainTabs->addTab( "Contact" , contactTabLayout ); - mainTabs->addTab( KIcon("list-add") , "", addTabLayout ); - - //mainLayout()->addItem(callTabLayout); - - //mainLayout()->addItem(callScrollArea); - //mainLayout()->addItem(historyScrollArea); - //mainLayout()->addItem(contactScrollArea); - - initPos = frmCalls->pos(); - - frmCalls->setPos ( initPos ); - frmHistory->setPos( initPos ); - frmContact->setPos( initPos ); - - setMinimumSize(285,390); -} - -void MainWidget::dataUpdated(const QString& source, const Plasma::DataEngine::Data& data) -{ - if ((source == "calls") && (frmCalls)) { - QHash<QString, QVariant> value = data; - bool modified = false; - foreach(QVariant call, value) { - if (!callWidgetList[value.key(call)]) { - callWidgetList[ value.key(call) ] = new CallItem(); - callWidgetList[ value.key(call) ]->setCallId(value.key(call)); - callLayout->insertItem(0,callWidgetList[value.key(call)]); - mainTabs->setCurrentIndex(CALL); - modified = true; - } - callWidgetList[value.key(call)]->setCallerName(call.toHash() [ "Name" ].toString()); - callWidgetList[value.key(call)]->setCallerNumber(call.toHash()[ "Number" ].toString()); - callWidgetList[value.key(call)]->setState(call.toHash() [ "State" ].toInt()); - - if (call.toHash()["State"].toInt() == CALL_STATE_INCOMING) { - emit requierAttention(); - } - - topLevelItems[value.key(call)] = callWidgetList[value.key(call)]; - } - -// if (modified) -// sflphoneEngine->connectSource("conferences", this,0/*Update only if something happen*/); - } - else if (source == "info") { - if (!data["Account"].isNull() || data["Account"].isValid()) - currentAccountId = data["Account"].toString(); - } - else if (source == "conferences") { - QHash<QString, QVariant> value = data; - foreach(QVariant call, value) { - qDebug() << "Painting conference: " << call;//.toHash(); - if (!topLevelItems[value.key(call)]) { - topLevelItems[value.key(call)] = new ConferenceItem(); - ((ConferenceItem*) topLevelItems[value.key(call)])->setConfId(value.key(call)); - callLayout->addItem((ConferenceItem*) topLevelItems[value.key(call)]); - mainTabs->setCurrentIndex(CALL); - } - QList<CallItem*> toSend; - foreach (QString callId, call.toStringList()) { - if (callWidgetList[callId]) { - toSend.push_back(callWidgetList[callId]); - callWidgetList[callId]->setParent(0); - if (topLevelItems[callId]) { - topLevelItems.remove(callId); - } - } - else - qDebug() << "Call not found"; - } - ((ConferenceItem*)topLevelItems[value.key(call)])->setCallList(toSend); - } - } - else if (source == "history") { - QHash<QString, QVariant> value = data; - for (QHash<QString, QVariant>::iterator i = value.begin(); i != value.end(); ++i) { - QString key = i.key(); - //QHash<QString, CallItem*> historyWidgetList; - if ( ! historyWidgetList[key]) { - historyWidgetList[ i.key() ] = new CallItem(); - historyWidgetList[ i.key() ]->setCallId(i.key()); - historyLayout->addItem(historyWidgetList[i.key()]); - } - historyWidgetList[ i.key() ]->setCallerName(i.value().toHash() [ "Name" ].toString()); - historyWidgetList[ i.key() ]->setCallerNumber(i.value().toHash() [ "Number" ].toString()); - historyWidgetList[ i.key() ]->setDate(i.value().toHash() [ "Date" ].toInt()) ; - } - } -} - -QGraphicsLinearLayout* MainWidget::mainLayout() -{ - if (!m_mainLayout) { - m_mainLayout = new QGraphicsLinearLayout(Qt::Vertical); - m_mainLayout->setContentsMargins(0, 0, 0, 0); - m_mainLayout->setSpacing(5); - setLayout(m_mainLayout); - } - return m_mainLayout; -} - -void MainWidget::call(QString number) -{ - Q_UNUSED(number); -// qDebug() << "Calling " << number << " with account " << currentAccountId << ", " << CallModelConvenience::getAccountList()->size() << " account registred"; -// CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); -// callManager.placeCall(currentAccountId, CallModelConvenience::generateCallId(), number); -} diff --git a/kde/plasma/plasmoid/MainWidget.h b/kde/plasma/plasmoid/MainWidget.h deleted file mode 100644 index a5892ef228..0000000000 --- a/kde/plasma/plasmoid/MainWidget.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef MAIN_WIDGET_H -#define MAIN_WIDGET_H - -#include <Plasma/Frame> -#include <Plasma/Svg> -#include <QGraphicsLinearLayout> -#include <Plasma/Frame> -#include <plasma/theme.h> -#include <plasma/widgets/tabbar.h> -//#include <plasma/animations/animation.h> -#include <Plasma/ScrollWidget> -#include <Plasma/DataEngine> -#include <Plasma/ExtenderItem> -#include <KIcon> -#include <QHash> - -#include "CallItem.h" -#include "ConferenceItem.h" -#include "DialPage.h" - -#define CALL 0 -#define HISTORY 1 -#define CONTACT 2 - -class MainWidget : public Plasma::Frame -{ - Q_OBJECT - public: - MainWidget(); - void dataUpdated(const QString& source, const Plasma::DataEngine::Data &data); - - private: - KIcon m_icon; - QGraphicsLinearLayout* m_mainLayout; - QGraphicsLinearLayout* mainLayout(); - Plasma::Frame* frmCalls; - Plasma::Frame* frmContact; - Plasma::Frame* frmHistory; - QGraphicsLinearLayout* callLayout; - QGraphicsLinearLayout* historyLayout; - QHash<QString, CallItem*> callWidgetList; - QHash<QString, ViewItem*> topLevelItems; - QHash<QString, CallItem*> historyWidgetList; - Plasma::ScrollWidget* callScrollArea; - Plasma::ScrollWidget* historyScrollArea; - Plasma::ScrollWidget* contactScrollArea; - Plasma::ScrollWidget* newScrollArea; - DialPage* dialPage; - QString currentAccountId; - Plasma::TabBar* mainTabs; - QPointF initPos; - int currentMode; - private slots: - void call(QString number); - - signals: - void requierAttention(); -}; -#endif diff --git a/kde/plasma/plasmoid/SFLPhonePlasmoid.cpp b/kde/plasma/plasmoid/SFLPhonePlasmoid.cpp deleted file mode 100644 index 293df0fa9a..0000000000 --- a/kde/plasma/plasmoid/SFLPhonePlasmoid.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "SFLPhonePlasmoid.h" -#include <QPainter> -#include <QFontMetrics> -#include <QSizeF> -#include <KIcon> -#include <KPushButton> - -#include "../../src/lib/CallModel.h" - -SFLPhonePlasmoid::SFLPhonePlasmoid(QObject* parent, const QVariantList& args) - : Plasma::PopupApplet(parent, args), extenderItem(0), callInit(false), requierAttention(false) -{ - //m_svg.setImagePath("widgets/background"); - setBackgroundHints(DefaultBackground); - - CallModelConvenience::init(); - - setMinimumSize(24,24); -} - -void SFLPhonePlasmoid::dataUpdated(const QString& source, const Plasma::DataEngine::Data& data) -{ - mainWidget->dataUpdated(source, data); - - //Prevent conferences from being initialized before calls - if ((source == "calls") && (!callInit)) { - sflphoneEngine->connectSource("conferences", this,0/*Update only if something happen*/); - callInit = true; - } -} - -SFLPhonePlasmoid::~SFLPhonePlasmoid() -{ - -} - -void SFLPhonePlasmoid::init() -{ - //contactEngine = dataEngine("akonadi"); - sflphoneEngine = dataEngine("sflphone"); - sflphoneEngine->connectSource("calls", this,0/*Update only if something happen*/); - sflphoneEngine->connectSource("info", this,0/*Update only if something happen*/); - sflphoneEngine->connectSource("history", this,0/*Update only if something happen*/); - - mainWidget = new MainWidget(); - connect(mainWidget,SIGNAL(requierAttention()),this,SLOT(notify())); - - //panelFrame = new Plasma::SvgWidget(&panel_icon); - panelFrame = new Plasma::PushButton(this); - - QGraphicsLinearLayout* mainLayout = new QGraphicsLinearLayout(Qt::Vertical); - - //panel_icon.setImagePath("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone.svg"); - panelFrame->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone.svg"); - - mainLayout->addItem(panelFrame); - - setLayout(mainLayout); - - //connect(panelFrame, SIGNAL(clicked(Qt::MouseButton)), this, SLOT(showCallPopup(Qt::MouseButton))); - connect(panelFrame->nativeWidget(), SIGNAL(clicked()), this, SLOT(showCallPopup())); - - extender()->setEmptyExtenderMessage(i18n("no running jobs...")); -} - -void SFLPhonePlasmoid::constraintsEvent(Plasma::Constraints constraints) -{ - if (constraints& Plasma::FormFactorConstraint) { - //FormFactor previous = formFaction; - switch (formFactor()) { - case Plasma::Planar: - case Plasma::MediaCenter: - formFaction = Desktop; - m_orientation = Qt::Vertical; - break; - case Plasma::Horizontal: - formFaction = Panel; - m_orientation = Qt::Horizontal; - break; - case Plasma::Vertical: - formFaction = Panel; - m_orientation = Qt::Vertical; - break; - } - - //if (previous != m_mode) - //connectToEngine(); - } -} - - - -//void SFLPhonePlasmoid::modeChanged(int index) -//{ - //switch (index) { - // case CALL: - // if (currentMode == HISTORY) - // switchPage(historyScrollArea,callScrollArea,contactScrollArea,true); - // else - // switchPage(contactScrollArea,callScrollArea,historyScrollArea,true); - // break; - // case HISTORY: - // if (currentMode == CALL) - // switchPage(callScrollArea,historyScrollArea,contactScrollArea,false); - // else - // switchPage(contactScrollArea,historyScrollArea,callScrollArea,true); - // break; - // case CONTACT: - // if (currentMode == CALL) - // switchPage(callScrollArea,contactScrollArea,historyScrollArea,false); - // else - // switchPage(historyScrollArea,contactScrollArea,callScrollArea,false); - // break; - //} - //currentMode = index; -//} - -//void SFLPhonePlasmoid::switchPage(Plasma::ScrollWidget* oldFrame, Plasma::ScrollWidget* newFrame, Plasma::ScrollWidget* toHide, bool direction) -//{ -// QPointF targetPos = oldFrame->pos(); -// newFrame->setPos(QPoint(targetPos.x() - newFrame->size().width() ,targetPos.y())); -// Plasma::Animation *slideAnim = Plasma::Animator::create(Plasma::Animator::SlideAnimation); -// slideAnim->setProperty("movementDirection", /*(direction)?*/Plasma::Animation::MoveRight/*:Plasma::Animation::MoveLeft*/); -// slideAnim->setProperty("reference", Plasma::Animation::Center); -// slideAnim->setProperty("distance", newFrame->size().width()); -// slideAnim->setProperty("duration",1000); -// slideAnim->setTargetWidget(newFrame); -// -// oldFrame->setPos(targetPos); -// Plasma::Animation *slideAnimOut = Plasma::Animator::create(Plasma::Animator::SlideAnimation); -// slideAnimOut->setProperty("movementDirection", /*(direction)?*/Plasma::Animation::MoveRight/*:Plasma::Animation::MoveLeft*/); -// slideAnimOut->setProperty("reference", Plasma::Animation::Center); -// slideAnimOut->setProperty("distance", newFrame->size().width()); -// slideAnimOut->setProperty("duration",1000); -// slideAnimOut->setTargetWidget(oldFrame); - -// oldFrame->setVisible(true); -// newFrame->setVisible(true); -// toHide->setVisible(false); - -// slideAnim->start(QAbstractAnimation::DeleteWhenStopped); -// slideAnimOut->start(QAbstractAnimation::DeleteWhenStopped); -//} - -void SFLPhonePlasmoid::showCallPopup(/*Qt::MouseButton button*/) -{ - //Q_UNUSED(button) - if (!extenderItem) { - extenderItem = new Plasma::ExtenderItem(extender()); - extenderItem->setTitle("SFL Phone"); - extenderItem->setWidget(mainWidget); - //extenderItem->showCloseButton(); - } - - togglePopup(); - - if (requierAttention) { - //panel_icon.setImagePath("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone.svg"); - panelFrame->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone.svg"); - requierAttention = false; - } -} - -void SFLPhonePlasmoid::notify() -{ - //panel_icon.setImagePath("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone_notif.svg"); - panelFrame->setImage("/usr/share/kde4/apps/sflphone-plasmoid/icons/sflphone_notif.svg"); - requierAttention = true; -} - -K_EXPORT_PLASMA_APPLET(sflphone, SFLPhonePlasmoid) - diff --git a/kde/plasma/plasmoid/SFLPhonePlasmoid.h b/kde/plasma/plasmoid/SFLPhonePlasmoid.h deleted file mode 100644 index 96ef72e2be..0000000000 --- a/kde/plasma/plasmoid/SFLPhonePlasmoid.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef SFLPHONE_PLASMOID_HEADER -#define SFLPHONE_PLASMOID_HEADER - -#include <KIcon> - -#include <Plasma/PopupApplet> -#include <Plasma/Svg> -#include <QGraphicsLinearLayout> -#include <Plasma/Frame> -#include <plasma/theme.h> -#include <plasma/widgets/tabbar.h> -//#include <plasma/animations/animation.h> -//#include <plasma/animator.h> -#include <Plasma/DataEngine> -#include <Plasma/ScrollWidget> -#include <Plasma/SvgWidget> -#include <Plasma/Extender> - -#include "CallItem.h" -#include "ConferenceItem.h" -#include "DialPage.h" -#include "MainWidget.h" - -class QSizeF; - -enum FormFactor { Panel, Desktop }; - -class SFLPhonePlasmoid : public Plasma::PopupApplet -{ - Q_OBJECT - public: - SFLPhonePlasmoid(QObject* parent, const QVariantList &args); - ~SFLPhonePlasmoid(); - void init(); - - private: - Plasma::Svg panel_icon; - //Plasma::SvgWidget* panelFrame; - Plasma::PushButton* panelFrame; - - Qt::Orientation m_orientation; - void constraintsEvent(Plasma::Constraints constraints); - Plasma::ExtenderItem* extenderItem; - //void switchPage(Plasma::ScrollWidget* oldFrame, Plasma::ScrollWidget* newFrame, Plasma::ScrollWidget* toHide, bool direction); - FormFactor formFaction; - Plasma::DataEngine* contactEngine; - Plasma::DataEngine* sflphoneEngine; - MainWidget* mainWidget; - bool callInit; - bool requierAttention; - private slots: - //void modeChanged(int index); - void showCallPopup(/*Qt::MouseButton button*/); - void notify(); - - public slots: - void dataUpdated(const QString& source, const Plasma::DataEngine::Data &data); -}; - -// This is the command that links your applet to the .desktop file - - -#endif diff --git a/kde/plasma/plasmoid/ViewItem.h b/kde/plasma/plasmoid/ViewItem.h deleted file mode 100644 index 154845d12d..0000000000 --- a/kde/plasma/plasmoid/ViewItem.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef VIEW_ITEM_H -#define VIEW_ITEM_H - -//A simple interface for plasmoid items -class ViewItem -{ - public: - virtual bool isConference() =0; - virtual ~ViewItem() {} -}; - -#endif diff --git a/kde/plasma/plasmoid/plasma-applet-sflphone.desktop b/kde/plasma/plasmoid/plasma-applet-sflphone.desktop deleted file mode 100644 index db66269660..0000000000 --- a/kde/plasma/plasmoid/plasma-applet-sflphone.desktop +++ /dev/null @@ -1,16 +0,0 @@ -[Desktop Entry] -Name=sflphone -Comment=Plasma frontend for the SFLPhone VoIP software -Type=Service -ServiceTypes=Plasma/Applet - -X-KDE-Library=plasma_applet_sflphone -X-KDE-PluginInfo-Author=Emmanuel Lepage Vallee -X-KDE-PluginInfo-Email=emmanuel.lepage@savoirfairelinux.com -X-KDE-PluginInfo-Name=sflphone -X-KDE-PluginInfo-Version=0.1 -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category=SIP -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPLv3 -X-KDE-PluginInfo-EnabledByDefault=true diff --git a/kde/plasma/plasmoid/sflphone-plasmoid.desktop b/kde/plasma/plasmoid/sflphone-plasmoid.desktop deleted file mode 100644 index 3fec3d7edf..0000000000 --- a/kde/plasma/plasmoid/sflphone-plasmoid.desktop +++ /dev/null @@ -1,15 +0,0 @@ -[Desktop Entry] -Name=Extender Tutorial -Type=Service -X-KDE-ServiceTypes=Plasma/Applet - -X-KDE-Library=plasma_applet_extendertutorial -X-KDE-PluginInfo-Author=The Plasma Team -X-KDE-PluginInfo-Email=plasma-devel@kde.org -X-KDE-PluginInfo-Name=extendertutorial -X-KDE-PluginInfo-Version=pre0.1 -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category= -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPL -X-KDE-PluginInfo-EnabledByDefault=true diff --git a/kde/src/AccountListModel.cpp b/kde/src/AccountListModel.cpp index 62be15d278..ada86426b1 100755 --- a/kde/src/AccountListModel.cpp +++ b/kde/src/AccountListModel.cpp @@ -38,6 +38,7 @@ AccountListModel::AccountListModel(QObject *parent) ///Destructor AccountListModel::~AccountListModel() { + } @@ -153,4 +154,4 @@ bool AccountListModel::addAccount(const QString& alias ) int AccountListModel::rowCount(const QModelIndex & /*parent*/) const { return accounts->size(); -} \ No newline at end of file +} diff --git a/kde/src/AccountView.cpp b/kde/src/AccountView.cpp index eee3f689ff..0e20a83ffc 100644 --- a/kde/src/AccountView.cpp +++ b/kde/src/AccountView.cpp @@ -55,14 +55,14 @@ void AccountView::initItemWidget() if(m_pWidget != NULL) delete m_pWidget; - bool enabled = getAccountDetail(ACCOUNT_ENABLED) == ACCOUNT_ENABLED_TRUE; + bool enabled = getAccountDetail(ACCOUNT_ENABLED) == REGISTRATION_ENABLED_TRUE; m_pWidget = new AccountItemWidget(); m_pWidget->setEnabled(enabled); m_pWidget->setAccountText(getAccountDetail(ACCOUNT_ALIAS)); if(isNew() || !enabled) m_pWidget->setState(AccountItemWidget::Unregistered); - else if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_READY) + else if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_READY) m_pWidget->setState(AccountItemWidget::Registered); else m_pWidget->setState(AccountItemWidget::NotWorking); @@ -91,9 +91,9 @@ AccountItemWidget* AccountView::getItemWidget() ///Return the state color QColor AccountView::getStateColor() { - if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_UNREGISTERED) + if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_UNREGISTERED) return Qt::black; - if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_READY) + if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_READY) return Qt::darkGreen; return Qt::red; } @@ -104,9 +104,9 @@ const QString& AccountView::getStateColorName() static const QString black ( "black" ); static const QString darkGreen( "darkGreen" ); static const QString red ( "red" ); - if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_UNREGISTERED) + if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_UNREGISTERED) return black; - if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_READY) + if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_READY) return darkGreen; return red; } @@ -154,11 +154,11 @@ void AccountView::updateState() Account::updateState(); AccountItemWidget * m_pWidget = getItemWidget(); - if(getAccountDetail(ACCOUNT_ENABLED) != ACCOUNT_ENABLED_TRUE ) { + if(getAccountDetail(ACCOUNT_ENABLED) != REGISTRATION_ENABLED_TRUE ) { kDebug() << "Changing account state to Unregistered"; m_pWidget->setState(AccountItemWidget::Unregistered); } - else if(getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_READY) { + else if(getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED || getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_READY) { kDebug() << "Changing account state to Registered"; m_pWidget->setState(AccountItemWidget::Registered); } diff --git a/kde/src/AccountWizard.cpp b/kde/src/AccountWizard.cpp index 6fdfd3dae5..a44c687ca0 100755 --- a/kde/src/AccountWizard.cpp +++ b/kde/src/AccountWizard.cpp @@ -17,7 +17,8 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ + **************************************************************************/ + #include <unistd.h> #include "AccountWizard.h" #include <QVBoxLayout> @@ -246,7 +247,7 @@ void AccountWizard::accept() server = QString( SFL_ACCOUNT_HOST ); password = QString( acc.passwd ); user = QString( acc.user ); - enabled = QString( ACCOUNT_ENABLED_TRUE ); + enabled = QString( REGISTRATION_ENABLED_TRUE ); is_create_account = true; is_using_sip = true; @@ -260,7 +261,7 @@ void AccountWizard::accept() ret += i18n("This assistant is now finished.") + "\n"; alias = field ( FIELD_SIP_ALIAS ).toString(); - enabled = QString ( ACCOUNT_ENABLED_TRUE ); + enabled = QString ( REGISTRATION_ENABLED_TRUE ); mailbox = field ( FIELD_SIP_VOICEMAIL ).toString(); protocol = QString ( ACCOUNT_TYPE_SIP ); server = field ( FIELD_SIP_SERVER ).toString(); @@ -275,7 +276,7 @@ void AccountWizard::accept() ret += i18n("This assistant is now finished.") + "\n"; alias = field ( FIELD_IAX_ALIAS ).toString(); - enabled = QString ( ACCOUNT_ENABLED_TRUE ); + enabled = QString ( REGISTRATION_ENABLED_TRUE ); mailbox = field ( FIELD_IAX_VOICEMAIL ).toString(); protocol = QString ( ACCOUNT_TYPE_IAX ); server = field ( FIELD_IAX_SERVER ).toString(); @@ -290,21 +291,21 @@ void AccountWizard::accept() // common sip paramaters if(is_using_sip) { if(field(FIELD_SIP_ENABLE_STUN).toBool()) { - stun_enabled = QString(ACCOUNT_ENABLED_TRUE); + stun_enabled = QString(REGISTRATION_ENABLED_TRUE); stun_server = field(FIELD_SIP_STUN_SERVER).toString(); } else { - stun_enabled = QString(ACCOUNT_ENABLED_FALSE); + stun_enabled = QString(REGISTRATION_ENABLED_FALSE); stun_server = QString(); } if(field(FIELD_ZRTP_ENABLED).toBool()) { - srtp_enabled = QString( ACCOUNT_ENABLED_TRUE ); + srtp_enabled = QString( REGISTRATION_ENABLED_TRUE ); key_exchange = QString( ZRTP ); - zrtp_display_sas = QString( ACCOUNT_ENABLED_TRUE ); - zrtp_not_supp_warning = QString( ACCOUNT_ENABLED_TRUE ); - zrtp_hello_hash = QString( ACCOUNT_ENABLED_TRUE ); - display_sas_once = QString( ACCOUNT_ENABLED_FALSE ); + zrtp_display_sas = QString( REGISTRATION_ENABLED_TRUE ); + zrtp_not_supp_warning = QString( REGISTRATION_ENABLED_TRUE ); + zrtp_hello_hash = QString( REGISTRATION_ENABLED_TRUE ); + display_sas_once = QString( REGISTRATION_ENABLED_FALSE ); } QStringList ifaceList = configurationManager.getAllIpInterface(); diff --git a/kde/src/AccountWizard.h b/kde/src/AccountWizard.h index 924f03f19a..f63663bee7 100755 --- a/kde/src/AccountWizard.h +++ b/kde/src/AccountWizard.h @@ -18,6 +18,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * **************************************************************************/ + #ifndef ACCOUNTWIZARD_H #define ACCOUNTWIZARD_H diff --git a/kde/src/ActionSetAccountFirst.cpp b/kde/src/ActionSetAccountFirst.cpp index 3759326830..d5cc6d71ce 100755 --- a/kde/src/ActionSetAccountFirst.cpp +++ b/kde/src/ActionSetAccountFirst.cpp @@ -17,7 +17,7 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ + **************************************************************************/ //Parent #include "ActionSetAccountFirst.h" diff --git a/kde/src/AkonadiBackend.h b/kde/src/AkonadiBackend.h deleted file mode 100644 index a0494d9633..0000000000 --- a/kde/src/AkonadiBackend.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef AKONADI_BACKEND_H -#define AKONADI_BACKEND_H - -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ -#include <lib/ContactBackend.h> -#include <akonadi/collectionmodel.h> - -//Qt -class QObject; - -//KDE -namespace KABC { - class Addressee; - class AddresseeList; -} - -namespace Akonadi { - class Session; - class CollectionModel; - class Collection; -} - -//SFLPhone -class Contact; - -typedef QList<Contact*> ContactList; - -///@class AkonadiBackend Implement a backend for Akonadi -class AkonadiBackend : public ContactBackend { - Q_OBJECT -public: - static ContactBackend* getInstance(); - Contact* getContactByPhone ( const QString& phoneNumber ); - Contact* getContactByUid ( const QString& uid ); - void editContact ( Contact* contact ); - void addNewContact ( Contact* contact ); - -private: - AkonadiBackend(QObject* parent); - virtual ~AkonadiBackend(); - - //Attributes - static AkonadiBackend* m_pInstance ; - Akonadi::Session* m_pSession ; - Akonadi::Collection m_Collection ; - QHash<QString,KABC::Addressee> m_AddrHash ; - -protected: - ContactList update_slot(); - -public slots: - ContactList update(Akonadi::Collection collection); - void collectionsReceived( const Akonadi::Collection::List& ); - -signals: - void collectionChanged(); -}; - -#endif \ No newline at end of file diff --git a/kde/src/CMakeLists.txt b/kde/src/CMakeLists.txt index 7ca4c1ec0f..2e1af6b3ff 100755 --- a/kde/src/CMakeLists.txt +++ b/kde/src/CMakeLists.txt @@ -1,54 +1,60 @@ ADD_DEFINITIONS( - ${KDE4_DEFINITIONS} - ${QT_DEFINITIONS} - -fexceptions - -DDATA_INSTALL_DIR="\\\"${DATA_INSTALL_DIR}\\\"" - -DSHARE_INSTALL_PREFIX="\\\"${SHARE_INSTALL_PREFIX}\\\"" + ${KDE4_DEFINITIONS} + ${QT_DEFINITIONS} + -fexceptions + -DDATA_INSTALL_DIR="\\\"${DATA_INSTALL_DIR}\\\"" + -DSHARE_INSTALL_PREFIX="\\\"${SHARE_INSTALL_PREFIX}\\\"" ) -add_subdirectory(lib) +ADD_DEFINITIONS("-std=c++0x") + +add_subdirectory( lib ) +add_subdirectory( klib ) + +find_package(Phonon) MESSAGE("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") IF(${CMAKE_BUILD_TYPE} MATCHES Release) - MESSAGE("NO DEBUG OUTPUT") - ADD_DEFINITIONS( -DQT_NO_DEBUG_OUTPUT) + MESSAGE("NO DEBUG OUTPUT") + ADD_DEFINITIONS( -DQT_NO_DEBUG_OUTPUT) ENDIF(${CMAKE_BUILD_TYPE} MATCHES Release) SET ( KDE4_KABC_LIBS -lkabc ) -SET( sflphone_client_kde_SRCS - SFLPhoneView.cpp - SFLPhone.cpp - SFLPhoneapplication.cpp - widgets/SFLPhoneTray.cpp - main.cpp - AccountWizard.cpp - widgets/AccountItemWidget.cpp - widgets/CallTreeItem.cpp - widgets/HistoryTreeItem.cpp - ActionSetAccountFirst.cpp - conf/ConfigurationDialog.cpp - conf/dlggeneral.cpp - conf/dlgdisplay.cpp - conf/dlgaccounts.cpp - conf/dlgaudio.cpp - conf/dlgaddressbook.cpp - conf/dlghooks.cpp - conf/ConfigurationSkeleton.cpp - conf/ConfigAccountList.cpp - widgets/Dialpad.cpp - widgets/ContactItemWidget.cpp - widgets/ContactDock.cpp - widgets/HistoryDock.cpp - widgets/BookmarkDock.cpp - widgets/TranslucentButtons.cpp - Codec.cpp - AccountListModel.cpp - AkonadiBackend.cpp - CallView.cpp - AccountView.cpp +SET( + sflphone_client_kde_SRCS + SFLPhoneView.cpp + SFLPhone.cpp + SFLPhoneapplication.cpp + widgets/SFLPhoneTray.cpp + main.cpp + AccountWizard.cpp + widgets/AccountItemWidget.cpp + widgets/CallTreeItem.cpp + widgets/HistoryTreeItem.cpp + ActionSetAccountFirst.cpp + conf/ConfigurationDialog.cpp + conf/dlggeneral.cpp + conf/dlgdisplay.cpp + conf/dlgaccounts.cpp + conf/dlgaudio.cpp + conf/dlgaddressbook.cpp + conf/dlghooks.cpp + conf/ConfigAccountList.cpp + widgets/Dialpad.cpp + widgets/ContactItemWidget.cpp + widgets/ContactDock.cpp + widgets/HistoryDock.cpp + widgets/BookmarkDock.cpp + widgets/TranslucentButtons.cpp + widgets/CategoryDrawer.cpp + widgets/CategorizedTreeWidget.cpp + Codec.cpp + AccountListModel.cpp + CallView.cpp + AccountView.cpp ) @@ -59,27 +65,26 @@ QT4_ADD_RESOURCES(QtApp_RCC_SRCS ${QtApp_RCCS}) # kde4_automoc(${sflphone_client_kde_SRCS}) -SET( config_ui_files - conf/dlggeneralbase.ui - conf/dlgdisplaybase.ui - conf/dlgaccountsbase.ui - conf/dlgaudiobase.ui - conf/dlgaddressbookbase.ui - conf/dlghooksbase.ui +SET( + config_ui_files + conf/dlggeneralbase.ui + conf/dlgdisplaybase.ui + conf/dlgaccountsbase.ui + conf/dlgaudiobase.ui + conf/dlgaddressbookbase.ui + conf/dlghooksbase.ui ) KDE4_ADD_UI_FILES(sflphone_client_kde_SRCS ui/SFLPhoneView_base.ui ${config_ui_files} ) -KDE4_ADD_KCFG_FILES(sflphone_client_kde_SRCS conf/kcfg_settings.kcfgc) -INSTALL(FILES conf/sflphone-client-kde.kcfg DESTINATION ${KCFG_INSTALL_DIR}) KDE4_ADD_EXECUTABLE(sflphone-client-kde ${sflphone_client_kde_SRCS} ${QtApp_RCC_SRCS}) -TARGET_LINK_LIBRARIES(sflphone-client-kde qtsflphone ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDEPIMLIBS_AKONADI_KMIME_LIBS} ${KDEPIMLIBS_AKONADI_LIBS} ${KDEPIMLIBS_AKONADI_CONTACT_LIBS} ) +TARGET_LINK_LIBRARIES(sflphone-client-kde ksflphone qtsflphone ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDEPIMLIBS_AKONADI_KMIME_LIBS} ${KDEPIMLIBS_AKONADI_LIBS} ${KDEPIMLIBS_AKONADI_CONTACT_LIBS} ${KDE4_PHONON_LIBS} ) ########### install files ############### -INSTALL(TARGETS sflphone-client-kde DESTINATION ${BIN_INSTALL_DIR}) +INSTALL(TARGETS sflphone-client-kde DESTINATION ${BIN_INSTALL_DIR} ) INSTALL( FILES icons/transferarraw.png DESTINATION ${DATA_INSTALL_DIR}/sflphone-client-kde ) INSTALL( FILES icons/transfertarrow.svg DESTINATION ${DATA_INSTALL_DIR}/sflphone-client-kde ) INSTALL( FILES icons/confBlackWhite.svg DESTINATION ${DATA_INSTALL_DIR}/sflphone-client-kde ) diff --git a/kde/src/CallView.cpp b/kde/src/CallView.cpp index 5c912479f3..d98747f7ed 100644 --- a/kde/src/CallView.cpp +++ b/kde/src/CallView.cpp @@ -44,7 +44,7 @@ #include "widgets/CallTreeItem.h" #include "SFLPhone.h" #include "SFLPhoneView.h" -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" ///Retrieve current and older calls from the daemon, fill history and the calls TreeView and enable drag n' drop @@ -258,33 +258,9 @@ bool CallView::contactToCall(QTreeWidgetItem *parent, int index, const QMimeData if (!QString(encodedContact).isEmpty()) { Contact* contact = AkonadiBackend::getInstance()->getContactByUid(encodedContact); if (contact) { - Call* call2; - if (contact->getPhoneNumbers().count() == 1) { - call2 = SFLPhone::model()->addDialingCall(contact->getFormattedName(), SFLPhone::model()->getCurrentAccountId()); - call2->appendText(contact->getPhoneNumbers()[0]->getNumber()); - } - else if (contact->getPhoneNumbers().count() > 1) { - bool ok = false; - QHash<QString,QString> map; - QStringList list; - foreach (Contact::PhoneNumber* number, contact->getPhoneNumbers()) { - map[number->getType()+" ("+number->getNumber()+")"] = number->getNumber(); - list << number->getType()+" ("+number->getNumber()+")"; - } - QString result = QInputDialog::getItem (this, QString("Select phone number"), QString("This contact have many phone number, please select the one you wish to call"), list, 0, false, &ok); - if (ok) { - call2 = SFLPhone::model()->addDialingCall(contact->getFormattedName(), SFLPhone::model()->getCurrentAccountId()); - call2->appendText(map[result]); - } - else { - kDebug() << "Operation cancelled"; - return false; - } - } - else { - kDebug() << "This contact have no valid phone number"; + Call* call2 = NULL; + if (!SFLPhone::app()->view()->selectCallPhoneNumber(call2,contact)) return false; - } if (!parent) { //Dropped on free space kDebug() << "Adding new dialing call"; @@ -382,12 +358,13 @@ Call* CallView::addCall(Call* call, Call* parent) ///Transfer a call void CallView::transfer() { - if (m_pCallPendingTransfer) { + if (m_pCallPendingTransfer && !m_pTransferLE->text().isEmpty()) { SFLPhone::model()->transfer(m_pCallPendingTransfer,m_pTransferLE->text()); - m_pCallPendingTransfer = 0; - m_pTransferLE->clear(); - m_pTransferOverlay->setVisible(false); } + + m_pCallPendingTransfer = 0; + m_pTransferLE->clear(); + m_pTransferOverlay->setVisible(false); } /***************************************************************************** @@ -421,6 +398,13 @@ void CallView::hideOverlay() if (m_pActiveOverlay) m_pActiveOverlay->setVisible(false); m_pActiveOverlay = 0; + + if (m_pCallPendingTransfer && m_pCallPendingTransfer->getState() == CALL_STATE_TRANSFER ) { + m_pCallPendingTransfer->actionPerformed(CALL_ACTION_TRANSFER); + } + + m_pCallPendingTransfer = 0; + m_pTransferLE->clear(); } ///Be sure the size of the overlay stay the same @@ -635,6 +619,7 @@ Call* CallView::addConference(Call* conf) ///Executed when the daemon signal a modification in an existing conference. Update the call list and update the TreeView bool CallView::conferenceChanged(Call* conf) { + if (!dynamic_cast<Call*>(conf)) return false; kDebug() << "Conference changed"; //if (!SFLPhone::model()->conferenceChanged(confId, state)) // return false; @@ -721,8 +706,9 @@ void CallViewOverlay::setVisible(bool enabled) { if (m_pTimer) { m_pTimer->stop(); disconnect(m_pTimer); + delete m_pTimer; } - m_pTimer = new QTimer(this); //TODO LEAK? + m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(changeVisibility())); m_step = 0; m_black.setAlpha(0); @@ -756,4 +742,4 @@ void CallViewOverlay::changeVisibility() { repaint(); if (m_step >= 35) m_pTimer->stop(); -} \ No newline at end of file +} diff --git a/kde/src/CallView.h b/kde/src/CallView.h index 0fa3f8ce56..d7fa765bfa 100644 --- a/kde/src/CallView.h +++ b/kde/src/CallView.h @@ -1,5 +1,3 @@ -#ifndef CALL_VIEW -#define CALL_VIEW /*************************************************************************** * Copyright (C) 2009-2012 by Savoir-Faire Linux * * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* @@ -19,6 +17,8 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * **************************************************************************/ +#ifndef CALL_VIEW +#define CALL_VIEW #include <QtGui/QItemDelegate> #include <QtGui/QTreeWidget> diff --git a/kde/src/SFLPhone.cpp b/kde/src/SFLPhone.cpp index 21b03330c8..adaf9693d8 100755 --- a/kde/src/SFLPhone.cpp +++ b/kde/src/SFLPhone.cpp @@ -47,14 +47,14 @@ #include "lib/Contact.h" //SFLPhone -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" #include "AccountWizard.h" #include "SFLPhoneView.h" #include "widgets/SFLPhoneTray.h" #include "widgets/ContactDock.h" #include "widgets/HistoryDock.h" #include "widgets/BookmarkDock.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" SFLPhone* SFLPhone::m_sApp = NULL; TreeWidgetCallModel* SFLPhone::m_pModel = NULL; @@ -187,6 +187,11 @@ void SFLPhone::setupActions() action_displayDialpad = new KAction(KIcon(QIcon(ICON_DISPLAY_DIALPAD)), i18n("Display dialpad"), this); action_displayDialpad->setCheckable( true ); action_displayDialpad->setChecked ( ConfigurationSkeleton::displayDialpad() ); + action_configureSflPhone->setText(i18n("Configure SFLphone")); + + action_displayMessageBox = new KAction(KIcon("mail-message-new"), i18n("Display text message box"), this); + action_displayMessageBox->setCheckable( true ); + action_displayMessageBox->setChecked ( ConfigurationSkeleton::displayMessageBox() ); action_displayVolumeControls = new KAction(KIcon(QIcon(ICON_DISPLAY_VOLUME_CONSTROLS)), i18n("Display volume controls"), this); action_displayVolumeControls->setCheckable( true ); @@ -205,6 +210,7 @@ void SFLPhone::setupActions() /**/connect(action_mailBox, SIGNAL(triggered()), m_pView , SLOT(mailBox() )); /**/connect(action_displayVolumeControls, SIGNAL(toggled(bool)), m_pView , SLOT(displayVolumeControls(bool) )); /**/connect(action_displayDialpad, SIGNAL(toggled(bool)), m_pView , SLOT(displayDialpad(bool) )); + /**/connect(action_displayMessageBox, SIGNAL(toggled(bool)), m_pView , SLOT(displayMessageBox(bool) )); /**/connect(action_accountCreationWizard, SIGNAL(triggered()), m_pView , SLOT(accountCreationWizard() )); /**/connect(action_configureShortcut, SIGNAL(triggered()), this , SLOT(showShortCutEditor() )); /* */ @@ -220,6 +226,7 @@ void SFLPhone::setupActions() actionCollection()->addAction("action_quit" , action_quit ); actionCollection()->addAction("action_displayVolumeControls" , action_displayVolumeControls ); actionCollection()->addAction("action_displayDialpad" , action_displayDialpad ); + actionCollection()->addAction("action_displayMessageBox" , action_displayMessageBox ); actionCollection()->addAction("action_configureSflPhone" , action_configureSflPhone ); actionCollection()->addAction("action_accountCreationWizard" , action_accountCreationWizard ); actionCollection()->addAction("action_configureShortcut" , action_configureShortcut ); @@ -397,8 +404,8 @@ void SFLPhone::on_m_pView_recordCheckStateChangeAsked(bool recordCheckState) void SFLPhone::on_m_pView_incomingCall(const Call * call) { Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(call->getPeerPhoneNumber()); - if (contact) { - KNotification::event(KNotification::Notification, "New incomming call", "New call from: \n" + call->getPeerName().isEmpty() ? call->getPeerPhoneNumber() : call->getPeerName(),*contact->getPhoto()); + if (contact && call) { + KNotification::event(KNotification::Notification, "New incomming call", "New call from: \n" + call->getPeerName().isEmpty() ? call->getPeerPhoneNumber() : call->getPeerName(),(contact->getPhoto())?*contact->getPhoto():NULL); } KNotification::event(KNotification::Notification, "New incomming call", "New call from: \n" + call->getPeerName().isEmpty() ? call->getPeerPhoneNumber() : call->getPeerName()); } diff --git a/kde/src/SFLPhone.h b/kde/src/SFLPhone.h index 030a229243..c8a7cd3386 100755 --- a/kde/src/SFLPhone.h +++ b/kde/src/SFLPhone.h @@ -57,7 +57,7 @@ typedef CallModel<CallTreeItem*,QTreeWidgetItem*> TreeWidgetCallModel; * * @short Main window * @author Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> - * @version 0.9.6 + * @version 1.1.0 **/ class SFLPhone : public KXmlGuiWindow { @@ -87,6 +87,7 @@ private: KAction* action_quit ; KAction* action_displayVolumeControls ; KAction* action_displayDialpad ; + KAction* action_displayMessageBox ; KAction* action_configureSflPhone ; KAction* action_configureShortcut ; KAction* action_accountCreationWizard ; diff --git a/kde/src/SFLPhoneView.cpp b/kde/src/SFLPhoneView.cpp index dadf805c4b..88309f36ac 100755 --- a/kde/src/SFLPhoneView.cpp +++ b/kde/src/SFLPhoneView.cpp @@ -38,7 +38,7 @@ //SFLPhone #include "conf/ConfigurationDialog.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" #include "AccountWizard.h" #include "ActionSetAccountFirst.h" #include "SFLPhone.h" @@ -49,6 +49,7 @@ #include "lib/callmanager_interface_singleton.h" #include "lib/instance_interface_singleton.h" #include "lib/sflphone_const.h" +#include "lib/Contact.h" //ConfigurationDialog* SFLPhoneView::configDialog; @@ -68,6 +69,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) pal.setColor(QPalette::AlternateBase, Qt::lightGray); setPalette(pal); + m_pMessageBoxW->setVisible(ConfigurationSkeleton::displayMessageBox()); + // SENDER SIGNAL RECEIVER SLOT / /**/connect(SFLPhone::model() , SIGNAL(incomingCall(Call*)) , this , SLOT(on1_incomingCall(Call*) )); /**/connect(SFLPhone::model() , SIGNAL(voiceMailNotify(const QString &, int)) , this , SLOT(on1_voiceMailNotify(const QString &, int) )); @@ -77,6 +80,8 @@ SFLPhoneView::SFLPhoneView(QWidget *parent) /**/connect(TreeWidgetCallModel::getAccountList() , SIGNAL(accountListUpdated()) , this , SLOT(updateStatusMessage() )); /**/connect(TreeWidgetCallModel::getAccountList() , SIGNAL(accountListUpdated()) , this , SLOT(updateWindowCallState() )); /**/connect(&configurationManager , SIGNAL(accountsChanged()) , TreeWidgetCallModel::getAccountList() , SLOT(updateAccounts() )); + /**/connect(m_pSendMessageLE , SIGNAL(returnPressed()) , this , SLOT(sendMessage() )); + /**/connect(m_pSendMessagePB , SIGNAL(clicked()) , this , SLOT(sendMessage() )); /* */ TreeWidgetCallModel::getAccountList()->updateAccounts(); @@ -140,10 +145,10 @@ void SFLPhoneView::typeString(QString str) } foreach (Call* call2, SFLPhone::model()->getCallList()) { - if(currentCall != call2 && call2->getState() == CALL_STATE_CURRENT) { + if(dynamic_cast<Call*>(call2) && currentCall != call2 && call2->getState() == CALL_STATE_CURRENT) { action(call2, CALL_ACTION_HOLD); } - else if(call2->getState() == CALL_STATE_DIALING) { + else if(dynamic_cast<Call*>(call2) && call2->getState() == CALL_STATE_DIALING) { candidate = call2; } } @@ -239,6 +244,37 @@ void SFLPhoneView::action(Call* call, call_action action) } } +///Select a phone number when calling using a contact +bool SFLPhoneView::selectCallPhoneNumber(Call* call2,Contact* contact) +{ + if (contact->getPhoneNumbers().count() == 1) { + call2 = SFLPhone::model()->addDialingCall(contact->getFormattedName(), SFLPhone::model()->getCurrentAccountId()); + call2->appendText(contact->getPhoneNumbers()[0]->getNumber()); + } + else if (contact->getPhoneNumbers().count() > 1) { + bool ok = false; + QHash<QString,QString> map; + QStringList list; + foreach (Contact::PhoneNumber* number, contact->getPhoneNumbers()) { + map[number->getType()+" ("+number->getNumber()+")"] = number->getNumber(); + list << number->getType()+" ("+number->getNumber()+")"; + } + QString result = QInputDialog::getItem (this, QString("Select phone number"), QString("This contact have many phone number, please select the one you wish to call"), list, 0, false, &ok); + if (ok) { + call2 = SFLPhone::model()->addDialingCall(contact->getFormattedName(), SFLPhone::model()->getCurrentAccountId()); + call2->appendText(map[result]); + } + else { + kDebug() << "Operation cancelled"; + return false; + } + } + else { + kDebug() << "This contact have no valid phone number"; + return false; + } + return true; +} /***************************************************************************** * * @@ -269,6 +305,7 @@ void SFLPhoneView::updateWindowCallState() enabledActions[ SFLPhone::Hold ] = false; enabledActions[ SFLPhone::Transfer ] = false; enabledActions[ SFLPhone::Record ] = false; + m_pMessageBoxW->setVisible(false); } else { call_state state = call->getState(); @@ -289,6 +326,7 @@ void SFLPhoneView::updateWindowCallState() break; case CALL_STATE_CURRENT: buttonIconFiles [ SFLPhone::Record ] = ICON_REC_DEL_ON ; + m_pMessageBoxW->setVisible(true); break; case CALL_STATE_DIALING: enabledActions [ SFLPhone::Hold ] = false ; @@ -300,6 +338,7 @@ void SFLPhoneView::updateWindowCallState() case CALL_STATE_HOLD: buttonIconFiles [ SFLPhone::Hold ] = ICON_UNHOLD ; actionTexts [ SFLPhone::Hold ] = ACTION_LABEL_UNHOLD ; + m_pMessageBoxW->setVisible(true); break; case CALL_STATE_FAILURE: enabledActions [ SFLPhone::Accept ] = false ; @@ -495,6 +534,12 @@ void SFLPhoneView::displayDialpad(bool checked) updateDialpad(); } +void SFLPhoneView::displayMessageBox(bool checked) +{ + ConfigurationSkeleton::setDisplayMessageBox(checked); + m_pMessageBoxW->setVisible(checked); +} + ///Input grabber void SFLPhoneView::on_widget_dialpad_typed(QString text) { @@ -755,4 +800,12 @@ void SFLPhoneView::on1_volumeChanged(const QString & /*device*/, double value) updateVolumeBar(value); } +void SFLPhoneView::sendMessage() +{ + Call* call = callTreeModel->getCurrentItem(); + if (dynamic_cast<Call*>(call) && !m_pSendMessageLE->text().isEmpty()) { + call->sendTextMessage(m_pSendMessageLE->text()); + } +} + #include "SFLPhoneView.moc" diff --git a/kde/src/SFLPhoneView.h b/kde/src/SFLPhoneView.h index 3f444acd6a..deda7b8907 100755 --- a/kde/src/SFLPhoneView.h +++ b/kde/src/SFLPhoneView.h @@ -47,7 +47,7 @@ class CallView; * * @short Main view * @author Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> - * @version 0.9.6 + * @version 1.1.0 */ class SFLPhoneView : public QWidget, public Ui::SFLPhone_view { @@ -93,6 +93,9 @@ public: */ int phoneNumberTypesDisplayed(); + + bool selectCallPhoneNumber(Call* call,Contact* contact); + private slots: /** * Performs the action action on the call call, then updates window. @@ -161,6 +164,8 @@ private slots: void updateVolumeBar (double _value = -1); void updateVolumeControls (); void updateDialpad (); + void sendMessage(); + public slots: @@ -201,6 +206,7 @@ public slots: void displayVolumeControls(bool checked = true); void displayDialpad(bool checked = true); + void displayMessageBox(bool checked = true); void configureSflPhone(); void accountCreationWizard(); void accept (); diff --git a/kde/src/SFLPhoneapplication.h b/kde/src/SFLPhoneapplication.h index 9401f89b8f..3c8d60f318 100755 --- a/kde/src/SFLPhoneapplication.h +++ b/kde/src/SFLPhoneapplication.h @@ -1,3 +1,24 @@ +/*************************************************************************** + * Copyright (C) 2009-2012 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + **************************************************************************/ + #ifndef SFLPHONEAPPLICATION_H #define SFLPHONEAPPLICATION_H diff --git a/kde/src/conf/ConfigAccountList.cpp b/kde/src/conf/ConfigAccountList.cpp index 9de04ed73a..5f464089a9 100644 --- a/kde/src/conf/ConfigAccountList.cpp +++ b/kde/src/conf/ConfigAccountList.cpp @@ -1,3 +1,23 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "ConfigAccountList.h" //KDE @@ -79,7 +99,7 @@ QVector<AccountView*> ConfigAccountList::getAccountByState(QString & state) { QVector<AccountView*> v; for (int i = 0; i < accounts->size(); ++i) { - if ((*accounts)[i]->getAccountDetail(ACCOUNT_STATUS) == state) + if ((*accounts)[i]->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == state) v += (*accounts)[i]; } return v; @@ -167,7 +187,7 @@ QVector<AccountView*> ConfigAccountList::registeredAccounts() const AccountView* current; for (int i = 0; i < accounts->count(); ++i) { current = (*accounts)[i]; - if(current->getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED) { + if(current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED) { kDebug() << current->getAlias() << " : " << current; registeredAccounts.append(current); } @@ -180,7 +200,7 @@ AccountView* ConfigAccountList::firstRegisteredAccount() const AccountView* current; for (int i = 0; i < accounts->count(); ++i) { current = (*accounts)[i]; - if(current->getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED) + if(current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED) { return current; } diff --git a/kde/src/conf/ConfigAccountList.h b/kde/src/conf/ConfigAccountList.h index ac8538bce1..d9df6a18e4 100644 --- a/kde/src/conf/ConfigAccountList.h +++ b/kde/src/conf/ConfigAccountList.h @@ -1,3 +1,23 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef CONFIG_ACCOUNT_LIST_H #define CONFIG_ACCOUNT_LIST_H diff --git a/kde/src/conf/ConfigurationDialog.cpp b/kde/src/conf/ConfigurationDialog.cpp index c24fd3433d..62804f5869 100755 --- a/kde/src/conf/ConfigurationDialog.cpp +++ b/kde/src/conf/ConfigurationDialog.cpp @@ -1,30 +1,29 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #include "ConfigurationDialog.h" //KDE #include <KDebug> -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" #include "dlggeneral.h" #include "dlgdisplay.h" @@ -69,12 +68,16 @@ void ConfigurationDialog::updateWidgets() { dlgAudio->updateWidgets(); dlgAccounts->updateWidgets(); + dlgGeneral->updateWidgets(); + dlgAddressBook->updateWidgets(); } void ConfigurationDialog::updateSettings() { dlgAudio->updateSettings(); dlgAccounts->updateSettings(); + dlgGeneral->updateSettings(); + dlgAddressBook->updateSettings(); } bool ConfigurationDialog::hasChanged() diff --git a/kde/src/conf/ConfigurationDialog.h b/kde/src/conf/ConfigurationDialog.h index 06bc43c9ae..5be091ad3e 100755 --- a/kde/src/conf/ConfigurationDialog.h +++ b/kde/src/conf/ConfigurationDialog.h @@ -1,30 +1,30 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef CONFIGURATIONDIALOG_H #define CONFIGURATIONDIALOG_H #include <kconfigdialog.h> -#include "kcfg_settings.h" +#include "klib/kcfg_settings.h" #include "SFLPhoneView.h" diff --git a/kde/src/conf/dlgaccounts.cpp b/kde/src/conf/dlgaccounts.cpp index 5f300b6480..face5dfb8a 100755 --- a/kde/src/conf/dlgaccounts.cpp +++ b/kde/src/conf/dlgaccounts.cpp @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlgaccounts.h" #include <QtGui/QInputDialog> @@ -81,10 +81,13 @@ DlgAccounts::DlgAccounts(KConfigDialog* parent) setupUi(this); disconnect(keditlistbox_codec->addButton(),SIGNAL(clicked())); ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); - button_accountUp->setIcon ( KIcon( "go-up" ) ); - button_accountDown->setIcon ( KIcon( "go-down" ) ); - button_accountAdd->setIcon ( KIcon( "list-add" ) ); - button_accountRemove->setIcon ( KIcon( "list-remove" ) ); + button_accountUp->setIcon ( KIcon( "go-up" ) ); + button_accountDown->setIcon ( KIcon( "go-down" ) ); + button_accountAdd->setIcon ( KIcon( "list-add" ) ); + button_accountRemove->setIcon ( KIcon( "list-remove" ) ); + button_add_credential->setIcon ( KIcon( "list-add" ) ); + button_remove_credential->setIcon ( KIcon( "list-remove" ) ); + accountList = new ConfigAccountList(false); loadAccountList(); loadCodecList(); @@ -101,7 +104,6 @@ DlgAccounts::DlgAccounts(KConfigDialog* parent) /**/connect(edit6_mailbox, SIGNAL(textEdited(const QString &)) , this , SLOT(changedAccountList() )); /**/connect(spinbox_regExpire, SIGNAL(editingFinished()) , this , SLOT(changedAccountList() )); /**/connect(comboBox_ni_local_address, SIGNAL(currentIndexChanged (int)) , this , SLOT(changedAccountList() )); - /**/connect(checkBox_conformRFC, SIGNAL(clicked(bool)) , this , SLOT(changedAccountList() )); /**/connect(button_accountUp, SIGNAL(clicked()) , this , SLOT(changedAccountList() )); /**/connect(button_accountDown, SIGNAL(clicked()) , this , SLOT(changedAccountList() )); /**/connect(button_accountAdd, SIGNAL(clicked()) , this , SLOT(changedAccountList() )); @@ -224,7 +226,8 @@ void DlgAccounts::saveAccount(QListWidgetItem * item) /**/account->setAccountDetail( ACCOUNT_USERNAME , edit4_user->text() ); /**/account->setAccountDetail( ACCOUNT_PASSWORD , edit5_password->text() ); /**/account->setAccountDetail( ACCOUNT_MAILBOX , edit6_mailbox->text() ); - /**/account->setAccountDetail( ACCOUNT_ENABLED , account->isChecked() ? ACCOUNT_ENABLED_TRUE : ACCOUNT_ENABLED_FALSE ); + /**/account->setAccountDetail( ACCOUNT_ENABLED , account->isChecked()?REGISTRATION_ENABLED_TRUE:REGISTRATION_ENABLED_FALSE); + /**/account->setAccountDetail( ACCOUNT_REGISTRATION_EXPIRE , QString::number(spinbox_regExpire->value()) ); /**/ /**/ /* Security */ /**/account->setAccountDetail( TLS_PASSWORD , edit_tls_private_key_password->text() ); @@ -301,14 +304,15 @@ void DlgAccounts::loadAccount(QListWidgetItem * item) loadCredentails(account->getAccountDetail(ACCOUNT_ID)); - bool ok; - int val = account->getAccountDetail(ACCOUNT_EXPIRE).toInt(&ok); - spinbox_regExpire->setValue(ok ? val : ACCOUNT_EXPIRE_DEFAULT); - - if (credentialList.size()) - edit5_password->setText( credentialList[0].password ); - +// bool ok; +// int val = account->getAccountDetail(ACCOUNT_REGISTRATION_STATUS).toInt(&ok); +// spinbox_regExpire->setValue(ok ? val : REGISTRATION_EXPIRE_DEFAULT); + foreach(CredentialData data,credentialList) { + if (data.name == account->getAccountDetail(ACCOUNT_USERNAME)) { + edit5_password->setText( data.password ); + } + } switch (account->getAccountDetail(TLS_METHOD ).toInt()) { @@ -339,7 +343,6 @@ void DlgAccounts::loadAccount(QListWidgetItem * item) /**/edit3_server->setText ( account->getAccountDetail( ACCOUNT_HOSTNAME ) ); /**/edit4_user->setText ( account->getAccountDetail( ACCOUNT_USERNAME ) ); /**/edit6_mailbox->setText ( account->getAccountDetail( ACCOUNT_MAILBOX ) ); - /**/checkBox_conformRFC->setChecked ( account->getAccountDetail( ACCOUNT_RESOLVE_ONCE ) != "TRUE" ); /**/checkbox_ZRTP_Ask_user->setChecked ( (account->getAccountDetail( ACCOUNT_DISPLAY_SAS_ONCE ) == "true")?1:0 ); /**/checkbox_SDES_fallback_rtp->setChecked ( (account->getAccountDetail( ACCOUNT_SRTP_RTP_FALLBACK ) == "true")?1:0 ); /**/checkbox_ZRTP_display_SAS->setChecked ( (account->getAccountDetail( ACCOUNT_ZRTP_DISPLAY_SAS ) == "true")?1:0 ); @@ -347,6 +350,7 @@ void DlgAccounts::loadAccount(QListWidgetItem * item) /**/checkbox_ZTRP_send_hello->setChecked ( (account->getAccountDetail( ACCOUNT_ZRTP_HELLO_HASH ) == "true")?1:0 ); /**/checkbox_stun->setChecked ( (account->getAccountDetail( ACCOUNT_SIP_STUN_ENABLED ) == "true")?1:0 ); /**/line_stun->setText ( account->getAccountDetail( ACCOUNT_SIP_STUN_SERVER ) ); + /**/spinbox_regExpire->setValue ( account->getAccountDetail( ACCOUNT_REGISTRATION_EXPIRE ).toInt() ); /**/radioButton_pa_same_as_local->setChecked ( (account->getAccountDetail( PUBLISHED_SAMEAS_LOCAL ) == "true")?1:0 ); /**/radioButton_pa_custom->setChecked ( !(account->getAccountDetail( PUBLISHED_SAMEAS_LOCAL ) == "true")?1:0 ); /**/lineEdit_pa_published_address->setText ( account->getAccountDetail( PUBLISHED_ADDRESS ) ); @@ -368,9 +372,24 @@ void DlgAccounts::loadAccount(QListWidgetItem * item) /**/combo_security_STRP->setCurrentIndex ( account->getAccountDetail( TLS_METHOD ).toInt() ); /* */ + if (account->getAccountDetail(ACCOUNT_USERNAME).isEmpty()) { + frame2_editAccounts->setTabEnabled(0,false); + frame2_editAccounts->setTabEnabled(1,false); + frame2_editAccounts->setTabEnabled(3,false); + frame2_editAccounts->setTabEnabled(4,false); + } + else { + frame2_editAccounts->setTabEnabled(0,true); + frame2_editAccounts->setTabEnabled(1,true); + frame2_editAccounts->setTabEnabled(3,true); + frame2_editAccounts->setTabEnabled(4,true); + frame2_editAccounts->setCurrentIndex(0); + } + combo_tls_method->setCurrentIndex ( combo_tls_method->findText(account->getAccountDetail(TLS_METHOD ))); ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); + comboBox_ni_local_address->clear(); QStringList interfaceList = configurationManager.getAllIpInterfaceByName(); comboBox_ni_local_address->addItems(interfaceList); @@ -390,9 +409,9 @@ void DlgAccounts::loadAccount(QListWidgetItem * item) if(protocolIndex == 0) { // if sip selected - checkbox_stun->setChecked(account->getAccountDetail(ACCOUNT_SIP_STUN_ENABLED) == ACCOUNT_ENABLED_TRUE); + checkbox_stun->setChecked(account->getAccountDetail(ACCOUNT_SIP_STUN_ENABLED) == REGISTRATION_ENABLED_TRUE); line_stun->setText( account->getAccountDetail(ACCOUNT_SIP_STUN_SERVER) ); - //checkbox_zrtp->setChecked(account->getAccountDetail(ACCOUNT_SRTP_ENABLED) == ACCOUNT_ENABLED_TRUE); + //checkbox_zrtp->setChecked(account->getAccountDetail(ACCOUNT_SRTP_ENABLED) == REGISTRATION_ENABLED_TRUE); tab_advanced->setEnabled(true); line_stun->setEnabled(checkbox_stun->isChecked()); @@ -558,7 +577,7 @@ void DlgAccounts::updateStatusLabel(AccountView* account) if(! account ) { return; } - QString status = account->getAccountDetail(ACCOUNT_STATUS); + QString status = account->getAccountDetail(ACCOUNT_REGISTRATION_STATUS); edit7_state->setText( "<FONT COLOR=\"" + account->getStateColorName() + "\">" + status + "</FONT>" ); } @@ -692,12 +711,12 @@ void DlgAccounts::loadCredentails(QString accountId) { VectorMapStringString credentials = configurationManager.getCredentials(accountId); for (int i=0; i < credentials.size(); i++) { QListWidgetItem* newItem = new QListWidgetItem(); - newItem->setText(credentials[i][ "username" ]); + newItem->setText(credentials[i][ CONFIG_ACCOUNT_USERNAME ]); CredentialData data; data.pointer = newItem ; - data.name = credentials[i][ "username" ] ; - data.password = credentials[i][ "password" ] ; - data.realm = credentials[i][ "realm" ] ; + data.name = credentials[i][ CONFIG_ACCOUNT_USERNAME ] ; + data.password = credentials[i][ CONFIG_ACCOUNT_PASSWORD ] ; + data.realm = credentials[i][ CONFIG_ACCOUNT_REALM ] ; credentialInfo[newItem] = data; credentialList << data; list_credential->addItem(newItem); @@ -712,9 +731,9 @@ void DlgAccounts::saveCredential(QString accountId) { for (int i=0; i < list_credential->count();i++) { QListWidgetItem* currentItem = list_credential->item(i); MapStringString credentialData; - credentialData["username"] = credentialInfo[currentItem].name ; - credentialData["password"] = credentialInfo[currentItem].password ; - credentialData["realm"] = credentialInfo[currentItem].realm ; + credentialData[CONFIG_ACCOUNT_USERNAME] = credentialInfo[currentItem].name ; + credentialData[CONFIG_ACCOUNT_PASSWORD] = credentialInfo[currentItem].password ; + credentialData[CONFIG_ACCOUNT_REALM] = credentialInfo[currentItem].realm ; toReturn << credentialData; } configurationManager.setCredentials(accountId,toReturn); diff --git a/kde/src/conf/dlgaccounts.h b/kde/src/conf/dlgaccounts.h index 39c64829e5..cff86e686b 100755 --- a/kde/src/conf/dlgaccounts.h +++ b/kde/src/conf/dlgaccounts.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGACCOUNTS_H #define DLGACCOUNTS_H diff --git a/kde/src/conf/dlgaccountsbase.ui b/kde/src/conf/dlgaccountsbase.ui index 94f5f4c68c..8359b8f4f9 100755 --- a/kde/src/conf/dlgaccountsbase.ui +++ b/kde/src/conf/dlgaccountsbase.ui @@ -29,7 +29,7 @@ <item> <widget class="QFrame" name="frame1_accountList"> <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> + <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -62,7 +62,7 @@ <item> <widget class="QListWidget" name="listWidget_accountList"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <sizepolicy hsizetype="Minimum" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -392,15 +392,18 @@ <string>Resgistration</string> </property> <layout class="QGridLayout" name="gridLayout_8"> - <item row="0" column="0"> - <widget class="QLabel" name="label_regExpire"> - <property name="text"> - <string>Registration expire</string> + <item row="0" column="2"> + <spacer name="horizontalSpacer_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> </property> - <property name="buddy"> - <cstring>spinbox_regExpire</cstring> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> </property> - </widget> + </spacer> </item> <item row="0" column="1"> <widget class="KIntSpinBox" name="spinbox_regExpire"> @@ -409,25 +412,15 @@ </property> </widget> </item> - <item row="1" column="0" colspan="2"> - <widget class="QCheckBox" name="checkBox_conformRFC"> + <item row="0" column="0"> + <widget class="QLabel" name="label_regExpire"> <property name="text"> - <string>Conform to RFC 3263</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <spacer name="horizontalSpacer_7"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <string>Registration expire</string> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <property name="buddy"> + <cstring>spinbox_regExpire</cstring> </property> - </spacer> + </widget> </item> </layout> </widget> @@ -738,6 +731,9 @@ <property name="enabled"> <bool>false</bool> </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> </widget> </item> </layout> @@ -1158,6 +1154,11 @@ <extends>QGroupBox</extends> <header>keditlistbox.h</header> </customwidget> + <customwidget> + <class>KLineEdit</class> + <extends>QLineEdit</extends> + <header>klineedit.h</header> + </customwidget> <customwidget> <class>KIntSpinBox</class> <extends>QSpinBox</extends> @@ -1168,11 +1169,6 @@ <extends>QFrame</extends> <header>kurlrequester.h</header> </customwidget> - <customwidget> - <class>KLineEdit</class> - <extends>QLineEdit</extends> - <header>klineedit.h</header> - </customwidget> </customwidgets> <resources> <include location="../qrc/resources.qrc"/> diff --git a/kde/src/conf/dlgaddressbook.cpp b/kde/src/conf/dlgaddressbook.cpp index 0766769b28..98c44d53e6 100755 --- a/kde/src/conf/dlgaddressbook.cpp +++ b/kde/src/conf/dlgaddressbook.cpp @@ -1,34 +1,71 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlgaddressbook.h" +#include "klib/ConfigurationSkeleton.h" + DlgAddressBook::DlgAddressBook(QWidget *parent) : QWidget(parent) { setupUi(this); -} + m_pPhoneTypeList->addItem( m_mNumbertype["Work"] = new QListWidgetItem("Work" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Home"] = new QListWidgetItem("Home" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Messenger"] = new QListWidgetItem("Messenger" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Prefered number"] = new QListWidgetItem("Prefered number" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Voice"] = new QListWidgetItem("Voice" )); +// m_pPhoneTypeList->addItem( m_mNumbertype["Fax"] = new QListWidgetItem("Fax" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Mobile"] = new QListWidgetItem("Mobile" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Video"] = new QListWidgetItem("Video" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Mailbox"] = new QListWidgetItem("Mailbox" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Modem"] = new QListWidgetItem("Modem" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Car"] = new QListWidgetItem("Car" )); + m_pPhoneTypeList->addItem( m_mNumbertype["ISDN"] = new QListWidgetItem("ISDN" )); + m_pPhoneTypeList->addItem( m_mNumbertype["PCS"] = new QListWidgetItem("PCS" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Pager"] = new QListWidgetItem("Pager" )); + m_pPhoneTypeList->addItem( m_mNumbertype["Other..."] = new QListWidgetItem("Other..." )); + + QStringList list = ConfigurationSkeleton::phoneTypeList(); + foreach(QListWidgetItem* i,m_mNumbertype) { + i->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + i->setCheckState((list.indexOf(m_mNumbertype.key(i)) != -1)?Qt::Checked:Qt::Unchecked); + } +} DlgAddressBook::~DlgAddressBook() { } +void DlgAddressBook::updateWidgets() +{ + +} + +void DlgAddressBook::updateSettings() +{ + QStringList list; + foreach(QListWidgetItem* i,m_mNumbertype) { + if (i->checkState() == Qt::Checked) + list << m_mNumbertype.key(i); + } + ConfigurationSkeleton::setPhoneTypeList(list); +} diff --git a/kde/src/conf/dlgaddressbook.h b/kde/src/conf/dlgaddressbook.h index 94ec8a671e..6ee981adc4 100755 --- a/kde/src/conf/dlgaddressbook.h +++ b/kde/src/conf/dlgaddressbook.h @@ -1,27 +1,30 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGADDRESSBOOK_H #define DLGADDRESSBOOK_H -#include <QWidget> +#include <QtCore/QHash> +#include <QtCore/QString> +#include <QtGui/QWidget> +#include <QtGui/QListWidgetItem> #include "ui_dlgaddressbookbase.h" @@ -36,6 +39,14 @@ public: ~DlgAddressBook(); +private: + QHash<QString,QListWidgetItem*> m_mNumbertype; + +public slots: + void updateWidgets(); + void updateSettings(); + + }; #endif diff --git a/kde/src/conf/dlgaddressbookbase.ui b/kde/src/conf/dlgaddressbookbase.ui index e7f4964bf3..245f8a1713 100755 --- a/kde/src/conf/dlgaddressbookbase.ui +++ b/kde/src/conf/dlgaddressbookbase.ui @@ -22,178 +22,27 @@ </widget> </item> <item> - <widget class="QWidget" name="widget_configAddressBookGeneral" native="true"> - <property name="enabled"> - <bool>false</bool> + <widget class="QLabel" name="m_pPhonetypeL"> + <property name="text"> + <string>Use contact from the following phone number category:</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="leftMargin"> - <number>0</number> - </property> - <item> - <widget class="QWidget" name="widget_maxResults" native="true"> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <property name="spacing"> - <number>-1</number> - </property> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>5</number> - </property> - <property name="rightMargin"> - <number>5</number> - </property> - <property name="bottomMargin"> - <number>5</number> - </property> - <item> - <widget class="QLabel" name="label_maxResults"> - <property name="text"> - <string>Maximum results</string> - </property> - <property name="buddy"> - <cstring>horizontalSlider_maxResults</cstring> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="horizontalSlider_maxResults"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimum"> - <number>25</number> - </property> - <property name="maximum"> - <number>50</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="KIntSpinBox" name="kcfg_maxResults"/> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QCheckBox" name="kcfg_displayPhoto"> - <property name="text"> - <string>Display photo if available</string> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_displayTypes"> - <property name="title"> - <string>Display phone numbers of these types :</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <item> - <widget class="QCheckBox" name="kcfg_business"> - <property name="text"> - <string>Work</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="kcfg_mobile"> - <property name="text"> - <string>Mobile</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="kcfg_home"> - <property name="text"> - <string>Home</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> </widget> </item> <item> - <spacer name="verticalSpacer_configAddressBook"> - <property name="orientation"> - <enum>Qt::Vertical</enum> + <widget class="QListWidget" name="m_pPhoneTypeList"> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>72</height> - </size> + <property name="sortingEnabled"> + <bool>true</bool> </property> - </spacer> + </widget> </item> </layout> </widget> - <customwidgets> - <customwidget> - <class>KIntSpinBox</class> - <extends>QSpinBox</extends> - <header>knuminput.h</header> - </customwidget> - </customwidgets> <resources/> - <connections> - <connection> - <sender>horizontalSlider_maxResults</sender> - <signal>valueChanged(int)</signal> - <receiver>kcfg_maxResults</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>265</x> - <y>67</y> - </hint> - <hint type="destinationlabel"> - <x>326</x> - <y>70</y> - </hint> - </hints> - </connection> - <connection> - <sender>kcfg_maxResults</sender> - <signal>valueChanged(int)</signal> - <receiver>horizontalSlider_maxResults</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>326</x> - <y>70</y> - </hint> - <hint type="destinationlabel"> - <x>265</x> - <y>67</y> - </hint> - </hints> - </connection> - <connection> - <sender>kcfg_enableAddressBook</sender> - <signal>toggled(bool)</signal> - <receiver>widget_configAddressBookGeneral</receiver> - <slot>setEnabled(bool)</slot> - <hints> - <hint type="sourcelabel"> - <x>92</x> - <y>25</y> - </hint> - <hint type="destinationlabel"> - <x>91</x> - <y>39</y> - </hint> - </hints> - </connection> - </connections> + <connections/> </ui> diff --git a/kde/src/conf/dlgaudio.cpp b/kde/src/conf/dlgaudio.cpp index ae9bbd966f..ccdf3f1751 100755 --- a/kde/src/conf/dlgaudio.cpp +++ b/kde/src/conf/dlgaudio.cpp @@ -1,30 +1,31 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlgaudio.h" #include <KLineEdit> #include "lib/configurationmanager_interface_singleton.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" #include "conf/ConfigurationDialog.h" #include <QtGui/QHeaderView> +#include <KStandardDirs> #include "lib/sflphone_const.h" @@ -36,9 +37,13 @@ DlgAudio::DlgAudio(KConfigDialog *parent) KUrlRequester_ringtone->setMode(KFile::File | KFile::ExistingOnly); KUrlRequester_ringtone->lineEdit()->setObjectName("kcfg_ringtone"); KUrlRequester_ringtone->lineEdit()->setReadOnly(true); + KUrlRequester_ringtone->setUrl( KStandardDirs::realFilePath(ConfigurationSkeleton::ringtone())); + + + ConfigurationManagerInterface& configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); KUrlRequester_destinationFolder->setMode(KFile::Directory|KFile::ExistingOnly|KFile::LocalOnly); - KUrlRequester_destinationFolder->setUrl(KUrl(QDir::home().path())); + KUrlRequester_destinationFolder->setUrl(KUrl(configurationManager.getRecordPath())); KUrlRequester_destinationFolder->lineEdit()->setObjectName("kcfg_destinationFolder"); KUrlRequester_destinationFolder->lineEdit()->setReadOnly(true); @@ -63,8 +68,10 @@ void DlgAudio::updateSettings() //alsaPlugin ConfigurationSkeleton * skeleton = ConfigurationSkeleton::self(); skeleton->setAlsaPlugin(box_alsaPlugin->currentText()); + skeleton->setRingtone(KUrlRequester_ringtone->lineEdit()->text()); - //codecTableHasChanged = false; + ConfigurationManagerInterface& configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); + configurationManager.setRecordPath(KUrlRequester_destinationFolder->lineEdit()->text()); } bool DlgAudio::hasChanged() @@ -102,4 +109,4 @@ void DlgAudio::loadAlsaSettings() else { groupBox_alsa->setEnabled(false); } -} \ No newline at end of file +} diff --git a/kde/src/conf/dlgaudio.h b/kde/src/conf/dlgaudio.h index 5b9a9885e3..c8823200c4 100755 --- a/kde/src/conf/dlgaudio.h +++ b/kde/src/conf/dlgaudio.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGAUDIO_H #define DLGAUDIO_H @@ -25,7 +25,7 @@ #include <kconfigdialog.h> #include "ui_dlgaudiobase.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" /** @author Jérémy Quentin <jeremy.quentin@gmail.com> diff --git a/kde/src/conf/dlgdisplay.cpp b/kde/src/conf/dlgdisplay.cpp index 33b18fac3f..cf7c6d7302 100755 --- a/kde/src/conf/dlgdisplay.cpp +++ b/kde/src/conf/dlgdisplay.cpp @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlgdisplay.h" DlgDisplay::DlgDisplay(QWidget *parent) diff --git a/kde/src/conf/dlgdisplay.h b/kde/src/conf/dlgdisplay.h index 6f6ab89ff3..81799771b5 100755 --- a/kde/src/conf/dlgdisplay.h +++ b/kde/src/conf/dlgdisplay.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGDISPLAY_H #define DLGDISPLAY_H diff --git a/kde/src/conf/dlggeneral.cpp b/kde/src/conf/dlggeneral.cpp index c99d01b61c..0b56c7f8b4 100755 --- a/kde/src/conf/dlggeneral.cpp +++ b/kde/src/conf/dlggeneral.cpp @@ -1,36 +1,49 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlggeneral.h" #include <QToolButton> #include <QAction> +#include "klib/ConfigurationSkeleton.h" +#include "conf/ConfigurationDialog.h" + DlgGeneral::DlgGeneral(QWidget *parent) : QWidget(parent) { setupUi(this); connect(toolButton_historyClear, SIGNAL(clicked()), this, SIGNAL(clearCallHistoryAsked())); -} + kcfg_historyMax->setValue(ConfigurationSkeleton::historyMax()); +} DlgGeneral::~DlgGeneral() { } +void DlgGeneral::updateWidgets() +{ + +} + +void DlgGeneral::updateSettings() +{ + ConfigurationSkeleton::setHistoryMax(kcfg_historyMax->value()); +} diff --git a/kde/src/conf/dlggeneral.h b/kde/src/conf/dlggeneral.h index 26719ac2cc..c7e5c10403 100755 --- a/kde/src/conf/dlggeneral.h +++ b/kde/src/conf/dlggeneral.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGGENERAL_H #define DLGGENERAL_H @@ -38,6 +38,11 @@ public: //Destructor ~DlgGeneral(); +public slots: + //Mutator + void updateWidgets(); + void updateSettings(); + signals: void clearCallHistoryAsked(); diff --git a/kde/src/conf/dlghooks.cpp b/kde/src/conf/dlghooks.cpp index a8e3cfca7c..67f5cfa806 100755 --- a/kde/src/conf/dlghooks.cpp +++ b/kde/src/conf/dlghooks.cpp @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "dlghooks.h" DlgHooks::DlgHooks(QWidget *parent) diff --git a/kde/src/conf/dlghooks.h b/kde/src/conf/dlghooks.h index ffa54388d2..7f5819c853 100755 --- a/kde/src/conf/dlghooks.h +++ b/kde/src/conf/dlghooks.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef DLGHOOKS_H #define DLGHOOKS_H diff --git a/kde/src/conf/sflphone-client-kde.kcfg b/kde/src/conf/sflphone-client-kde.kcfg deleted file mode 100755 index 3bc1f21fb5..0000000000 --- a/kde/src/conf/sflphone-client-kde.kcfg +++ /dev/null @@ -1,141 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd"> -<kcfg> - <kcfgfile/> - <group name="main"> - - <!-- General Settings --> - - <entry name="SIPPort" type="Int"> - <label>Defines the port that will be used for SIP communication.</label> - <min> 1025 </min> - <max> 65536 </max> - <default> 1025 </default> - </entry> - <entry name="enableHistory" type="Bool"> - <label>Defines whether sflphone should keep a history of calls.</label> - </entry> - <entry name="historyMax" type="Int"> - <label>Defines the number of days the history has to be kept.</label> - <min> 1 </min> - <max> 99 </max> - <default> 30 </default> - </entry> - - <!-- Display Settings --> - - <entry name="notifOnCalls" type="Bool"> - <label>Defines whether user should be notified when receiving a call.</label> - </entry> - <entry name="notifOnMessages" type="Bool"> - <label>Defines whether user should be notified when receiving a message.</label> - </entry> - <entry name="displayOnStart" type="Bool"> - <label>Defines whether the main window should be displayed on start.</label> - </entry> - <entry name="displayOnCalls" type="Bool"> - <label>Defines whether the main window should be displayed when receiving a message.</label> - </entry> - <entry name="displayDialpad" type="Bool"> - <label>Defines whether the dialpad is being shown by default</label> - </entry> - <entry name="displayVolume" type="Bool"> - <label>Defines whether the volume widgets are visible by default</label> - </entry> - <entry name="displayMenu" type="Bool"> - <label>Defines whether the main menu is visible by default, it can be restored with "Ctrl+m"</label> - </entry> - <entry name="displayDataRange" type="Bool"> - <label>Defines whether call history is restricted to a specific date range</label> - </entry> - <entry name="displayContactCallHistory" type="Bool"> - <label>Defines if the individual contact history list is visible</label> - </entry> - - <!-- Audio Settings --> - - <entry name="interface" type="Enum"> - <label>Defines the Stun server to use.</label> - <choices> - <choice name="ALSA" /> - <choice name="PulseAudio" /> - </choices> - </entry> - <entry name="enableRingtones" type="Bool"> - <label>Defines whether ringtones are enabled.</label> - </entry> - <entry name="ringtone" type="Path"> - <label>Defines which ringtone is used.</label> - </entry> - <!-- - <entry name="activeCodecList" type="StringList"> - <label>Defines which ALSA plugin to use.</label> - </entry> - --> - <entry name="alsaPlugin" type="String"> - <label>Defines which ALSA plugin to use.</label> - </entry> - <entry name="alsaInputDevice" type="Int"> - <label>Defines which ALSA Input device to use.</label> - </entry> - <entry name="alsaOutputDevice" type="Int"> - <label>Defines which ALSA Output device to use.</label> - </entry> - <entry name="pulseAudioVolumeAlter" type="Bool"> - <label>Defines whether pulse audio can mute other applications during a call.</label> - </entry> - - <!-- Address Book Settings --> - - <entry name="enableAddressBook" type="Bool"> - <label>Defines whether the search in KDE Address Book is enabled</label> - </entry> - <entry name="maxResults" type="Int"> - <label>Defines the max number of contacts to display during a search in address book.</label> - </entry> - <entry name="displayPhoto" type="Bool"> - <label>Defines whether to display contacts photos.</label> - </entry> - <entry name="business" type="Bool"> - <label>Defines whether to display professionnal phone numbers.</label> - </entry> - <entry name="mobile" type="Bool"> - <label>Defines whether to display mobile phone numbers.</label> - </entry> - <entry name="home" type="Bool"> - <label>Defines whether to display personnal phone numbers.</label> - </entry> - - <!-- Bookmark --> - <entry name="bookmarkList" type="StringList"> - <label>List of bookmarked clients</label> - </entry> - - <!-- Record Settings --> - - <entry name="destinationFolder" type="Path"> - <label>Defines the destination directory for call recordings.</label> - </entry> - - <!-- Hooks Settings --> - - <entry name="enableHooksSIP" type="Bool"> - <label>Defines whether to enable hooks for SIP accounts.</label> - </entry> - <entry name="enableHooksIAX" type="Bool"> - <label>Defines whether to enable hooks for IAX accounts.</label> - </entry> - <entry name="hooksSIPHeader" type="String"> - <label>Defines which header to catch for SIP accounts hooks.</label> - </entry> - <entry name="hooksCommand" type="String"> - <label>Defines which command to execute.</label> - </entry> - <entry name="addPrefix" type="Bool"> - <label>Defines whether to add a prefix for outgoing calls.</label> - </entry> - <entry name="prepend" type="String"> - <label>Defines the prefix to add.</label> - </entry> - </group> -</kcfg> diff --git a/kde/src/dbus/configurationmanager-introspec.xml b/kde/src/dbus/configurationmanager-introspec.xml index 19ded470d6..9477797542 100755 --- a/kde/src/dbus/configurationmanager-introspec.xml +++ b/kde/src/dbus/configurationmanager-introspec.xml @@ -37,9 +37,9 @@ <li>DISPLAY_NAMEL: The display name</li> <li>STUN_ENABLE: True or False (Default: False)</li> <li>STUN_SERVER: The STUN server address</li> - <li>REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> - <li>REGISTRATION_STATE_CODE</li> - <li>REGISTRATION_STATE_DESCRIPTION</li> + <li>ACCOUNT_REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> + <li>ACCOUNT_REGISTRATION_STATE_CODE</li> + <li>ACCOUNT_REGISTRATION_STATE_DESC</li> <li>SRTP_KEY_EXCHANGE</li> <li>SRTP_ENABLE: Whether or not voice communication are encrypted - True or False (Default: False)</li> <li>SRTP_RTP_FALLBACK</li> @@ -449,6 +449,21 @@ <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> </signal> + <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> + <arg type="s" name="accountID"/> + <arg type="i" name="registration_state"/> + </signal> + + <signal name="stunStatusFailure" tp:name-for_bindings="stunStatusFailure"> + <arg type="s" name="reason"> + </arg> + </signal> + + <signal name="stunStatusSuccess" tp:name-for_bindings="stunStatusSuccess"> + <arg type="s" name="message"> + </arg> + </signal> + <signal name="errorAlert" tp:name-for-bindings="errorAlert"> <arg type="i" name="code"> </arg> diff --git a/kde/src/AkonadiBackend.cpp b/kde/src/klib/AkonadiBackend.cpp similarity index 67% rename from kde/src/AkonadiBackend.cpp rename to kde/src/klib/AkonadiBackend.cpp index 7677746d4f..babae9dddc 100644 --- a/kde/src/AkonadiBackend.cpp +++ b/kde/src/klib/AkonadiBackend.cpp @@ -1,22 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "AkonadiBackend.h" @@ -43,14 +43,17 @@ #include <kabc/phonenumber.h> //SFLPhone library -#include "lib/Contact.h" +#include "../lib/Contact.h" +#include "../lib/AccountList.h" +#include "../lib/Account.h" //SFLPhone -#include "SFLPhone.h" -#include "SFLPhoneView.h" +//#include "SFLPhone.h" +//#include "SFLPhoneView.h" ///Init static attributes AkonadiBackend* AkonadiBackend::m_pInstance = 0; +CallModel<>* AkonadiBackend::m_pModel = 0; ///Constructor AkonadiBackend::AkonadiBackend(QObject* parent) : ContactBackend(parent) @@ -58,6 +61,12 @@ AkonadiBackend::AkonadiBackend(QObject* parent) : ContactBackend(parent) //QTimer::singleShot( 0, this, SLOT( delayedInit() ) ); m_pSession = new Akonadi::Session( "SFLPhone::instance" ); + if ( not m_pModel ) { + m_pModel = new CallModel<>(CallModel<>::ActiveCall); + m_pModel->initCall(); + m_pModel->initHistory(); + } + // fetching all collections containing emails recursively, starting at the root collection Akonadi::CollectionFetchJob *job = new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive, this ); job->fetchScope().setContentMimeTypes( QStringList() << "text/directory" ); @@ -86,10 +95,19 @@ ContactBackend* AkonadiBackend::getInstance() return m_pInstance; } -///Find contact using a phone number -Contact* AkonadiBackend::getContactByPhone(const QString& phoneNumber) +///Find contact using a phone number, +///@param resolveDNS check if the DNS is used by an account, then assume contact with that phone number / extension is the same as the caller +Contact* AkonadiBackend::getContactByPhone(const QString& phoneNumber,bool resolveDNS) { - return m_ContactByPhone[phoneNumber]; + if (!resolveDNS || phoneNumber.indexOf("@") == -1) + return m_ContactByPhone[phoneNumber]; + else if (!getHostNameFromPhone(phoneNumber).isEmpty() && m_ContactByPhone[getUserFromPhone(phoneNumber)]) { + foreach (Account* a, m_pModel->getAccountList()->getAccounts()) { + if (a->getAccountDetail(ACCOUNT_HOSTNAME) == getHostNameFromPhone(phoneNumber)) + return m_ContactByPhone[getUserFromPhone(phoneNumber)]; + } + } + return nullptr; } ///Find contact by UID @@ -109,10 +127,9 @@ Contact* AkonadiBackend::getContactByUid(const QString& uid) ContactList AkonadiBackend::update(Akonadi::Collection collection) { m_Collection = collection; - ContactList contacts; if ( !collection.isValid() ) { kDebug() << "The current collection is not valid"; - return contacts; + return ContactList(); } Akonadi::RecursiveItemFetchJob *job = new Akonadi::RecursiveItemFetchJob( collection, QStringList() << KABC::Addressee::mimeType() << KABC::ContactGroup::mimeType()); @@ -145,6 +162,7 @@ ContactList AkonadiBackend::update(Akonadi::Collection collection) aContact->setFamilyName (tmp.familyName() ); aContact->setOrganization (tmp.organization() ); aContact->setPreferredEmail (tmp.preferredEmail() ); + aContact->setDepartment (tmp.department() ); aContact->setUid (tmp.uid() ); aContact->setPhoneNumbers (newNumbers ); @@ -152,32 +170,32 @@ ContactList AkonadiBackend::update(Akonadi::Collection collection) aContact->setPhoto(new QPixmap(QPixmap::fromImage( tmp.photo().data()).scaled(QSize(48,48)))); else aContact->setPhoto(0); - contacts << aContact; } } + m_pContacts = m_ContactByUid.values(); } - return contacts; + return m_ContactByUid.values(); } ///Edit backend value using an updated frontend contact -void AkonadiBackend::editContact(Contact* contact) +void AkonadiBackend::editContact(Contact* contact,QWidget* parent) { KABC::Addressee ct = m_AddrHash[contact->getUid()]; if (ct.uid() != contact->getUid()) { kDebug() << "Contact not found"; return; } - Akonadi::ContactEditor *editor = new Akonadi::ContactEditor( Akonadi::ContactEditor::EditMode, SFLPhone::app()->view() ); + Akonadi::ContactEditor *editor = new Akonadi::ContactEditor( Akonadi::ContactEditor::EditMode, parent ); Akonadi::Item item; item.setPayload<KABC::Addressee>(ct); editor->loadContact(item); - KDialog* dlg = new KDialog(SFLPhone::app()->view()); + KDialog* dlg = new KDialog(parent); dlg->setMainWidget(editor); dlg->exec(); } ///Add a new contact -void AkonadiBackend::addNewContact(Contact* contact) +void AkonadiBackend::addNewContact(Contact* contact,QWidget* parent) { KABC::Addressee newContact; newContact.setNickName ( contact->getNickName() ); @@ -185,6 +203,7 @@ void AkonadiBackend::addNewContact(Contact* contact) newContact.setGivenName ( contact->getFirstName() ); newContact.setFamilyName ( contact->getSecondName() ); newContact.setOrganization ( contact->getOrganization() ); + newContact.setDepartment ( contact->getDepartment() ); //newContact.setPreferredEmail ( contact->getPreferredEmail() );//TODO foreach (Contact::PhoneNumber* nb, contact->getPhoneNumbers()) { @@ -208,14 +227,13 @@ void AkonadiBackend::addNewContact(Contact* contact) newContact.insertPhoneNumber(pn); } - //aContact->setPhoneNumbers (newNumbers );//TODO - Akonadi::ContactEditor *editor = new Akonadi::ContactEditor( Akonadi::ContactEditor::CreateMode, SFLPhone::app()->view() ); + Akonadi::ContactEditor *editor = new Akonadi::ContactEditor( Akonadi::ContactEditor::CreateMode, parent ); editor->setContactTemplate(newContact); - KDialog* dlg = new KDialog(SFLPhone::app()->view()); + KDialog* dlg = new KDialog(parent); dlg->setMainWidget(editor); dlg->exec(); @@ -225,6 +243,18 @@ void AkonadiBackend::addNewContact(Contact* contact) } } +///Implement virtual pure method +void AkonadiBackend::editContact(Contact* contact) +{ + editContact(contact,0); +} + +///Implement virtual pure method +void AkonadiBackend::addNewContact(Contact* contact) +{ + addNewContact(contact,0); +} + /***************************************************************************** * * @@ -244,5 +274,35 @@ void AkonadiBackend::collectionsReceived( const Akonadi::Collection::List& list ///Update the contact list even without a new collection ContactList AkonadiBackend::update_slot() { - return update(m_Collection); + return m_pContacts;//update(m_Collection); +} + +/***************************************************************************** + * * + * Helpers * + * * + ****************************************************************************/ + +///Return the extension/user of an URI (<sip:12345@exemple.com>) +QString AkonadiBackend::getUserFromPhone(QString phoneNumber) +{ + if (phoneNumber.indexOf("@") != -1) { + QString user = phoneNumber.split("@")[0]; + if (user.indexOf(":") != -1) { + return user.split(":")[1]; + } + else { + return user; + } + } + return phoneNumber; +} + +///Return the domaine of an URI (<sip:12345@exemple.com>) +QString AkonadiBackend::getHostNameFromPhone(QString phoneNumber) +{ + if (phoneNumber.indexOf("@") != -1) { + return phoneNumber.split("@")[1].left(phoneNumber.split("@")[1].size()-1); + } + return ""; } \ No newline at end of file diff --git a/kde/src/klib/AkonadiBackend.h b/kde/src/klib/AkonadiBackend.h new file mode 100644 index 0000000000..25bf871378 --- /dev/null +++ b/kde/src/klib/AkonadiBackend.h @@ -0,0 +1,87 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#ifndef AKONADI_BACKEND_H +#define AKONADI_BACKEND_H + +#include "../lib/ContactBackend.h" +#include "../lib/CallModel.h" +#include "../lib/typedefs.h" +#include <akonadi/collectionmodel.h> + +//Qt +class QObject; + +//KDE +namespace KABC { + class Addressee; + class AddresseeList; +} + +namespace Akonadi { + class Session; + class CollectionModel; + class Collection; +} + +//SFLPhone +class Contact; + +///@class AkonadiBackend Implement a backend for Akonadi +class LIB_EXPORT AkonadiBackend : public ContactBackend { + Q_OBJECT +public: + static ContactBackend* getInstance(); + Contact* getContactByPhone ( const QString& phoneNumber ,bool resolveDNS = false ); + Contact* getContactByUid ( const QString& uid ); + void editContact ( Contact* contact , QWidget* parent = 0 ); + void addNewContact ( Contact* contact , QWidget* parent = 0 ); + + virtual void editContact ( Contact* contact ); + virtual void addNewContact ( Contact* contact ); + +private: + AkonadiBackend(QObject* parent); + virtual ~AkonadiBackend(); + + //Helper + QString getUserFromPhone(QString phoneNumber); + QString getHostNameFromPhone(QString phoneNumber); + + //Attributes + static AkonadiBackend* m_pInstance ; + static CallModel<>* m_pModel ; + Akonadi::Session* m_pSession ; + Akonadi::Collection m_Collection ; + QHash<QString,KABC::Addressee> m_AddrHash ; + ContactList m_pContacts ; + +protected: + ContactList update_slot(); + +public slots: + ContactList update(Akonadi::Collection collection); + void collectionsReceived( const Akonadi::Collection::List& ); + +signals: + void collectionChanged(); +}; + +#endif diff --git a/kde/src/klib/CMakeLists.txt b/kde/src/klib/CMakeLists.txt new file mode 100644 index 0000000000..80ec02345e --- /dev/null +++ b/kde/src/klib/CMakeLists.txt @@ -0,0 +1,67 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +ADD_DEFINITIONS("-std=c++0x") + +ADD_DEFINITIONS( + ${QT_DEFINITIONS} + -fexceptions +) + +PROJECT(ksflphone) + +SET ( KDE4_KABC_LIBS -lkabc ) + + +add_subdirectory(dataengine) + +SET(LOCAL_CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/") +SET(CMAKE_MODULE_PATH "${LOCAL_CMAKE_MODULE_PATH}") + +FIND_PACKAGE ( KDE4 REQUIRED ) +FIND_PACKAGE ( Qt4 REQUIRED ) + +INCLUDE ( KDE4Defaults ) + +set(GENERIC_LIB_VERSION "1.1.0") + +INCLUDE_DIRECTORIES ( ${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) + +#File to compile +set( ksflphone_LIB_SRCS + HelperFunctions.cpp + AkonadiBackend.cpp + SortableDockCommon.cpp + ConfigurationSkeleton.cpp +) + +KDE4_ADD_KCFG_FILES(ksflphone_LIB_SRCS kcfg_settings.kcfgc) + +kde4_add_library( ksflphone SHARED ${ksflphone_LIB_SRCS} ) + +target_link_libraries( ksflphone + qtsflphone + ${QT_QTCORE_LIBRARY} + ${KDEPIMLIBS_AKONADI_KMIME_LIBS} + ${KDEPIMLIBS_AKONADI_LIBS} + ${KDEPIMLIBS_AKONADI_CONTACT_LIBS} + ${KDE4_KDEUI_LIBS} +) + +set_target_properties( ksflphone + PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} +) + +set( ksflphone_LIB_HDRS + AkonadiBackend.h + HelperFunctions.h + SortableDockCommon.h +) + +INSTALL(FILES sflphone-client-kde.kcfg DESTINATION ${KCFG_INSTALL_DIR}) + +install( FILES ${ksflphone_LIB_HDRS} + DESTINATION ${INCLUDE_INSTALL_DIR}/ksflphone + COMPONENT Devel +) + +install( TARGETS ksflphone ${INSTALL_TARGETS_DEFAULT_ARGS} ) diff --git a/kde/src/conf/ConfigurationSkeleton.cpp b/kde/src/klib/ConfigurationSkeleton.cpp similarity index 66% rename from kde/src/conf/ConfigurationSkeleton.cpp rename to kde/src/klib/ConfigurationSkeleton.cpp index 3fadaea56a..26bf996337 100755 --- a/kde/src/conf/ConfigurationSkeleton.cpp +++ b/kde/src/klib/ConfigurationSkeleton.cpp @@ -1,27 +1,27 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #include "ConfigurationSkeleton.h" -#include "lib/configurationmanager_interface_singleton.h" -#include "lib/sflphone_const.h" +#include "../lib/configurationmanager_interface_singleton.h" +#include "../lib/sflphone_const.h" //KDE #include <KDebug> @@ -66,19 +66,19 @@ void ConfigurationSkeleton::readConfig() //Call history settings //setEnableHistory(true); - setHistoryMax(1000);//configurationManager.getHistoryLimit()); + setHistoryMax(configurationManager.getHistoryLimit()); //////////////////////// ////Display settings//// //////////////////////// //Notification settings - setNotifOnCalls(true); - setNotifOnMessages(true);//configurationManager.getMailNotify()); + //setNotifOnCalls(true); + setNotifOnMessages(configurationManager.getMailNotify()); //Window display settings - setDisplayOnStart(true); - setDisplayOnCalls(true); + //setDisplayOnStart(true); + //setDisplayOnCalls(true); ///////////////////////// ////Accounts settings//// @@ -98,12 +98,9 @@ void ConfigurationSkeleton::readConfig() //ringtones settings setEnableRingtones(true); - QString ringtone = ""; - if(ringtone.isEmpty()) { - setRingtone(QString(SHARE_INSTALL_PREFIX) + "sflphone/ringtones/konga.ul"); - } - else { - setRingtone(ringtone); + //QString ringtone = ""; + if(ringtone().isEmpty()) { + setRingtone(QString(SHARE_INSTALL_PREFIX) + "/sflphone/ringtones/konga.ul"); } //codecs settings @@ -131,31 +128,17 @@ void ConfigurationSkeleton::readConfig() //if(!ok) kDebug() << "outputDevice is not a number"; //setAlsaOutputDevice(outputDevice); - /////////////////////// - ////Record settings//// - /////////////////////// - - QString recordPath = configurationManager.getRecordPath(); - if(! recordPath.isEmpty()) { - setDestinationFolder(recordPath); - } - else { - setDestinationFolder(QDir::home().path()); - } - - - ///////////////////////////// ////Address book settings//// ///////////////////////////// MapStringInt addressBookSettings = configurationManager.getAddressbookSettings().value(); setEnableAddressBook(addressBookSettings[ADDRESSBOOK_ENABLE]); - setMaxResults(addressBookSettings[ADDRESSBOOK_MAX_RESULTS]); - setDisplayPhoto(addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO]); - setBusiness(addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS]); - setMobile(addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE]); - setHome(addressBookSettings[ADDRESSBOOK_DISPLAY_HOME]); +// setMaxResults(addressBookSettings[ADDRESSBOOK_MAX_RESULTS]); +// setDisplayPhoto(addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO]); +// setBusiness(addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS]); +// setMobile(addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE]); +// setHome(addressBookSettings[ADDRESSBOOK_DISPLAY_HOME]); ///////////////////////////// ///////Hooks settings//////// @@ -176,7 +159,7 @@ void ConfigurationSkeleton::writeConfig() { //ConfigurationSkeleton::writeConfig(); kDebug() << "Writing config"; - /*ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); + ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); //////////////////////// @@ -200,7 +183,8 @@ void ConfigurationSkeleton::writeConfig() //Notification settings //if(notifOnCalls() != configurationManager.getNotify()) configurationManager.setNotify(); - //if(notifOnMessages() != configurationManager.getMailNotify()) configurationManager.setMailNotify(); +// if(notifOnMessages() != configurationManager.getMailNotify()) configurationManager.setMailNotify(); + //configurationManager.setMailNotify(notifOnMessages()); //Window display settings //WARNING états inversés @@ -222,15 +206,15 @@ void ConfigurationSkeleton::writeConfig() kDebug() << "Writing Audio settings"; //Audio Interface settings - int prevManager = configurationManager.getAudioManager(); - int newManager = interface(); - if(prevManager != newManager) { - configurationManager.setAudioManager(newManager); - } +// int prevManager = configurationManager.getAudioManager(); +// int newManager = interface(); +// if(prevManager != newManager) { +// configurationManager.setAudioManager(newManager); +// } //ringtones settings - if(enableRingtones() != configurationManager.isRingtoneEnabled()) configurationManager.ringtoneEnabled(); - configurationManager.setRingtoneChoice(ringtone()); +// if(enableRingtones() != configurationManager.isRingtoneEnabled()) configurationManager.ringtoneEnabled(); +// configurationManager.setRingtoneChoice(ringtone()); //codecs settings //kDebug() << "activeCodecList = " << activeCodecList(); @@ -238,12 +222,12 @@ void ConfigurationSkeleton::writeConfig() //alsa settings - if(prevManager == CONST_ALSA && newManager == EnumInterface::ALSA) { - kDebug() << "setting alsa settings"; - configurationManager.setOutputAudioPlugin(alsaPlugin()); - configurationManager.setAudioInputDevice(alsaInputDevice()); - configurationManager.setAudioOutputDevice(alsaOutputDevice()); - } +// if(prevManager == CONST_ALSA && newManager == EnumInterface::ALSA) { +// kDebug() << "setting alsa settings"; +// configurationManager.setOutputAudioPlugin(alsaPlugin()); +// configurationManager.setAudioInputDevice(alsaInputDevice()); +// configurationManager.setAudioOutputDevice(alsaOutputDevice()); +// } /////////////////////// @@ -252,8 +236,8 @@ void ConfigurationSkeleton::writeConfig() kDebug() << "Writing Record settings"; - QString destination = destinationFolder(); - configurationManager.setRecordPath(destination); +// QString destination = destinationFolder(); +// configurationManager.setRecordPath(destination); ///////////////////////////// @@ -264,11 +248,11 @@ void ConfigurationSkeleton::writeConfig() MapStringInt addressBookSettings = MapStringInt(); addressBookSettings[ADDRESSBOOK_ENABLE] = enableAddressBook(); - addressBookSettings[ADDRESSBOOK_MAX_RESULTS] = maxResults(); - addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO] = displayPhoto(); - addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS] = business(); - addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE] = mobile(); - addressBookSettings[ADDRESSBOOK_DISPLAY_HOME] = home(); +// addressBookSettings[ADDRESSBOOK_MAX_RESULTS] = maxResults(); +// addressBookSettings[ADDRESSBOOK_DISPLAY_CONTACT_PHOTO] = displayPhoto(); +// addressBookSettings[ADDRESSBOOK_DISPLAY_BUSINESS] = business(); +// addressBookSettings[ADDRESSBOOK_DISPLAY_MOBILE] = mobile(); +// addressBookSettings[ADDRESSBOOK_DISPLAY_HOME] = home(); configurationManager.setAddressbookSettings(addressBookSettings); ///////////////////////////// @@ -286,7 +270,7 @@ void ConfigurationSkeleton::writeConfig() hooksSettings[HOOKS_COMMAND] = hooksCommand(); configurationManager.setHookSettings(hooksSettings); - kDebug() << "Finished to write config\n";*/ + kDebug() << "Finished to write config\n"; ConfigurationSkeletonBase::writeConfig(); } diff --git a/kde/src/conf/ConfigurationSkeleton.h b/kde/src/klib/ConfigurationSkeleton.h similarity index 60% rename from kde/src/conf/ConfigurationSkeleton.h rename to kde/src/klib/ConfigurationSkeleton.h index cd99acd48a..5c8792293d 100755 --- a/kde/src/conf/ConfigurationSkeleton.h +++ b/kde/src/klib/ConfigurationSkeleton.h @@ -1,31 +1,31 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef CONFIGURATIONSKELETON_H #define CONFIGURATIONSKELETON_H #include <QWidget> +#include "../lib/typedefs.h" -#include "kcfg_settings.h" +#include "src/klib/kcfg_settings.h" //#include "CodecListModel.h" -#include "AccountListModel.h" /** @author Jérémy Quentin <jeremy.quentin@gmail.com> @@ -38,7 +38,7 @@ This class reimplements the writeConfig and readConfig functions to ask the daemon instead of the normal behavior (read and write in a kconfig file). */ -class ConfigurationSkeleton : public ConfigurationSkeletonBase +class LIB_EXPORT ConfigurationSkeleton : public ConfigurationSkeletonBase { Q_OBJECT diff --git a/kde/src/klib/HelperFunctions.cpp b/kde/src/klib/HelperFunctions.cpp new file mode 100644 index 0000000000..4a3cdb50e4 --- /dev/null +++ b/kde/src/klib/HelperFunctions.cpp @@ -0,0 +1,47 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#include "HelperFunctions.h" + +//Qt +#include <QtCore/QString> +#include <QtCore/QVariant> + +//SFLPhone +#include "../lib/Contact.h" + +ContactHash HelperFunctions::toHash(QList<Contact*> contacts) { + QHash<QString,QHash<QString,QVariant> > hash; + for (int i=0;i<contacts.size();i++) { + Contact* cont = contacts[i]; + QHash<QString,QVariant> conth = cont->toHash(); + conth["phoneCount"] = cont->getPhoneNumbers().size(); + if (cont->getPhoneNumbers().size() == 1) { + conth["phoneNumber"] = cont->getPhoneNumbers()[0]->getNumber(); + conth["phoneType" ] = cont->getPhoneNumbers()[0]->getType(); + } + else { + conth["phoneNumber"] = QString::number(cont->getPhoneNumbers().size())+" numbers"; + conth["phoneType" ] = ""; + } + hash[contacts[i]->getUid()] = conth; + } + return hash; +} \ No newline at end of file diff --git a/kde/src/klib/HelperFunctions.h b/kde/src/klib/HelperFunctions.h new file mode 100644 index 0000000000..f87d684c1f --- /dev/null +++ b/kde/src/klib/HelperFunctions.h @@ -0,0 +1,42 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#ifndef HELPER_FUNCTIONS +#define HELPER_FUNCTIONS + +//Qt +#include <QtCore/QString> +#include <QtCore/QVariant> +#include <QtCore/QHash> +#include <QtCore/QList> + +//SFLPhone +#include "../lib/Contact.h" + +//Typedef +typedef QHash<QString,QHash<QString,QVariant> > ContactHash; + +///@class HelperFunctions little visitor not belonging to libqtsflphone +///Ramdom mix of dynamic property and transtypping +class LIB_EXPORT HelperFunctions { +public: + static ContactHash toHash(QList<Contact*> contacts); +}; +#endif \ No newline at end of file diff --git a/kde/src/klib/SortableDockCommon.cpp b/kde/src/klib/SortableDockCommon.cpp new file mode 100644 index 0000000000..85f229c969 --- /dev/null +++ b/kde/src/klib/SortableDockCommon.cpp @@ -0,0 +1,73 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#include "SortableDockCommon.h" + +//Qt +#include <QtCore/QDateTime> +#include <QtCore/QStringList> +#include <QtCore/QTimer> + +//SFLPhone +#include "../lib/Call.h" +#include "../lib/Contact.h" +#include "../lib/CallModel.h" +#include "AkonadiBackend.h" + +///StaticEventHandler constructor +StaticEventHandler::StaticEventHandler(QObject* parent, QStringList* list) : QObject(parent),m_pList(list) +{ + QTimer* timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(update())); + timer->start(86400000); //1 day + update(); +} + +///Update the days constant, necessary to cycle after midnight +void StaticEventHandler::update() +{ + (*m_pList)= { + "Today" ,//0 + "Yesterday" ,//1 + QDate::currentDate().addDays(-2).toString("dddd"),//2 + QDate::currentDate().addDays(-3).toString("dddd"),//3 + QDate::currentDate().addDays(-4).toString("dddd"),//4 + QDate::currentDate().addDays(-5).toString("dddd"),//5 + QDate::currentDate().addDays(-6).toString("dddd"),//6 + "Last week" ,//7 + "Two weeks ago" ,//8 + "Three weeks ago" ,//9 + "Last month" ,//10 + "Two months ago" ,//11 + "Three months ago" ,//12 + "Four months ago" ,//13 + "Five months ago" ,//14 + "Six months ago" ,//15 + "Seven months ago" ,//16 + "Eight months ago" ,//17 + "Nine months ago" ,//18 + "Ten months ago" ,//19 + "Eleven months ago" ,//20 + "Twelve months ago" ,//21 + "Last year" ,//22 + "Very long time ago" ,//23 + "Never" //24 + }; +} diff --git a/kde/src/klib/SortableDockCommon.h b/kde/src/klib/SortableDockCommon.h new file mode 100644 index 0000000000..a3b54a9d38 --- /dev/null +++ b/kde/src/klib/SortableDockCommon.h @@ -0,0 +1,128 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#ifndef SORTABLE_DOCK_COMMON +#define SORTABLE_DOCK_COMMON + +#include <QtCore/QObject> +#include <QtCore/QHash> +#include <QtCore/QModelIndex> +#include <QtGui/QWidget> + +#include "HelperFunctions.h" + +//Qt +class QString; +class QStringList; +class QDate; +class QDateTime; + +//SFLPhone +class StaticEventHandler; +class Contact; +class Call; + +///@enum ContactSortingMode Available sorting mode +enum ContactSortingMode { + Name , + Organisation , + Recently_used , + Group , + Department +}; + +///@enum HistorySortingMode +enum HistorySortingMode { + Date = 0, + Name2 = 1, + Popularity = 2, + Length = 3 +}; + +template <typename CallWidget = QWidget*, typename Index = QModelIndex*> +class LIB_EXPORT SortableDockCommon { + public: + friend class StaticEventHandler; + + //Helpers + static QString getIdentity(Call* item); + static int usableNumberCount(Contact* cont); + static void setHistoryCategory ( QList<Call*>& calls , HistorySortingMode mode ); + static void setContactCategory ( QList<Contact*> contacts , ContactSortingMode mode ); + + protected: + SortableDockCommon(); + //Helpers + static QString timeToHistoryCategory ( QDate date ); + static QHash<Contact*, QDateTime> getContactListByTime ( /*ContactList list*/ ); + + //Attributes + static QStringList m_slHistoryConst; + + ///@enum HistoryConst match m_slHistoryConst + enum HistoryConst { + Today = 0 , + Yesterday = 1 , + Two_days_ago = 2 , + Three_days_ago = 3 , + Four_days_ago = 4 , + Five_days_ago = 5 , + Six_days_ago = 6 , + Last_week = 7 , + Two_weeks_ago = 8 , + Three_weeks_ago = 9 , + Last_month = 10 , + Two_months_ago = 11 , + Three_months_ago = 12 , + Four_months_ago = 13 , + Five_months_ago = 14 , + Six_months_ago = 15 , + Seven_months_ago = 16 , + Eight_months_ago = 17 , + Nine_months_ago = 18 , + Ten_months_ago = 19 , + Eleven_months_ago = 20 , + Twelve_months_ago = 21 , + Last_year = 22 , + Very_long_time_ago= 23 , + Never = 24 + }; + + private: + static StaticEventHandler* m_spEvHandler ; +}; + + +///@class StaticEventHandler "cron jobs" for static member; +class LIB_EXPORT StaticEventHandler : public QObject +{ + Q_OBJECT + public: + StaticEventHandler(QObject* parent, QStringList* list); + + public slots: + void update(); + private: + QStringList* m_pList; +}; + +#include "SortableDockCommon.hpp" + +#endif diff --git a/kde/src/klib/SortableDockCommon.hpp b/kde/src/klib/SortableDockCommon.hpp new file mode 100644 index 0000000000..cf6ca70a5e --- /dev/null +++ b/kde/src/klib/SortableDockCommon.hpp @@ -0,0 +1,231 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +//Qt +#include <QtCore/QDateTime> +#include <QtCore/QStringList> +#include <QtCore/QTimer> + +//SFLPhone +#include "../lib/Call.h" +#include "../lib/Contact.h" +#include "../lib/CallModel.h" +#include "AkonadiBackend.h" +#include "HelperFunctions.h" +#include "ConfigurationSkeleton.h" + +//Define +#define CALLMODEL_TEMPLATE template<typename CallWidget, typename Index> +#define SORTABLE_T SortableDockCommon<CallWidget,Index> + +CALLMODEL_TEMPLATE QStringList SORTABLE_T::m_slHistoryConst = QStringList(); +CALLMODEL_TEMPLATE StaticEventHandler* SORTABLE_T::m_spEvHandler = new StaticEventHandler(0,&(SORTABLE_T::m_slHistoryConst)); + +CALLMODEL_TEMPLATE SORTABLE_T::SortableDockCommon() +{ + /*if (not m_spEvHandler) { + m_spEvHandler = new StaticEventHandler(0,&(SORTABLE_T::m_slHistoryConst)); + }*/ +} + + +/***************************************************************************** + * * + * Helpers * + * * + ****************************************************************************/ + +CALLMODEL_TEMPLATE QString SORTABLE_T::timeToHistoryCategory(QDate date) +{ + if (m_slHistoryConst.size() < 10) + m_spEvHandler->update(); + + //m_spEvHandler->update(); + if (QDate::currentDate() == date || QDate::currentDate() < date) //The future case would be a bug, but it have to be handled anyway or it will appear in "very long time ago" + return m_slHistoryConst[HistoryConst::Today]; + + //Check for last week + for (int i=1;i<7;i++) { + if (QDate::currentDate().addDays(-i) == date) + return m_slHistoryConst[i]; //Yesterday to Six_days_ago + } + + //Check for last month + for (int i=1;i<4;i++) { + if (QDate::currentDate().addDays(-(i*7)) >= date && QDate::currentDate().addDays(-(i*7) -7) < date) + return m_slHistoryConst[i+Last_week-1]; //Last_week to Three_weeks_ago + } + + //Check for last year + for (int i=1;i<12;i++) { + if (QDate::currentDate().addMonths(-i) >= date && QDate::currentDate().addMonths((-i) - 1) < date) + return m_slHistoryConst[i+Last_month-1]; //Last_month to Twelve_months ago + } + + if (QDate::currentDate().addYears(-1) >= date && QDate::currentDate().addYears(-2) < date) + return m_slHistoryConst[Last_year]; + + //Every other senario + return m_slHistoryConst[Very_long_time_ago]; +} + +///Return the list of contact from history (in order, most recently used first) +CALLMODEL_TEMPLATE QHash<Contact*, QDateTime> SORTABLE_T::getContactListByTime(/*ContactList list*/) +{ + const CallMap& history= CallModel<CallWidget,Index>::getHistory(); + QHash<Contact*, QDateTime> toReturn; + QSet<QString> alreadyUsed; + QMapIterator<QString, Call*> i(history); + i.toBack(); + while (i.hasPrevious()) { //Iterate from the end up + i.previous(); + (alreadyUsed.find(i.value()->getPeerPhoneNumber()) == alreadyUsed.constEnd()); //Don't ask, leave it there Elv13(2012) + if (alreadyUsed.find(i.value()->getPeerPhoneNumber()) == alreadyUsed.constEnd()) { + Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(i.value()->getPeerPhoneNumber(),true); + if (contact && toReturn.find(contact) == toReturn.end()) { + toReturn[contact] = QDateTime::fromTime_t(i.value()->getStartTimeStamp().toUInt()); + } + alreadyUsed << i.value()->getPeerPhoneNumber(); + } + } + return toReturn; +} + +CALLMODEL_TEMPLATE void SORTABLE_T::setHistoryCategory(QList<Call*>& calls,HistorySortingMode mode) +{ + QHash<QString,uint> popularityCount; + QMap<QString, QList<Call*> > byDate; + switch (mode) { + case HistorySortingMode::Date: + foreach (QString cat, m_slHistoryConst) { + byDate[cat] = QList<Call*>(); + } + break; + case HistorySortingMode::Popularity: + foreach (Call* call, calls) { + popularityCount[getIdentity(call)]++; + } + break; + default: + break; + } + foreach (Call* call, calls) { + QString category; + switch (mode) { + case HistorySortingMode::Date: + { + category = timeToHistoryCategory(QDateTime::fromTime_t(call->getStartTimeStamp().toUInt()).date()); + byDate[category] <<call; + } + break; + case HistorySortingMode::Name2: + category = getIdentity(call); + break; + case HistorySortingMode::Popularity: + { + QString identity = getIdentity(call); + category = identity+"("+QString::number(popularityCount[identity])+")"; + } + break; + case HistorySortingMode::Length: + category = "TODO"; + break; + default: + break; + } + call->setProperty("section",category); + } + switch (mode) { + case HistorySortingMode::Date: + calls.clear(); + foreach (QString cat, m_slHistoryConst) { + foreach (Call* call, byDate[cat]) { + calls << call; + } + } + break; + default: + break; + } +} + +CALLMODEL_TEMPLATE void SORTABLE_T::setContactCategory(QList<Contact*> contacts,ContactSortingMode mode) +{ + QHash<Contact*, QDateTime> recentlyUsed; + switch (mode) { + case ContactSortingMode::Recently_used: + recentlyUsed = getContactListByTime(); + foreach (QString cat, m_slHistoryConst) { + //m_pContactView->addCategory(cat); + } + break; + default: + break; + } + foreach (Contact* cont, contacts) { + if (cont->getPhoneNumbers().count() && usableNumberCount(cont)) { + QString category; + switch (mode) { + case ContactSortingMode::Name: + category = QString(cont->getFormattedName()[0]); + break; + case ContactSortingMode::Organisation: + category = (cont->getOrganization().isEmpty())?"Unknow":cont->getOrganization(); + break; + case ContactSortingMode::Recently_used: + if (recentlyUsed.find(cont) != recentlyUsed.end()) + category = timeToHistoryCategory(recentlyUsed[cont].date()); + else + category = m_slHistoryConst[Never]; + break; + case ContactSortingMode::Group: + category = "TODO"; + break; + case ContactSortingMode::Department: + category = (cont->getDepartment().isEmpty())?"Unknow":cont->getDepartment();; + break; + default: + break; + } + } + } +} + +///Return the identity of the call caller, try to return something usefull +CALLMODEL_TEMPLATE QString SORTABLE_T::getIdentity(Call* item) +{ + Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(item->getPeerPhoneNumber()); + if (contact) + return contact->getFormattedName(); + else if (!item->getPeerName().isEmpty()) + return item->getPeerName(); + else + return item->getPeerPhoneNumber(); +} + +CALLMODEL_TEMPLATE int SORTABLE_T::usableNumberCount(Contact* cont) +{ + uint result =0; + QStringList list = ConfigurationSkeleton::phoneTypeList(); + foreach (Contact::PhoneNumber* pn,cont->getPhoneNumbers()) { + result += list.indexOf(pn->getType()) != -1; + } + return result; +} diff --git a/kde/src/klib/dataengine.h b/kde/src/klib/dataengine.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/kde/plasma/dataengine/CMakeLists.txt b/kde/src/klib/dataengine/CMakeLists.txt similarity index 64% rename from kde/plasma/dataengine/CMakeLists.txt rename to kde/src/klib/dataengine/CMakeLists.txt index 867b10900d..1810f03d24 100644 --- a/kde/plasma/dataengine/CMakeLists.txt +++ b/kde/src/klib/dataengine/CMakeLists.txt @@ -13,14 +13,19 @@ include_directories( set(sflphone_engine_SRCS sflphonEngine.cpp + sflphoneService.cpp ) kde4_add_plugin(plasma_engine_sflphone ${sflphone_engine_SRCS}) target_link_libraries(plasma_engine_sflphone qtsflphone + ksflphone ${KDE4_KDECORE_LIBS} - ${KDE4_PLASMA_LIBS}) + ${KDE4_PLASMA_LIBS} + ${KDEPIMLIBS_AKONADI_KMIME_LIBS} + ${KDEPIMLIBS_AKONADI_LIBS} + ${KDEPIMLIBS_AKONADI_CONTACT_LIBS} ) install(TARGETS plasma_engine_sflphone DESTINATION ${PLUGIN_INSTALL_DIR}) @@ -28,4 +33,5 @@ install(TARGETS plasma_engine_sflphone install(FILES plasma-engine-sflphone.desktop DESTINATION ${SERVICES_INSTALL_DIR}) -#TARGET_LINK_LIBRARIES(sflphone-client-kde sflphonekde ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KABC_LIBS}) +install(FILES sflphone.operations + DESTINATION ${DATA_INSTALL_DIR}/plasma/services) diff --git a/kde/plasma/dataengine/plasma-engine-sflphone.desktop b/kde/src/klib/dataengine/plasma-engine-sflphone.desktop similarity index 100% rename from kde/plasma/dataengine/plasma-engine-sflphone.desktop rename to kde/src/klib/dataengine/plasma-engine-sflphone.desktop diff --git a/kde/plasma/dataengine/plasma-engine-testtime.desktop b/kde/src/klib/dataengine/plasma-engine-testtime.desktop similarity index 100% rename from kde/plasma/dataengine/plasma-engine-testtime.desktop rename to kde/src/klib/dataengine/plasma-engine-testtime.desktop diff --git a/kde/src/klib/dataengine/sflphonEngine.cpp b/kde/src/klib/dataengine/sflphonEngine.cpp new file mode 100644 index 0000000000..5c9f78dc03 --- /dev/null +++ b/kde/src/klib/dataengine/sflphonEngine.cpp @@ -0,0 +1,349 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#include "sflphonEngine.h" + +#include <Plasma/DataContainer> + +#include "../../lib/Call.h" +#include "../../lib/Account.h" +#include "../../lib/AccountList.h" +#include "../../lib/Contact.h" +#include "../../lib/dbus/metatypes.h" +#include "../../lib/instance_interface_singleton.h" +#include "../../lib/configurationmanager_interface_singleton.h" +#include "../../lib/callmanager_interface_singleton.h" +#include "../../lib/sflphone_const.h" +#include "../../klib/AkonadiBackend.h" +#include "../../klib/HelperFunctions.h" +#include "../../klib/ConfigurationSkeleton.h" +#include "sflphoneService.h"> + +CallModel<>* SFLPhoneEngine::m_pModel = NULL; + +SFLPhoneEngine::SFLPhoneEngine(QObject* parent, const QVariantList& args) + : Plasma::DataEngine(parent, args) +{ + Q_UNUSED(args) + if (not m_pModel) { + m_pModel = new CallModel<>(CallModel<>::ActiveCall); + m_pModel->initCall(); + m_pModel->initHistory(); + } + + //CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); + + connect(m_pModel , SIGNAL( callStateChanged(Call*)) , this , SLOT(callStateChangedSignal(Call*) )); + connect(m_pModel , SIGNAL( callAdded(Call*)) , this , SLOT(callStateChangedSignal(Call*) )); + connect(m_pModel , SIGNAL( callStateChanged(Call*)) , this , SLOT(callStateChangedSignal(Call*) )); + //connect(&callManager , SIGNAL( incomingCall(Call*)) , this , SLOT(incomingCallSignal(Call*) )); + //connect(&callManager , SIGNAL( conferenceCreated(Call*)) , this , SLOT(conferenceCreatedSignal(Call*) )); + //connect(&callManager , SIGNAL( conferenceChanged(Call*)) , this , SLOT(conferenceChangedSignal(Call*) )); + connect(AkonadiBackend::getInstance(), SIGNAL( collectionChanged()) , this , SLOT(updateCollection() )); + +} + +bool SFLPhoneEngine::sourceRequestEvent(const QString &name) +{ + if ( name == "history" ) { + updateHistory(); + } + else if ( name == "calls" ) { + updateCallList(); + } + else if ( name == "conferences" ) { + updateConferenceList(); + } + else if ( name == "info" ) { + updateInfo(); + } + else if ( name == "accounts" ) { + updateAccounts(); + } + else if ( name == "contacts" ) { + updateContacts(); + } + else if ( name == "bookmark" ) { + updateBookmarkList(); + } + else if ( name.left(7) == "Number:" ) { + generateNumberList(name); + } + return true;//updateSourceEvent(name); +} + +bool SFLPhoneEngine::updateSourceEvent(const QString &name) +{ + Q_UNUSED(name) + return true; +} + +QStringList SFLPhoneEngine::sources() const { + QStringList toReturn; + toReturn << "calls" << "history" << "conferences" << "info" << "accounts" << "contacts" << "bookmark"; + return toReturn; +} + +Plasma::Service* SFLPhoneEngine::serviceForSource(const QString &source) +{ + if (source != "calls") { + return 0; + } + + SFLPhoneService *service = new SFLPhoneService(this); + service->setParent(this); + return service; +} + +QString SFLPhoneEngine::getCallStateName(call_state state) +{ + if (state == CALL_STATE_INCOMING) { + return I18N_NOOP("Ringing (in)"); + } else if (state == CALL_STATE_RINGING) { + return I18N_NOOP("Ringing (out)"); + } else if (state == CALL_STATE_CURRENT) { + return I18N_NOOP("Talking"); + } else if (state == CALL_STATE_DIALING) { + return I18N_NOOP("Dialing"); + } else if (state == CALL_STATE_HOLD) { + return I18N_NOOP("Hold"); + } else if (state == CALL_STATE_FAILURE) { + return I18N_NOOP("Failed"); + } else if (state == CALL_STATE_BUSY) { + return I18N_NOOP("Busy"); + } else if (state == CALL_STATE_TRANSFER) { + return I18N_NOOP("Transfer"); + } else if (state == CALL_STATE_TRANSF_HOLD) { + return I18N_NOOP("Transfer hold"); + } else if (state == CALL_STATE_OVER) { + return I18N_NOOP("Over"); + } else if (state == CALL_STATE_ERROR) { + return I18N_NOOP("Error"); + } + return ""; +} + +void SFLPhoneEngine::updateHistory() +{ + CallList list = m_pModel->getHistory().values(); + setHistoryCategory(list,HistorySortingMode::Date); + + foreach (Call* oldCall, list) { + historyCall[oldCall->getCallId()][ "peerName" ] = oldCall->getPeerName(); + historyCall[oldCall->getCallId()][ "peerNumber" ] = oldCall->getPeerPhoneNumber(); + historyCall[oldCall->getCallId()][ "length" ] = oldCall->getStopTimeStamp().toInt() - oldCall->getStartTimeStamp().toInt(); + historyCall[oldCall->getCallId()][ "date" ] = oldCall->getStopTimeStamp(); + historyCall[oldCall->getCallId()][ "id" ] = oldCall->getCallId(); + if (oldCall->property("section").isValid()) + historyCall[oldCall->getCallId()][ "section" ] = oldCall->property("section"); + setData("history", oldCall->getCallId() , historyCall[oldCall->getCallId()]); + } +} + +void SFLPhoneEngine::updateCallList() +{ + QHash<QString,QVariant> test; + test[ "peerName" ] = ""; + test[ "peerNumber" ] = ""; + test[ "stateName" ] = ""; + test[ "state" ] = ""; + test[ "id" ] = ""; + setData("calls", "fake",test ); + removeAllData("calls"); + foreach (Call* call, m_pModel->getCalls()) { + if ((!m_pModel->isConference(call)) && (call->getState() != CALL_STATE_OVER)) { + currentCall[call->getCallId()][ "peerName" ] = call->getPeerName(); + currentCall[call->getCallId()][ "peerNumber" ] = call->getPeerPhoneNumber(); + currentCall[call->getCallId()][ "stateName" ] = getCallStateName(call->getState()); + currentCall[call->getCallId()][ "state" ] = call->getState(); + currentCall[call->getCallId()][ "id" ] = call->getCallId(); + setData("calls", call->getCallId(), currentCall[call->getCallId()]); + } + } +} + +void SFLPhoneEngine::updateBookmarkList() +{ + removeAllData("bookmark"); + int i=0; + QStringList cl = getModel()->getNumbersByPopularity(); + for (;i < ((cl.size() < 10)?cl.size():10);i++) { + QHash<QString,QVariant> pop; + Contact* cont = AkonadiBackend::getInstance()->getContactByPhone(cl[i],true); + if (cont) { + pop["peerName" ] = cont->getFormattedName(); + } + else { + pop["peerName" ] = cl[i]; + } + pop["peerNumber" ] = cl[i] ; + pop["section" ] = "Popular" ; + pop["listPriority" ] = 1000 ; + pop["id" ] = i ; + setData("bookmark", QString::number(i), pop); + } + + //TODO Wont work for now + foreach (QString nb, ConfigurationSkeleton::bookmarkList()) { + i++; + QHash<QString,QVariant> pop; + pop["peerName" ] = "TODO" ; + pop["peerNumber" ] = nb ; + pop["section" ] = "1" ; + pop["listPriority" ] = 0 ; + pop["id" ] = i ; + setData("bookmark", QString::number(i), pop); + } +} + +void SFLPhoneEngine::updateConferenceList() +{ + foreach (Call* call, m_pModel->getCalls()) { + if (m_pModel->isConference(call)) { + CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); + currentConferences[call->getConfId()] = callManager.getParticipantList(call->getConfId()); + setData("conferences", call->getConfId(), currentConferences[call->getConfId()]); + } + } +} + +void SFLPhoneEngine::updateCollection() +{ + + typedef QHash<QString,QVariant> SerializedContact; + ContactList list = AkonadiBackend::getInstance()->update(); + if (!list.size()) + return; + ContactHash hash = HelperFunctions::toHash(list); + foreach (SerializedContact cont, hash) { + if (!m_hContacts[hash.key(cont)].size()) { + m_hContacts[hash.key(cont)] = cont; + } + // + } + removeAllData("contacts"); + int i=0; + foreach (SerializedContact cont, m_hContacts) { + cont["section"] = "test"; + setData("contacts", QString::number(i), QVariant(cont)); + i++; + } + updateBookmarkList(); +} + +void SFLPhoneEngine::updateContacts() +{ + QHash<QString,QVariant> test; + test[ "nickName" ] = ""; + test[ "firstName" ] = ""; + test[ "secondName" ] = ""; + test[ "formattedName" ] = ""; + test[ "organization" ] = ""; + test[ "Uid" ] = ""; + test[ "preferredEmail" ] = ""; + test[ "type" ] = ""; + test[ "group" ] = ""; + test[ "department" ] = ""; + setData("contacts", "fake",test ); +} + +void SFLPhoneEngine::updateInfo() +{ + setData("info", I18N_NOOP("Current_account"), m_pModel->getCurrentAccountId()); +} + +void SFLPhoneEngine::updateAccounts() +{ + const QVector<Account*>& list = m_pModel->getAccountList()->getAccounts(); + foreach(Account* a,list) { + QHash<QString,QVariant> acc; + acc["id"] = a->getAccountId(); + acc["alias"] = a->getAccountDetail(ACCOUNT_ALIAS); + setData("accounts", QString::number(rand()) , acc); + } +} + +void SFLPhoneEngine::generateNumberList(QString name) +{ + QString contactUid = name.right(name.size()-7); + qDebug() << "LOOKING FOR " << contactUid; + Contact* cont = AkonadiBackend::getInstance()->getContactByUid(contactUid); + if (cont) { + foreach(Contact::PhoneNumber* num,cont->getPhoneNumbers()) { + QHash<QString,QVariant> hash; + hash[ "number" ] = num->getNumber(); + hash[ "type" ] = num->getType(); + setData(name, QString::number(rand()) , hash); + } + } + else { + kDebug() << "Contact not found"; + } +} + +void SFLPhoneEngine::callStateChangedSignal(Call* call) +{ + Q_UNUSED(call) + updateCallList(); +} + +void SFLPhoneEngine::incomingCallSignal(Call* call) +{ + Q_UNUSED(call) + updateCallList(); +} + +void SFLPhoneEngine::conferenceCreatedSignal(Call* conf) +{ + Q_UNUSED(conf) + updateConferenceList(); +} + +void SFLPhoneEngine::conferenceChangedSignal(Call* conf) +{ + Q_UNUSED(conf) + updateConferenceList(); +} + +void SFLPhoneEngine::incomingMessageSignal(const QString& accountId, const QString& message) +{ + Q_UNUSED(accountId) + Q_UNUSED(message) + //TODO +} + +void SFLPhoneEngine::voiceMailNotifySignal(const QString& accountId, int count) +{ + Q_UNUSED(accountId) + Q_UNUSED(count) + //TODO +} + +void SFLPhoneEngine::accountChanged() +{ + +} + +CallModel<>* SFLPhoneEngine::getModel() +{ + return m_pModel; +} + +K_EXPORT_PLASMA_DATAENGINE(sflphone, SFLPhoneEngine) diff --git a/kde/src/klib/dataengine/sflphonEngine.h b/kde/src/klib/dataengine/sflphonEngine.h new file mode 100644 index 0000000000..4543276c70 --- /dev/null +++ b/kde/src/klib/dataengine/sflphonEngine.h @@ -0,0 +1,78 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#ifndef SFLPHONEENGINE_H +#define SFLPHONEENGINE_H + +#include <Plasma/DataEngine> +#include <Plasma/Service> +#include <QHash> + +#include "../../lib/CallModel.h" +#include "../SortableDockCommon.h" + +typedef QHash<QString,QVariant> HashStringString; +typedef QHash<QString,QHash<QString,QVariant> > ContactHash; +class Call; + +class SFLPhoneEngine : public Plasma::DataEngine,public SortableDockCommon<> +{ + Q_OBJECT + + public: + SFLPhoneEngine(QObject* parent, const QVariantList& args); + Plasma::Service *serviceForSource(const QString &source); + virtual QStringList sources() const; + + static CallModel<>* getModel(); + friend class SFLPhoneService; + + protected: + bool sourceRequestEvent(const QString& name); + bool updateSourceEvent(const QString& source); + + private: + QHash<QString, HashStringString > historyCall ; + QHash<QString, HashStringString > currentCall ; + QHash<QString, QStringList> currentConferences ; + static CallModel<>* m_pModel ; + ContactHash m_hContacts ; + QString getCallStateName(call_state state); + void updateHistory (); + void updateCallList (); + void updateAccounts (); + void updateConferenceList (); + void updateContacts (); + void updateBookmarkList (); + void updateInfo(); + void generateNumberList(QString name); + private slots: + void updateCollection(); + void callStateChangedSignal (Call* call); + void incomingCallSignal (Call* conf); + void conferenceCreatedSignal (Call* conf); + void conferenceChangedSignal (Call* conf); + //void conferenceRemovedSignal(const QString& confId); + void incomingMessageSignal( const QString& accountId, const QString& message ); + void voiceMailNotifySignal( const QString& accountId, int count ); + void accountChanged(); +}; + +#endif // SFLPHONEENGINE_H diff --git a/kde/src/klib/dataengine/sflphone.operations b/kde/src/klib/dataengine/sflphone.operations new file mode 100644 index 0000000000..95f487988c --- /dev/null +++ b/kde/src/klib/dataengine/sflphone.operations @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE kcfg SYSTEM + "http://www.kde.org/standards/kcfg/1.0/kcfg.xsd"> +<kcfg> + <group name="Call"> + <entry name="AccountId" type="String"> + <label>Account id to make this call</label> + </entry> + <entry name="Number" type="String"> + <label>Number to call</label> + </entry> + </group> + <group name="DMTF"> + <entry name="str" type="String"> + <label>Right sound for a key</label> + </entry> + </group> + <group name="Transfer"> + <entry name="callid" type="String"> + <label>A valid call identifier number</label> + </entry> + <entry name="transfernumber" type="String"> + <label>Number to transfer too</label> + </entry> + </group> + <group name="Hangup"> + <entry name="callid" type="String"> + <label>A valid call identifier number</label> + </entry> + </group> + <group name="Hold"> + <entry name="callid" type="String"> + <label>A valid call identifier number</label> + </entry> + </group> + <group name="Record"> + <entry name="callid" type="String"> + <label>A valid call identifier number</label> + </entry> + </group> +</kcfg> diff --git a/kde/src/klib/dataengine/sflphoneService.cpp b/kde/src/klib/dataengine/sflphoneService.cpp new file mode 100644 index 0000000000..5452f05977 --- /dev/null +++ b/kde/src/klib/dataengine/sflphoneService.cpp @@ -0,0 +1,58 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#include "sflphoneService.h" + +#include "../../lib/Call.h" + +SFLPhoneService::SFLPhoneService(SFLPhoneEngine *engine) + +{ + m_engine = engine; + setName("sflphone"); +} + +ServiceJob *SFLPhoneService::createJob(const QString &operation, QMap<QString, QVariant> ¶meters) +{ + if (!m_engine) { + return 0; + } + + if (operation == "Call") { + return new CallJob(this, operation,parameters); + } + else if (operation == "DMTF") { + return new DTMFJob(this, operation,parameters); + } + else if (operation == "Transfer") { + return new TransferJob(this, operation,parameters); + } + else if (operation == "Hangup") { + return new HangUpJob(this, operation,parameters); + } + else if (operation == "Hold") { + return new HoldJob(this, operation,parameters); + } + else if (operation == "Record") { + return new RecordJob(this, operation,parameters); + } + m_engine->setData(operation, parameters["query"]); + return 0; +} \ No newline at end of file diff --git a/kde/src/klib/dataengine/sflphoneService.h b/kde/src/klib/dataengine/sflphoneService.h new file mode 100644 index 0000000000..22c5d4295e --- /dev/null +++ b/kde/src/klib/dataengine/sflphoneService.h @@ -0,0 +1,166 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + +#ifndef SFLPHONE_SERVICE_H +#define SFLPHONE_SERVICE_H + +#include "sflphonEngine.h" + +#include <Plasma/Service> +#include <Plasma/ServiceJob> + +#include "../../lib/Call.h" +#include "../../lib/CallModel.h" + +using namespace Plasma; + +class SFLPhoneService : public Plasma::Service +{ + Q_OBJECT + +public: + SFLPhoneService(SFLPhoneEngine *engine); + ServiceJob *createJob(const QString &operation, QMap<QString, QVariant> ¶meters); + +private: + SFLPhoneEngine *m_engine; + +}; + +class CallJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + CallJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_AccountId ( parameters[ "AccountId" ].toString() ) + , m_Number ( parameters[ "Number" ].toString() ) + {} + + void start() + { + Call* call = SFLPhoneEngine::getModel()->addDialingCall(m_Number,m_AccountId); + call->setCallNumber(m_Number); + call->actionPerformed(CALL_ACTION_ACCEPT); + } + +private: + QString m_AccountId; + QString m_Number; +}; + +class DTMFJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + DTMFJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_mStr( parameters[ "str" ].toString() ) + {} + + void start() + { + CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); + callManager.playDTMF(m_mStr); + } +private: + QString m_mStr; +}; + +class HangUpJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + HangUpJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_CallId( parameters[ "callid" ].toString() ) + {} + + void start() + { + Call* call = SFLPhoneEngine::getModel()->getCall(m_CallId); + call->actionPerformed(CALL_ACTION_REFUSE); + call->changeCurrentState(CALL_STATE_OVER); + } +private: + QString m_CallId; +}; + +class TransferJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + TransferJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_CallId ( parameters[ "callid" ].toString() ) + , m_transferNumber ( parameters[ "transfernumber" ].toString() ) + {} + + void start() + { + Call* call = SFLPhoneEngine::getModel()->getCall(m_CallId); + call->setTransferNumber(m_transferNumber); + call->changeCurrentState(CALL_STATE_TRANSFER); + call->actionPerformed(CALL_ACTION_ACCEPT); + call->changeCurrentState(CALL_STATE_OVER); + } +private: + QString m_CallId; + QString m_transferNumber; +}; + +class HoldJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + HoldJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_CallId ( parameters[ "callid" ].toString() ) + {} + + void start() + { + Call* call = SFLPhoneEngine::getModel()->getCall(m_CallId); + call->actionPerformed(CALL_ACTION_HOLD); + } +private: + QString m_CallId; +}; + +class RecordJob : public Plasma::ServiceJob +{ + Q_OBJECT +public: + RecordJob(QObject* parent, const QString& operation, const QVariantMap& parameters = QVariantMap()) + : Plasma::ServiceJob("", operation, parameters, parent) + , m_CallId ( parameters[ "callid" ].toString() ) + {} + + void start() + { + Call* call = SFLPhoneEngine::getModel()->getCall(m_CallId); + call->actionPerformed(CALL_ACTION_RECORD); + } +private: + QString m_CallId; +}; + + +#endif //SFLPHONE_SERVICE_H diff --git a/kde/src/conf/kcfg_settings.kcfgc b/kde/src/klib/kcfg_settings.kcfgc similarity index 61% rename from kde/src/conf/kcfg_settings.kcfgc rename to kde/src/klib/kcfg_settings.kcfgc index b14ca1863f..d64e6e44c5 100755 --- a/kde/src/conf/kcfg_settings.kcfgc +++ b/kde/src/klib/kcfg_settings.kcfgc @@ -3,3 +3,5 @@ File=sflphone-client-kde.kcfg ClassName=ConfigurationSkeletonBase Singleton=true Mutators=true +Visibility=LIB_EXPORT +IncludeFiles=\"../src/lib/typedefs.h\" \ No newline at end of file diff --git a/kde/src/klib/sflphone-client-kde.kcfg b/kde/src/klib/sflphone-client-kde.kcfg new file mode 100755 index 0000000000..49256a578f --- /dev/null +++ b/kde/src/klib/sflphone-client-kde.kcfg @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd"> +<kcfg> + <kcfgfile/> + <group name="main"> + + <!-- General Settings --> + + <entry name="SIPPort" type="Int"> + <label>Defines the port that will be used for SIP communication.</label> + <min> 1025 </min> + <max> 65536 </max> + <default> 1025 </default> + </entry> + <entry name="enableHistory" type="Bool"> + <label>Defines whether sflphone should keep a history of calls.</label> + </entry> + <entry name="historyMax" type="Int"> + <label>Defines the number of days the history has to be kept.</label> + <min> 1 </min> + <max> 99 </max> + <default> 30 </default> + </entry> + + <!-- Display Settings --> + + <entry name="notifOnCalls" type="Bool"> + <label>Defines whether user should be notified when receiving a call.</label> + <default>true</default> + </entry> + <entry name="notifOnMessages" type="Bool"> + <label>Defines whether user should be notified when receiving a message.</label> + <default>true</default> + </entry> + <entry name="displayOnStart" type="Bool"> + <label>Defines whether the main window should be displayed on start.</label> + <default>true</default> + </entry> + <entry name="displayOnCalls" type="Bool"> + <label>Defines whether the main window should be displayed when receiving a message.</label> + <default>true</default> + </entry> + <entry name="displayDialpad" type="Bool"> + <label>Defines whether the dialpad is being shown by default</label> + <default>true</default> + </entry> + <entry name="displayMessageBox" type="Bool"> + <label>Defines whether the text message box is visible</label> + <default>false</default> + </entry> + <entry name="displayVolume" type="Bool"> + <label>Defines whether the volume widgets are visible by default</label> + <default>false</default> + </entry> + <entry name="displayMenu" type="Bool"> + <label>Defines whether the main menu is visible by default, it can be restored with "Ctrl+m"</label> + </entry> + <entry name="displayDataRange" type="Bool"> + <label>Defines whether call history is restricted to a specific date range</label> + </entry> + <entry name="displayPopularAsBookmark" type="Bool"> + <label>Defines whether or not to display the 10 most popular phone number as bookmark automagically</label> + </entry> + <entry name="historySortMode" type="Int"> + <label>Define sorting order for history list</label> + </entry> + <entry name="contactSortMode" type="Int"> + <label>Define sorting order for contact list</label> + </entry> + <entry name="displayContactCallHistory" type="Bool"> + <label>Defines if the individual contact history list is visible</label> + </entry> + + + <!-- Audio Settings --> + + <entry name="interface" type="Enum"> + <label>Defines the Stun server to use.</label> + <choices> + <choice name="ALSA" /> + <choice name="PulseAudio" /> + </choices> + </entry> + <entry name="enableRingtones" type="Bool"> + <label>Defines whether ringtones are enabled.</label> + </entry> + <entry name="ringtone" type="Path"> + <label>Defines which ringtone is used.</label> + </entry> + <entry name="alsaPlugin" type="String"> + <label>Defines which ALSA plugin to use.</label> + </entry> + <entry name="alsaInputDevice" type="Int"> + <label>Defines which ALSA Input device to use.</label> + </entry> + <entry name="alsaOutputDevice" type="Int"> + <label>Defines which ALSA Output device to use.</label> + </entry> + <entry name="pulseAudioVolumeAlter" type="Bool"> + <label>Defines whether pulse audio can mute other applications during a call.</label> + </entry> + + <!-- Address Book Settings --> + + <entry name="enableAddressBook" type="Bool"> + <label>Defines whether the search in KDE Address Book is enabled</label> + </entry> + + <entry name="phoneTypeList" type="StringList"> + <label>Defines whether the search in KDE Address Book is enabled</label> + <default>{Work,Home,Messenger,Prefered number,Voice,Mobile,Work,Video,Mailbox,Modem,Car,ISDN,PCS,Pager,Other...,Work}</default> + </entry> + + <!-- Bookmark --> + <entry name="bookmarkList" type="StringList"> + <label>List of bookmarked clients</label> + </entry> + + <!-- Hooks Settings --> + + <entry name="enableHooksSIP" type="Bool"> + <label>Defines whether to enable hooks for SIP accounts.</label> + </entry> + <entry name="enableHooksIAX" type="Bool"> + <label>Defines whether to enable hooks for IAX accounts.</label> + </entry> + <entry name="hooksSIPHeader" type="String"> + <label>Defines which header to catch for SIP accounts hooks.</label> + </entry> + <entry name="hooksCommand" type="String"> + <label>Defines which command to execute.</label> + </entry> + <entry name="addPrefix" type="Bool"> + <label>Defines whether to add a prefix for outgoing calls.</label> + </entry> + <entry name="prepend" type="String"> + <label>Defines the prefix to add.</label> + </entry> + </group> +</kcfg> diff --git a/kde/src/lib/Account.cpp b/kde/src/lib/Account.cpp index 2bd6e0e9d4..c93064db62 100644 --- a/kde/src/lib/Account.cpp +++ b/kde/src/lib/Account.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "Account.h" @@ -86,6 +85,12 @@ Account* Account::buildExistingAccountFromId(const QString& _accountId) return NULL; } a->m_pAccountDetails = aDetails; + + //Enable for debug + // foreach (QString str, *aDetails) { + // qDebug() << aDetails->key(str) << str; + // } + return a; } @@ -152,6 +157,10 @@ const QString& Account::getAccountDetail(const QString& param) const } if (m_pAccountDetails->find(param) != m_pAccountDetails->end()) return (*m_pAccountDetails)[param]; + else if (m_pAccountDetails->count() > 0) { + qDebug() << "Account paramater \"" << param << "\" not found"; + return EMPTY_STRING; + } else { qDebug() << "Account details not found, there is " << m_pAccountDetails->count() << " details available"; return EMPTY_STRING; @@ -167,13 +176,13 @@ const QString& Account::getAlias() const ///Is this account enabled bool Account::isEnabled() const { - return (getAccountDetail(ACCOUNT_ENABLED) == ACCOUNT_ENABLED_TRUE); + return (getAccountDetail(ACCOUNT_ENABLED) == REGISTRATION_ENABLED_TRUE); } ///Is this account registered bool Account::isRegistered() const { - return (getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED); + return (getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED); } @@ -207,7 +216,7 @@ void Account::setAccountId(const QString& id) ///Set account enabled void Account::setEnabled(bool checked) { - setAccountDetail(ACCOUNT_ENABLED, checked ? ACCOUNT_ENABLED_TRUE : ACCOUNT_ENABLED_FALSE); + setAccountDetail(ACCOUNT_ENABLED, checked ? REGISTRATION_ENABLED_TRUE : REGISTRATION_ENABLED_FALSE); } /***************************************************************************** @@ -222,8 +231,8 @@ void Account::updateState() if(! isNew()) { ConfigurationManagerInterface & configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); MapStringString details = configurationManager.getAccountDetails(getAccountId()).value(); - QString status = details[ACCOUNT_STATUS]; - setAccountDetail(ACCOUNT_STATUS, status); //Update -internal- object state + QString status = details[ACCOUNT_REGISTRATION_STATUS]; + setAccountDetail(ACCOUNT_REGISTRATION_STATUS, status); //Update -internal- object state } } diff --git a/kde/src/lib/Account.h b/kde/src/lib/Account.h index a746dae223..0ed07591e3 100644 --- a/kde/src/lib/Account.h +++ b/kde/src/lib/Account.h @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef ACCOUNT_H #define ACCOUNT_H diff --git a/kde/src/lib/AccountList.cpp b/kde/src/lib/AccountList.cpp index 8a99b6b899..070ff71f02 100644 --- a/kde/src/lib/AccountList.cpp +++ b/kde/src/lib/AccountList.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "AccountList.h" @@ -143,7 +142,7 @@ QVector<Account*> AccountList::getAccountsByState(const QString& state) { QVector<Account *> v; for (int i = 0; i < m_pAccounts->size(); ++i) { - if ((*m_pAccounts)[i]->getAccountDetail(ACCOUNT_STATUS) == state) + if ((*m_pAccounts)[i]->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == state) v += (*m_pAccounts)[i]; } return v; @@ -157,7 +156,7 @@ QVector<Account*> AccountList::registeredAccounts() const Account* current; for (int i = 0; i < m_pAccounts->count(); ++i) { current = (*m_pAccounts)[i]; - if(current->getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED) { + if(current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED) { qDebug() << current->getAlias() << " : " << current; registeredAccounts.append(current); } @@ -171,11 +170,11 @@ Account* AccountList::firstRegisteredAccount() const Account* current; for (int i = 0; i < m_pAccounts->count(); ++i) { current = (*m_pAccounts)[i]; - if(current && current->getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED) { + if(current && current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED) { return current; } else { - qDebug() << "Account " << current->getAccountId() << " is not registered (" << current->getAccountDetail(ACCOUNT_STATUS) << ")"; + qDebug() << "Account " << ((current)?current->getAccountId():"") << " is not registered (" << ((current)?current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS):"") << ") State:" << ((current)?current->getAccountDetail(ACCOUNT_REGISTRATION_STATUS):""); } } return NULL; diff --git a/kde/src/lib/AccountList.h b/kde/src/lib/AccountList.h index 68f995b08d..e0c5aac0a2 100644 --- a/kde/src/lib/AccountList.h +++ b/kde/src/lib/AccountList.h @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef ACCOUNT_LIST_H #define ACCOUNT_LIST_H @@ -70,5 +69,4 @@ signals: void accountListUpdated(); }; - #endif diff --git a/kde/src/lib/CMakeLists.txt b/kde/src/lib/CMakeLists.txt index c2fa10571e..3db06e4622 100644 --- a/kde/src/lib/CMakeLists.txt +++ b/kde/src/lib/CMakeLists.txt @@ -1,5 +1,8 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +ADD_DEFINITIONS("-std=c++0x") +# ADD_DEFINITIONS("-std=c++0x") + ADD_DEFINITIONS( ${QT_DEFINITIONS} -fexceptions @@ -17,7 +20,7 @@ FIND_PACKAGE ( Qt4 REQUIRED ) INCLUDE ( KDE4Defaults ) -set(GENERIC_LIB_VERSION "1.0.2") +set(GENERIC_LIB_VERSION "1.1.0") INCLUDE_DIRECTORIES ( ${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/kde/src/lib/COPYING b/kde/src/lib/COPYING new file mode 100644 index 0000000000..36f86cca55 --- /dev/null +++ b/kde/src/lib/COPYING @@ -0,0 +1,138 @@ +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/kde/src/lib/Call.cpp b/kde/src/lib/Call.cpp index 7504e8e0ec..fed5b54aee 100644 --- a/kde/src/lib/Call.cpp +++ b/kde/src/lib/Call.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "Call.h" @@ -313,7 +312,7 @@ daemon_call_state Call::toDaemonCallState(const QString & stateName) QString Call::getStopTimeStamp() const { if (m_pStopTime == NULL) - return QString(); + return QString("0"); return QString::number(m_pStopTime->toTime_t()); } @@ -321,7 +320,7 @@ QString Call::getStopTimeStamp() const QString Call::getStartTimeStamp() const { if (m_pStartTime == NULL) - return QString(); + return QString("0"); return QString::number(m_pStartTime->toTime_t()); } @@ -385,6 +384,12 @@ const QString& Call::getConfId() const return m_ConfId; } +///Get the recording path +const QString& Call::getRecordingPath() const +{ + return m_RecordingPath; +} + ///Get the current codec QString Call::getCurrentCodecName() const { @@ -459,6 +464,18 @@ void Call::setConfId(QString value) m_ConfId = value; } +///Set the recording path +void Call::setRecordingPath(const QString& path) +{ + m_RecordingPath = path; +} + +///Set peer name +void Call::setPeerName(const QString& name) +{ + m_PeerName = name; +} + /***************************************************************************** * * * Mutator * @@ -523,6 +540,11 @@ void Call::changeCurrentState(call_state newState) emit isOver(this); } +void Call::sendTextMessage(QString message) +{ + CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); + callManager.sendTextMessage(m_CallId,message); +} /***************************************************************************** * * @@ -608,7 +630,7 @@ void Call::call() qDebug() << "account = " << m_Account; if(m_Account.isEmpty()) { qDebug() << "Account is not set, taking the first registered."; - this->m_Account = CallModelConvenience::getCurrentAccountId(); + this->m_Account = CallModel<>::getCurrentAccountId(); } if(!m_Account.isEmpty()) { qDebug() << "Calling " << m_CallNumber << " with account " << m_Account << ". callId : " << m_CallId; diff --git a/kde/src/lib/Call.h b/kde/src/lib/Call.h index 8e475dbcdf..af85777562 100644 --- a/kde/src/lib/Call.h +++ b/kde/src/lib/Call.h @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef CALL_H @@ -151,21 +150,25 @@ public: const QString& getConfId () const; const QString& getTransferNumber () const; const QString& getCallNumber () const; + const QString& getRecordingPath () const; //Automated function call_state stateChanged(const QString & newState); call_state actionPerformed(call_action action); //Setters - void setConference(bool value); - void setConfId(QString value); - void setTransferNumber(const QString& number); - void setCallNumber(const QString& number); + void setConference ( bool value ); + void setConfId ( QString value ); + void setTransferNumber ( const QString& number ); + void setCallNumber ( const QString& number ); + void setRecordingPath ( const QString& path ); + void setPeerName ( const QString& name ); //Mutators void appendText(const QString& str); void backspaceItemText(); void changeCurrentState(call_state newState); + void sendTextMessage(QString message); private: @@ -175,6 +178,7 @@ private: QString m_ConfId ; QString m_PeerPhoneNumber; QString m_PeerName ; + QString m_RecordingPath ; history_state m_HistoryState ; QDateTime* m_pStartTime ; QDateTime* m_pStopTime ; diff --git a/kde/src/lib/CallModel.cpp b/kde/src/lib/CallModel.cpp index 66c37d1f39..c58837239d 100644 --- a/kde/src/lib/CallModel.cpp +++ b/kde/src/lib/CallModel.cpp @@ -1,22 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + //Parent #include <CallModel.h> @@ -60,9 +61,14 @@ void CallModelBase::on1_callStateChanged(const QString &callID, const QString &s qDebug() << "Call found" << call; call->stateChanged(state); } - //updateWindowCallState(); //NEED_PORT + + if (call->getCurrentState() == CALL_STATE_OVER) { + addToHistory(call); + emit historyChanged(); + } + emit callStateChanged(call); - + } void CallModelBase::on1_incomingCall(const QString & accountID, const QString & callID) @@ -91,7 +97,7 @@ void CallModelBase::on1_changingConference(const QString &confID, const QString { Call* conf = getCall(confID); qDebug() << "Changing conference state" << conf << confID; - if (conf) { + if (conf && dynamic_cast<Call*>(conf)) { //Prevent a race condition between call and conference changeConference(confID, state); emit conferenceChanged(conf); } @@ -130,4 +136,4 @@ Call* CallModelBase::addCall(Call* call, Call* parent) return call; } -//More code in CallModel.hpp \ No newline at end of file +//More code in CallModel.hpp diff --git a/kde/src/lib/CallModel.h b/kde/src/lib/CallModel.h index 608af376d0..1002aff3bb 100644 --- a/kde/src/lib/CallModel.h +++ b/kde/src/lib/CallModel.h @@ -1,29 +1,31 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef CALL_MODEL_H #define CALL_MODEL_H #include <QObject> #include <QVector> -#include <QHash> +#include <QWidget> +#include <QModelIndex> +#include <QMap> #include "typedefs.h" //Qt @@ -37,11 +39,11 @@ class AccountList; class Account; class ContactBackend; -typedef QHash<QString, Call*> CallHash; +typedef QMap<QString, Call*> CallMap; typedef QList<Call*> CallList; ///@class CallModelBase Base class for the central model/frontend -///This class need to exist because template classes can't have signals ans +///This class need to exist because template classes can't have signals and ///slots because Qt MOC generator can't guess the type at precompilation class LIB_EXPORT CallModelBase : public QObject { @@ -54,6 +56,7 @@ public: virtual Call* findCallByCallId ( const QString& callId ) = 0; virtual Call* addRingingCall ( const QString& callId ) = 0; virtual Call* addIncomingCall ( const QString& callId ) = 0; + virtual void addToHistory ( Call* call ) = 0; virtual Call* addCall ( Call* call , Call* parent =0 ); virtual Call* getCall ( const QString& callId ) const = 0; public slots: @@ -67,24 +70,25 @@ public slots: private: static bool dbusInit; signals: - void callStateChanged (Call* call ); - void incomingCall (Call* call ); - void conferenceCreated (Call* conf ); - void conferenceChanged (Call* conf ); - void conferenceRemoved (const QString& confId ); - void aboutToRemoveConference (Call* conf ); - void voiceMailNotify (const QString& accountID , int count ); - void volumeChanged (const QString& device , double value ); - void callAdded (Call* call , Call* parent ); + void callStateChanged ( Call* call ); + void incomingCall ( Call* call ); + void conferenceCreated ( Call* conf ); + void conferenceChanged ( Call* conf ); + void conferenceRemoved ( const QString& confId ); + void aboutToRemoveConference ( Call* conf ); + void voiceMailNotify ( const QString& accountID , int count ); + void volumeChanged ( const QString& device , double value ); + void callAdded ( Call* call , Call* parent ); + void historyChanged ( ); }; /** - * Note from the author: It was previously done by a QAbstractModel + QTreeView, but the sip-call use case is incompatible - * with the MVC model. The MVC never got to a point were it was bug-free and the code was getting dirty. The Mirror model - * solution may be less "clean" than MVC, but is 3 time smaller and easier to improve (in fact, possible to improve). + * Note from the author: It was previously done by a QAbstractModel + QTreeView, but the sip-call use case is incompatible + * with the MVC model. The MVC never got to a point were it was bug-free and the code was getting dirty. The Mirror model + * solution may be less "clean" than MVC, but is 3 time smaller and easier to improve (in fact, possible to improve). */ ///@class CallModel Central model/frontend to deal with sflphoned -template <typename CallWidget, typename Index> +template <typename CallWidget = QWidget*, typename Index = QModelIndex*> class LIB_EXPORT CallModel : public CallModelBase { public: enum ModelType { @@ -109,7 +113,8 @@ class LIB_EXPORT CallModel : public CallModelBase { void removeCall ( Call* call ); void attendedTransfer ( Call* toTransfer , Call* target ); void transfer ( Call* toTransfer , QString target ); - + void addToHistory ( Call* call ); + virtual bool selectItem(Call* item) { Q_UNUSED(item); return false;} //Comference related @@ -123,10 +128,11 @@ class LIB_EXPORT CallModel : public CallModelBase { void removeConference ( Call* call ); //Getters - int size (); - CallList getCallList (); - static const CallHash& getHistory (); - static const QStringList getHistoryCallId (); + int size (); + CallList getCallList (); + static const CallMap& getHistory (); + static const QStringList getNumbersByPopularity (); + static const QStringList getHistoryCallId (); //Account related static Account* getCurrentAccount ( ); @@ -137,7 +143,7 @@ class LIB_EXPORT CallModel : public CallModelBase { //Connection related static bool init(); - + //Magic dispatcher Call* findCallByCallId( const QString& callId ); CallList getCalls ( ); @@ -145,41 +151,41 @@ class LIB_EXPORT CallModel : public CallModelBase { CallList getCalls ( const QString& callId ) const; CallList getCalls ( const Call* call ) const; CallList getCalls ( const Index idx ) const; - + bool isConference ( const Call* call ) const; bool isConference ( const QString& callId ) const; bool isConference ( const Index idx ) const; bool isConference ( const CallWidget widget ) const; - + Call* getCall ( const QString& callId ) const; Call* getCall ( const Index idx ) const; Call* getCall ( const Call* call ) const; Call* getCall ( const CallWidget widget ) const; - + Index getIndex ( const Call* call ) const; Index getIndex ( const Index idx ) const; Index getIndex ( const CallWidget widget ) const; Index getIndex ( const QString& callId ) const; - + CallWidget getWidget ( const Call* call ) const; CallWidget getWidget ( const Index idx ) const; CallWidget getWidget ( const CallWidget widget ) const; CallWidget getWidget ( const QString& getWidget) const; - + bool updateIndex ( Call* call, Index value ); bool updateWidget ( Call* call, CallWidget value ); - - + + protected: //Struct struct InternalStruct; typedef QList<InternalStruct*> InternalCallList; struct InternalStruct { - CallWidget call ; - Call* call_real ; - Index index ; - InternalCallList children ; - bool conference ; + CallWidget call ; + Call* call_real ; + Index index ; + InternalCallList children ; + bool conference ; }; typedef QHash< Call* , InternalStruct* > InternalCall ; typedef QHash< QString , InternalStruct* > InternalCallId; @@ -187,14 +193,14 @@ class LIB_EXPORT CallModel : public CallModelBase { typedef QHash< Index , InternalStruct* > InternalIndex ; //Static attributes - static CallHash m_sActiveCalls ; - static CallHash m_sHistoryCalls; - + static CallMap m_sActiveCalls ; + static CallMap m_sHistoryCalls; + static InternalCall m_sPrivateCallList_call ; static InternalCallId m_sPrivateCallList_callId; static InternalWidget m_sPrivateCallList_widget; static InternalIndex m_sPrivateCallList_index ; - + static QString m_sPriorAccountId; static AccountList* m_spAccountList ; static bool m_sCallInit ; @@ -208,11 +214,11 @@ class LIB_EXPORT CallModel : public CallModelBase { bool updateCommon (Call* call); }; -class CallModelConvenience : public CallModel<QWidget*,QModelIndex*> +/*class CallModelConvenience : public CallModel<QWidget*,QModelIndex*> { public: CallModelConvenience(ModelType type) : CallModel<QWidget*,QModelIndex*>(type) {} -}; +};*/ #include "CallModel.hpp" diff --git a/kde/src/lib/CallModel.hpp b/kde/src/lib/CallModel.hpp index f19081c5a5..298967b339 100644 --- a/kde/src/lib/CallModel.hpp +++ b/kde/src/lib/CallModel.hpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Qt #include <QtCore/QHash> @@ -38,20 +37,45 @@ //System #include "unistd.h" +//Define +#define CALLMODEL_TEMPLATE template<typename CallWidget, typename Index> +#define CALLMODEL_T CallModel<CallWidget,Index> + //Static member -template <typename CallWidget, typename Index> QString CallModel<CallWidget,Index>::m_sPriorAccountId = "" ; -template <typename CallWidget, typename Index> AccountList* CallModel<CallWidget,Index>::m_spAccountList = 0 ; -template <typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::m_sInstanceInit = false ; -template <typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::m_sCallInit = false ; -template <typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::m_sHistoryInit = false ; +CALLMODEL_TEMPLATE QString CALLMODEL_T::m_sPriorAccountId = "" ; +CALLMODEL_TEMPLATE AccountList* CALLMODEL_T::m_spAccountList = 0 ; +CALLMODEL_TEMPLATE bool CALLMODEL_T::m_sInstanceInit = false ; +CALLMODEL_TEMPLATE bool CALLMODEL_T::m_sCallInit = false ; +CALLMODEL_TEMPLATE bool CALLMODEL_T::m_sHistoryInit = false ; + +CALLMODEL_TEMPLATE CallMap CALLMODEL_T::m_sActiveCalls ; +CALLMODEL_TEMPLATE CallMap CALLMODEL_T::m_sHistoryCalls ; + +CALLMODEL_TEMPLATE typename CALLMODEL_T::InternalCall CALLMODEL_T::m_sPrivateCallList_call ; +CALLMODEL_TEMPLATE typename CALLMODEL_T::InternalCallId CALLMODEL_T::m_sPrivateCallList_callId ; +CALLMODEL_TEMPLATE typename CALLMODEL_T::InternalIndex CALLMODEL_T::m_sPrivateCallList_index ; +CALLMODEL_TEMPLATE typename CALLMODEL_T::InternalWidget CALLMODEL_T::m_sPrivateCallList_widget ; + +/***************************************************************************** + * * + * Private classes * + * * + ****************************************************************************/ +class SortableCallSource { +public: + SortableCallSource(Call* call=0) : count(0),callInfo(call) {} + uint count; + Call* callInfo; + bool operator<(SortableCallSource other) { + return (other.count > count); + } +}; -template <typename CallWidget, typename Index> QHash<QString, Call*> CallModel<CallWidget,Index>::m_sActiveCalls ; -template <typename CallWidget, typename Index> QHash<QString, Call*> CallModel<CallWidget,Index>::m_sHistoryCalls ; +inline bool operator< (const SortableCallSource & s1, const SortableCallSource & s2) +{ + return s1.count < s2.count; +} -template <typename CallWidget, typename Index> typename CallModel<CallWidget,Index>::InternalCall CallModel<CallWidget,Index>::m_sPrivateCallList_call ; -template <typename CallWidget, typename Index> typename CallModel<CallWidget,Index>::InternalCallId CallModel<CallWidget,Index>::m_sPrivateCallList_callId ; -template <typename CallWidget, typename Index> typename CallModel<CallWidget,Index>::InternalIndex CallModel<CallWidget,Index>::m_sPrivateCallList_index ; -template <typename CallWidget, typename Index> typename CallModel<CallWidget,Index>::InternalWidget CallModel<CallWidget,Index>::m_sPrivateCallList_widget ; /***************************************************************************** * * @@ -60,7 +84,7 @@ template <typename CallWidget, typename Index> typename CallModel<CallWidget,In ****************************************************************************/ ///Retrieve current and older calls from the daemon, fill history and the calls TreeView and enable drag n' drop -template<typename CallWidget, typename Index> CallModel<CallWidget,Index>::CallModel(ModelType type) : CallModelBase(0) +CALLMODEL_TEMPLATE CALLMODEL_T::CallModel(ModelType type) : CallModelBase(0) { Q_UNUSED(type) init(); @@ -68,16 +92,16 @@ template<typename CallWidget, typename Index> CallModel<CallWidget,Index>::CallM } ///Open the connection to the daemon and register this client -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::init() +CALLMODEL_TEMPLATE bool CALLMODEL_T::init() { if (!m_sInstanceInit) { registerCommTypes(); InstanceInterface& instance = InstanceInterfaceSingleton::getInstance(); instance.Register(getpid(), APP_NAME); - + //Setup accounts if (m_spAccountList == NULL) - m_spAccountList = new AccountList(true); + m_spAccountList = new AccountList(true); } m_sInstanceInit = true; return true; @@ -85,7 +109,7 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: ///Fill the call list ///@warning This solution wont scale to multiple call or history model implementation. Some static addCall + foreach for each call would be needed if this case ever become unavoidable -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::initCall() +CALLMODEL_TEMPLATE bool CALLMODEL_T::initCall() { if (!m_sCallInit) { CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); @@ -95,7 +119,7 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: m_sActiveCalls[tmpCall->getCallId()] = tmpCall; addCall(tmpCall); } - + QStringList confList = callManager.getConferenceList(); foreach (QString confId, confList) { addConference(confId); @@ -106,36 +130,36 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Set how the call can find more informations about the call it receive -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::initContact ( ContactBackend* be ) +CALLMODEL_TEMPLATE void CALLMODEL_T::initContact ( ContactBackend* be ) { Call::setContactBackend(be); } ///Fill the history list ///@warning This solution wont scale to multiple call or history model implementation. Some static addCall + foreach for each call would be needed if this case ever become unavoidable -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::initHistory() +CALLMODEL_TEMPLATE bool CALLMODEL_T::initHistory() { if (!m_sHistoryInit) { ConfigurationManagerInterface& configurationManager = ConfigurationManagerInterfaceSingleton::getInstance(); - QStringList historyMap = configurationManager.getHistory().value(); - foreach (QString historyCallId, historyMap) { - QStringList param = historyCallId.split("|"); - if (param.count() <= 10) { - //If this ever change, look at the gnome client - QString history_state = param[0]; - QString peer_number = param[1]; - QString peer_name = param[2]; - QString time_start = param[3]; - QString time_stop = param[4]; - QString callID = param[5]; - QString accountID = param[6]; - QString recordfile = param[7]; - QString confID = param[8]; - QString time_added = param[9]; - m_sHistoryCalls[time_start] = Call::buildHistoryCall(callID, time_start.toUInt(), time_stop.toUInt(), accountID, peer_name, peer_number, history_state); - addCall(m_sHistoryCalls[time_start]); + QVector< QMap<QString, QString> > history = configurationManager.getHistory(); + foreach (MapStringString hc, history) { + Call* pastCall = Call::buildHistoryCall( + hc[ CALLID_KEY ] , + hc[ TIMESTAMP_START_KEY ].toUInt(), + hc[ TIMESTAMP_STOP_KEY ].toUInt(), + hc[ ACCOUNT_ID_KEY ] , + hc[ DISPLAY_NAME_KEY ] , + hc[ PEER_NUMBER_KEY ] , + hc[ STATE_KEY ] + ); + if (pastCall->getPeerName().isEmpty()) { + pastCall->setPeerName("Unknow"); } + pastCall->setRecordingPath(hc[ RECORDING_PATH_KEY ]); + m_sHistoryCalls[ hc[TIMESTAMP_START_KEY ]] = pastCall; + addCall(pastCall); } + qDebug() << "There is " << m_sHistoryCalls.count() << "in history"; } m_sHistoryInit = true; return true; @@ -149,19 +173,19 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: ****************************************************************************/ ///Return the active call count -template<typename CallWidget, typename Index> int CallModel<CallWidget,Index>::size() +CALLMODEL_TEMPLATE int CALLMODEL_T::size() { return m_sActiveCalls.size(); } ///Return a call corresponding to this ID or NULL -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::findCallByCallId(const QString& callId) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::findCallByCallId(const QString& callId) { return m_sActiveCalls[callId]; } ///Return the action call list -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCallList() +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCallList() { QList<Call*> callList; foreach(Call* call, m_sActiveCalls) { @@ -178,13 +202,16 @@ template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget, ****************************************************************************/ ///Add a call in the model structure, the call must exist before being added to the model -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addCall(Call* call, Call* parent) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addCall(Call* call, Call* parent) { Q_UNUSED(parent) + if (!call) + return new Call("",""); //Invalid, but better than managing NULL everywhere + InternalStruct* aNewStruct = new InternalStruct; aNewStruct->call_real = call; aNewStruct->conference = false; - + m_sPrivateCallList_call[call] = aNewStruct; m_sPrivateCallList_callId[call->getCallId()] = aNewStruct; @@ -194,7 +221,7 @@ template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>: } ///Common set of instruction shared by all call adder -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addCallCommon(Call* call) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addCallCommon(Call* call) { m_sActiveCalls[call->getCallId()] = call; addCall(call); @@ -203,33 +230,33 @@ template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>: } ///Create a new dialing call from peer name and the account ID -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addDialingCall(const QString& peerName, QString account) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addDialingCall(const QString& peerName, QString account) { QString account2 = account; if (account2.isEmpty()) { account2 = getCurrentAccountId(); } - + Call* call = Call::buildDialingCall(generateCallId(), peerName, account2); return addCallCommon(call); } ///Create a new incomming call when the daemon is being called -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addIncomingCall(const QString& callId) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addIncomingCall(const QString& callId) { Call* call = Call::buildIncomingCall(callId); return addCallCommon(call); } ///Create a ringing call -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addRingingCall(const QString& callId) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addRingingCall(const QString& callId) { Call* call = Call::buildRingingCall(callId); return addCallCommon(call); } ///Generate a new random call unique identifier (callId) -template<typename CallWidget, typename Index> QString CallModel<CallWidget,Index>::generateCallId() +CALLMODEL_TEMPLATE QString CALLMODEL_T::generateCallId() { int id = qrand(); QString res = QString::number(id); @@ -237,7 +264,7 @@ template<typename CallWidget, typename Index> QString CallModel<CallWidget,Index } ///Remove a call and update the internal structure -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::removeCall(Call* call) +CALLMODEL_TEMPLATE void CALLMODEL_T::removeCall(Call* call) { InternalStruct* internal = m_sPrivateCallList_call[call]; @@ -264,7 +291,7 @@ template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>:: } ///Transfer "toTransfer" to "target" and wait to see it it succeeded -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::attendedTransfer(Call* toTransfer, Call* target) +CALLMODEL_TEMPLATE void CALLMODEL_T::attendedTransfer(Call* toTransfer, Call* target) { CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); callManager.attendedTransfer(toTransfer->getCallId(),target->getCallId()); @@ -275,9 +302,9 @@ template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>:: } ///Transfer this call to "target" number -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::transfer(Call* toTransfer, QString target) +CALLMODEL_TEMPLATE void CALLMODEL_T::transfer(Call* toTransfer, QString target) { - qDebug() << "\n\n\n\n\nTransferring call " << toTransfer->getCallId() << target << "\n\n\n\n\n"; + qDebug() << "Transferring call " << toTransfer->getCallId() << "to" << target; toTransfer->setTransferNumber(target); toTransfer->changeCurrentState(CALL_STATE_TRANSFER); toTransfer->actionPerformed(CALL_ACTION_ACCEPT); @@ -291,13 +318,13 @@ template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>:: ****************************************************************************/ ///Add a new conference, get the call list and update the interface as needed -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::addConference(const QString & confID) +CALLMODEL_TEMPLATE Call* CALLMODEL_T::addConference(const QString & confID) { qDebug() << "Notified of a new conference " << confID; CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); QStringList callList = callManager.getParticipantList(confID); qDebug() << "Paticiapants are:" << callList; - + if (!callList.size()) { qDebug() << "This conference (" + confID + ") contain no call"; return 0; @@ -308,19 +335,19 @@ template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>: return 0; } Call* newConf = new Call(confID, m_sPrivateCallList_callId[callList[0]]->call_real->getAccountId()); - + InternalStruct* aNewStruct = new InternalStruct; aNewStruct->call_real = newConf; aNewStruct->conference = true; - + m_sPrivateCallList_call[newConf] = aNewStruct; m_sPrivateCallList_callId[confID] = aNewStruct; - + return newConf; } ///Join two call to create a conference, the conference will be created later (see addConference) -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::createConferenceFromCall(Call* call1, Call* call2) +CALLMODEL_TEMPLATE bool CALLMODEL_T::createConferenceFromCall(Call* call1, Call* call2) { qDebug() << "Joining call: " << call1->getCallId() << " and " << call2->getCallId(); CallManagerInterface &callManager = CallManagerInterfaceSingleton::getInstance(); @@ -329,7 +356,7 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Add a new participant to a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::addParticipant(Call* call2, Call* conference) +CALLMODEL_TEMPLATE bool CALLMODEL_T::addParticipant(Call* call2, Call* conference) { if (conference->isConference()) { CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); @@ -343,7 +370,7 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Remove a participant from a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::detachParticipant(Call* call) +CALLMODEL_TEMPLATE bool CALLMODEL_T::detachParticipant(Call* call) { CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); callManager.detachParticipant(call->getCallId()); @@ -351,7 +378,7 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Merge two conferences -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::mergeConferences(Call* conf1, Call* conf2) +CALLMODEL_TEMPLATE bool CALLMODEL_T::mergeConferences(Call* conf1, Call* conf2) { CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance(); callManager.joinConference(conf1->getConfId(),conf2->getConfId()); @@ -359,16 +386,16 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Executed when the daemon signal a modification in an existing conference. Update the call list and update the TreeView -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::changeConference(const QString& confId, const QString& state) +CALLMODEL_TEMPLATE bool CALLMODEL_T::changeConference(const QString& confId, const QString& state) { qDebug() << "Conf changed"; Q_UNUSED(state) - + if (!m_sPrivateCallList_callId[confId]) { qDebug() << "The conference does not exist"; return false; } - + if (!m_sPrivateCallList_callId[confId]->index) { qDebug() << "The conference item does not exist"; return false; @@ -377,17 +404,17 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: } ///Remove a conference from the model and the TreeView -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::removeConference(const QString &confId) +CALLMODEL_TEMPLATE void CALLMODEL_T::removeConference(const QString &confId) { qDebug() << "Ending conversation containing " << m_sPrivateCallList_callId[confId]->children.size() << " participants"; removeConference(getCall(confId)); } ///Remove a conference using it's call object -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::removeConference(Call* call) +CALLMODEL_TEMPLATE void CALLMODEL_T::removeConference(Call* call) { InternalStruct* internal = m_sPrivateCallList_call[call]; - + if (!internal) { qDebug() << "Cannot remove conference: call not found"; return; @@ -403,7 +430,7 @@ template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>:: ****************************************************************************/ ///Return a list of all previous calls -template<typename CallWidget, typename Index> const QStringList CallModel<CallWidget,Index>::getHistoryCallId() +CALLMODEL_TEMPLATE const QStringList CALLMODEL_T::getHistoryCallId() { QStringList toReturn; foreach(Call* call, m_sHistoryCalls) { @@ -413,11 +440,46 @@ template<typename CallWidget, typename Index> const QStringList CallModel<CallWi } ///Return the history list -template<typename CallWidget, typename Index> const CallHash& CallModel<CallWidget,Index>::getHistory() +CALLMODEL_TEMPLATE const CallMap& CALLMODEL_T::getHistory() { return m_sHistoryCalls; } +///Add to history +CALLMODEL_TEMPLATE void CALLMODEL_T::addToHistory(Call* call) +{ + if (call) { + m_sHistoryCalls[call->getStartTimeStamp()] = call; + } +} + +///Sort all history call by popularity and return the result (most popular first) +CALLMODEL_TEMPLATE const QStringList CALLMODEL_T::getNumbersByPopularity() +{ + QHash<QString,SortableCallSource*> hc; + foreach (Call* call, getHistory()) { + if (!hc[call->getPeerPhoneNumber()]) { + hc[call->getPeerPhoneNumber()] = new SortableCallSource(call); + } + hc[call->getPeerPhoneNumber()]->count++; + } + QList<SortableCallSource> userList; + foreach (SortableCallSource* i,hc) { + userList << *i; + } + qSort(userList); + QStringList cl; + for (int i=userList.size()-1;i >=0 ;i--) { + cl << userList[i].callInfo->getPeerPhoneNumber(); + } + foreach (SortableCallSource* i,hc) { + delete i; + } + + return cl; +} + + /***************************************************************************** * * * Account related code * @@ -425,7 +487,7 @@ template<typename CallWidget, typename Index> const CallHash& CallModel<CallWidg ****************************************************************************/ ///Return the current account id (do not put in the cpp file) -template<typename CallWidget, typename Index> QString CallModel<CallWidget,Index>::getCurrentAccountId() +CALLMODEL_TEMPLATE QString CALLMODEL_T::getCurrentAccountId() { Account* firstRegistered = getCurrentAccount(); if(firstRegistered == NULL) { @@ -438,10 +500,10 @@ template<typename CallWidget, typename Index> QString CallModel<CallWidget,Index ///Return the current account -template<typename CallWidget, typename Index> Account* CallModel<CallWidget,Index>::getCurrentAccount() +CALLMODEL_TEMPLATE Account* CALLMODEL_T::getCurrentAccount() { Account* priorAccount = getAccountList()->getAccountById(m_sPriorAccountId); - if(priorAccount && priorAccount->getAccountDetail(ACCOUNT_STATUS) == ACCOUNT_STATE_REGISTERED ) { + if(priorAccount && priorAccount->getAccountDetail(ACCOUNT_REGISTRATION_STATUS) == ACCOUNT_STATE_REGISTERED ) { return priorAccount; } else { @@ -451,7 +513,7 @@ template<typename CallWidget, typename Index> Account* CallModel<CallWidget,Inde } ///Return a list of registered accounts -template<typename CallWidget, typename Index> AccountList* CallModel<CallWidget,Index>::getAccountList() +CALLMODEL_TEMPLATE AccountList* CALLMODEL_T::getAccountList() { if (m_spAccountList == NULL) { m_spAccountList = new AccountList(true); @@ -460,13 +522,13 @@ template<typename CallWidget, typename Index> AccountList* CallModel<CallWidget, } ///Return the previously used account ID -template<typename CallWidget, typename Index> QString CallModel<CallWidget,Index>::getPriorAccoundId() +CALLMODEL_TEMPLATE QString CALLMODEL_T::getPriorAccoundId() { return m_sPriorAccountId; } ///Set the previous account used -template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::setPriorAccountId(const QString& value) { +CALLMODEL_TEMPLATE void CALLMODEL_T::setPriorAccountId(const QString& value) { m_sPriorAccountId = value; } @@ -476,8 +538,8 @@ template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>:: * * ****************************************************************************/ -///Get a call from it's widget -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::getCall ( const CallWidget widget ) const +///Get a call from it's widget +CALLMODEL_TEMPLATE Call* CALLMODEL_T::getCall ( const CallWidget widget ) const { if (m_sPrivateCallList_widget[widget]) { return m_sPrivateCallList_widget[widget]->call_real; @@ -485,20 +547,20 @@ template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>: return NULL; } -///Get a call list from a conference -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCalls ( const CallWidget widget ) const +///Get a call list from a conference +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCalls ( const CallWidget widget ) const { QList<Call*> toReturn; if (m_sPrivateCallList_widget[widget] && m_sPrivateCallList_widget[widget]->conference) { foreach (InternalStruct* child, m_sPrivateCallList_widget[widget]->children) { - toReturn << child.call_real; + toReturn << child.call_real; } } return toReturn; } -///Get a list of every call -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCalls ( ) +///Get a list of every call +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCalls ( ) { QList<Call*> toReturn; foreach (InternalStruct* child, m_sPrivateCallList_call) { @@ -507,8 +569,8 @@ template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget, return toReturn; } -///Is the call associated with that widget a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::isConference ( const CallWidget widget ) const +///Is the call associated with that widget a conference +CALLMODEL_TEMPLATE bool CALLMODEL_T::isConference ( const CallWidget widget ) const { if (m_sPrivateCallList_widget[widget]) { return m_sPrivateCallList_widget[widget]->conference; @@ -516,8 +578,8 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: return false; } -///Is that call a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::isConference ( const Call* call ) const +///Is that call a conference +CALLMODEL_TEMPLATE bool CALLMODEL_T::isConference ( const Call* call ) const { if (m_sPrivateCallList_call[(Call*)call]) { return m_sPrivateCallList_call[(Call*)call]->conference; @@ -525,36 +587,36 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>:: return false; } -///Do nothing, provided for API consistency -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::getCall ( const Call* call ) const -{ +///Do nothing, provided for API consistency +CALLMODEL_TEMPLATE Call* CALLMODEL_T::getCall ( const Call* call ) const +{ return call; } -///Return the calls from the "call" conference -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCalls ( const Call* call ) const -{ +///Return the calls from the "call" conference +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCalls ( const Call* call ) const +{ QList<Call*> toReturn; if (m_sPrivateCallList_call[call] && m_sPrivateCallList_call[call]->conference) { foreach (InternalStruct* child, m_sPrivateCallList_call[call]->children) { - toReturn << child.call_real; + toReturn << child.call_real; } } return toReturn; } -///Is the call associated with that Index a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::isConference ( const Index idx ) const -{ +///Is the call associated with that Index a conference +CALLMODEL_TEMPLATE bool CALLMODEL_T::isConference ( const Index idx ) const +{ if (m_sPrivateCallList_index[idx]) { return m_sPrivateCallList_index[idx]->conference; } return false; } -///Get the call associated with this index -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::getCall ( const Index idx ) const -{ +///Get the call associated with this index +CALLMODEL_TEMPLATE Call* CALLMODEL_T::getCall ( const Index idx ) const +{ if (m_sPrivateCallList_index[idx]) { return m_sPrivateCallList_index[idx]->call_real; } @@ -562,50 +624,50 @@ template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>: return NULL; } -///Get the call associated with that conference index -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCalls ( const Index idx ) const -{ +///Get the call associated with that conference index +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCalls ( const Index idx ) const +{ QList<Call*> toReturn; if (m_sPrivateCallList_index[idx] && m_sPrivateCallList_index[idx]->conference) { foreach (InternalStruct* child, m_sPrivateCallList_index[idx]->children) { - toReturn << child.call_real; + toReturn << child.call_real; } } return toReturn; } -///Is the call associated with that ID a conference -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::isConference ( const QString& callId ) const -{ +///Is the call associated with that ID a conference +CALLMODEL_TEMPLATE bool CALLMODEL_T::isConference ( const QString& callId ) const +{ if (m_sPrivateCallList_callId[callId]) { return m_sPrivateCallList_callId[callId]->conference; } return false; } -///Get the call associated with this ID -template<typename CallWidget, typename Index> Call* CallModel<CallWidget,Index>::getCall ( const QString& callId ) const -{ +///Get the call associated with this ID +CALLMODEL_TEMPLATE Call* CALLMODEL_T::getCall ( const QString& callId ) const +{ if (m_sPrivateCallList_callId[callId]) { return m_sPrivateCallList_callId[callId]->call_real; } return NULL; } -///Get the calls associated with this ID -template<typename CallWidget, typename Index> QList<Call*> CallModel<CallWidget,Index>::getCalls ( const QString& callId ) const +///Get the calls associated with this ID +CALLMODEL_TEMPLATE QList<Call*> CALLMODEL_T::getCalls ( const QString& callId ) const { QList<Call*> toReturn; if (m_sPrivateCallList_callId[callId] && m_sPrivateCallList_callId[callId]->conference) { foreach (InternalStruct* child, m_sPrivateCallList_callId[callId]->children) { - toReturn << child.callId_real; + toReturn << child.callId_real; } } return toReturn; } -///Get the index associated with this call -template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>::getIndex ( const Call* call ) const +///Get the index associated with this call +CALLMODEL_TEMPLATE Index CALLMODEL_T::getIndex ( const Call* call ) const { if (m_sPrivateCallList_call[(Call*)call]) { return m_sPrivateCallList_call[(Call*)call]->index; @@ -613,8 +675,8 @@ template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>: return NULL; } -///Get the index associated with this index (dummy implementation) -template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>::getIndex ( const Index idx ) const +///Get the index associated with this index (dummy implementation) +CALLMODEL_TEMPLATE Index CALLMODEL_T::getIndex ( const Index idx ) const { if (m_sPrivateCallList_index[idx]) { return m_sPrivateCallList_index[idx]->index; @@ -622,8 +684,8 @@ template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>: return NULL; } -///Get the index associated with this call -template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>::getIndex ( const CallWidget widget ) const +///Get the index associated with this call +CALLMODEL_TEMPLATE Index CALLMODEL_T::getIndex ( const CallWidget widget ) const { if (m_sPrivateCallList_widget[widget]) { return m_sPrivateCallList_widget[widget]->index; @@ -631,8 +693,8 @@ template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>: return NULL; } -///Get the index associated with this ID -template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>::getIndex ( const QString& callId ) const +///Get the index associated with this ID +CALLMODEL_TEMPLATE Index CALLMODEL_T::getIndex ( const QString& callId ) const { if (m_sPrivateCallList_callId[callId]) { return m_sPrivateCallList_callId[callId]->index; @@ -640,8 +702,8 @@ template<typename CallWidget, typename Index> Index CallModel<CallWidget,Index>: return NULL; } -///Get the widget associated with this call -template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,Index>::getWidget ( const Call* call ) const +///Get the widget associated with this call +CALLMODEL_TEMPLATE CallWidget CALLMODEL_T::getWidget ( const Call* call ) const { if (m_sPrivateCallList_call[call]) { return m_sPrivateCallList_call[call]->call; @@ -649,8 +711,8 @@ template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,In return NULL; } -///Get the widget associated with this ID -template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,Index>::getWidget ( const Index idx ) const +///Get the widget associated with this ID +CALLMODEL_TEMPLATE CallWidget CALLMODEL_T::getWidget ( const Index idx ) const { if (m_sPrivateCallList_index[idx]) { return m_sPrivateCallList_index[idx]->call; @@ -658,8 +720,8 @@ template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,In return NULL; } -///Get the widget associated with this widget (dummy) -template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,Index>::getWidget ( const CallWidget widget ) const +///Get the widget associated with this widget (dummy) +CALLMODEL_TEMPLATE CallWidget CALLMODEL_T::getWidget ( const CallWidget widget ) const { if (m_sPrivateCallList_widget[widget]) { return m_sPrivateCallList_widget[widget]->call; @@ -667,8 +729,8 @@ template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,In return NULL; } -///Get the widget associated with this ID -template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,Index>::getWidget ( const QString& widget ) const +///Get the widget associated with this ID +CALLMODEL_TEMPLATE CallWidget CALLMODEL_T::getWidget ( const QString& widget ) const { if (m_sPrivateCallList_widget[widget]) { return m_sPrivateCallList_widget[widget]->call; @@ -677,32 +739,33 @@ template<typename CallWidget, typename Index> CallWidget CallModel<CallWidget,In } ///Common set of instruction shared by all gui updater -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::updateCommon(Call* call) +CALLMODEL_TEMPLATE bool CALLMODEL_T::updateCommon(Call* call) { - if (!m_sPrivateCallList_call[call]) { + if (!m_sPrivateCallList_call[call] && dynamic_cast<Call*>(call)) { m_sPrivateCallList_call [ call ] = new InternalStruct ; m_sPrivateCallList_call [ call ]->call_real = call ; m_sPrivateCallList_call [ call ]->conference = false ; m_sPrivateCallList_callId [ call->getCallId() ] = m_sPrivateCallList_call[call] ; } + else + return false; return true; } -///Update the widget associated with this call -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::updateWidget (Call* call, CallWidget value ) +///Update the widget associated with this call +CALLMODEL_TEMPLATE bool CALLMODEL_T::updateWidget (Call* call, CallWidget value ) { - updateCommon(call); + if (!updateCommon(call)) return false; m_sPrivateCallList_call[call]->call = value ; m_sPrivateCallList_widget[value] = m_sPrivateCallList_call[call] ; return true; } - ///Update the index associated with this call -template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::updateIndex (Call* call, Index value ) +CALLMODEL_TEMPLATE bool CALLMODEL_T::updateIndex (Call* call, Index value ) { updateCommon(call); m_sPrivateCallList_call[call]->index = value ; m_sPrivateCallList_index[value] = m_sPrivateCallList_call[call] ; return true; -} \ No newline at end of file +} diff --git a/kde/src/lib/Contact.cpp b/kde/src/lib/Contact.cpp index 3f4069c8c2..6d7272a3ed 100644 --- a/kde/src/lib/Contact.cpp +++ b/kde/src/lib/Contact.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "Contact.h" @@ -106,6 +105,17 @@ const QString& Contact::getUid() const return m_Uid; } +///Get the group +const QString& Contact::getGroup() const +{ + return m_Group; +} + +const QString& Contact::getDepartment() const +{ + return m_Department; +} + ///Get the contact type const QString& Contact::getType() const { @@ -139,7 +149,7 @@ void Contact::setFamilyName(const QString& name) ///Set the Photo/Avatar void Contact::setPhoto(QPixmap* photo) { - m_pPhoto = photo; + m_pPhoto = photo; } ///Set the formatted name (display name) @@ -164,4 +174,35 @@ void Contact::setPreferredEmail(const QString& name) void Contact::setUid(const QString& id) { m_Uid = id; +} + +///Set Group +void Contact::setGroup(const QString& name) +{ + m_Group = name; +} + +///Set department +void Contact::setDepartment(const QString& name) +{ + m_Department = name; +} + +///Turn the contact into QString-QString hash +QHash<QString,QVariant> Contact::toHash() +{ + QHash<QString,QVariant> aContact; + //aContact[""] = PhoneNumbers getPhoneNumbers() const; + aContact[ "nickName" ] = getNickName(); + aContact[ "firstName" ] = getFirstName(); + aContact[ "secondName" ] = getSecondName(); + aContact[ "formattedName" ] = getFormattedName(); + aContact[ "organization" ] = getOrganization(); + aContact[ "uid" ] = getUid(); + aContact[ "preferredEmail" ] = getPreferredEmail(); + //aContact[ "Photo" ] = QVariant(*getPhoto()); + aContact[ "type" ] = getType(); + aContact[ "group" ] = getGroup(); + aContact[ "department" ] = getDepartment(); + return aContact; } \ No newline at end of file diff --git a/kde/src/lib/Contact.h b/kde/src/lib/Contact.h index 169ddf0b60..4b8da5e058 100644 --- a/kde/src/lib/Contact.h +++ b/kde/src/lib/Contact.h @@ -1,27 +1,28 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef CONTACT_H #define CONTACT_H -#include <QObject> +#include <QtCore/QObject> +#include <QtCore/QVariant> //Qt class QListWidgetItem; @@ -69,6 +70,8 @@ private: QString m_PreferredEmail ; QString m_Organization ; QString m_Uid ; + QString m_Group ; + QString m_Department ; bool m_DisplayPhoto ; PhoneNumbers m_Numbers ; @@ -89,17 +92,24 @@ public: virtual const QString& getPreferredEmail() const; virtual const QPixmap* getPhoto() const; virtual const QString& getType() const; + virtual const QString& getGroup() const; + virtual const QString& getDepartment() const; //Setters - virtual void setPhoneNumbers (PhoneNumbers ); - virtual void setFormattedName (const QString& name ); - virtual void setNickName (const QString& name ); - virtual void setFirstName (const QString& name ); - virtual void setFamilyName (const QString& name ); - virtual void setOrganization (const QString& name ); - virtual void setPreferredEmail (const QString& name ); - virtual void setUid (const QString& id ); - virtual void setPhoto (QPixmap* photo ); + virtual void setPhoneNumbers ( PhoneNumbers ); + virtual void setFormattedName ( const QString& name ); + virtual void setNickName ( const QString& name ); + virtual void setFirstName ( const QString& name ); + virtual void setFamilyName ( const QString& name ); + virtual void setOrganization ( const QString& name ); + virtual void setPreferredEmail ( const QString& name ); + virtual void setGroup ( const QString& name ); + virtual void setDepartment ( const QString& name ); + virtual void setUid ( const QString& id ); + virtual void setPhoto ( QPixmap* photo ); + + //Mutator + QHash<QString,QVariant> toHash(); protected: virtual void initItemWidget(); diff --git a/kde/src/lib/ContactBackend.cpp b/kde/src/lib/ContactBackend.cpp index cedbd31dc4..f6a527d959 100644 --- a/kde/src/lib/ContactBackend.cpp +++ b/kde/src/lib/ContactBackend.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "ContactBackend.h" diff --git a/kde/src/lib/ContactBackend.h b/kde/src/lib/ContactBackend.h index 81a0c051d2..cea4318555 100644 --- a/kde/src/lib/ContactBackend.h +++ b/kde/src/lib/ContactBackend.h @@ -1,35 +1,38 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef CONTACT_BACKEND_H #define CONTACT_BACKEND_H #include <QObject> #include <QHash> +#include <QStringList> +#include <QVariant> #include "typedefs.h" +#include "Contact.h" //SFLPhone class Contact; +//Typedef typedef QList<Contact*> ContactList; ///@class ContactBackend Allow different way to handle contact without poluting the library @@ -37,7 +40,7 @@ class LIB_EXPORT ContactBackend : public QObject { Q_OBJECT public: ContactBackend(QObject* parent); - virtual Contact* getContactByPhone ( const QString& phoneNumber ) = 0; + virtual Contact* getContactByPhone ( const QString& phoneNumber , bool resolveDNS = false) = 0; virtual Contact* getContactByUid ( const QString& uid ) = 0; virtual void editContact ( Contact* contact ) = 0; virtual void addNewContact ( Contact* contact ) = 0; diff --git a/kde/src/lib/Item.cpp b/kde/src/lib/Item.cpp index 4875cf9658..a09308ad36 100644 --- a/kde/src/lib/Item.cpp +++ b/kde/src/lib/Item.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ //Parent #include "Item.h" diff --git a/kde/src/lib/Item.h b/kde/src/lib/Item.h index 24238fa5c4..ecb301dd59 100644 --- a/kde/src/lib/Item.h +++ b/kde/src/lib/Item.h @@ -1,23 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef ITEM_H #define ITEM_H @@ -26,67 +26,67 @@ class QListWidgetItem; /** - @author Jérémy Quentin <jeremy.quentin@gmail.com> - Represents an item of a list, that is displayed - by an QListWidgetItem with a QWidget inside. - The two objects are contained in this class, but their - initializations are pure virtual. - The template class WIDGET_TYPE should be derived from - QWidget. - The implementation of initItem should call initItemWidget + * @author Jérémy Quentin <jeremy.quentin@gmail.com> + * Represents an item of a list, that is displayed + * by an QListWidgetItem with a QWidget inside. + * The two objects are contained in this class, but their + * initializations are pure virtual. + * The template class WIDGET_TYPE should be derived from + * QWidget. + * The implementation of initItem should call initItemWidget */ template<class WIDGET_TYPE>class LIB_EXPORT Item { protected: - QListWidgetItem * item; - WIDGET_TYPE * itemWidget; - + QListWidgetItem * item; + WIDGET_TYPE * itemWidget; + public: - /** - * Would be great to take the QListWidget as attribute - * to be able to add the itemWidget to the item in the list. - * For the moment, we have to do it from outside. - */ - Item(/*QListWidget *list=0*/) { - item = NULL; - itemWidget = NULL; - } - - /** - * Be careful that it is not already deleted by QObject - * Commented for safety reasons... - */ - virtual ~Item() { -// delete item; -// delete itemWidget; - } - - QListWidgetItem* getItem() { - return item; - } - - WIDGET_TYPE* getItemWidget() { - return itemWidget; - } - - const QListWidgetItem* getItem() const { - return item; - } - const WIDGET_TYPE* getItemWidget() const { - return itemWidget; - } - - /** - * Initializes the item and widget - * Implementation should call initItemWidget! - */ - virtual void initItem() = 0; - + /** + * Would be great to take the QListWidget as attribute + * to be able to add the itemWidget to the item in the list. + * For the moment, we have to do it from outside. + */ + Item(/*QListWidget *list=0*/) { + item = NULL; + itemWidget = NULL; + } + + /** + * Be careful that it is not already deleted by QObject + * Commented for safety reasons... + */ + virtual ~Item() { + // delete item; + // delete itemWidget; + } + + QListWidgetItem* getItem() { + return item; + } + + WIDGET_TYPE* getItemWidget() { + return itemWidget; + } + + const QListWidgetItem* getItem() const { + return item; + } + const WIDGET_TYPE* getItemWidget() const { + return itemWidget; + } + + /** + * Initializes the item and widget + * Implementation should call initItemWidget! + */ + virtual void initItem() = 0; + protected: - virtual void initItemWidget() = 0; - - + virtual void initItemWidget() = 0; + + }; #endif diff --git a/kde/src/lib/callmanager_interface_singleton.cpp b/kde/src/lib/callmanager_interface_singleton.cpp index 2eaadcdeb6..206c90fee0 100644 --- a/kde/src/lib/callmanager_interface_singleton.cpp +++ b/kde/src/lib/callmanager_interface_singleton.cpp @@ -1,22 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #include "callmanager_interface_singleton.h" diff --git a/kde/src/lib/callmanager_interface_singleton.h b/kde/src/lib/callmanager_interface_singleton.h index 2f1b6f8a83..2127a04f67 100644 --- a/kde/src/lib/callmanager_interface_singleton.h +++ b/kde/src/lib/callmanager_interface_singleton.h @@ -1,22 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - **************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef CALL_MANAGER_INTERFACE_SINGLETON_H #define CALL_MANAGER_INTERFACE_SINGLETON_H diff --git a/kde/src/lib/configurationmanager_interface_singleton.cpp b/kde/src/lib/configurationmanager_interface_singleton.cpp index bcd19e8ff1..c09ac74fcc 100644 --- a/kde/src/lib/configurationmanager_interface_singleton.cpp +++ b/kde/src/lib/configurationmanager_interface_singleton.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #include "configurationmanager_interface_singleton.h" @@ -32,4 +31,4 @@ ConfigurationManagerInterface & ConfigurationManagerInterfaceSingleton::getInsta } return *interface; } - + diff --git a/kde/src/lib/configurationmanager_interface_singleton.h b/kde/src/lib/configurationmanager_interface_singleton.h index 73fafb8cf6..fd7ee60726 100644 --- a/kde/src/lib/configurationmanager_interface_singleton.h +++ b/kde/src/lib/configurationmanager_interface_singleton.h @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009-2012 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef CONFIGURATION_MANAGER_INTERFACE_SINGLETON_H #define CONFIGURATION_MANAGER_INTERFACE_SINGLETON_H diff --git a/kde/src/lib/dbus/callmanager-introspec.xml b/kde/src/lib/dbus/callmanager-introspec.xml index 46cec40068..a742426b77 100644 --- a/kde/src/lib/dbus/callmanager-introspec.xml +++ b/kde/src/lib/dbus/callmanager-introspec.xml @@ -1,825 +1,781 @@ <?xml version="1.0" encoding="UTF-8" ?> <node name="/callmanager-introspec" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> - <interface name="org.sflphone.SFLphone.CallManager"> - - <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> - <p>The CallManager interface is used to manage - any call and conference related actions.</p> - <p>Since SFLphone-daemon support multiple incoming/outgoing calls, any actions involving a specific call must address the method by the means of a unique callID. SFLphone-clients is responsible to generate the callID on outgoing call. On the other hand, SFLphone-daemon will generate a unique callID on incoming calls.</p> - </tp:docstring> - <method name="placeCall" tp:name-for-bindings="placeCall"> - <tp:docstring> - <p>This is the main method in order to place a new call. The call is registered to the daemon using this method.</p> - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - The ID of the account you want to make a call with. If the call is to be placed whithout any account by the means of a SIP URI (i.e. sip:num@server), the "IP2IP_PROFILE" is passed as the accountID. For more details about accounts see the configuration manager interface. - </tp:docstring> - </arg> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID is a unique identifier that must be randomly generated on the client's side. Any subsequent actions refering to this call must use this callID. - </tp:docstring> - </arg> - <arg type="s" name="to" direction="in"> - <tp:docstring> - If bound to a VoIP account, then the argument is the phone number. In case of calls involving "IP2IP_PROFILE", a complete SIP URI must be specified. - </tp:docstring> - </arg> - </method> - - <method name="placeCallFirstAccount" tp:name-for-bindings="placeCallFirstAccount"> - <tp:added version="0.9.8"/> - <tp:docstring> - Place a call with the fist registered account, regarding to the account list order. - <tp:rationale> - Use this function when you don't have any information about the accounts used (Ex: Firefly mozilla extension) - </tp:rationale> - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID is a unique identifier that must be randomly generated on the client's side. Any subsequent actions refering to this call must use this callID. - </tp:docstring> - </arg> - <arg type="s" name="to" direction="in"> - <tp:docstring> - If bound to a VoIP account, then the argument is the phone number. In case of calls involving "IP2IP_PROFILE", a complete SIP URI must be specified. - </tp:docstring> - </arg> - </method> - - <method name="refuse" tp:name-for-bindings="refuse"> - <tp:docstring> - Refuse an incoming call. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - - </method> - - <method name="accept" tp:name-for-bindings="accept"> - <tp:docstring> - Answer an incoming call. Automatically put the current call on state HOLD. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - </method> - - <method name="hangUp" tp:name-for-bindings="hangUp"> - <tp:docstring> - Hangup a call in state "CURRENT" or "HOLD". - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - </method> - - <method name="hangUpConference" tp:name-for-bindings="hangUpConference"> - <tp:added version="0.9.7"/> - <tp:docstring> - Hangup a conference, and every call participating to the conference. - </tp:docstring> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - The unique conference ID. - </tp:docstring> - </arg> - </method> - - <method name="hold" tp:name-for-bindings="hold"> - <tp:docstring> - Place a call on hold. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - </method> - - <method name="unhold" tp:name-for-bindings="unhold"> - <tp:docstring> - Hold off a call, and place this call on state CURRENT. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - </method> - - <method name="transfer" tp:name-for-bindings="transfer"> - <tp:docstring> - Transfer a call to given phone number. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The callID. - </tp:docstring> - </arg> - <arg type="s" name="to" direction="in"> - <tp:docstring> - The phone number to transfer the call to. - </tp:docstring> - </arg> - </method> - - <method name="attendedTransfer" tp:name-for-bindings="attendedTransfer"> - <tp:docstring> - Perform an attended transfer on two calls - </tp:docstring> - <arg type="s" name="transferID" direction="in"> - <tp:docstring> - The callID of the call to be transfered. - </tp:docstring> - </arg> - <arg type="s" name="targetID" direction="in"> - <tp:docstring> - The callID of the target call. - </tp:docstring> - </arg> - </method> - - <method name="playDTMF" tp:name-for-bindings="playDTMF"> - <tp:docstring> - Dual-Tone multi-frequency. Tell the core to play dial tones. A SIP INFO message is sent to notify the server. - </tp:docstring> - <arg type="s" name="key" direction="in"> - <tp:docstring> - Unicode charter for pressed key - </tp:docstring> - </arg> - </method> - - <method name="startTone" tp:name-for-bindings="startTone"> - <tp:docstring> - Start audio stream and play tone.. - </tp:docstring> - <arg type="i" name="start" direction="in"/> - <arg type="i" name="type" direction="in"/> - </method> - - <method name="setVolume" tp:name-for-bindings="setVolume"> - <tp:docstring> - <p>Sets the volume using a linear scale [0,100].</p> - <tp:rationale>Pulseaudio has its own mechanism to modify application volume. This method is enabled only if the ALSA API is used.</tp:rationale> - </tp:docstring> - <arg type="s" name="device" direction="in"> - <tp:docstring> - The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value" direction="in"> - <tp:docstring> - The volume value (between 0 and 100) - </tp:docstring> - </arg> - </method> - - <method name="getVolume" tp:name-for-bindings="getVolume"> - <tp:docstring> - <p>Return the volume value of the given device on a linear scale [0,100].</p> - <tp:rationale>Only enabled if the ALSA API is used, Pulseaudio has its own mechanism to modify application volume.</tp:rationale> - </tp:docstring> - <arg type="s" name="device" direction="in"> - <tp:docstring> - The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value" direction="out"> - <tp:docstring> - The volume value (between 0 and 100) - </tp:docstring> - </arg> - </method> - - <method name="joinParticipant" tp:name-for-bindings="joinParticipant"> - <tp:added version="0.9.7"/> - <tp:docstring> - <p>Join two participants together to create a 3-way conference including the current client.</p> - <tp:rationale>The signal <tp:member-ref>conferenceCreated</tp:member-ref> is emitted on success.</tp:rationale> - </tp:docstring> - <arg type="s" name="sel_callID" direction="in"/> - <arg type="s" name="drag_callID" direction="in"/> - </method> - - <method name="createConfFromParticipantList" tp:name-for-bindings="createConfFromParticipantList"> - <tp:added version="0.9.14"/> - <tp:docstring> - <p>Create a conference from a list of participant</p> - <tp:rationale>The signal <tp:member-ref>conferenceCreated</tp:member-ref> is emitted on success.</tp:rationale> - </tp:docstring> - <arg type="as" name="participants" direction="in"/> - </method> - - <method name="addParticipant" tp:name-for-bindings="addParticipant"> - <tp:added version="0.9.7"/> - <tp:docstring> - <p>Join a new particiant to an existing conference.</p> - <tp:rationale>The signal <tp:member-ref>conferenceChanged</tp:member-ref> is emitted on success.</tp:rationale> - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The ID of the call to add to the conference - </tp:docstring> - </arg> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - An existing conference ID - </tp:docstring> - </arg> - </method> - - <method name="addMainParticipant" tp:name-for-bindings="addMainParticipant"> - <tp:added version="0.9.7"/> - <tp:docstring> - <p>As the core can handle multiple calls an conferences, it may happens that the client's user leave a conference to answer an incoming call or send new ones. This method is used to reintroduce SFLphone-client's user into the conference.</p> - <p>It put the current call on state HOLD or detach SFLphone-client's user from the another conference.</p> - </tp:docstring> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - An existing conference ID - </tp:docstring> - </arg> - </method> - - <method name="detachParticipant" tp:name-for-bindings="detachParticipant"> - <tp:added version="0.9.7"/> - <tp:docstring> - Detach the given call from the conference. If only one participant is left, the conference is deleted and the signal <tp:member-ref>conferenceRemoved</tp:member-ref> is emited. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The call ID - </tp:docstring> - </arg> - </method> - - <method name="joinConference" tp:name-for-bindings="joinConference"> - <tp:added version="0.9.7"/> - <tp:docstring> - Join two conferences together. - </tp:docstring> - <arg type="s" name="sel_confID" direction="in"/> - <arg type="s" name="drag_confID" direction="in"/> - </method> - - <method name="getConferenceDetails" tp:name-for-bindings="getConferenceDetails"> - <tp:added version="0.9.7"/> - <tp:docstring> - Returns a hashtable containing conference details. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The conference ID - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="infos" direction="out"> - <tp:docstring> - A map containing the ID of the conferences - and their states: - <ul> - <li>ACTIVE_ATTACHED</li> - <li>ACTIVE_DETACHED</li> - <li>HOLD</li> - </ul> - </tp:docstring> - </arg> - </method> - - <method name="getConferenceList" tp:name-for-bindings="getConferenceList"> - <tp:added version="0.9.7"/> - <tp:docstring> - Returns a list containing all active - conferences. - <tp:rationale>To update client status, one should - use <tp:member-ref>getParticipantList</tp:member-ref> - with provided conference IDs.</tp:rationale> - </tp:docstring> - <arg type="as" name="list" direction="out"> - <tp:docstring> - The list of conferences. - </tp:docstring> - </arg> - </method> - - <method name="setRecording" tp:name-for-bindings="setRecording"> - <tp:docstring> - Start recording a call. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The ID of the call to record. - </tp:docstring> - </arg> - </method> - - <method name="getIsRecording" tp:name-for-bindings="getIsRecording"> - <tp:docstring> - Tells whether or not a call is being recorded. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The call ID. - </tp:docstring> - </arg> - <arg type="b" name="isRecording" direction="out"> - <tp:docstring> - Returns true is the call is being recorded. False otherwise. - </tp:docstring> - </arg> - </method> - - <signal name="recordPlaybackFilepath" tp:name-for-bindings="recordPlaybackFilepath"> - <tp:docstring> - Once after starting recording for the first time, this signal is emited to - provide the recorded file path to client application. - </tp:docstring> - <arg type="s" name="callID" /> - <arg type="s" name="filepath"/> - </signal> - - <signal name="recordPlaybackStopped" tp:name-for-bindings="recordPlaybackStopped"> - <tp:docstring/> - <arg type="s" name="filepath" /> - </signal> - - - <method name="getCallDetails" tp:name-for-bindings="getCallDetails"> - <tp:docstring> - Get all the details about a specific call. - </tp:docstring> - <arg type="s" name="callID" direction="in"> - <tp:docstring> - The call ID. - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="infos" direction="out" tp:type="String_String_Map"> - <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> - <p>A map containing the call details: </p> - <ul> - <li>ACCOUNTID</li> - <li>PEER_NUMBER</li> - <li>PEER_NAME</li> - <li>DISPLAY_NAME</li> - <li>CALL_STATE</li> - <li>CALL_TYPE</li> - </ul> - </tp:docstring> - </arg> - </method> - - <method name="getCallList" tp:name-for-bindings="getCallList"> - <tp:docstring> - Get the list of active calls. - <tp:rationale>To get the call details, iterate on the return value and call <tp:member-ref>getCallDetails</tp:member-ref> method.</tp:rationale> - </tp:docstring> - <arg type="as" name="list" direction="out"> - <tp:docstring> - A list of call IDs. - </tp:docstring> - </arg> - </method> - - <method name="getCurrentCallID" tp:name-for-bindings="getCurrentCallID"> - <tp:docstring> - Unused - </tp:docstring> - <arg type="s" name="callID" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getCurrentAudioCodecName" tp:name-for-bindings="getCurrentAudioCodecName"> - <tp:docstring> - Unused - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - <arg type="s" name="codecName" direction="out"/> - </method> - - <method name="sendTextMessage" tp:name-for-bindings="sendTextMessage"> - <tp:docstring> - Send a text message to the specified call - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - <arg type="s" name="message" direction="in"/> - </method> - - <signal name="newCallCreated" tp:name-for-bindings="newCallCreated"> - <tp:docstring> - <p>Notify that a cell have been created.</p> - <p>The callID generated by the daemon must be stored by the clients in order to address other action for - this call. This signal is emitted when call have been created by the daemon itself.</p> - <tp:rationale> The client must subscribe to this signal to handle calls created by other clients </tp:rationale> - </tp:docstring> - <arg type="s" name="accountID"> - <tp:docstring> - The account ID of the calle. Clients must notify teh right account when receiving this signal. - </tp:docstring> - </arg> - <arg type="s" name="callID"> - <tp:docstring> - A new call ID. - </tp:docstring> - </arg> - <arg type="s" name="to"> - <tp:docstring> - The sip uri this call is trying to reach - </tp:docstring> - </arg> - </signal> - - <signal name="incomingCall" tp:name-for-bindings="incomingCall"> - <tp:docstring> - <p>Notify an incoming call.</p> - <p>The callID generated by the daemon must be stored by the clients in order to address other action for - this call. This signal is emitted when we receive a call from a remote peer</p> - <tp:rationale>The client must subscribe to this signal to handle incoming calls.</tp:rationale> - </tp:docstring> - <arg type="s" name="accountID"> - <tp:docstring> - The account ID of the callee. Clients must notify the right account when receiving this signal. - </tp:docstring> - </arg> - <arg type="s" name="callID"> - <tp:docstring> - A new call ID. - </tp:docstring> - </arg> - <arg type="s" name="from"> - <tp:docstring> - The caller phone number. - </tp:docstring> - </arg> - </signal> - - <signal name="incomingMessage" tp:name-for-bindings="incomingMessage"> - <tp:docstring> - Notify clients that a new text message has been received. - </tp:docstring> - <arg type="s" name="callID" /> - <arg type="s" name="from" /> - <arg type="s" name="message" /> - </signal> - - <signal name="callStateChanged" tp:name-for-bindings="callStateChanged"> - <tp:docstring> - <p>Notify of a change in a call state.</p> - <p>The client must subscribe to this signal.</p> - </tp:docstring> - <arg type="s" name="callID"> - <tp:docstring> - The call ID. - </tp:docstring> - </arg> - <arg type="s" name="state" > - <tp:docstring> - The acceptable states are: - <ul> - <li>INCOMING: Initial state of incoming calls</li> - <li>RINGING: Initial state of received outgoing call</li> - <li>CURRENT: The normal active state of an answered call</li> - <li>HUNGUP: Notify that the call has been hungup by peer</li> - <li>BUSY</li> - <li>FAILURE: Error when processing a call</li> - <li>HOLD</li> - <li>UNHOLD_CURRENT</li> - <li>UNHOLD_RECORD</li> - </ul> - </tp:docstring> - </arg> - </signal> - - <signal name="conferenceChanged" tp:name-for-bindings="conferenceChanged"> - <tp:added version="0.9.7"/> - <tp:docstring> - Notify of a change in the conferences state - </tp:docstring> - <arg type="s" name="confID"> - <tp:docstring> - The conference ID. - </tp:docstring> - </arg> - <arg type="s" name="state"> - <tp:docstring> - The acceptable states are: - <ul> - <li>ACTIVE_ATTACHED: SFLphone user is - participating to this conference</li> - <li>ACTIVE_DETACHED: This situation can - occur if a call is received while - SFLphone user is participating to a - conference. In this case, one can leave - the conference by answering the - call. Other participants may continue - conferencing normally.</li> - <li>HOLD: Each call in this conference - is on state HOLD</li> - </ul> - </tp:docstring> - </arg> - </signal> - - <method name="getParticipantList" tp:name-for-bindings="getParticipantList"> - <tp:added version="0.9.7"/> - <tp:docstring> - Get the call IDs of every participant to a given conference. The client should keep and update the list of participant. - </tp:docstring> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - The conference ID. - </tp:docstring> - </arg> - <arg type="as" name="list" direction="out"> - <tp:docstring> - The list of the call IDs. - </tp:docstring> - </arg> - </method> - - <signal name="conferenceCreated" tp:name-for-bindings="conferenceCreated"> - <tp:added version="0.9.7"/> - <tp:docstring> - Emited when a new conference is created. SFLphone-client is reponsible to store the confID and call <tp:member-ref>getParticipantList</tp:member-ref> to update the display. - </tp:docstring> - <arg type="s" name="confID"> - <tp:docstring> - A new conference ID. - </tp:docstring> - </arg> - </signal> - - <signal name="conferenceRemoved" tp:name-for-bindings="conferenceRemoved"> - <tp:added version="0.9.7"/> - <tp:docstring> - Emited when a new conference is remove. SFLphone-client should have kept a list of current participant in order to display modification. - </tp:docstring> - <arg type="s" name="confID"> - <tp:docstring> - The conference ID. - </tp:docstring> - </arg> - </signal> - - <method name="holdConference" tp:name-for-bindings="holdConference"> - <tp:added version="0.9.7"/> - <tp:docstring> - Hold on every calls participating to this conference. - </tp:docstring> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - The conference ID. - </tp:docstring> - </arg> - </method> - - <method name="unholdConference" tp:name-for-bindings="unholdConference"> - <tp:added version="0.9.7"/> - <tp:docstring> - Hold off every calls participating to this conference. - </tp:docstring> - <arg type="s" name="confID" direction="in"> - <tp:docstring> - The conference ID. - </tp:docstring> - </arg> - </method> - - <method name="startRecordedFilePlayback" tp:name-for-bindings="startRecordedFilePlayback"> - <tp:added version="0.9.14"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="filepath" direction="in"/> - <arg type="b" name="result" direction="out"/> - </method> - - <method name="stopRecordedFilePlayback" tp:name-for-bindings="stopRecordedFilePlayback"> - <tp:added version="0.9.14"/> - <tp:docstring/> - <arg type="s" name="filepath" direction="in"/> - </method> - - <signal name="sipCallStateChanged" tp:name-for-bindings="sipCallStateChanged"> - <tp:docstring> - <p>Call state changed, SFLphone received a notification - from registrar concerning this call.</p> - </tp:docstring> - <arg type="s" name="callID" /> - <tp:docstring> - The call ID - </tp:docstring> - <arg type="s" name="state" /> - <tp:docstring> - Description string - </tp:docstring> - <arg type="i" name="code" /> - <tp:docstring> - The SIP or IAX2 message code - </tp:docstring> - </signal> - - <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> - <tp:docstring> - <p>Account state changed, SFLphone received a notification - from registrar.</p> - </tp:docstring> - <arg type="s" name="accountID" > - <tp:docstring> - The account ID - </tp:docstring> - </arg> - <arg type="s" name="state"> - <tp:docstring> - Description string - </tp:docstring> - </arg> - <arg type="i" name="code"> - <tp:docstring> - The SIP or IAX2 message code - </tp:docstring> - </arg> - </signal> - - <signal name="voiceMailNotify" tp:name-for-bindings="voiceMailNotify"> - <tp:docstring> - Notify the clients of the voicemail number for a specific account, if applicable. - </tp:docstring> - <arg type="s" name="accountID"> - <tp:docstring> - The account ID. - </tp:docstring> - </arg> - <arg type="i" name="count"> - <tp:docstring> - The number of waiting messages. - </tp:docstring> - </arg> - </signal> - - <signal name="volumeChanged" tp:name-for-bindings="volumeChanged"> - <tp:docstring> - <p>Notify clients of a volume level - change.</p> - <p>This signal occurs only if ALSA is - enabled since Pulseaudio streams are - managed externally. </p> - </tp:docstring> - <arg type="s" name="device"> - <tp:docstring> - The device: mic or speaker - </tp:docstring> - </arg> - <arg type="d" name="value"> - <tp:docstring> - The new volume value - </tp:docstring> - </arg> - </signal> - - <signal name="transferSucceded" tp:name-for-bindings="transferSucceded"> - <tp:docstring> - <p>Transfer has been successfully - processed. Client should remove transfered - call from call list as it is no longer - accessible in SFLphone-daemon.</p> - </tp:docstring> - </signal> - - <signal name="transferFailed" tp:name-for-bindings="transferFailed"> - <tp:docstring> - <p>Transfer operation failed. Corespondin - call is no longer accessible in - SFLphone-daemon.</p> - </tp:docstring> - </signal> - - <signal name="secureSdesOn" tp:name-for-bindings="secureSdesOn"> - <tp:added version="0.9.7"/> - <tp:docstring> - <p>Signal sent on SDES session success. Media transmission is encripted - for this call only. It does not apply for a - conference.</p> - <p>A conference can be considered to be secured if and only if each - participant is secured.</p> - </tp:docstring> - <arg type="s" name="callID"/> - </signal> - - <signal name="secureSdesOff" tp:name-for-bindings="secureSdesOff"> - <tp:added version="0.9.7"/> - <tp:docstring> - <p>Sinal sent to notify that SDES session - failed.</p> - <p>Media transmission is not encrypted.</p> - </tp:docstring> - <arg type="s" name="callID" /> - </signal> - - <!-- ZRTP Methods and Signals --> - <signal name="secureZrtpOn" tp:name-for-bindings="secureZrtpOn"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - <arg type="s" name="cipher" /> - </signal> - - <signal name="secureZrtpOff" tp:name-for-bindings="secureZrtpOff"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - </signal> - - <signal name="confirmGoClear" tp:name-for-bindings="confirmGoClear"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - </signal> - - <signal name="zrtpNegotiationFailed" tp:name-for-bindings="zrtpNegotiationFailed"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - <arg type="s" name="reason" /> - <arg type="s" name="severity" /> - </signal> - - <signal name="zrtpNotSuppOther" tp:name-for-bindings="zrtpNotSuppOther"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - </signal> - - <signal name="showSAS" tp:name-for-bindings="showSAS"> - <tp:added version="0.9.7"/> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" /> - <arg type="s" name="sas" /> - <arg type="b" name="verified"/> - </signal> - - <method name="setSASVerified" tp:name-for-bindings="setSASVerified"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - </method> - - <method name="resetSASVerified" tp:name-for-bindings="resetSASVerified"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - </method> - - <method name="setConfirmGoClear" tp:name-for-bindings="setConfirmGoClear"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - </method> - - <method name="requestGoClear" tp:name-for-bindings="requestGoClear"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - </method> - - <method name="acceptEnrollment" tp:name-for-bindings="acceptEnrollment"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - <arg type="b" name="accepted" direction="in"/> - </method> - - <method name="setPBXEnrollment" tp:name-for-bindings="setPBXEnrollment"> - <tp:added version="0.9.7"/> - <tp:docstring> - </tp:docstring> - <arg type="s" name="callID" direction="in"/> - <arg type="b" name="yesNo" direction="in"/> - </method> - - </interface> + <interface name="org.sflphone.SFLphone.CallManager"> + + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>The CallManager interface is used to manage call and conference related actions.</p> + <p>Since SFLphone-daemon supports multiple incoming/outgoing calls, any actions involving a specific call must address the method by the means of a unique callID. + SFLphone-clients is responsible for generating the callID on outgoing calls. Conversely, SFLphone-daemon will generate a unique callID for incoming calls.</p> + </tp:docstring> + <method name="placeCall" tp:name-for-bindings="placeCall"> + <tp:docstring> + <p>This is the main method in order to place a new call. The call is registered with the daemon using this method.</p> + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> + The ID of the account with which you want to make a call. If the call is to be placed without any account by means of a SIP URI (i.e. sip:num@server), the "IP2IP_PROFILE" is passed as the accountID. For more details on accounts see the configuration manager interface. + </tp:docstring> + </arg> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID is a unique identifier that must be randomly generated on the client's side. Any subsequent actions refering to this call must use this callID. + </tp:docstring> + </arg> + <arg type="s" name="to" direction="in"> + <tp:docstring> + If bound to a VoIP account, then the argument is the phone number. In case of calls involving "IP2IP_PROFILE", a complete SIP URI must be specified. + </tp:docstring> + </arg> + </method> + + <method name="placeCallFirstAccount" tp:name-for-bindings="placeCallFirstAccount"> + <tp:added version="0.9.8"/> + <tp:docstring> + Place a call with the first registered account in the account list. + <tp:rationale> + Use this function when you don't have any information about the accounts used (Ex: Firefly mozilla extension) + </tp:rationale> + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID is a unique identifier that must be randomly generated on the client's side. Any subsequent actions refering to this call must use this callID. + </tp:docstring> + </arg> + <arg type="s" name="to" direction="in"> + <tp:docstring> + If bound to a VoIP account, then the argument is the phone number. In case of calls involving "IP2IP_PROFILE", a complete SIP URI must be specified. + </tp:docstring> + </arg> + </method> + + <method name="refuse" tp:name-for-bindings="refuse"> + <tp:docstring> + Refuse an incoming call. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + + </method> + + <method name="accept" tp:name-for-bindings="accept"> + <tp:docstring> + Answer an incoming call. Automatically puts the current call on HOLD. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + </method> + + <method name="hangUp" tp:name-for-bindings="hangUp"> + <tp:docstring> + Hangup a call in state "CURRENT" or "HOLD". + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + </method> + + <method name="hangUpConference" tp:name-for-bindings="hangUpConference"> + <tp:added version="0.9.7"/> + <tp:docstring> + Hangup a conference, and every call participating to the conference. + </tp:docstring> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + The unique conference ID. + </tp:docstring> + </arg> + </method> + + <method name="hold" tp:name-for-bindings="hold"> + <tp:docstring> + Place a call on hold. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + </method> + + <method name="unhold" tp:name-for-bindings="unhold"> + <tp:docstring> + Take a call off hold, and place this call in state CURRENT. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + </method> + + <method name="transfer" tp:name-for-bindings="transfer"> + <tp:docstring> + Transfer a call to the given phone number. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The callID. + </tp:docstring> + </arg> + <arg type="s" name="to" direction="in"> + <tp:docstring> + The phone number to which the call will be transferred. + </tp:docstring> + </arg> + </method> + + <method name="attendedTransfer" tp:name-for-bindings="attendedTransfer"> + <tp:docstring> + Perform an attended transfer on two calls. + </tp:docstring> + <arg type="s" name="transferID" direction="in"> + <tp:docstring> + The callID of the call to be transfered. + </tp:docstring> + </arg> + <arg type="s" name="targetID" direction="in"> + <tp:docstring> + The callID of the target call. + </tp:docstring> + </arg> + </method> + + <method name="playDTMF" tp:name-for-bindings="playDTMF"> + <tp:docstring> + Dual-Tone multi-frequency. Tell the core to play dialtones. A SIP INFO message is sent to notify the server. + </tp:docstring> + <arg type="s" name="key" direction="in"> + <tp:docstring> + Unicode character for pressed key. + </tp:docstring> + </arg> + </method> + + <method name="startTone" tp:name-for-bindings="startTone"> + <tp:docstring> + Start audio stream and play tone. + </tp:docstring> + <arg type="i" name="start" direction="in"/> + <arg type="i" name="type" direction="in"/> + </method> + + <method name="setVolume" tp:name-for-bindings="setVolume"> + <tp:docstring> + <p>Sets the volume using a linear scale [0,100].</p> + <tp:rationale>Pulseaudio has its own mechanism to modify application volume. This method is enabled only if the ALSA API is used.</tp:rationale> + </tp:docstring> + <arg type="s" name="device" direction="in"> + <tp:docstring> + The device: mic or speaker + </tp:docstring> + </arg> + <arg type="d" name="value" direction="in"> + <tp:docstring> + The volume value (between 0 and 100) + </tp:docstring> + </arg> + </method> + + <method name="getVolume" tp:name-for-bindings="getVolume"> + <tp:docstring> + <p>Return the volume value of the given device on a linear scale [0,100].</p> + <tp:rationale>Only enabled if the ALSA API is used, Pulseaudio has its own mechanism to modify application volume.</tp:rationale> + </tp:docstring> + <arg type="s" name="device" direction="in"> + <tp:docstring> + The device: mic or speaker + </tp:docstring> + </arg> + <arg type="d" name="value" direction="out"> + <tp:docstring> + The volume value (between 0 and 100) + </tp:docstring> + </arg> + </method> + + <method name="joinParticipant" tp:name-for-bindings="joinParticipant"> + <tp:added version="0.9.7"/> + <tp:docstring> + <p>Join two participants together to create a 3-way conference including the current client.</p> + <tp:rationale>The signal <tp:member-ref>conferenceCreated</tp:member-ref> is emitted on success.</tp:rationale> + </tp:docstring> + <arg type="s" name="sel_callID" direction="in"/> + <arg type="s" name="drag_callID" direction="in"/> + </method> + + <method name="createConfFromParticipantList" tp:name-for-bindings="createConfFromParticipantList"> + <tp:added version="0.9.14"/> + <tp:docstring> + <p>Create a conference from a list of participants</p> + <tp:rationale>The signal <tp:member-ref>conferenceCreated</tp:member-ref> is emitted on success.</tp:rationale> + </tp:docstring> + <arg type="as" name="participants" direction="in"/> + </method> + + <method name="addParticipant" tp:name-for-bindings="addParticipant"> + <tp:added version="0.9.7"/> + <tp:docstring> + <p>Join a new particiant to an existing conference.</p> + <tp:rationale>The signal <tp:member-ref>conferenceChanged</tp:member-ref> is emitted on success.</tp:rationale> + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The ID of the call to add to the conference + </tp:docstring> + </arg> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + An existing conference ID + </tp:docstring> + </arg> + </method> + + <method name="addMainParticipant" tp:name-for-bindings="addMainParticipant"> + <tp:added version="0.9.7"/> + <tp:docstring> + <p>As the core can handle multiple calls and conferences, it may happen that the client's user leaves a conference to answer an incoming call or to start new calls. This method is used to reintroduce SFLphone-client's user into the conference.</p> + <p>Its put the current call on HOLD or detaches SFLphone-client's user from the another conference.</p> + </tp:docstring> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + An existing conference ID + </tp:docstring> + </arg> + </method> + + <method name="detachParticipant" tp:name-for-bindings="detachParticipant"> + <tp:added version="0.9.7"/> + <tp:docstring> + Detach the given call from the conference. If only one participant is left, the conference is deleted and the signal <tp:member-ref>conferenceRemoved</tp:member-ref> is emited. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The call ID + </tp:docstring> + </arg> + </method> + + <method name="joinConference" tp:name-for-bindings="joinConference"> + <tp:added version="0.9.7"/> + <tp:docstring> + Join two conferences together. + </tp:docstring> + <arg type="s" name="sel_confID" direction="in"/> + <arg type="s" name="drag_confID" direction="in"/> + </method> + + <method name="getConferenceDetails" tp:name-for-bindings="getConferenceDetails"> + <tp:added version="0.9.7"/> + <tp:docstring> + Returns a hashtable containing conference details. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The conference ID + </tp:docstring> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="infos" direction="out"> + <tp:docstring> + A map containing the ID of the conferences + and their states: + <ul> + <li>ACTIVE_ATTACHED</li> + <li>ACTIVE_DETACHED</li> + <li>HOLD</li> + </ul> + </tp:docstring> + </arg> + </method> + + <method name="getConferenceList" tp:name-for-bindings="getConferenceList"> + <tp:added version="0.9.7"/> + <tp:docstring> + Returns a list containing all active + conferences. + <tp:rationale>To update client status, one should + use <tp:member-ref>getParticipantList</tp:member-ref> + with provided conference IDs.</tp:rationale> + </tp:docstring> + <arg type="as" name="list" direction="out"> + <tp:docstring> + The list of conferences. + </tp:docstring> + </arg> + </method> + + <method name="setRecording" tp:name-for-bindings="setRecording"> + <tp:docstring> + Start recording a call. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The ID of the call to record. + </tp:docstring> + </arg> + </method> + + <method name="getIsRecording" tp:name-for-bindings="getIsRecording"> + <tp:docstring> + Tells whether or not a call is being recorded. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The call ID. + </tp:docstring> + </arg> + <arg type="b" name="isRecording" direction="out"> + <tp:docstring> + Returns true is the call is being recorded. False otherwise. + </tp:docstring> + </arg> + </method> + + <signal name="recordPlaybackFilepath" tp:name-for-bindings="recordPlaybackFilepath"> + <tp:docstring> + Once after starting recording for the first time, this signal is emited to + provide the recorded file path to client application. + </tp:docstring> + <arg type="s" name="callID" /> + <arg type="s" name="filepath"/> + </signal> + + <signal name="recordPlaybackStopped" tp:name-for-bindings="recordPlaybackStopped"> + <tp:docstring/> + <arg type="s" name="filepath" /> + </signal> + + + <method name="getCallDetails" tp:name-for-bindings="getCallDetails"> + <tp:docstring> + Get all the details about a specific call. + </tp:docstring> + <arg type="s" name="callID" direction="in"> + <tp:docstring> + The call ID. + </tp:docstring> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="infos" direction="out" tp:type="String_String_Map"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A map containing the call details: </p> + <ul> + <li>ACCOUNTID</li> + <li>PEER_NUMBER</li> + <li>PEER_NAME</li> + <li>DISPLAY_NAME</li> + <li>CALL_STATE</li> + <li>CALL_TYPE</li> + </ul> + </tp:docstring> + </arg> + </method> + + <method name="getCallList" tp:name-for-bindings="getCallList"> + <tp:docstring> + Get the list of active calls. + <tp:rationale>To get the call details, iterate on the return value and call <tp:member-ref>getCallDetails</tp:member-ref> method.</tp:rationale> + </tp:docstring> + <arg type="as" name="list" direction="out"> + <tp:docstring> + A list of call IDs. + </tp:docstring> + </arg> + </method> + + <method name="getCurrentAudioCodecName" tp:name-for-bindings="getCurrentAudioCodecName"> + <arg type="s" name="callID" direction="in"/> + <arg type="s" name="codecName" direction="out"/> + </method> + + <method name="sendTextMessage" tp:name-for-bindings="sendTextMessage"> + <tp:docstring> + Send a text message to the specified call + </tp:docstring> + <arg type="s" name="callID" direction="in"/> + <arg type="s" name="message" direction="in"/> + </method> + + <signal name="newCallCreated" tp:name-for-bindings="newCallCreated"> + <tp:docstring> + <p>Notify that a call has been created.</p> + <p>The callID generated by the daemon must be stored by the clients in order to address other actions for + this call. This signal is emitted when call haves been created by the daemon itself.</p> + <tp:rationale>The client must subscribe to this signal to handle calls created by other clients</tp:rationale> + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> + The account ID of the call. Clients must notify the right account when receiving this signal. + </tp:docstring> + </arg> + <arg type="s" name="callID"> + <tp:docstring> + A new call ID. + </tp:docstring> + </arg> + <arg type="s" name="to"> + <tp:docstring> + The SIP URI this call is trying to reach. + </tp:docstring> + </arg> + </signal> + + <signal name="incomingCall" tp:name-for-bindings="incomingCall"> + <tp:docstring> + <p>Notify an incoming call.</p> + <p>The callID generated by the daemon must be stored by the clients in order to address other action for + this call. This signal is emitted when we receive a call from a remote peer</p> + <tp:rationale>The client must subscribe to this signal to handle incoming calls.</tp:rationale> + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> + The account ID of the callee. Clients must notify the right account when receiving this signal. + </tp:docstring> + </arg> + <arg type="s" name="callID"> + <tp:docstring> + A new call ID. + </tp:docstring> + </arg> + <arg type="s" name="from"> + <tp:docstring> + The caller phone number. + </tp:docstring> + </arg> + </signal> + + <signal name="incomingMessage" tp:name-for-bindings="incomingMessage"> + <tp:docstring> + Notify clients that a new text message has been received. + </tp:docstring> + <arg type="s" name="callID" /> + <arg type="s" name="from" /> + <arg type="s" name="message" /> + </signal> + + <signal name="callStateChanged" tp:name-for-bindings="callStateChanged"> + <tp:docstring> + <p>Notify of a change in a call state.</p> + <p>The client must subscribe to this signal.</p> + </tp:docstring> + <arg type="s" name="callID"> + <tp:docstring> + The call ID. + </tp:docstring> + </arg> + <arg type="s" name="state" > + <tp:docstring> + The acceptable states are: + <ul> + <li>INCOMING: Initial state of incoming calls</li> + <li>RINGING: Initial state of received outgoing call</li> + <li>CURRENT: The normal active state of an answered call</li> + <li>HUNGUP: Notify that the call has been hungup by peer</li> + <li>BUSY</li> + <li>FAILURE: Error when processing a call</li> + <li>HOLD</li> + <li>UNHOLD_CURRENT</li> + <li>UNHOLD_RECORD</li> + </ul> + </tp:docstring> + </arg> + </signal> + + <signal name="conferenceChanged" tp:name-for-bindings="conferenceChanged"> + <tp:added version="0.9.7"/> + <tp:docstring> + Notify of a change in the conferences state + </tp:docstring> + <arg type="s" name="confID"> + <tp:docstring> + The conference ID. + </tp:docstring> + </arg> + <arg type="s" name="state"> + <tp:docstring> + The acceptable states are: + <ul> + <li>ACTIVE_ATTACHED: SFLphone user is + participating to this conference</li> + <li>ACTIVE_DETACHED: This situation can + occur if a call is received while + SFLphone user is participating to a + conference. In this case, one can leave + the conference by answering the + call. Other participants may continue + conferencing normally.</li> + <li>HOLD: Each call in this conference + is on state HOLD</li> + </ul> + </tp:docstring> + </arg> + </signal> + + <method name="getParticipantList" tp:name-for-bindings="getParticipantList"> + <tp:added version="0.9.7"/> + <tp:docstring> + Get the call IDs of every participant to a given conference. The client should keep and update the list of participants. + </tp:docstring> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + The conference ID. + </tp:docstring> + </arg> + <arg type="as" name="list" direction="out"> + <tp:docstring> + The list of the call IDs. + </tp:docstring> + </arg> + </method> + + <signal name="conferenceCreated" tp:name-for-bindings="conferenceCreated"> + <tp:added version="0.9.7"/> + <tp:docstring> + Emited when a new conference is created. SFLphone-client is reponsible for storing the confID and call <tp:member-ref>getParticipantList</tp:member-ref> to update the display. + </tp:docstring> + <arg type="s" name="confID"> + <tp:docstring> + A new conference ID. + </tp:docstring> + </arg> + </signal> + + <signal name="conferenceRemoved" tp:name-for-bindings="conferenceRemoved"> + <tp:added version="0.9.7"/> + <tp:docstring> + Emited when a new conference is remove. SFLphone-client should have kept a list of current participant in order to display modification. + </tp:docstring> + <arg type="s" name="confID"> + <tp:docstring> + The conference ID. + </tp:docstring> + </arg> + </signal> + + <method name="holdConference" tp:name-for-bindings="holdConference"> + <tp:added version="0.9.7"/> + <tp:docstring> + Hold every call which is participating in this conference. + </tp:docstring> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + The conference ID. + </tp:docstring> + </arg> + </method> + + <method name="unholdConference" tp:name-for-bindings="unholdConference"> + <tp:added version="0.9.7"/> + <tp:docstring> + Hold off every call participating in this conference. + </tp:docstring> + <arg type="s" name="confID" direction="in"> + <tp:docstring> + The conference ID. + </tp:docstring> + </arg> + </method> + + <method name="startRecordedFilePlayback" tp:name-for-bindings="startRecordedFilePlayback"> + <tp:added version="0.9.14"/> + <arg type="s" name="filepath" direction="in"/> + <arg type="b" name="result" direction="out"/> + </method> + + <method name="stopRecordedFilePlayback" tp:name-for-bindings="stopRecordedFilePlayback"> + <tp:added version="0.9.14"/> + <tp:docstring/> + <arg type="s" name="filepath" direction="in"/> + </method> + + <signal name="sipCallStateChanged" tp:name-for-bindings="sipCallStateChanged"> + <tp:docstring> + <p>Call state changed, SFLphone received a notification + from registrar concerning this call.</p> + </tp:docstring> + <arg type="s" name="callID" /> + <tp:docstring> + The call ID + </tp:docstring> + <arg type="s" name="state" /> + <tp:docstring> + Description string + </tp:docstring> + <arg type="i" name="code" /> + <tp:docstring> + The SIP or IAX2 message code + </tp:docstring> + </signal> + + <signal name="registrationStateChanged" tp:name-for-bindings="registrationStateChanged"> + <tp:docstring> + <p>Account state changed, SFLphone received a notification + from registrar.</p> + </tp:docstring> + <arg type="s" name="accountID" > + <tp:docstring> + The account ID + </tp:docstring> + </arg> + <arg type="s" name="state"> + <tp:docstring> + Description string + </tp:docstring> + </arg> + <arg type="i" name="code"> + <tp:docstring> + The SIP or IAX2 message code + </tp:docstring> + </arg> + </signal> + + <signal name="voiceMailNotify" tp:name-for-bindings="voiceMailNotify"> + <tp:docstring> + Notify the clients of the voicemail number for a specific account, if applicable. + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> + The account ID. + </tp:docstring> + </arg> + <arg type="i" name="count"> + <tp:docstring> + The number of waiting messages. + </tp:docstring> + </arg> + </signal> + + <signal name="volumeChanged" tp:name-for-bindings="volumeChanged"> + <tp:docstring> + <p>Notify clients of a volume level change.</p> + <p>This signal occurs only if ALSA is enabled since Pulseaudio streams are managed externally. </p> + </tp:docstring> + <arg type="s" name="device"> + <tp:docstring> + The device: mic or speaker + </tp:docstring> + </arg> + <arg type="d" name="value"> + <tp:docstring> + The new volume value + </tp:docstring> + </arg> + </signal> + + <signal name="transferSucceeded" tp:name-for-bindings="transferSucceeded"> + <tp:docstring> + <p>Transfer has been successfully + processed. Client should remove transfered + call from call list as it is no longer + accessible in SFLphone-daemon.</p> + </tp:docstring> + </signal> + + <signal name="transferFailed" tp:name-for-bindings="transferFailed"> + <tp:docstring> + <p>Transfer operation failed. Corresponding + call is no longer accessible in + SFLphone-daemon.</p> + </tp:docstring> + </signal> + + <signal name="secureSdesOn" tp:name-for-bindings="secureSdesOn"> + <tp:added version="0.9.7"/> + <tp:docstring> + <p>Signal sent on SDES session success. Media transmission is encripted + for this call only. It does not apply for a conference.</p> + <p>A conference can be considered to be secured if and only if each + participant is secured.</p> + </tp:docstring> + <arg type="s" name="callID"/> + </signal> + + <signal name="secureSdesOff" tp:name-for-bindings="secureSdesOff"> + <tp:added version="0.9.7"/> + <tp:docstring> + <p>Sinal sent to notify that SDES session failed.</p> + <p>Media transmission is not encrypted.</p> + </tp:docstring> + <arg type="s" name="callID" /> + </signal> + + <!-- ZRTP Methods and Signals --> + <signal name="secureZrtpOn" tp:name-for-bindings="secureZrtpOn"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + <arg type="s" name="cipher" /> + </signal> + + <signal name="secureZrtpOff" tp:name-for-bindings="secureZrtpOff"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + </signal> + + <signal name="confirmGoClear" tp:name-for-bindings="confirmGoClear"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + </signal> + + <signal name="zrtpNegotiationFailed" tp:name-for-bindings="zrtpNegotiationFailed"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + <arg type="s" name="reason" /> + <arg type="s" name="severity" /> + </signal> + + <signal name="zrtpNotSuppOther" tp:name-for-bindings="zrtpNotSuppOther"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + </signal> + + <signal name="showSAS" tp:name-for-bindings="showSAS"> + <tp:added version="0.9.7"/> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" /> + <arg type="s" name="sas" /> + <arg type="b" name="verified"/> + </signal> + + <method name="setSASVerified" tp:name-for-bindings="setSASVerified"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + </method> + + <method name="resetSASVerified" tp:name-for-bindings="resetSASVerified"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + </method> + + <method name="setConfirmGoClear" tp:name-for-bindings="setConfirmGoClear"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + </method> + + <method name="requestGoClear" tp:name-for-bindings="requestGoClear"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + </method> + + <method name="acceptEnrollment" tp:name-for-bindings="acceptEnrollment"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + <arg type="b" name="accepted" direction="in"/> + </method> + + <method name="setPBXEnrollment" tp:name-for-bindings="setPBXEnrollment"> + <tp:added version="0.9.7"/> + <arg type="s" name="callID" direction="in"/> + <arg type="b" name="yesNo" direction="in"/> + </method> + + </interface> </node> diff --git a/kde/src/lib/dbus/configurationmanager-introspec.xml b/kde/src/lib/dbus/configurationmanager-introspec.xml index 13f666940b..926ff774de 100644 --- a/kde/src/lib/dbus/configurationmanager-introspec.xml +++ b/kde/src/lib/dbus/configurationmanager-introspec.xml @@ -1,107 +1,97 @@ <?xml version="1.0" ?> <node name="/configurationmanager-introspec" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> - <interface name="org.sflphone.SFLphone.ConfigurationManager"> - - <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> - Used to handle the configuration stuff: accounts settings, account registration, user preferences, ... - </tp:docstring> - - <method name="getAccountDetails" tp:name-for-bindings="getAccountDetails"> - <tp:docstring> - Get all parameters of the specified account. - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - The account ID - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> - <tp:docstring> - The available keys / parameters are: - <ul> - <li>CONFIG_ACCOUNT_ENABLE: True or False (Default: True)</li> - <li>CONFIG_ACCOUNT_RESOLVE_ONCE</li> - <li>CONFIG_ACCOUNT_TYPE: SIP or IAX2 (Default: SIP)</li> - <li>HOSTNAME: The IP adress or hostname of the registrar</li> - <li>USERNAME: The username (or extension) of the account</li> - <li>PASSWORD: The password associated to the account</li> - <li>REALM</li> - <li>CONFIG_ACCOUNT_MAILBOX: Number to dial to access the voicemail box</li> - <li>CONFIG_ACCOUNT_REGISTRATION_EXPIRE: SIP header expiration value (Default: 1600)</li> - <li>LOCAL_INTERFACE: The network interface (Default: eth0)</li> - <li>PUBLISHED_SAMEAS_LOCAL: If False, the published address equals the local address. This is the default.</li> - <li>PUBLISHED_ADDRESS: The SIP published address</li> - <li>LOCAL_PORT: The SIP listening port (Default: 5060)</li> - <li>PUBLISHED_PORT: The SIP published port</li> - <li>DISPLAY_NAMEL: The display name</li> - <li>STUN_ENABLE: True or False (Default: False)</li> - <li>STUN_SERVER: The STUN server address</li> - <li>REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> - <li>REGISTRATION_STATE_CODE</li> - <li>REGISTRATION_STATE_DESCRIPTION</li> - <li>SRTP_KEY_EXCHANGE</li> - <li>SRTP_ENABLE: Whether or not voice communication are encrypted - True or False (Default: False)</li> - <li>SRTP_RTP_FALLBACK</li> - <li>ZRTP_DISPLAY_SAS</li> - <li>ZRTP_DISPLAY_SAS_ONCE</li> - <li>ZRTP_HELLO_HASH</li> - <li>ZRTP_NOT_SUPP_WARNING</li> - <li>TLS_LISTENER_PORT: TLS listening port (Default: 5061)</li> - <li>TLS_ENABLE: Whether or not signalling is encrypted - True or False (Default: False)</li> - <li>TLS_CA_LIST_FILE</li> - <li>TLS_CERTIFICATE_FILE</li> - <li>TLS_PRIVATE_KEY_FILE</li> - <li>TLS_METHOD</li> - <li>TLS_CIPHERS</li> - <li>TLS_SERVER_NAME</li> - <li>TLS_VERIFY_SERVER</li> - <li>TLS_VERIFY_CLIENT</li> - <li>TLS_REQUIRE_CLIENT_CERTIFICATE</li> - <li>TLS_NEGOTIATION_TIMEOUT_SEC</li> - <li>TLS_NEGOTIATION_TIMEOUT_MSEC</li> - </ul> - </tp:docstring> - </arg> - </method> - - <method name="setAccountDetails" tp:name-for-bindings="setAccountDetails"> - <tp:docstring> - Send new account parameters, or account parameters changes, to the core. The hash table is not required to be complete, only the updated parameters may be specified. - <tp:rationale>Account settings are written to the configuration file when sflphone properly quits.</tp:rationale> - <tp:rationale>After calling this method, the core will emit the signal <tp:member-ref>accountsChanged</tp:member-ref> with the updated data. The client must subscribe to this signal and use it to update its internal data structure.</tp:rationale> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="MapStringString"/> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setCredentials" tp:name-for-bindings="setCredentials"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="VectorMapStringString"/> - <arg type="aa{ss}" name="credentialInformation" direction="in" tp:type="String_String_Map"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getIp2IpDetails" tp:name-for-bindings="getIp2IpDetails"> + <interface name="org.sflphone.SFLphone.ConfigurationManager"> + + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + Used to handle the configuration stuff: accounts settings, account registration, user preferences, ... + </tp:docstring> + + <method name="getAccountDetails" tp:name-for-bindings="getAccountDetails"> + <tp:docstring> + Get all parameters of the specified account. + </tp:docstring> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> + The account ID + </tp:docstring> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> + <tp:docstring> + The available keys / parameters are: + <ul> + <li>CONFIG_ACCOUNT_ENABLE: True or False (Default: True)</li> + <li>CONFIG_ACCOUNT_RESOLVE_ONCE</li> + <li>CONFIG_ACCOUNT_TYPE: SIP or IAX2 (Default: SIP)</li> + <li>HOSTNAME: The IP adress or hostname of the registrar</li> + <li>USERNAME: The username (or extension) of the account</li> + <li>PASSWORD: The password associated to the account</li> + <li>REALM</li> + <li>CONFIG_ACCOUNT_MAILBOX: Number to dial to access the voicemail box</li> + <li>CONFIG_ACCOUNT_REGISTRATION_EXPIRE: SIP header expiration value (Default: 1600)</li> + <li>LOCAL_INTERFACE: The network interface (Default: eth0)</li> + <li>PUBLISHED_SAMEAS_LOCAL: If False, the published address equals the local address. This is the default.</li> + <li>PUBLISHED_ADDRESS: The SIP published address</li> + <li>LOCAL_PORT: The SIP listening port (Default: 5060)</li> + <li>PUBLISHED_PORT: The SIP published port</li> + <li>DISPLAY_NAMEL: The display name</li> + <li>STUN_ENABLE: True or False (Default: False)</li> + <li>STUN_SERVER: The STUN server address</li> + <li>REGISTRATION_STATUS: The account registration status. Should be Registered to make calls.</li> + <li>REGISTRATION_STATE_CODE</li> + <li>REGISTRATION_STATE_DESCRIPTION</li> + <li>SRTP_KEY_EXCHANGE</li> + <li>SRTP_ENABLE: Whether or not voice communication are encrypted - True or False (Default: False)</li> + <li>SRTP_RTP_FALLBACK</li> + <li>ZRTP_DISPLAY_SAS</li> + <li>ZRTP_DISPLAY_SAS_ONCE</li> + <li>ZRTP_HELLO_HASH</li> + <li>ZRTP_NOT_SUPP_WARNING</li> + <li>TLS_LISTENER_PORT: TLS listening port (Default: 5061)</li> + <li>TLS_ENABLE: Whether or not signalling is encrypted - True or False (Default: False)</li> + <li>TLS_CA_LIST_FILE</li> + <li>TLS_CERTIFICATE_FILE</li> + <li>TLS_PRIVATE_KEY_FILE</li> + <li>TLS_METHOD</li> + <li>TLS_CIPHERS</li> + <li>TLS_SERVER_NAME</li> + <li>TLS_VERIFY_SERVER</li> + <li>TLS_VERIFY_CLIENT</li> + <li>TLS_REQUIRE_CLIENT_CERTIFICATE</li> + <li>TLS_NEGOTIATION_TIMEOUT_SEC</li> + <li>TLS_NEGOTIATION_TIMEOUT_MSEC</li> + </ul> + </tp:docstring> + </arg> + </method> + + <method name="setAccountDetails" tp:name-for-bindings="setAccountDetails"> + <tp:docstring> + Send new account parameters, or account parameters changes, to the core. The hash table is not required to be complete, only the updated parameters may be specified. + <tp:rationale>Account settings are written to the configuration file when sflphone properly quits.</tp:rationale> + <tp:rationale>After calling this method, the core will emit the signal <tp:member-ref>accountsChanged</tp:member-ref> with the updated data. The client must subscribe to this signal and use it to update its internal data structure.</tp:rationale> + </tp:docstring> + <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="MapStringString"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> + </arg> + </method> + + <method name="setCredentials" tp:name-for-bindings="setCredentials"> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="VectorMapStringString"/> + <arg type="aa{ss}" name="credentialInformation" direction="in" tp:type="String_String_Map"> + </arg> + </method> + + <method name="getIp2IpDetails" tp:name-for-bindings="getIp2IpDetails"> <tp:docstring> Get configuration settings of the IP2IP_PROFILE. They are sligthly different from account settings since no VoIP accounts are involved. </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <!--<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/>--> + <!--<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/>--> <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map"> <tp:docstring> Available parameters are: @@ -134,597 +124,388 @@ </arg> </method> - <method name="getCredentials" tp:name-for-bindings="getCredentials"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> - <arg type="aa{ss}" name="credentialInformation" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="addAccount" tp:name-for-bindings="addAccount"> - <tp:docstring> - Add a new account. When created, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. - <tp:rationale>If no details are specified, the default parameters are used.</tp:rationale> - <tp:rationale>The core tries to register the account as soon it is created.</tp:rationale> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> - <tp:docstring> - The new account settings - </tp:docstring> - </arg> - <arg type="s" name="createdAccountId" direction="out"> - <tp:docstring> - A new account ID - </tp:docstring> - </arg> - </method> - - <method name="setAccountsOrder" tp:name-for-bindings="setAccountsOrder"> - <tp:docstring> - Update the accounts order. - <tp:rationale>When placing a call, the first registered account in the list is used.</tp:rationale> - </tp:docstring> - <arg type="s" name="order" direction="in"> - <tp:docstring> - An ordered list of account IDs, delimited by '/' - </tp:docstring> - </arg> - </method> - - <method name="removeAccount" tp:name-for-bindings="removeAccount"> - <tp:docstring> - Remove an existing account. When removed, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. - </tp:docstring> - <arg type="s" name="accoundID" direction="in"> - <tp:docstring> - The account to remove, identified by its ID - </tp:docstring> - </arg> - </method> - - <method name="getAccountList" tp:name-for-bindings="getAccountList"> - <tp:docstring> - Get a list of all created accounts, as stored by the core. - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - A list of account IDs - </tp:docstring> - </arg> - </method> - - <method name="sendRegister" tp:name-for-bindings="sendRegister"> - <tp:docstring> - Send account registration (REGISTER) to the registrar. - </tp:docstring> - the account if expire=1, unregister if expire=0. - - @param[in] input accountID - --> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - The account ID - </tp:docstring> - </arg> - <arg type="i" name="expire" direction="in"> - <tp:docstring> - <p>To register, expire must be 1.</p> - <p>To un-register, expire must be 0.</p> - </tp:docstring> - </arg> - </method> - - <method name="getAudioManager" tp:name-for-bindings="getAudioManager"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="api" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAudioManager" tp:name-for-bindings="setAudioManager"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="api" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getRecordPath" tp:name-for-bindings="getRecordPath"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="rec" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setRecordPath" tp:name-for-bindings="setRecordPath"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="rec" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getIsAlwaysRecording" tp:name-for-bindings="getIsAlwaysRecording"> - <tp:docstring> - </tp:docstring> - <arg type="b" name="res" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setIsAlwaysRecording" tp:name-for-bindings="setIsAlwaysRecording"> - <tp:docstring> - </tp:docstring> - <arg type="b" name="enabled" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <!-- /////////////////////// --> - - <!-- Codecs-related methods --> - - <method name="getAudioCodecList" tp:name-for-bindings="getAudioCodecList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorInt"/> - <arg type="ai" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAudioCodecDetails" tp:name-for-bindings="getAudioCodecDetails"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="payload" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="details" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getActiveAudioCodecList" tp:name-for-bindings="getActiveAudioCodecList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorInt"/> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <arg type="ai" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setActiveAudioCodecList" tp:name-for-bindings="setActiveAudioCodecList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/> - <arg type="as" name="list" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <arg type="s" name="accountID" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - - <!-- Audio devices methods --> - - <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAudioPlugin" tp:name-for-bindings="setAudioPlugin"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="audioPlugin" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAudioOutputDevice" tp:name-for-bindings="setAudioOutputDevice"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAudioRingtoneDevice" tp:name-for-bindings="setAudioRingtoneDevice"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - - <method name="getCurrentAudioDevicesIndex" tp:name-for-bindings="getCurrentAudioDevicesIndex"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAudioDeviceIndex" tp:name-for-bindings="getAudioDeviceIndex"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="name" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <arg type="i" name="index" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getCurrentAudioOutputPlugin" tp:name-for-bindings="getCurrentAudioOutputPlugin"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="plugin" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> + <method name="getCredentials" tp:name-for-bindings="getCredentials"> + <arg type="s" name="accountID" direction="in"> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <arg type="aa{ss}" name="credentialInformation" direction="out"> + </arg> + </method> + + <method name="addAccount" tp:name-for-bindings="addAccount"> + <tp:docstring> + Add a new account. When created, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. + <tp:rationale>If no details are specified, the default parameters are used.</tp:rationale> + <tp:rationale>The core tries to register the account as soon it is created.</tp:rationale> + </tp:docstring> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> + <tp:docstring> + The new account settings + </tp:docstring> + </arg> + <arg type="s" name="createdAccountId" direction="out"> + <tp:docstring> + A new account ID + </tp:docstring> + </arg> + </method> + + <method name="setAccountsOrder" tp:name-for-bindings="setAccountsOrder"> + <tp:docstring> + Update the accounts order. + <tp:rationale>When placing a call, the first registered account in the list is used.</tp:rationale> + </tp:docstring> + <arg type="s" name="order" direction="in"> + <tp:docstring> + An ordered list of account IDs, delimited by '/' + </tp:docstring> + </arg> + </method> + + <method name="removeAccount" tp:name-for-bindings="removeAccount"> + <tp:docstring> + Remove an existing account. When removed, the signal <tp:member-ref>accountsChanged</tp:member-ref> is emitted. The clients must then call <tp:member-ref>getAccountList</tp:member-ref> to update their internal data structure. + </tp:docstring> + <arg type="s" name="accoundID" direction="in"> + <tp:docstring> + The account to remove, identified by its ID + </tp:docstring> + </arg> + </method> + + <method name="getAccountList" tp:name-for-bindings="getAccountList"> + <tp:docstring> + Get a list of all created accounts, as stored by the core. + </tp:docstring> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + <tp:docstring> + A list of account IDs + </tp:docstring> + </arg> + </method> + + <method name="sendRegister" tp:name-for-bindings="sendRegister"> + <tp:docstring> + Send account registration (REGISTER) to the registrar. + </tp:docstring> + Register the account if enable=true, unregister if enable=false. + + @param[in] input accountID + --> + <arg type="s" name="accountID" direction="in"> + <tp:docstring> + The account ID + </tp:docstring> + </arg> + <arg type="b" name="enable" direction="in"> + <tp:docstring> + <p>To register, enable must be true.</p> + <p>To un-register, enable must be false.</p> + </tp:docstring> + </arg> + </method> + + <method name="getAudioManager" tp:name-for-bindings="getAudioManager"> + <arg type="s" name="api" direction="out"> + </arg> + </method> + + <method name="setAudioManager" tp:name-for-bindings="setAudioManager"> + <arg type="s" name="api" direction="in"> + </arg> + </method> + + <method name="getRecordPath" tp:name-for-bindings="getRecordPath"> + <arg type="s" name="rec" direction="out"> + </arg> + </method> + + <method name="setRecordPath" tp:name-for-bindings="setRecordPath"> + <arg type="s" name="rec" direction="in"> + </arg> + </method> + + <method name="getIsAlwaysRecording" tp:name-for-bindings="getIsAlwaysRecording"> + <arg type="b" name="res" direction="out"> + </arg> + </method> + + <method name="setIsAlwaysRecording" tp:name-for-bindings="setIsAlwaysRecording"> + <arg type="b" name="enabled" direction="in"> + </arg> + </method> + + <!-- /////////////////////// --> + + <!-- Codecs-related methods --> + + <method name="getAudioCodecList" tp:name-for-bindings="getAudioCodecList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorInt"/> + <arg type="ai" name="list" direction="out"> + </arg> + </method> + + <method name="getAudioCodecDetails" tp:name-for-bindings="getAudioCodecDetails"> + <arg type="i" name="payload" direction="in"> + </arg> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="details" direction="out"> + </arg> + </method> + + <method name="getActiveAudioCodecList" tp:name-for-bindings="getActiveAudioCodecList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorInt"/> + <arg type="s" name="accountID" direction="in"> + </arg> + <arg type="ai" name="list" direction="out"> + </arg> + </method> + + <method name="setActiveAudioCodecList" tp:name-for-bindings="setActiveAudioCodecList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/> + <arg type="as" name="list" direction="in"> + </arg> + <arg type="s" name="accountID" direction="in"> + </arg> + </method> + + <!-- Audio devices methods --> + + <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="setAudioPlugin" tp:name-for-bindings="setAudioPlugin"> + <arg type="s" name="audioPlugin" direction="in"> + </arg> + </method> + + <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="setAudioOutputDevice" tp:name-for-bindings="setAudioOutputDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="setAudioInputDevice" tp:name-for-bindings="setAudioInputDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="setAudioRingtoneDevice" tp:name-for-bindings="setAudioRingtoneDevice"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="getAudioInputDeviceList" tp:name-for-bindings="getAudioInputDeviceList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + + <method name="getCurrentAudioDevicesIndex" tp:name-for-bindings="getCurrentAudioDevicesIndex"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getAudioDeviceIndex" tp:name-for-bindings="getAudioDeviceIndex"> + <arg type="s" name="name" direction="in"> + </arg> + <arg type="i" name="index" direction="out"> + </arg> + </method> + + <method name="getCurrentAudioOutputPlugin" tp:name-for-bindings="getCurrentAudioOutputPlugin"> + <arg type="s" name="plugin" direction="out"> + </arg> + </method> <method name="getEchoCancelState" tp:name-for-bindings="getNoiseSuppressState"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="state" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setEchoCancelState" tp:name-for-bindings="setEchoCancelState"> - <arg type="s" name="state" direction="in"> - </arg> - </method> - - <method name="setEchoCancelTailLength" tp:name-for-bindings="setEchoCancelTailLength"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getEchoCancelTailLength" tp:name-for-bindings="getEchoCancelTailLength"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setEchoCancelDelay" tp:name-for-bindings="setEchoCancelDelay"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="in"> - </arg> - </method> - - <method name="getEchoCancelDelay" tp:name-for-bindings="getEchoCancelDelay"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="index" direction="out"> - </arg> - </method> - - - <method name="getNoiseSuppressState" tp:name-for-bindings="getEchoCancelState"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="state" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setNoiseSuppressState" tp:name-for-bindings="setNoiseSuppressState"> - <arg type="s" name="state" direction="in"> - </arg> - </method> - - <!-- General Settings Panel --> - - <method name="isIax2Enabled" tp:name-for-bindings="isIax2Enabled"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="res" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setMailNotify" tp:name-for-bindings="setMailNotify"> - <tp:docstring> - </tp:docstring> - </method> - - <method name="getMailNotify" tp:name-for-bindings="getMailNotify"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="level" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - - <method name="getHistoryLimit" tp:name-for-bindings="getHistoryLimit"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="days" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setHistoryLimit" tp:name-for-bindings="setHistoryLimit"> - <tp:docstring> - </tp:docstring> - <arg type="i" name="days" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <!-- Addressbook configuration --> - <method name="getAddressbookSettings" tp:name-for-bindings="getAddressbookSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringInt"/> - <arg type="a{si}" name="settings" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAddressbookSettings" tp:name-for-bindings="setAddressbookSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringInt"/> - <arg type="a{si}" name="settings" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <!-- Addressbook list --> - <method name="getAddressbookList" tp:name-for-bindings="getAddressbookList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="settings" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setAddressbookList" tp:name-for-bindings="setAddressbookList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/> - <arg type="as" name="settings" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <!-- Hook configuration --> - <method name="getHookSettings" tp:name-for-bindings="getHookSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="settings" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setHookSettings" tp:name-for-bindings="setHookSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> - <arg type="a{ss}" name="settings" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getHistory" tp:name-for-bindings="getHistory"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="as" name="entries" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setHistory" tp:name-for-bindings="setHistory"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> - <arg type="as" name="entries" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> - </signal> - - <signal name="errorAlert" tp:name-for-bindings="errorAlert"> - <arg type="i" name="code"> - <tp:docstring> - </tp:docstring> - </arg> - </signal> - - <!-- TLS Methods --> - <method name="getSupportedTlsMethod" tp:name-for-bindings="getSupportedTlsMethod"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getTlsSettingsDefault" tp:name-for-bindings="getTlsSettingsDefault"> + <arg type="s" name="state" direction="out"> + </arg> + </method> + + <method name="setEchoCancelState" tp:name-for-bindings="setEchoCancelState"> + <arg type="s" name="state" direction="in"> + </arg> + </method> + + <method name="setEchoCancelTailLength" tp:name-for-bindings="setEchoCancelTailLength"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="getEchoCancelTailLength" tp:name-for-bindings="getEchoCancelTailLength"> + <arg type="i" name="index" direction="out"> + </arg> + </method> + + <method name="setEchoCancelDelay" tp:name-for-bindings="setEchoCancelDelay"> + <arg type="i" name="index" direction="in"> + </arg> + </method> + + <method name="getEchoCancelDelay" tp:name-for-bindings="getEchoCancelDelay"> + <arg type="i" name="index" direction="out"> + </arg> + </method> + + + <method name="getNoiseSuppressState" tp:name-for-bindings="getEchoCancelState"> + <arg type="s" name="state" direction="out"> + </arg> + </method> + + <method name="setNoiseSuppressState" tp:name-for-bindings="setNoiseSuppressState"> + <arg type="s" name="state" direction="in"> + </arg> + </method> + + <!-- General Settings Panel --> + + <method name="isIax2Enabled" tp:name-for-bindings="isIax2Enabled"> + <arg type="i" name="res" direction="out"> + </arg> + </method> + + <method name="setMailNotify" tp:name-for-bindings="setMailNotify"> + </method> + + <method name="getMailNotify" tp:name-for-bindings="getMailNotify"> + <arg type="i" name="level" direction="out"> + </arg> + </method> + + <method name="getHistoryLimit" tp:name-for-bindings="getHistoryLimit"> + <arg type="i" name="days" direction="out"> + </arg> + </method> + + <method name="setHistoryLimit" tp:name-for-bindings="setHistoryLimit"> + <arg type="i" name="days" direction="in"> + </arg> + </method> + + <!-- Addressbook configuration --> + <method name="getAddressbookSettings" tp:name-for-bindings="getAddressbookSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringInt"/> + <arg type="a{si}" name="settings" direction="out"> + </arg> + </method> + + <method name="setAddressbookSettings" tp:name-for-bindings="setAddressbookSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringInt"/> + <arg type="a{si}" name="settings" direction="in"> + </arg> + </method> + + <!-- Addressbook list --> + <method name="getAddressbookList" tp:name-for-bindings="getAddressbookList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="settings" direction="out"> + </arg> + </method> + + <method name="setAddressbookList" tp:name-for-bindings="setAddressbookList"> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/> + <arg type="as" name="settings" direction="in"> + </arg> + </method> + + <!-- Hook configuration --> + <method name="getHookSettings" tp:name-for-bindings="getHookSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="settings" direction="out"> + </arg> + </method> + + <method name="setHookSettings" tp:name-for-bindings="setHookSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> + <arg type="a{ss}" name="settings" direction="in"> + </arg> + </method> + + <method name="getHistory" tp:name-for-bindings="getHistory"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/> + <!-- Return a List of type Dict<string, string> >...a List of Dicts --> + <arg type="aa{ss}" name="entries" direction="out"/> + </method> + + <method name="clearHistory" tp:name-for-bindings="clearHistory"> + </method> + + <signal name="accountsChanged" tp:name-for-bindings="accountsChanged"> + </signal> + + <signal name="errorAlert" tp:name-for-bindings="errorAlert"> + <arg type="i" name="code"> + </arg> + </signal> + + <!-- TLS Methods --> + <method name="getSupportedTlsMethod" tp:name-for-bindings="getSupportedTlsMethod"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getTlsSettingsDefault" tp:name-for-bindings="getTlsSettingsDefault"> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <tp:docstring> - </tp:docstring> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getTlsSettings" tp:name-for-bindings="getTlsSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setTlsSettings" tp:name-for-bindings="setTlsSettings"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> - <arg type="a{ss}" name="details" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAddrFromInterfaceName" tp:name-for-bindings="getAddrFromInterfaceName"> - <tp:docstring> - </tp:docstring> - <arg type="s" name="interface" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - <arg type="s" name="address" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAllIpInterface" tp:name-for-bindings="getAllIpInterface"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getAllIpInterfaceByName" tp:name-for-bindings="getAllIpInterfaceByName"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getShortcuts" tp:name-for-bindings="getShortcuts"> + <arg type="a{ss}" name="details" direction="out"> + </arg> + </method> + + <method name="getTlsSettings" tp:name-for-bindings="getTlsSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="out"> + </arg> + </method> + + <method name="setTlsSettings" tp:name-for-bindings="setTlsSettings"> + <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="in"> + </arg> + </method> + + <method name="getAddrFromInterfaceName" tp:name-for-bindings="getAddrFromInterfaceName"> + <arg type="s" name="interface" direction="in"> + </arg> + <arg type="s" name="address" direction="out"> + </arg> + </method> + + <method name="getAllIpInterface" tp:name-for-bindings="getAllIpInterface"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getAllIpInterfaceByName" tp:name-for-bindings="getAllIpInterfaceByName"> + <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> + <arg type="as" name="list" direction="out"> + </arg> + </method> + + <method name="getShortcuts" tp:name-for-bindings="getShortcuts"> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MapStringString"/> - <tp:docstring> - </tp:docstring> - <arg type="a{ss}" name="shortcutsMap" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="setShortcuts" tp:name-for-bindings="setShortcuts"> + <arg type="a{ss}" name="shortcutsMap" direction="out"> + </arg> + </method> + + <method name="setShortcuts" tp:name-for-bindings="setShortcuts"> <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="MapStringString"/> - <tp:docstring> - </tp:docstring> - <arg type="a{ss}" name="shortcutsMap" direction="in"> - <tp:docstring> - </tp:docstring> - </arg> - </method> + <arg type="a{ss}" name="shortcutsMap" direction="in"> + </arg> + </method> </interface> - </node> +</node> diff --git a/kde/src/lib/instance_interface_singleton.cpp b/kde/src/lib/instance_interface_singleton.cpp index cbf2d744a6..51da037ef8 100644 --- a/kde/src/lib/instance_interface_singleton.cpp +++ b/kde/src/lib/instance_interface_singleton.cpp @@ -1,23 +1,22 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #include "instance_interface_singleton.h" @@ -27,7 +26,7 @@ InstanceInterface* InstanceInterfaceSingleton::interface InstanceInterface& InstanceInterfaceSingleton::getInstance() { if(!interface->connection().isConnected()) { - throw "Error : sflphoned not connected. Service " + interface->service() + " not connected. From instance interface."; + throw "Error : sflphoned not connected. Service " + interface->service() + " not connected. From instance interface."; } return *interface; } diff --git a/kde/src/lib/instance_interface_singleton.h b/kde/src/lib/instance_interface_singleton.h index 1b29e058d2..bc1d6df5f0 100644 --- a/kde/src/lib/instance_interface_singleton.h +++ b/kde/src/lib/instance_interface_singleton.h @@ -1,24 +1,23 @@ -/*************************************************************************** - * Copyright (C) 2009 by Savoir-Faire Linux * - * Author : Jérémy Quentin * - * jeremy.quentin@savoirfairelinux.com * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef INSTANCE_INTERFACE_SINGLETON_H #define INSTANCE_INTERFACE_SINGLETON_H @@ -26,8 +25,8 @@ #include "typedefs.h" /** - @author Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> -*/ + * @author Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> + */ class LIB_EXPORT InstanceInterfaceSingleton { diff --git a/kde/src/lib/sflphone_const.h b/kde/src/lib/sflphone_const.h index 10009f279c..83e56d3e5e 100644 --- a/kde/src/lib/sflphone_const.h +++ b/kde/src/lib/sflphone_const.h @@ -1,21 +1,22 @@ -/* - * Copyright (C) 2008 Savoir-Faire Linux inc. - * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ #ifndef __SFLPHONE_CONST_H #define __SFLPHONE_CONST_H @@ -25,7 +26,7 @@ /* @file sflphone_const.h * @brief Contains the global variables for the client code */ - + #define APP_NAME "SFLphone KDE Client" #define SIP 0 @@ -110,63 +111,139 @@ /** Account details */ -#define ACCOUNT_TYPE "Account.type" -#define ACCOUNT_ALIAS "Account.alias" -#define ACCOUNT_ENABLED "Account.enable" -#define ACCOUNT_MAILBOX "Account.mailbox" -#define ACCOUNT_RESOLVE_ONCE "Account.resolveOnce" -#define ACCOUNT_REGISTRATION_EXPIRE "Account.expire" -#define ACCOUNT_SIP_STUN_SERVER "STUN.server" -#define ACCOUNT_SIP_STUN_ENABLED "STUN.enable" -#define ACCOUNT_HOSTNAME "hostname" -#define ACCOUNT_USERNAME "username" -#define ACCOUNT_PASSWORD "password" -#define ACCOUNT_AUTHENTICATION_USERNAME "authenticationUsername" -#define ACCOUNT_REALM "realm" -#define ACCOUNT_KEY_EXCHANGE "SRTP.keyExchange" -#define ACCOUNT_SRTP_ENABLED "SRTP.enable" -#define ACCOUNT_ZRTP_DISPLAY_SAS "ZRTP.displaySAS" -#define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" -#define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" -#define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" -#define KEY_EXCHANGE_NONE "0" -#define ZRTP "1" -#define SDES "2" +// #define ACCOUNT_ID "Account.id" +// #define ACCOUNT_TYPE "Account.type" +// #define ACCOUNT_ALIAS "Account.alias" +// #define ACCOUNT_ENABLED "Account.enable" +// #define ACCOUNT_MAILBOX "Account.mailbox" +// #define ACCOUNT_USERAGENT "Account.useragent" +// #define ACCOUNT_REGISTRATION_EXPIRE "Account.registrationExpire" +// #define ACCOUNT_SIP_STUN_SERVER "STUN.server" +// #define ACCOUNT_SIP_STUN_ENABLED "STUN.enable" +// #define ACCOUNT_DTMF_TYPE "Account.dtmfType" +// #define ACCOUNT_HOSTNAME "Account.hostname" +// #define ACCOUNT_USERNAME "Account.username" +// #define ACCOUNT_ROUTE "Account.routeset" +// #define ACCOUNT_PASSWORD "Account.password" +// #define ACCOUNT_REALM "Account.realm" +// #define ACCOUNT_KEY_EXCHANGE "SRTP.keyExchange" +// #define ACCOUNT_SRTP_ENABLED "SRTP.enable" +// #define ACCOUNT_SRTP_RTP_FALLBACK "SRTP.rtpFallback" +// #define ACCOUNT_ZRTP_DISPLAY_SAS "ZRTP.displaySAS" +// #define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" +// #define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" +// #define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" +// #define KEY_EXCHANGE_NONE "0" +// #define ZRTP "1" +// #define SDES "2" /** TLS */ -#define TLS_LISTENER_PORT "TLS.listenerPort" -#define TLS_ENABLE "TLS.enable" -#define TLS_PORT "TLS.port" -#define TLS_CA_LIST_FILE "TLS.certificateListFile" -#define TLS_CERTIFICATE_FILE "TLS.certificateFile" -#define TLS_PRIVATE_KEY_FILE "TLS.privateKeyFile" -#define TLS_PASSWORD "TLS.password" -#define TLS_METHOD "TLS.method" -#define TLS_CIPHERS "TLS.ciphers" -#define TLS_SERVER_NAME "TLS.serverName" -#define TLS_VERIFY_SERVER "TLS.verifyServer" -#define TLS_VERIFY_CLIENT "TLS.verifyClient" -#define TLS_REQUIRE_CLIENT_CERTIFICATE "TLS.requireClientCertificate" -#define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" -#define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" - -#define LOCAL_INTERFACE "Account.localInterface" -#define PUBLISHED_SAMEAS_LOCAL "Account.publishedSameAsLocal" -#define LOCAL_PORT "Account.localPort" -#define PUBLISHED_PORT "Account.publishedPort" -#define PUBLISHED_ADDRESS "Account.publishedAddress" - -#define REGISTRATION_STATUS "Status" -#define REGISTRATION_STATE_CODE "Registration.code" -#define REGISTRATION_STATE_DESCRIPTION "Registration.description" +// #define TLS_LISTENER_PORT "TLS.listenerPort" +// #define TLS_ENABLE "TLS.enable" +// #define TLS_PORT "TLS.port" +// #define TLS_CA_LIST_FILE "TLS.certificateListFile" +// #define TLS_CERTIFICATE_FILE "TLS.certificateFile" +// #define TLS_PRIVATE_KEY_FILE "TLS.privateKeyFile" +// #define TLS_PASSWORD "TLS.password" +// #define TLS_METHOD "TLS.method" +// #define TLS_CIPHERS "TLS.ciphers" +// #define TLS_SERVER_NAME "TLS.serverName" +// #define TLS_VERIFY_SERVER "TLS.verifyServer" +// #define TLS_VERIFY_CLIENT "TLS.verifyClient" +// #define TLS_REQUIRE_CLIENT_CERTIFICATE "TLS.requireClientCertificate" +// #define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" +// #define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" +// +// #define LOCAL_INTERFACE "Account.localInterface" +// #define PUBLISHED_SAMEAS_LOCAL "Account.publishedSameAsLocal" +// #define LOCAL_PORT "Account.localPort" +// #define PUBLISHED_PORT "Account.publishedPort" +// #define PUBLISHED_ADDRESS "Account.publishedAddress" +// +// #define REGISTRATION_STATUS "Registration.Status" +// #define REGISTRATION_STATE_CODE "Registration.code" +// #define REGISTRATION_STATE_DESCRIPTION "Registration.description" + + +#define IP2IP_PROFILE "IP2IP" + +#define ACCOUNT_ID "Account.id" +#define ACCOUNT_TYPE "Account.type" +#define ACCOUNT_ALIAS "Account.alias" +#define ACCOUNT_ENABLED "Account.enable" +#define ACCOUNT_MAILBOX "Account.mailbox" +#define ACCOUNT_USERAGENT "Account.useragent" +#define ACCOUNT_REGISTRATION_EXPIRE "Account.registrationExpire" +#define ACCOUNT_REGISTRATION_STATUS "Account.registrationStatus" +#define ACCOUNT_REGISTRATION_STATE_CODE "Account.registrationCode" +#define ACCOUNT_REGISTRATION_STATE_DESC "Account.registrationDescription" + +#define ACCOUNT_SIP_STUN_SERVER "STUN.server" +#define ACCOUNT_SIP_STUN_ENABLED "STUN.enable" +#define ACCOUNT_DTMF_TYPE "Account.dtmfType" +#define ACCOUNT_HOSTNAME "Account.hostname" +#define ACCOUNT_USERNAME "Account.username" +#define ACCOUNT_ROUTE "Account.routeset" +#define ACCOUNT_PASSWORD "Account.password" +#define ACCOUNT_REALM "Account.realm" +#define ACCOUNT_KEY_EXCHANGE "SRTP.keyExchange" +#define ACCOUNT_SRTP_ENABLED "SRTP.enable" +#define ACCOUNT_SRTP_RTP_FALLBACK "SRTP.rtpFallback" +#define ACCOUNT_ZRTP_DISPLAY_SAS "ZRTP.displaySAS" +#define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" +#define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" +#define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" +#define KEY_EXCHANGE_NONE "none" +#define ZRTP "zrtp" +#define SDES "sdes" + +#define CONFIG_RINGTONE_PATH "Account.ringtonePath" +#define CONFIG_RINGTONE_ENABLED "Account.ringtoneEnabled" + +#define TLS_LISTENER_PORT "TLS.listenerPort" +#define TLS_ENABLE "TLS.enable" +#define TLS_PORT "TLS.port" +#define TLS_CA_LIST_FILE "TLS.certificateListFile" +#define TLS_CERTIFICATE_FILE "TLS.certificateFile" +#define TLS_PRIVATE_KEY_FILE "TLS.privateKeyFile" +#define TLS_PASSWORD "TLS.password" +#define TLS_METHOD "TLS.method" +#define TLS_CIPHERS "TLS.ciphers" +#define TLS_SERVER_NAME "TLS.serverName" +#define TLS_VERIFY_SERVER "TLS.verifyServer" +#define TLS_VERIFY_CLIENT "TLS.verifyClient" +#define TLS_REQUIRE_CLIENT_CERTIFICATE "TLS.requireClientCertificate" +#define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" +#define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" + +#define SHORTCUT_PICKUP "pickUp" +#define SHORTCUT_HANGUP "hangUp" +#define SHORTCUT_POPUP "popupWindow" +#define SHORTCUT_TOGGLEPICKUPHANGUP "togglePickupHangup" +#define SHORTCUT_TOGGLEHOLD "toggleHold" + + +#define CONFIG_ACCOUNT_HOSTNAME "Account.hostname" +#define CONFIG_ACCOUNT_USERNAME "Account.username" +#define CONFIG_ACCOUNT_ROUTESET "Account.routeset" +#define CONFIG_ACCOUNT_PASSWORD "Account.password" +#define CONFIG_ACCOUNT_REALM "Account.realm" +#define CONFIG_ACCOUNT_DEFAULT_REALM "*" +#define CONFIG_ACCOUNT_USERAGENT "Account.useragent" + +#define LOCAL_INTERFACE "Account.localInterface" +#define PUBLISHED_SAMEAS_LOCAL "Account.publishedSameAsLocal" +#define LOCAL_PORT "Account.localPort" +#define PUBLISHED_PORT "Account.publishedPort" +#define PUBLISHED_ADDRESS "Account.publishedAddress" /** Maybe to remove **/ -#define ACCOUNT_EXPIRE "Account.expire" -#define ACCOUNT_STATUS "Status" -#define ACCOUNT_EXPIRE_DEFAULT 600 -#define ACCOUNT_ENABLED_TRUE "true" -#define ACCOUNT_ENABLED_FALSE "false" +// #define ACCOUNT_EXPIRE "Account.expire" +// #define ACCOUNT_STATUS "Status" +#define REGISTRATION_EXPIRE_DEFAULT 600 +#define REGISTRATION_ENABLED_TRUE "true" +#define REGISTRATION_ENABLED_FALSE "false" #define ACCOUNT_TYPE_SIP "SIP" #define ACCOUNT_TYPE_IAX "IAX" #define ACCOUNT_TYPES_TAB {QString(ACCOUNT_TYPE_SIP), QString(ACCOUNT_TYPE_IAX)} @@ -250,37 +327,37 @@ #define CONST_PULSEAUDIO 1 /** TLS */ -#define TLS_LISTENER_PORT "TLS.listenerPort" -#define TLS_ENABLE "TLS.enable" -#define TLS_PORT "TLS.port" -#define TLS_CA_LIST_FILE "TLS.certificateListFile" -#define TLS_CERTIFICATE_FILE "TLS.certificateFile" -#define TLS_PRIVATE_KEY_FILE "TLS.privateKeyFile" -#define TLS_PASSWORD "TLS.password" -#define TLS_METHOD "TLS.method" -#define TLS_CIPHERS "TLS.ciphers" -#define TLS_SERVER_NAME "TLS.serverName" -#define TLS_VERIFY_SERVER "TLS.verifyServer" -#define TLS_VERIFY_CLIENT "TLS.verifyClient" -#define TLS_REQUIRE_CLIENT_CERTIFICATE "TLS.requireClientCertificate" -#define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" -#define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" - -#define ACCOUNT_ID "Account.id" -#define ACCOUNT_AUTHENTICATION_USERNAME "authenticationUsername" -#define ACCOUNT_KEY_EXCHANGE "SRTP.keyExchange" -#define ACCOUNT_SRTP_ENABLED "SRTP.enable" -#define ACCOUNT_SRTP_RTP_FALLBACK "SRTP.rtpFallback" -#define ACCOUNT_ZRTP_DISPLAY_SAS "ZRTP.displaySAS" -#define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" -#define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" -#define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" -#define KEY_EXCHANGE_NONE "0" -#define ZRTP "1" -#define SDES "2" +// #define TLS_LISTENER_PORT "TLS.listenerPort" +// #define TLS_ENABLE "TLS.enable" +// #define TLS_PORT "TLS.port" +// #define TLS_CA_LIST_FILE "TLS.certificateListFile" +// #define TLS_CERTIFICATE_FILE "TLS.certificateFile" +// #define TLS_PRIVATE_KEY_FILE "TLS.privateKeyFile" +// #define TLS_PASSWORD "TLS.password" +// #define TLS_METHOD "TLS.method" +// #define TLS_CIPHERS "TLS.ciphers" +// #define TLS_SERVER_NAME "TLS.serverName" +// #define TLS_VERIFY_SERVER "TLS.verifyServer" +// #define TLS_VERIFY_CLIENT "TLS.verifyClient" +// #define TLS_REQUIRE_CLIENT_CERTIFICATE "TLS.requireClientCertificate" +// #define TLS_NEGOTIATION_TIMEOUT_SEC "TLS.negotiationTimeoutSec" +// #define TLS_NEGOTIATION_TIMEOUT_MSEC "TLS.negotiationTimemoutMsec" + +// #define ACCOUNT_ID "Account.id" +// #define ACCOUNT_AUTHENTICATION_USERNAME "authenticationUsername" +// #define ACCOUNT_KEY_EXCHANGE "SRTP.keyExchange" +// #define ACCOUNT_SRTP_ENABLED "SRTP.enable" +// #define ACCOUNT_SRTP_RTP_FALLBACK "SRTP.rtpFallback" +// #define ACCOUNT_ZRTP_DISPLAY_SAS "ZRTP.displaySAS" +// #define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" +// #define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" +// #define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" +// #define KEY_EXCHANGE_NONE "0" +// #define ZRTP "1" +// #define SDES "2" typedef enum -{ +{ /** Ringing incoming call */ CALL_STATE_INCOMING = 0, /** Ringing outgoing call */ @@ -317,3 +394,17 @@ static const QString empty(""); #define MIME_PLAIN_TEXT "text/plain" #endif +/** HISTORY SERIALIZATION */ +#define ACCOUNT_ID_KEY "accountid" +#define CALLID_KEY "callid" +#define CONFID_KEY "confid" +#define DISPLAY_NAME_KEY "display_name" +#define PEER_NUMBER_KEY "peer_number" +#define RECORDING_PATH_KEY "recordfile" +#define STATE_KEY "state" +#define TIMESTAMP_START_KEY "timestamp_start" +#define TIMESTAMP_STOP_KEY "timestamp_stop" +#define MISSED_STRING "missed" +#define INCOMING_STRING "incoming" +#define OUTGOING_STRING "outgoing" + diff --git a/kde/src/lib/typedefs.h b/kde/src/lib/typedefs.h index 7befa57505..e453123641 100644 --- a/kde/src/lib/typedefs.h +++ b/kde/src/lib/typedefs.h @@ -1,3 +1,23 @@ +/************************************************************************************ + * Copyright (C) 2009 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***********************************************************************************/ + #ifndef TYPEDEFS_H #define TYPEDEFS_H diff --git a/kde/src/main.cpp b/kde/src/main.cpp index f91419b4ff..340be2b2ce 100755 --- a/kde/src/main.cpp +++ b/kde/src/main.cpp @@ -41,7 +41,7 @@ #include "AccountWizard.h" #include "SFLPhoneapplication.h" #include "conf/ConfigurationDialog.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" #include "CallView.h" #include "SFLPhone.h" #include "AccountListModel.h" @@ -52,7 +52,7 @@ static const char description[] = "A KDE 4 Client for SFLphone"; -static const char version[] = "1.0.2"; +static const char version[] = "1.1.0"; int main(int argc, char **argv) { @@ -75,7 +75,6 @@ int main(int argc, char **argv) ); about.addAuthor( ki18n( "Jérémy Quentin" ), KLocalizedString(), "jeremy.quentin@savoirfairelinux.com" ); about.addAuthor( ki18n( "Emmanuel Lepage Vallee" ), KLocalizedString(), "emmanuel.lepage@savoirfairelinux.com" ); - //about.setTranslator( ki18nc("NAME OF TRANSLATORS","Your names"), ki18nc("EMAIL OF TRANSLATORS","Your emails") ); KCmdLineArgs::init(argc, argv, &about); KCmdLineOptions options; KCmdLineArgs::addCmdLineOptions(options); diff --git a/kde/src/ui/SFLPhoneView_base.ui b/kde/src/ui/SFLPhoneView_base.ui index c564894726..9ad0c749aa 100755 --- a/kde/src/ui/SFLPhoneView_base.ui +++ b/kde/src/ui/SFLPhoneView_base.ui @@ -24,6 +24,33 @@ </property> </widget> </item> + <item> + <widget class="QWidget" name="m_pMessageBoxW" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="KLineEdit" name="m_pSendMessageLE"> + <property name="placeholderText"> + <string>Send text message</string> + </property> + <property name="showClearButton" stdset="0"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="m_pSendMessagePB"> + <property name="text"> + <string>Send</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> <item> <widget class="QWidget" name="widget_controls" native="true"> <property name="enabled"> @@ -163,6 +190,11 @@ </layout> </widget> <customwidgets> + <customwidget> + <class>KLineEdit</class> + <extends>QLineEdit</extends> + <header>klineedit.h</header> + </customwidget> <customwidget> <class>Dialpad</class> <extends>QWidget</extends> diff --git a/kde/src/widgets/BookmarkDock.cpp b/kde/src/widgets/BookmarkDock.cpp index 37638d7aae..a8925dacf3 100644 --- a/kde/src/widgets/BookmarkDock.cpp +++ b/kde/src/widgets/BookmarkDock.cpp @@ -26,6 +26,8 @@ #include <QtGui/QTreeWidgetItem> #include <QtGui/QTreeWidget> #include <QtGui/QSplitter> +#include <QtGui/QCheckBox> +#include <QStandardItemModel> //KDE #include <KLocalizedString> @@ -33,8 +35,12 @@ #include <KLineEdit> //SFLPhone -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" #include "widgets/HistoryTreeItem.h" +#include "SFLPhone.h" +#include "widgets/CategoryDrawer.h" +#include "widgets/CategorizedTreeWidget.h" +#include "klib/AkonadiBackend.h" ///@class QNumericTreeWidgetItem : Tree widget with different sorting criterias class QNumericTreeWidgetItem : public QTreeWidgetItem { @@ -65,13 +71,21 @@ BookmarkDock::BookmarkDock(QWidget* parent) : QDockWidget(parent) m_pFilterLE = new KLineEdit(this); m_pSplitter = new QSplitter(Qt::Vertical,this); - m_pItemView = new QTreeWidget(this); + m_pItemView = new CategorizedTreeWidget(this); + m_pMostUsedCK = new QCheckBox(this); + + m_pFilterLE->setPlaceholderText(i18n("Filter")); + + m_pMostUsedCK->setChecked(ConfigurationSkeleton::displayContactCallHistory()); QWidget* mainWidget = new QWidget(this); setWidget(mainWidget); + m_pMostUsedCK->setText("Show most called contacts"); + QVBoxLayout* mainLayout = new QVBoxLayout(mainWidget); + mainLayout->addWidget(m_pMostUsedCK); mainLayout->addWidget(m_pSplitter); m_pSplitter->addWidget(m_pItemView); mainLayout->addWidget(m_pFilterLE); @@ -82,11 +96,10 @@ BookmarkDock::BookmarkDock(QWidget* parent) : QDockWidget(parent) setWindowTitle(i18n("Bookmark")); m_pItemView->headerItem()->setText(0,i18n("Bookmark") ); - foreach (QString nb, ConfigurationSkeleton::bookmarkList()) { - addBookmark_internal(nb); - } - - connect(m_pFilterLE, SIGNAL(textChanged(QString)), this, SLOT(filter(QString) )); + connect(m_pFilterLE , SIGNAL(textChanged(QString)), this , SLOT(filter(QString) )); + connect(m_pMostUsedCK , SIGNAL(toggled(bool)), this , SLOT(reload() )); + connect(AkonadiBackend::getInstance() , SIGNAL(collectionChanged()) , this , SLOT(reload() )); + reload(); } ///Destructor @@ -106,7 +119,15 @@ BookmarkDock::~BookmarkDock() void BookmarkDock::addBookmark_internal(const QString& phone) { HistoryTreeItem* widget = new HistoryTreeItem(m_pItemView,phone); - QTreeWidgetItem* item = new QTreeWidgetItem(m_pItemView ); + QTreeWidgetItem* item = NULL; + + if (widget->getName() == "Unknow" || widget->getName().isEmpty()) { + item = m_pItemView->addItem<QNumericTreeWidgetItem>("Unknow"); + } + else { + item = m_pItemView->addItem<QNumericTreeWidgetItem>(QString(widget->getName()[0])); + } + widget->setItem(item); m_pItemView->addTopLevelItem(item); m_pItemView->setItemWidget(item,0,widget); @@ -124,8 +145,33 @@ void BookmarkDock::addBookmark(const QString& phone) void BookmarkDock::filter(QString text) { foreach(HistoryTreeItem* item, m_pBookmark) { - bool visible = (item->getName().toLower().indexOf(text) != -1) || (item->getPhoneNumber().toLower().indexOf(text) != -1); - item->getItem()-> setHidden(!visible); + bool visible = (item->getName().toLower().indexOf(text.toLower()) != -1) || (item->getPhoneNumber().toLower().indexOf(text.toLower()) != -1); + item->getItem()->setHidden(!visible); } m_pItemView->expandAll(); -} \ No newline at end of file +} + +///Show the most popular items +void BookmarkDock::reload() +{ + m_pItemView->clear(); + m_pBookmark.clear(); + m_pItemView->addCategory("Popular"); + for (int i=65;i<=90;i++) { + m_pItemView->addCategory(QString(i)); + } + if (m_pMostUsedCK->isChecked()) { + QStringList cl = SFLPhone::model()->getNumbersByPopularity(); + for (int i=0;i < ((cl.size() < 10)?cl.size():10);i++) { + QNumericTreeWidgetItem* item = m_pItemView->addItem<QNumericTreeWidgetItem>("Popular"); + HistoryTreeItem* widget = new HistoryTreeItem(m_pItemView,cl[i]); + widget->setItem(item); + m_pItemView->setItemWidget(item,0,widget); + m_pBookmark << widget; + } + } + foreach (QString nb, ConfigurationSkeleton::bookmarkList()) { + addBookmark_internal(nb); + } + ConfigurationSkeleton::setDisplayContactCallHistory(m_pMostUsedCK->isChecked()); +} diff --git a/kde/src/widgets/BookmarkDock.h b/kde/src/widgets/BookmarkDock.h index f55fc30347..e47dd018a4 100644 --- a/kde/src/widgets/BookmarkDock.h +++ b/kde/src/widgets/BookmarkDock.h @@ -25,12 +25,16 @@ //Qt class QTreeWidget; class QSplitter; +class QCheckBox; +class QTreeView; //KDE class KLineEdit; //SFLPhone class HistoryTreeItem; +class CategoryDrawer; +class CategorizedTreeWidget; //Typedef typedef QList<HistoryTreeItem*> BookmarkList; @@ -47,15 +51,18 @@ public: void addBookmark(const QString& phone); private: //Attributes - QTreeWidget* m_pItemView; - KLineEdit* m_pFilterLE; - QSplitter* m_pSplitter; - BookmarkList m_pBookmark; + CategorizedTreeWidget* m_pItemView ; + KLineEdit* m_pFilterLE ; + QSplitter* m_pSplitter ; + BookmarkList m_pBookmark ; + QCheckBox* m_pMostUsedCK; + QTreeView* m_pTest; //Mutators void addBookmark_internal(const QString& phone); private slots: void filter(QString text); + void reload(); }; #endif \ No newline at end of file diff --git a/kde/src/widgets/CallTreeItem.cpp b/kde/src/widgets/CallTreeItem.cpp index 223cacfbdb..041ddaae88 100644 --- a/kde/src/widgets/CallTreeItem.cpp +++ b/kde/src/widgets/CallTreeItem.cpp @@ -48,7 +48,7 @@ #include "lib/Call.h" //SFLPhone -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" #include "widgets/TranslucentButtons.h" #include "SFLPhone.h" @@ -173,11 +173,11 @@ void CallTreeItem::setCall(Call *call) ///Update data void CallTreeItem::updated() { - kDebug() << "\n\n\n\nI am here\n\n\n\n\n" << m_pItemCall->getState() << "\n\n\n"; kDebug() << "Updating tree item"; Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(m_pItemCall->getPeerPhoneNumber()); if (contact) { - m_pIconL->setPixmap(*contact->getPhoto()); + if (contact->getPhoto()) + m_pIconL->setPixmap(*contact->getPhoto()); m_pPeerL->setText("<b>"+contact->getFormattedName()+"</b>"); } else { @@ -244,7 +244,7 @@ void CallTreeItem::updated() void CallTreeItem::dragEnterEvent ( QDragEnterEvent *e ) { kDebug() << "Drag enter"; - if (SFLPhone::model()->getIndex(this)->parent() && + if (SFLPhone::model()->getIndex(this) && SFLPhone::model()->getIndex(this)->parent() && SFLPhone::model()->getIndex(e->mimeData()->data( MIME_CALLID))->parent() && SFLPhone::model()->getIndex(this)->parent() == SFLPhone::model()->getIndex(e->mimeData()->data( MIME_CALLID))->parent() && e->mimeData()->data( MIME_CALLID) != SFLPhone::model()->getCall(this)->getCallId()) { @@ -286,7 +286,7 @@ void CallTreeItem::dragLeaveEvent ( QDragLeaveEvent *e ) ///Something is being dropped void CallTreeItem::dropEvent(QDropEvent *e) { - kDebug() << "Drop accepted" << e->pos(); + kDebug() << "Drop accepted"; QTimer::singleShot(500, this, SLOT(hide())); m_isHover = false; if (e->pos().x() < rect().width()/2) { @@ -330,4 +330,4 @@ void CallTreeItem::hide() m_pBtnConf->setVisible(false); m_pBtnTrans->setVisible(false); } -} \ No newline at end of file +} diff --git a/kde/src/widgets/CategorizedTreeWidget.cpp b/kde/src/widgets/CategorizedTreeWidget.cpp new file mode 100644 index 0000000000..5a5cac3bf1 --- /dev/null +++ b/kde/src/widgets/CategorizedTreeWidget.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + * Copyright (C) 2009-2012 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + **************************************************************************/ + +#include "CategorizedTreeWidget.h" + +#include "CategoryDrawer.h" + +#include <QtGui/QStyledItemDelegate> +#include <QtGui/QPainter> +#include <QtGui/QHeaderView> + +#include <klocale.h> +#include <kdebug.h> + +#include <QDebug> +#include <QEvent> +#include <QKeyEvent> + +//BEGIN KateColorTreeDelegate +class KateColorTreeDelegate : public QStyledItemDelegate +{ + public: + KateColorTreeDelegate(CategorizedTreeWidget* widget) + : QStyledItemDelegate(widget) + , m_tree(widget) + { + } + + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { + QSize sh = QStyledItemDelegate::sizeHint(option, index); + if (!index.parent().isValid()) { + sh.rheight() += 2 * m_categoryDrawer.leftMargin(); + } else { + sh.rheight() += m_categoryDrawer.leftMargin(); + } + if (index.column() == 0) { + sh.rwidth() += m_categoryDrawer.leftMargin(); + } else if (index.column() == 1) { + sh.rwidth() = 150; + } else { + sh.rwidth() += m_categoryDrawer.leftMargin(); + } + + return sh; + } + + QRect fullCategoryRect(const QStyleOptionViewItem& option, const QModelIndex& index) const { + QModelIndex i = index; + if (i.parent().isValid()) { + i = i.parent(); + } + + QTreeWidgetItem* item = m_tree->itemFromIndex(i); + QRect r = m_tree->visualItemRect(item); + + // adapt width + r.setLeft(m_categoryDrawer.leftMargin()); + r.setWidth(m_tree->viewport()->width() - m_categoryDrawer.leftMargin() - m_categoryDrawer.rightMargin()); + + // adapt height + if (item->isExpanded() && item->childCount() > 0) { + const int childCount = item->childCount(); + const int h = sizeHint(option, index.child(0, 0)).height(); + r.setHeight(r.height() + childCount * h); + } + + r.setTop(r.top() + m_categoryDrawer.leftMargin()); + + return r; + } + + virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const + { + Q_ASSERT(index.isValid()); + + //BEGIN: draw toplevel items + if (!index.parent().isValid()) { + QStyleOptionViewItem opt(option); + const QRegion cl = painter->clipRegion(); + painter->setClipRect(opt.rect); + opt.rect = fullCategoryRect(option, index); + m_categoryDrawer.drawCategory(index, 0, opt, painter); + painter->setClipRegion(cl); + return; + } + //END: draw toplevel items + + //BEGIN: draw background of category for all other items + { + QStyleOptionViewItem opt(option); + opt.rect = fullCategoryRect(option, index); + const QRegion cl = painter->clipRegion(); + QRect cr = option.rect; + if (index.column() == 0) { + if (m_tree->layoutDirection() == Qt::LeftToRight) { + cr.setLeft(5); + } else { + cr.setRight(opt.rect.right()); + } + } + painter->setClipRect(cr); + m_categoryDrawer.drawCategory(index, 0, opt, painter); + painter->setClipRegion(cl); + painter->setRenderHint(QPainter::Antialiasing, false); + } + //END: draw background of category for all other items + + painter->setClipRect(option.rect); + } + + private: + CategorizedTreeWidget* m_tree; + CategoryDrawer m_categoryDrawer; +}; +//END KateColorTreeDelegate + +CategorizedTreeWidget::CategorizedTreeWidget(QWidget *parent) + : QTreeWidget(parent) +{ + setItemDelegate(new KateColorTreeDelegate(this)); + setHeaderHidden(true); + setRootIsDecorated(false); + setIndentation(25); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + setHorizontalScrollMode(QAbstractItemView::ScrollPerItem); +} + +void CategorizedTreeWidget::drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const +{ + Q_UNUSED(painter) + Q_UNUSED(rect) + Q_UNUSED(index) +// if (index.parent() != QModelIndex() && index.parent().parent() != QModelIndex()) +// QTreeWidget::drawBranches(painter,rect,index); +} + +QVector<QTreeWidgetItem*> CategorizedTreeWidget::realItems() const +{ + return m_lItems; +} diff --git a/kde/src/widgets/CategorizedTreeWidget.h b/kde/src/widgets/CategorizedTreeWidget.h new file mode 100644 index 0000000000..0652281e64 --- /dev/null +++ b/kde/src/widgets/CategorizedTreeWidget.h @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2009-2012 by Savoir-Faire Linux * + * Author : Jérémy Quentin <jeremy.quentin@savoirfairelinux.com> * + * Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>* + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + **************************************************************************/ + +#ifndef KATE_COLOR_TREE_WIDGET_H +#define KATE_COLOR_TREE_WIDGET_H + +#include <QtGui/QTreeWidget> + +class KConfigGroup; +class KateColorTreeItem; +class QTreeWidgetItem; + +class CategorizedTreeWidget : public QTreeWidget +{ + Q_OBJECT + friend class KateColorTreeItem; + friend class KateColorTreeDelegate; + + public: + explicit CategorizedTreeWidget(QWidget *parent = 0); + + public: + template <class T = QTreeWidgetItem> T* addItem(QString category); + template <class T = QTreeWidgetItem> T* addCategory(QString name); + + QVector<QTreeWidgetItem*> realItems() const; + + Q_SIGNALS: + void changed(); + + protected: + void drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const; + private: + QVector<QTreeWidgetItem*> m_lItems; +}; + +template <class T> T* CategorizedTreeWidget::addItem(QString category) +{ + QTreeWidgetItem* categoryItem = 0; + for (int i = 0; i < topLevelItemCount(); ++i) { + if (topLevelItem(i)->text(0) == category) { + categoryItem = topLevelItem(i); + break; + } + } + + if (!categoryItem) { + categoryItem =addCategory(category); + } + setItemHidden(categoryItem,false); + + T* iwdg = new T(categoryItem); + resizeColumnToContents(0); + m_lItems << iwdg; + return iwdg; +} + + +template <class T> T* CategorizedTreeWidget::addCategory(QString name) +{ + T* categoryItem = new T(this); + categoryItem->setText(0, name); + addTopLevelItem(categoryItem); + expandItem(categoryItem); + setItemHidden(categoryItem,true); + return categoryItem; +} + +#endif \ No newline at end of file diff --git a/kde/src/widgets/CategoryDrawer.cpp b/kde/src/widgets/CategoryDrawer.cpp new file mode 100644 index 0000000000..7288a40f55 --- /dev/null +++ b/kde/src/widgets/CategoryDrawer.cpp @@ -0,0 +1,273 @@ +/*************************************************************************** + * Copyright (C) 2009 by Rafael Fernández López <ereslibre@kde.org> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License version 2 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to * + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * + * Boston, MA 02110-1301, USA. * + **************************************************************************/ + +// this code is taken from SystemSettings/icons/CategoryDrawer.{h,cpp} +// Rafael agreet to relicense it under LGPLv2 or LGPLv3, just as we need it, +// see: http://lists.kde.org/?l=kwrite-devel&m=133061943317199&w=2 + +#include "CategoryDrawer.h" + +#include <QPainter> +#include <QApplication> +#include <QStyleOption> + +CategoryDrawer::CategoryDrawer() +{ + setLeftMargin( 7 ); + setRightMargin( 7 ); +} + +void CategoryDrawer::drawCategory(const QModelIndex &index, + int sortRole, + const QStyleOption &option, + QPainter *painter) const +{ + Q_UNUSED( sortRole ) + + painter->setRenderHint(QPainter::Antialiasing); + + const QRect optRect = option.rect; + QFont font(QApplication::font()); + font.setBold(true); + const QFontMetrics fontMetrics = QFontMetrics(font); + const int height = categoryHeight(index, option); + const bool leftToRight = painter->layoutDirection() == Qt::LeftToRight; + + //BEGIN: decoration gradient + { + QPainterPath path(optRect.bottomLeft()); + + path.lineTo(QPoint(optRect.topLeft().x(), optRect.topLeft().y() - 3)); + const QPointF topLeft(optRect.topLeft()); + QRectF arc(topLeft, QSizeF(4, 4)); + path.arcTo(arc, 180, -90); + path.lineTo(optRect.topRight()); + path.lineTo(optRect.bottomRight()); + path.lineTo(optRect.bottomLeft()); + + QColor window(option.palette.window().color()); + const QColor base(option.palette.base().color()); + + window.setAlphaF(0.4); + + QLinearGradient decoGradient1; + if (leftToRight) { + decoGradient1.setStart(optRect.topLeft()); + decoGradient1.setFinalStop(optRect.bottomLeft()); + } else { + decoGradient1.setStart(optRect.topRight()); + decoGradient1.setFinalStop(optRect.bottomRight()); + } + decoGradient1.setColorAt(0, window); + decoGradient1.setColorAt(1, Qt::transparent); + + QLinearGradient decoGradient2; + if (leftToRight) { + decoGradient2.setStart(optRect.topLeft()); + decoGradient2.setFinalStop(optRect.topRight()); + } else { + decoGradient2.setStart(optRect.topRight()); + decoGradient2.setFinalStop(optRect.topLeft()); + } + decoGradient2.setColorAt(0, Qt::transparent); + decoGradient2.setColorAt(1, base); + + painter->fillPath(path, decoGradient1); + painter->fillPath(path, decoGradient2); + } + //END: decoration gradient + + { + QRect newOptRect(optRect); + + if (leftToRight) { + newOptRect.translate(1, 1); + } else { + newOptRect.translate(-1, 1); + } + + //BEGIN: inner top left corner + { + painter->save(); + painter->setPen(option.palette.base().color()); + QRectF arc; + if (leftToRight) { + const QPointF topLeft(newOptRect.topLeft()); + arc = QRectF(topLeft, QSizeF(4, 4)); + arc.translate(0.5, 0.5); + painter->drawArc(arc, 1440, 1440); + } else { + QPointF topRight(newOptRect.topRight()); + topRight.rx() -= 4; + arc = QRectF(topRight, QSizeF(4, 4)); + arc.translate(-0.5, 0.5); + painter->drawArc(arc, 0, 1440); + } + painter->restore(); + } + //END: inner top left corner + + //BEGIN: inner left vertical line + { + QPoint start; + QPoint verticalGradBottom; + if (leftToRight) { + start = newOptRect.topLeft(); + verticalGradBottom = newOptRect.topLeft(); + } else { + start = newOptRect.topRight(); + verticalGradBottom = newOptRect.topRight(); + } + start.ry() += 3; + verticalGradBottom.ry() += newOptRect.height() - 3; + QLinearGradient gradient(start, verticalGradBottom); + gradient.setColorAt(0, option.palette.base().color()); + gradient.setColorAt(1, Qt::transparent); + painter->fillRect(QRect(start, QSize(1, newOptRect.height() - 3)), gradient); + } + //END: inner left vertical line + + //BEGIN: inner horizontal line + { + QPoint start; + QPoint horizontalGradTop; + if (leftToRight) { + start = newOptRect.topLeft(); + horizontalGradTop = newOptRect.topLeft(); + start.rx() += 3; + horizontalGradTop.rx() += newOptRect.width() - 3; + } else { + start = newOptRect.topRight(); + horizontalGradTop = newOptRect.topRight(); + start.rx() -= 3; + horizontalGradTop.rx() -= newOptRect.width() - 3; + } + QLinearGradient gradient(start, horizontalGradTop); + gradient.setColorAt(0, option.palette.base().color()); + gradient.setColorAt(1, Qt::transparent); + QSize rectSize; + if (leftToRight) { + rectSize = QSize(newOptRect.width() - 3, 1); + } else { + rectSize = QSize(-newOptRect.width() + 3, 1); + } + painter->fillRect(QRect(start, rectSize), gradient); + } + //END: inner horizontal line + } + + QColor outlineColor = option.palette.text().color(); + outlineColor.setAlphaF(0.35); + + //BEGIN: top left corner + { + painter->save(); + painter->setPen(outlineColor); + QRectF arc; + if (leftToRight) { + const QPointF topLeft(optRect.topLeft()); + arc = QRectF(topLeft, QSizeF(4, 4)); + arc.translate(0.5, 0.5); + painter->drawArc(arc, 1440, 1440); + } else { + QPointF topRight(optRect.topRight()); + topRight.rx() -= 4; + arc = QRectF(topRight, QSizeF(4, 4)); + arc.translate(-0.5, 0.5); + painter->drawArc(arc, 0, 1440); + } + painter->restore(); + } + //END: top left corner + + //BEGIN: left vertical line + { + QPoint start; + QPoint verticalGradBottom; + if (leftToRight) { + start = optRect.topLeft(); + verticalGradBottom = optRect.topLeft(); + } else { + start = optRect.topRight(); + verticalGradBottom = optRect.topRight(); + } + start.ry() += 3; + verticalGradBottom.ry() += optRect.height() - 3; + QLinearGradient gradient(start, verticalGradBottom); + gradient.setColorAt(0, outlineColor); + gradient.setColorAt(1, option.palette.base().color()); + painter->fillRect(QRect(start, QSize(1, optRect.height() - 3)), gradient); + } + //END: left vertical line + + //BEGIN: horizontal line + { + QPoint start; + QPoint horizontalGradTop; + if (leftToRight) { + start = optRect.topLeft(); + horizontalGradTop = optRect.topLeft(); + start.rx() += 3; + horizontalGradTop.rx() += optRect.width() - 3; + } else { + start = optRect.topRight(); + horizontalGradTop = optRect.topRight(); + start.rx() -= 3; + horizontalGradTop.rx() -= optRect.width() - 3; + } + QLinearGradient gradient(start, horizontalGradTop); + gradient.setColorAt(0, outlineColor); + gradient.setColorAt(1, option.palette.base().color()); + QSize rectSize; + if (leftToRight) { + rectSize = QSize(optRect.width() - 3, 1); + } else { + rectSize = QSize(-optRect.width() + 3, 1); + } + painter->fillRect(QRect(start, rectSize), gradient); + } + //END: horizontal line + + //BEGIN: draw text + { + const QString category = index.model()->data(index, Qt::DisplayRole).toString(); // KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString(); + QRect textRect = QRect(option.rect.topLeft(), QSize(option.rect.width() - 2 - 3 - 3, height)); + textRect.setTop(textRect.top() + 2 + 3 /* corner */); + textRect.setLeft(textRect.left() + 2 + 3 /* corner */ + 3 /* a bit of margin */); + painter->save(); + painter->setFont(font); + QColor penColor(option.palette.text().color()); + penColor.setAlphaF(0.6); + painter->setPen(penColor); + painter->drawText(textRect, Qt::AlignLeft | Qt::AlignTop, category); + painter->restore(); + } + //END: draw text +} + +int CategoryDrawer::categoryHeight(const QModelIndex &index, const QStyleOption &option) const +{ + Q_UNUSED( index ); + Q_UNUSED( option ); + + QFont font(QApplication::font()); + font.setBold(true); + const QFontMetrics fontMetrics = QFontMetrics(font); + + return fontMetrics.height() + 2 + 12 /* vertical spacing */; +} diff --git a/kde/src/widgets/CategoryDrawer.h b/kde/src/widgets/CategoryDrawer.h new file mode 100644 index 0000000000..c997268b4e --- /dev/null +++ b/kde/src/widgets/CategoryDrawer.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2009 by Rafael Fernández López <ereslibre@kde.org> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License version 2 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to * + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * + * Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +// this code is taken from SystemSettings/icons/CategoryDrawer.{h,cpp} +// Rafael agreet to relicense it under LGPLv2 or LGPLv3, just as we need it, +// see: http://lists.kde.org/?l=kwrite-devel&m=133061943317199&w=2 + +#ifndef CATEGORYDRAWER_H +#define CATEGORYDRAWER_H + +#include <KCategoryDrawer> + +class QPainter; +class QModelIndex; +class QStyleOption; + +class CategoryDrawer : public KCategoryDrawerV2 +{ +public: + CategoryDrawer(); + + virtual void drawCategory(const QModelIndex &index, + int sortRole, + const QStyleOption &option, + QPainter *painter) const; + + virtual int categoryHeight(const QModelIndex &index, const QStyleOption &option) const; +}; + +#endif diff --git a/kde/src/widgets/ContactDock.cpp b/kde/src/widgets/ContactDock.cpp index bce78d16d8..401eefb8e7 100644 --- a/kde/src/widgets/ContactDock.cpp +++ b/kde/src/widgets/ContactDock.cpp @@ -23,6 +23,7 @@ //Qt #include <QtCore/QDateTime> +#include <QtCore/QMap> #include <QtGui/QVBoxLayout> #include <QtGui/QListWidget> #include <QtGui/QTreeWidget> @@ -39,15 +40,19 @@ #include <KIcon> //SFLPhone -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" #include "ContactItemWidget.h" #include "SFLPhone.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/ConfigurationSkeleton.h" +#include "CallView.h" +#include "SFLPhoneView.h" //SFLPhone library #include "lib/Call.h" #include "lib/Contact.h" +#define CURRENT_SORTING_MODE m_pSortByCBB->currentIndex() + ///@class QNumericTreeWidgetItem_hist TreeWidget using different sorting criterias class QNumericTreeWidgetItem_hist : public QTreeWidgetItem { public: @@ -94,9 +99,10 @@ ContactDock::ContactDock(QWidget* parent) : QDockWidget(parent) QStringList sortType; - sortType << "Name" << "Organisation" << "Phone number type" << "Rencently used" << "Group"; + sortType << "Name" << "Organisation" << "Recently used" << "Group" << "Department"; + m_pSortByCBB->addItems(sortType); - m_pSortByCBB->setDisabled(true); + //m_pSortByCBB->setDisabled(true); QWidget* mainWidget = new QWidget(this); setWidget(mainWidget); @@ -109,7 +115,7 @@ ContactDock::ContactDock(QWidget* parent) : QDockWidget(parent) KeyPressEaterC *keyPressEater = new KeyPressEaterC(this); m_pContactView->installEventFilter(keyPressEater); - m_pContactView->setAlternatingRowColors(true); + //m_pContactView->setAlternatingRowColors(true); m_pFilterLE->setPlaceholderText(i18n("Filter")); m_pFilterLE->setClearButtonShown(true); @@ -131,11 +137,20 @@ ContactDock::ContactDock(QWidget* parent) : QDockWidget(parent) m_pSplitter->setChildrenCollapsible(true); m_pSplitter->setStretchFactor(0,7); + QTimer* timer = new QTimer(this); + + m_pSortByCBB->setCurrentIndex(ConfigurationSkeleton::contactSortMode()); + connect (AkonadiBackend::getInstance(),SIGNAL(collectionChanged()), this, SLOT(reloadContact() )); + connect (m_pSortByCBB ,SIGNAL(currentIndexChanged(int)), this, SLOT(reloadContact() )); connect (m_pContactView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),this, SLOT(loadContactHistory(QTreeWidgetItem*) )); connect (m_pFilterLE, SIGNAL(textChanged(QString)), this, SLOT(filter(QString) )); connect (m_pShowHistoCK, SIGNAL(toggled(bool)), this, SLOT(setHistoryVisible(bool) )); + connect (timer ,SIGNAL(timeout()), this, SLOT(reloadHistoryConst() )); + timer->start(1800*1000); //30 minutes setWindowTitle(i18n("Contact")); + + } ///Destructor @@ -155,31 +170,75 @@ ContactDock::~ContactDock() void ContactDock::reloadContact() { ContactList list = AkonadiBackend::getInstance()->update(); + if (!list.size()) + return; + m_pContactView->clear(); + m_Contacts.clear(); + + QHash<Contact*, QDateTime> recentlyUsed; + switch (CURRENT_SORTING_MODE) { + case Recently_used: + recentlyUsed = getContactListByTime(); + foreach (QString cat, m_slHistoryConst) { + m_pContactView->addCategory(cat); + } + break; + } + foreach (Contact* cont, list) { - ContactItemWidget* aContact = new ContactItemWidget(m_pContactView); - QNumericTreeWidgetItem_hist* item = new QNumericTreeWidgetItem_hist(m_pContactView); - item->widget = aContact; - aContact->setItem(item); - aContact->setContact(cont); - - PhoneNumbers numbers = aContact->getContact()->getPhoneNumbers(); - kDebug() << "Phone count" << numbers.count(); - if (numbers.count() > 1) { - foreach (Contact::PhoneNumber* number, numbers) { - QNumericTreeWidgetItem_hist* item2 = new QNumericTreeWidgetItem_hist(item); - QLabel* numberL = new QLabel("<b>"+number->getType()+":</b>"+number->getNumber(),this); - item2->number = number->getNumber(); - m_pContactView->setItemWidget(item2,0,numberL); + if (cont->getPhoneNumbers().count() && usableNumberCount(cont)) { + ContactItemWidget* aContact = new ContactItemWidget(m_pContactView); + QString category; + switch (CURRENT_SORTING_MODE) { + case Name: + category = QString(cont->getFormattedName()[0]); + break; + case Organisation: + category = (cont->getOrganization().isEmpty())?"Unknow":cont->getOrganization(); + break; + case Recently_used: + if (recentlyUsed.find(cont) != recentlyUsed.end()) + category = timeToHistoryCategory(recentlyUsed[cont].date()); + else + category = m_slHistoryConst[Never]; + break; + case Group: + category = "TODO"; + break; + case Department: + category = (cont->getDepartment().isEmpty())?"Unknow":cont->getDepartment();; + break; + } + QNumericTreeWidgetItem_hist* item = m_pContactView->addItem<QNumericTreeWidgetItem_hist>(category); + item->widget = aContact; + aContact->setItem(item); + aContact->setContact(cont); + + PhoneNumbers numbers = aContact->getContact()->getPhoneNumbers(); + if (numbers.count() > 1) { + foreach (Contact::PhoneNumber* number, numbers) { + QNumericTreeWidgetItem_hist* item2 = new QNumericTreeWidgetItem_hist(item); + QLabel* numberL = new QLabel("<b>"+number->getType()+":</b>"+number->getNumber(),this); + item2->number = number->getNumber(); + m_pContactView->setItemWidget(item2,0,numberL); + } + } + else if (numbers.count() == 1) { + item->number = numbers[0]->getNumber(); } - } - else if (numbers.count() == 1) { - item->number = numbers[0]->getNumber(); - } - m_pContactView->addTopLevelItem(item); - m_pContactView->setItemWidget(item,0,aContact); - m_Contacts << aContact; + m_pContactView->setItemWidget(item,0,aContact); + m_Contacts << aContact; + } } + switch (CURRENT_SORTING_MODE) { + case Recently_used: + break; + default: + m_pContactView->sortItems(0,Qt::AscendingOrder); + } + + ConfigurationSkeleton::setContactSortMode(m_pSortByCBB->currentIndex()); } ///Query the call history for all items related to this contact @@ -208,17 +267,26 @@ void ContactDock::filter(const QString& text) foreach(ContactItemWidget* item, m_Contacts) { bool foundNumber = false; foreach (Contact::PhoneNumber* number, item->getContact()->getPhoneNumbers()) { - foundNumber |= number->getNumber().toLower().indexOf(text) != -1; + foundNumber |= number->getNumber().toLower().indexOf(text.toLower()) != -1; } - bool visible = (item->getContact()->getFormattedName().toLower().indexOf(text) != -1) - || (item->getContact()->getOrganization().toLower().indexOf(text) != -1) - || (item->getContact()->getPreferredEmail().toLower().indexOf(text) != -1) + bool visible = (item->getContact()->getFormattedName ().toLower().indexOf(text.toLower()) != -1) + || (item->getContact()->getOrganization ().toLower().indexOf(text.toLower()) != -1) + || (item->getContact()->getPreferredEmail ().toLower().indexOf(text.toLower()) != -1) + || (item->getContact()->getDepartment ().toLower().indexOf(text.toLower()) != -1) || foundNumber; item->getItem()->setHidden(!visible); } - m_pContactView->expandAll(); + //m_pContactView->expandAll(); } +void ContactDock::reloadHistoryConst() +{ + switch (CURRENT_SORTING_MODE) { + case Recently_used: + reloadContact(); + break; + } +} /***************************************************************************** * * @@ -293,9 +361,23 @@ void ContactDock::keyPressEvent(QKeyEvent* event) { int key = event->key(); if(key == Qt::Key_Escape) m_pFilterLE->setText(QString()); - else if(key == Qt::Key_Return || key == Qt::Key_Enter) {} + else if(key == Qt::Key_Return || key == Qt::Key_Enter) { + if (m_pContactView->selectedItems()[0] && m_pContactView->itemWidget(m_pContactView->selectedItems()[0],0)) { + QNumericTreeWidgetItem_hist* item = dynamic_cast<QNumericTreeWidgetItem_hist*>(m_pContactView->selectedItems()[0]); + if (item) { + Call* call = NULL; + SFLPhone::app()->view()->selectCallPhoneNumber(call,item->widget->getContact()); + } + } + } else if((key == Qt::Key_Backspace) && (m_pFilterLE->text().size())) m_pFilterLE->setText(m_pFilterLE->text().left( m_pFilterLE->text().size()-1 )); else if (!event->text().isEmpty() && !(key == Qt::Key_Backspace)) m_pFilterLE->setText(m_pFilterLE->text()+event->text()); -} \ No newline at end of file +} + +/***************************************************************************** + * * + * Helpers * + * * + ****************************************************************************/ diff --git a/kde/src/widgets/ContactDock.h b/kde/src/widgets/ContactDock.h index b19f9c7514..c7318a0b4f 100644 --- a/kde/src/widgets/ContactDock.h +++ b/kde/src/widgets/ContactDock.h @@ -20,8 +20,12 @@ #ifndef CONTACT_DOCK_H #define CONTACT_DOCK_H +#include <QtCore/QHash> #include <QtGui/QDockWidget> -#include <QtGui/QTreeWidget> +#include "CategorizedTreeWidget.h" +#include "../klib/SortableDockCommon.h" +#include "CallTreeItem.h" +#include <QtGui/QTreeWidgetItem> //Qt class QSplitter; @@ -29,6 +33,8 @@ class QListWidget; class QComboBox; class QTreeWidgetItem; class QCheckBox; +class QStringList; +class DateTime; //KDE class KLineEdit; @@ -49,9 +55,11 @@ namespace KABC { ///SFLPhone class ContactTree; class ContactItemWidget; +class StaticEventHandler; +class Contact; ///@class ContactDock Dock to access contacts -class ContactDock : public QDockWidget +class ContactDock : public QDockWidget, public SortableDockCommon<CallTreeItem*,QTreeWidgetItem*> { Q_OBJECT public: @@ -61,11 +69,11 @@ public: private: //Attributes - KLineEdit* m_pFilterLE; - QSplitter* m_pSplitter; + KLineEdit* m_pFilterLE ; + QSplitter* m_pSplitter ; ContactTree* m_pContactView; - QListWidget* m_pCallView; - QComboBox* m_pSortByCBB; + QListWidget* m_pCallView ; + QComboBox* m_pSortByCBB ; QCheckBox* m_pShowHistoCK; QList<ContactItemWidget*> m_Contacts; @@ -73,17 +81,18 @@ public slots: virtual void keyPressEvent(QKeyEvent* event); private slots: - void reloadContact(); - void loadContactHistory(QTreeWidgetItem* item); - void filter(const QString& text); - void setHistoryVisible(bool visible); + void reloadContact ( ); + void loadContactHistory ( QTreeWidgetItem* item ); + void filter ( const QString& text ); + void setHistoryVisible ( bool visible ); + void reloadHistoryConst ( ); }; ///@class ContactTree tree view with additinal drag and drop -class ContactTree : public QTreeWidget { +class ContactTree : public CategorizedTreeWidget { Q_OBJECT public: - ContactTree(QWidget* parent) : QTreeWidget(parent) {} + ContactTree(QWidget* parent) : CategorizedTreeWidget(parent) {} virtual QMimeData* mimeData( const QList<QTreeWidgetItem *> items) const; bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action); }; diff --git a/kde/src/widgets/ContactItemWidget.cpp b/kde/src/widgets/ContactItemWidget.cpp index db15eaa48b..b253adfff3 100644 --- a/kde/src/widgets/ContactItemWidget.cpp +++ b/kde/src/widgets/ContactItemWidget.cpp @@ -40,7 +40,7 @@ #include <unistd.h> //SFLPhone -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" #include "widgets/BookmarkDock.h" #include "SFLPhone.h" diff --git a/kde/src/widgets/HistoryDock.cpp b/kde/src/widgets/HistoryDock.cpp index 165759f7c6..462ce05815 100644 --- a/kde/src/widgets/HistoryDock.cpp +++ b/kde/src/widgets/HistoryDock.cpp @@ -42,16 +42,19 @@ //SFLPhone #include "SFLPhone.h" #include "widgets/HistoryTreeItem.h" -#include "AkonadiBackend.h" -#include "conf/ConfigurationSkeleton.h" +#include "klib/AkonadiBackend.h" +#include "klib/ConfigurationSkeleton.h" //SFLPhone library #include "lib/sflphone_const.h" + +#define CURRENT_SORTING_MODE m_pSortByCBB->currentIndex() + ///Qt lack official functional sorting algo, so this hack around it class QNumericTreeWidgetItem : public QTreeWidgetItem { public: - QNumericTreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent),widget(0),weight(-1){} + QNumericTreeWidgetItem(QTreeWidget* parent=0):QTreeWidgetItem(parent),widget(0),weight(-1){} QNumericTreeWidgetItem(QTreeWidgetItem* parent):QTreeWidgetItem(parent),widget(0),weight(-1){} HistoryTreeItem* widget; int weight; @@ -109,7 +112,7 @@ HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent) m_pItemView->headerItem()->setText(0,i18n("Calls") ); m_pItemView->header ()->setClickable(true ); m_pItemView->header ()->setSortIndicatorShown(true ); - m_pItemView->setAlternatingRowColors(true ); + //m_pItemView->setAlternatingRowColors(true ); m_pItemView->setAcceptDrops( true ); m_pItemView->setDragEnabled( true ); KeyPressEater *keyPressEater = new KeyPressEater(this); @@ -119,7 +122,7 @@ HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent) m_pFilterLE->setClearButtonShown(true); QStringList sortBy; - sortBy << "Date" << "Name" << "Popularity" << "Duration"; + sortBy << "Date" << "Name" << "Popularity" << "Length"; m_pSortByCBB->addItems(sortBy); QWidget* mainWidget = new QWidget(this); @@ -143,16 +146,20 @@ HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent) QDate date(2000,1,1); m_pFromDW->setDate(date); - reload(); m_CurrentFromDate = m_pFromDW->date(); m_CurrentToDate = m_pToDW->date(); - connect(m_pAllTimeCB, SIGNAL(toggled(bool)), this, SLOT(enableDateRange(bool) )); - connect(m_pFilterLE, SIGNAL(textChanged(QString)), this, SLOT(filter(QString) )); - connect(m_pFromDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedFromDate(QDate) )); - connect(m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate) )); - connect(m_pSortByCBB, SIGNAL(currentIndexChanged(int)), this, SLOT(reload() )); - connect(AkonadiBackend::getInstance(), SIGNAL(collectionChanged()), this, SLOT(updateContactInfo() )); + m_pSortByCBB->setCurrentIndex(ConfigurationSkeleton::historySortMode()); + + connect(m_pAllTimeCB, SIGNAL(toggled(bool)), this, SLOT(enableDateRange(bool) )); + connect(m_pFilterLE, SIGNAL(textChanged(QString)), this, SLOT(filter(QString) )); + connect(m_pFromDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedFromDate(QDate) )); + connect(m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate) )); + connect(m_pSortByCBB, SIGNAL(currentIndexChanged(int)), this, SLOT(reload() )); + connect(AkonadiBackend::getInstance(), SIGNAL(collectionChanged()), this, SLOT(updateContactInfo() )); + connect(SFLPhone::model() , SIGNAL(historyChanged()), this, SLOT(reload() )); + + reload(); } ///Destructor @@ -167,15 +174,6 @@ HistoryDock::~HistoryDock() * * ****************************************************************************/ -///Return the identity of the call caller -QString HistoryDock::getIdentity(HistoryTreeItem* item) -{ - if (item->getName().trimmed().isEmpty()) - return item->getPhoneNumber(); - else - return item->getName(); -} - /***************************************************************************** * * @@ -195,12 +193,22 @@ void HistoryDock::updateContactInfo() void HistoryDock::reload() { m_pItemView->clear(); + + QHash<Contact*, QDateTime> recentlyUsed; + switch (CURRENT_SORTING_MODE) { + case Date: + foreach (QString cat, m_slHistoryConst) { + m_pItemView->addCategory(cat); + } + break; + } + foreach(HistoryTreeItem* hitem, m_History) { delete hitem; } m_History.clear(); foreach (Call* call, SFLPhone::app()->model()->getHistory()) { - if (!m_pAllTimeCB->isChecked() || (QDateTime(m_pFromDW->date()).toTime_t() < call->getStartTimeStamp().toUInt() && QDateTime(m_pToDW->date().addDays(1)).toTime_t() > call->getStartTimeStamp().toUInt() )) { + if (call != nullptr && (!m_pAllTimeCB->isChecked() || (QDateTime(m_pFromDW->date()).toTime_t() < call->getStartTimeStamp().toUInt() && QDateTime(m_pToDW->date().addDays(1)).toTime_t() > call->getStartTimeStamp().toUInt() ))) { HistoryTreeItem* callItem = new HistoryTreeItem(m_pItemView); callItem->setCall(call); m_History << callItem; @@ -209,22 +217,23 @@ void HistoryDock::reload() switch (m_pSortByCBB->currentIndex()) { case Date: foreach(HistoryTreeItem* hitem, m_History) { - QNumericTreeWidgetItem* item = new QNumericTreeWidgetItem(m_pItemView); + //QNumericTreeWidgetItem* item = new QNumericTreeWidgetItem(m_pItemView);//m_pItemView->addItem<QNumericTreeWidgetItem>(timeToHistoryCategory(QDateTime::fromTime_t(hitem->call()->getStartTimeStamp().toUInt()).date())); + QNumericTreeWidgetItem* item = m_pItemView->addItem<QNumericTreeWidgetItem>(timeToHistoryCategory(QDateTime::fromTime_t(hitem->call()->getStartTimeStamp().toUInt()).date())); item->widget = hitem; hitem->setItem(item); - m_pItemView->addTopLevelItem(item); + //m_pItemView->addTopLevelItem(item); m_pItemView->setItemWidget(item,0,hitem); } break; - case Name: { + case Name2: { QHash<QString,QTreeWidgetItem*> group; foreach(HistoryTreeItem* item, m_History) { - if (!group[getIdentity(item)]) { - group[getIdentity(item)] = new QTreeWidgetItem(m_pItemView); - group[getIdentity(item)]->setText(0,getIdentity(item)); - m_pItemView->addTopLevelItem(group[getIdentity(item)]); - } - QNumericTreeWidgetItem* twItem = new QNumericTreeWidgetItem(group[getIdentity(item)]); +// if (!group[getIdentity(item)]) { +// group[getIdentity(item)] = new QTreeWidgetItem(m_pItemView); +// group[getIdentity(item)]->setText(0,getIdentity(item)); +// m_pItemView->addTopLevelItem(group[getIdentity(item)]); +// } + QNumericTreeWidgetItem* twItem = m_pItemView->addItem<QNumericTreeWidgetItem>(getIdentity(item->call())); item->setItem(twItem); twItem->widget = item; m_pItemView->setItemWidget(twItem,0,item); @@ -234,31 +243,48 @@ void HistoryDock::reload() case Popularity: { QHash<QString,QNumericTreeWidgetItem*> group; foreach(HistoryTreeItem* item, m_History) { - if (!group[getIdentity(item)]) { - group[getIdentity(item)] = new QNumericTreeWidgetItem(m_pItemView); - group[getIdentity(item)]->weight = 0; - m_pItemView->addTopLevelItem(group[getIdentity(item)]); + if (!group[getIdentity(item->call())]) { + group[getIdentity(item->call())] = m_pItemView->addCategory<QNumericTreeWidgetItem>(getIdentity(item->call())); + group[getIdentity(item->call())]->weight = 0; + m_pItemView->addTopLevelItem(group[getIdentity(item->call())]); } - group[getIdentity(item)]->weight++; - group[getIdentity(item)]->setText(0,getIdentity(item)+" ("+QString::number(group[getIdentity(item)]->weight)+")"); - QNumericTreeWidgetItem* twItem = new QNumericTreeWidgetItem(group[getIdentity(item)]); + group[getIdentity(item->call())]->weight++; + group[getIdentity(item->call())]->setText(0,getIdentity(item->call())+" ("+QString::number(group[getIdentity(item->call())]->weight)+")"); + QNumericTreeWidgetItem* twItem = m_pItemView->addItem<QNumericTreeWidgetItem>(getIdentity(item->call())); item->setItem(twItem); twItem->widget = item; m_pItemView->setItemWidget(twItem,0,item); } break; } - case Duration: + case Length: foreach(HistoryTreeItem* hitem, m_History) { - QNumericTreeWidgetItem* item = new QNumericTreeWidgetItem(m_pItemView); - item->weight = hitem->getDuration(); + QNumericTreeWidgetItem* item = m_pItemView->addItem<QNumericTreeWidgetItem>(" "); + item->weight = hitem->getLength(); hitem->setItem(item); m_pItemView->addTopLevelItem(item); m_pItemView->setItemWidget(item,0,hitem); } break; } - m_pItemView->sortItems(0,Qt::AscendingOrder); + ConfigurationSkeleton::setHistorySortMode(m_pSortByCBB->currentIndex()); + + switch (m_pSortByCBB->currentIndex()) { + case Date: + break; + default: + m_pItemView->sortItems(0,Qt::AscendingOrder); + } + + int maxWidth = 0; + + //Align all durationwidget + foreach(HistoryTreeItem* item, m_History) { + maxWidth = ((uint)item->getDurWidth() > (uint)maxWidth)?item->getDurWidth():maxWidth; + } + foreach(HistoryTreeItem* item, m_History) { + item->setDurWidth(maxWidth); + } } ///Enable the ability to set a date range like 1 month to limit history @@ -378,9 +404,16 @@ void HistoryDock::keyPressEvent(QKeyEvent* event) { int key = event->key(); if(key == Qt::Key_Escape) m_pFilterLE->setText(QString()); - else if(key == Qt::Key_Return || key == Qt::Key_Enter) {} + else if ((key == Qt::Key_Return || key == Qt::Key_Enter) && m_pItemView->selectedItems().size() > 0) { + if (m_pItemView->selectedItems()[0] && m_pItemView->itemWidget(m_pItemView->selectedItems()[0],0)) { + QNumericTreeWidgetItem* item = dynamic_cast<QNumericTreeWidgetItem*>(m_pItemView->selectedItems()[0]); + if (item) { + SFLPhone::model()->addDialingCall(item->widget->getName(), SFLPhone::app()->model()->getCurrentAccountId())->setCallNumber(item->widget->getPhoneNumber()); + } + } + } else if((key == Qt::Key_Backspace) && (m_pFilterLE->text().size())) m_pFilterLE->setText(m_pFilterLE->text().left( m_pFilterLE->text().size()-1 )); else if (!event->text().isEmpty() && !(key == Qt::Key_Backspace)) m_pFilterLE->setText(m_pFilterLE->text()+event->text()); -} \ No newline at end of file +} diff --git a/kde/src/widgets/HistoryDock.h b/kde/src/widgets/HistoryDock.h index e331b476e3..51ce18b1ec 100644 --- a/kde/src/widgets/HistoryDock.h +++ b/kde/src/widgets/HistoryDock.h @@ -23,6 +23,10 @@ #include <QtGui/QDockWidget> #include <QtGui/QTreeWidget> #include <QtCore/QDate> +#include "../klib/SortableDockCommon.h" +#include "CategorizedTreeWidget.h" +#include "CallTreeItem.h" +#include <QtGui/QTreeWidgetItem> //Qt class QTreeWidgetItem; @@ -46,7 +50,7 @@ class HistoryTree; typedef QList<HistoryTreeItem*> HistoryList; ///@class HistoryDock Dock to see the previous SFLPhone calls -class HistoryDock : public QDockWidget { +class HistoryDock : public QDockWidget, public SortableDockCommon<CallTreeItem*,QTreeWidgetItem*> { Q_OBJECT public: @@ -58,17 +62,6 @@ public: virtual ~HistoryDock(); private: - //Enum - enum SortBy { - Date = 0, - Name = 1, - Popularity = 2, - Duration = 3 - }; - - //Getters - QString getIdentity(HistoryTreeItem* item); - //Attributes HistoryTree* m_pItemView ; KLineEdit* m_pFilterLE ; @@ -101,10 +94,10 @@ private slots: ///@class HistoryTree Simple tree view with additional keybpard filter -class HistoryTree : public QTreeWidget { +class HistoryTree : public CategorizedTreeWidget { Q_OBJECT public: - HistoryTree(QWidget* parent) : QTreeWidget(parent) {} + HistoryTree(QWidget* parent) : CategorizedTreeWidget(parent) {} virtual QMimeData* mimeData( const QList<QTreeWidgetItem *> items) const; bool dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action); }; diff --git a/kde/src/widgets/HistoryTreeItem.cpp b/kde/src/widgets/HistoryTreeItem.cpp index 86d24c424a..3ba87e729c 100644 --- a/kde/src/widgets/HistoryTreeItem.cpp +++ b/kde/src/widgets/HistoryTreeItem.cpp @@ -22,17 +22,29 @@ #include "HistoryTreeItem.h" //Qt -#include <QtCore/QStringList> #include <QtGui/QGridLayout> #include <QtGui/QMenu> #include <QtGui/QLabel> #include <QtGui/QSpacerItem> +#include <QtGui/QHBoxLayout> +#include <QtGui/QToolButton> +#include <QtGui/QMessageBox> +#include <QtGui/QPainter> +#include <QtGui/QColor> +#include <QtGui/QFontMetrics> +#include <QtCore/QStringList> +#include <QtCore/QFile> +#include <Phonon/MediaObject> +#include <Phonon/BackendCapabilities> +#include <Phonon/AudioOutput> +#include <Phonon/SeekSlider> //KDE #include <KLocale> #include <KDebug> #include <KAction> #include <KIcon> +#include <KMessageBox> //SFLPhone library #include "lib/sflphone_const.h" @@ -40,15 +52,29 @@ #include "lib/Call.h" //SFLPhone -#include "AkonadiBackend.h" +#include "klib/AkonadiBackend.h" #include "SFLPhone.h" #include "widgets/BookmarkDock.h" const char * HistoryTreeItem::callStateIcons[12] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", "", ICON_CONFERENCE}; +class PlayerWidget : public QWidget { +public: + PlayerWidget(QWidget* parent = 0) : QWidget(parent) {} +protected: + virtual void paintEvent(QPaintEvent* /*event*/) + { + QColor backgroundColor = palette().light().color(); + backgroundColor.setAlpha(200); + QPainter customPainter(this); + customPainter.fillRect(rect(),backgroundColor); + } +}; + + ///Constructor HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone) - : QWidget(parent), m_pItemCall(0),m_pMenu(0) + : QWidget(parent), m_pItemCall(0),m_pMenu(0),m_pAudioSlider(0),m_pTimeLeftL(0),m_pTimePlayedL(0),m_pPlayer(0),m_pContact(0) { setContextMenuPolicy(Qt::CustomContextMenu); @@ -59,7 +85,7 @@ HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone) m_pAddToContact = new KAction(this); m_pBookmark = new KAction(this); - m_pCallAgain->setShortcut ( Qt::CTRL + Qt::Key_Enter ); + m_pCallAgain->setShortcut ( Qt::Key_Enter ); m_pCallAgain->setText ( i18n("Call Again") ); m_pCallAgain->setIcon ( KIcon(ICON_DIALING) ); @@ -86,33 +112,54 @@ HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone) m_pBookmark->setText ( i18n("Bookmark") ); m_pBookmark->setIcon ( KIcon("bookmarks") ); + m_pPlay = new QToolButton(this); + + m_pPlay->setIcon(KIcon("media-playback-start")); + m_pPlay->setMinimumSize(30,30); + m_pPlay->setMaximumSize(30,30); + m_pPlay->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed)); + m_pPlay->setVisible(false); + + m_pRemove = new QToolButton(this); + m_pRemove->setIcon(KIcon("list-remove")); + m_pRemove->setMinimumSize(30,30); + m_pRemove->setMaximumSize(30,30); + m_pRemove->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed)); + m_pRemove->setVisible(false); + connect(m_pCallAgain , SIGNAL(triggered()) , this , SLOT(callAgain() )); connect(m_pAddContact , SIGNAL(triggered()) , this , SLOT(addContact() )); connect(m_pCopy , SIGNAL(triggered()) , this , SLOT(copy() )); connect(m_pEmail , SIGNAL(triggered()) , this , SLOT(sendEmail() )); connect(m_pAddToContact , SIGNAL(triggered()) , this , SLOT(addToContact() )); connect(m_pBookmark , SIGNAL(triggered()) , this , SLOT(bookmark() )); + connect(m_pPlay , SIGNAL(clicked() ) , this , SLOT(showRecordPlayer() )); + connect(m_pRemove , SIGNAL(clicked() ) , this , SLOT(removeRecording() )); connect(this , SIGNAL(customContextMenuRequested(QPoint)) , this , SLOT(showContext(QPoint) )); m_pIconL = new QLabel( this ); m_pPeerNameL = new QLabel( this ); m_pCallNumberL = new QLabel( this ); - m_pDurationL = new QLabel( this ); + m_pLengthL = new QLabel( this ); m_pTimeL = new QLabel( this ); - m_pIconL->setMinimumSize(70,48); - m_pIconL->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); + m_pIconL->setMinimumSize(70,0); + m_pIconL->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::MinimumExpanding); QSpacerItem* verticalSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); - QGridLayout* mainLayout = new QGridLayout(this); - mainLayout->addWidget ( m_pIconL,0,0,4,1 ); - mainLayout->addWidget ( m_pPeerNameL,0,1 ); - mainLayout->addWidget ( m_pCallNumberL,1,1 ); - mainLayout->addWidget ( m_pTimeL,2,1 ); - mainLayout->addItem ( verticalSpacer,3,1 ); - mainLayout->addWidget ( m_pDurationL,0,2,4,1 ); - setLayout(mainLayout); + m_pMainLayout = new QGridLayout(this); + m_pMainLayout->addWidget ( m_pIconL , 0 , 0 , 4 , 1 ); + m_pMainLayout->addWidget ( m_pPeerNameL , 0 , 1 ); + m_pMainLayout->addWidget ( m_pCallNumberL , 1 , 1 ); + m_pMainLayout->addWidget ( m_pTimeL , 2 , 1 ); + m_pMainLayout->addItem ( verticalSpacer , 4 , 1 ); + m_pMainLayout->addWidget ( m_pPlay , 0 , 2 , 4 , 1 ); + m_pMainLayout->addWidget ( m_pRemove , 0 , 3 , 4 , 1 ); + m_pMainLayout->addWidget ( m_pLengthL , 0 , 4 , 4 , 1 ); + setLayout(m_pMainLayout); setMinimumSize(QSize(50, 30)); + setMaximumSize(QSize(300,99999)); + setSizePolicy(QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum)); if (!phone.isEmpty()) { getContactInfo(phone); @@ -143,7 +190,7 @@ Call* HistoryTreeItem::call() const ///The item have to be updated void HistoryTreeItem::updated() { - if (!getContactInfo(m_pItemCall->getPeerPhoneNumber())) { + if (!getContactInfo(m_pItemCall->getPeerPhoneNumber()),true) { if(! m_pItemCall->getPeerName().trimmed().isEmpty()) { m_pPeerNameL->setText("<b>"+m_pItemCall->getPeerName()+"</b>"); } @@ -228,6 +275,197 @@ void HistoryTreeItem::bookmark() SFLPhone::app()->bookmarkDock()->addBookmark(m_PhoneNumber); } +void HistoryTreeItem::removeRecording() +{ + int ret = KMessageBox::questionYesNo(this, "Are you sure you want to delete this recording?", "Delete recording"); + if (ret == KMessageBox::Yes) { + kDebug() << "Deleting file"; + QFile::remove(m_pItemCall->getRecordingPath()); + } +} + +///Hide or show the media player +void HistoryTreeItem::showRecordPlayer() +{ + if (!m_pAudioSlider) { + m_pPlayer = new PlayerWidget ( this ); + QWidget* r1w = new QWidget ( this ); + QWidget* r2w = new QWidget ( this ); + QVBoxLayout* l = new QVBoxLayout ( m_pPlayer ); + QHBoxLayout* r1= new QHBoxLayout ( r1w ); + QHBoxLayout* r2= new QHBoxLayout ( r2w ); + m_pAudioSlider = new Phonon::SeekSlider ( this ); + m_pTimeLeftL = new QLabel ( "00:00" ); + m_pTimePlayedL = new QLabel ( "00:00" ); + m_pPause = new QToolButton ( ); + m_pStop = new QToolButton ( ); + m_pNote = new QToolButton ( ); + + l->addWidget(r1w); + l->addWidget(r2w); + + m_pPlayer->setAttribute( Qt::WA_TranslucentBackground, true ); + m_pPlayer->setMinimumSize(0,25); + m_pPlayer->setStyleSheet("margin-top:5px"); + + l-> setContentsMargins(0,0,0,0); + r1->setContentsMargins(0,0,0,0); + r2->setContentsMargins(0,0,0,0); + + m_pPause->setIcon ( KIcon( "media-playback-pause" )); + m_pStop->setIcon ( KIcon( "media-playback-stop" )); + m_pNote->setIcon ( KIcon( "view-pim-notes" )); + + m_pPause->setMinimumSize(30,30); + m_pStop->setMinimumSize (30,30); + m_pNote->setMinimumSize (30,30); + QSpacerItem* hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); + + r1->addWidget( m_pTimePlayedL ); + r1->addWidget( m_pAudioSlider ); + r1->addWidget( m_pTimeLeftL ); + r2->addWidget( m_pPause ); + r2->addWidget( m_pStop ); + r2->addItem ( hSpacer ); + r2->addWidget( m_pNote ); + + m_pPlayer->setMinimumSize(width(),height()); + m_pPlayer->setMaximumSize(width(),height()); + + l->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding)); + m_pPlayer->setVisible(true); + + m_pAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); + m_pMediaObject = new Phonon::MediaObject(this); + m_pMetaInformationResolver = new Phonon::MediaObject(this); + Phonon::createPath(m_pMediaObject, m_pAudioOutput); + + m_pAudioSlider->setMediaObject(m_pMediaObject); + + m_pMediaObject->setTickInterval(1000); + + connect( m_pStop , SIGNAL(clicked() ) , this , SLOT( stopPlayer() )); + connect( m_pPause , SIGNAL(clicked() ) , this , SLOT( playPausePlayer() )); + connect( m_pNote , SIGNAL(clicked() ) , this , SLOT( editNote() )); + connect( m_pMediaObject , SIGNAL(tick(qint64) ) , this , SLOT( tick(qint64) )); + + connect(m_pMediaObject , SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this, SLOT(stateChanged(Phonon::State,Phonon::State))); + + } + kDebug() << "Path:" << m_pItemCall->getRecordingPath(); + m_pPlayer->setVisible(true); + Phonon::MediaSource source(m_pItemCall->getRecordingPath()); + m_lSources.append(source); + if (m_lSources.size() > 0) + m_pMetaInformationResolver->setCurrentSource(m_lSources.first()); + m_pMediaObject->play(); + +} + +///Called when the user press the stop button +void HistoryTreeItem::stopPlayer() +{ + m_pPlayer->setVisible(false); + m_pMediaObject->stop(); +} + +///Called then the user press the Play/Pause button +void HistoryTreeItem::playPausePlayer() +{ + if (m_pMediaObject->state() == Phonon::PlayingState) + m_pMediaObject->pause(); + else + m_pMediaObject->play(); +} + +///Add or edit the note associated with this call +void HistoryTreeItem::editNote() +{ + +} + +///Update player labels +void HistoryTreeItem::tick(qint64 time) +{ + QTime displayTime(0, (time / 60000) % 60, (time / 1000) % 60); + m_pTimePlayedL->setText(displayTime.toString("mm:ss")); +} + +///Called on player state change +void HistoryTreeItem::stateChanged(Phonon::State newState, Phonon::State /* oldState */) +{ + kDebug() << "Player state changed"; + switch (newState) { + case Phonon::ErrorState: + if (m_pMediaObject->errorType() == Phonon::FatalError) { + QMessageBox::warning(this, tr("Fatal Error"), + m_pMediaObject->errorString()); + } else { + QMessageBox::warning(this, tr("Error"), + m_pMediaObject->errorString()); + } + break; + case Phonon::PlayingState: + m_pPause->setIcon(KIcon("media-playback-pause")); + break; + case Phonon::StoppedState: + m_pPause->setIcon(KIcon("media-playback-play")); + m_pTimePlayedL->setText("00:00"); + break; + case Phonon::PausedState: + m_pPause->setIcon(KIcon("media-playback-play")); + break; + case Phonon::BufferingState: + break; + default: + ; + } +} + +///Reference code for metastate change +void HistoryTreeItem::metaStateChanged(Phonon::State newState, Phonon::State oldState) +{ + Q_UNUSED(oldState); + if (newState == Phonon::ErrorState) { + QMessageBox::warning(this, tr("Error opening files"), + m_pMetaInformationResolver->errorString()); + while (!m_lSources.isEmpty() && + !(m_lSources.takeLast() == m_pMetaInformationResolver->currentSource())) {} /* loop */; + return; + } + + if (newState != Phonon::StoppedState && newState != Phonon::PausedState) + return; + + if (m_pMetaInformationResolver->currentSource().type() == Phonon::MediaSource::Invalid) + return; + + QMap<QString, QString> metaData = m_pMetaInformationResolver->metaData(); + + m_pMediaObject->setCurrentSource(m_pMetaInformationResolver->currentSource()); + + Phonon::MediaSource source = m_pMetaInformationResolver->currentSource(); + int index = m_lSources.indexOf(m_pMetaInformationResolver->currentSource()) + 1; + if (m_lSources.size() > index) { + m_pMetaInformationResolver->setCurrentSource(m_lSources.at(index)); + } +} + +///Resize the player +void HistoryTreeItem::resizeEvent(QResizeEvent* event) +{ + Q_UNUSED(event); + if (m_pPlayer) { + m_pPlayer->setMinimumSize(width(),height()); + m_pPlayer->setMaximumSize(width(),height()); + } +} + +void HistoryTreeItem::mouseDoubleClickEvent(QMouseEvent* event) +{ + callAgain(); +} /***************************************************************************** * * @@ -250,15 +488,18 @@ void HistoryTreeItem::setCall(Call *call) m_pTimeL->setText(QDateTime::fromTime_t(m_pItemCall->getStartTimeStamp().toUInt()).toString()); int dur = m_pItemCall->getStopTimeStamp().toInt() - m_pItemCall->getStartTimeStamp().toInt(); - m_pDurationL->setText(QString("%1").arg(dur/3600,2)+":"+QString("%1").arg((dur%3600)/60,2)+":"+QString("%1").arg((dur%3600)%60,2)+" "); + m_pLengthL->setText(QString("%1").arg(dur/3600,2).trimmed()+":"+QString("%1").arg((dur%3600)/60,2).trimmed()+":"+QString("%1").arg((dur%3600)%60,2).trimmed()+" "); connect(m_pItemCall , SIGNAL(changed()) , this , SLOT(updated() )); updated(); m_TimeStamp = m_pItemCall->getStartTimeStamp().toUInt(); - m_Duration = dur; + m_Length = dur; m_Name = m_pItemCall->getPeerName(); m_PhoneNumber = m_pItemCall->getPeerPhoneNumber(); + + m_pPlay-> setVisible(!m_pItemCall->getRecordingPath().isEmpty() && QFile::exists(m_pItemCall->getRecordingPath())); + m_pRemove->setVisible(!m_pItemCall->getRecordingPath().isEmpty() && QFile::exists(m_pItemCall->getRecordingPath())); } ///Set the index associed with this widget @@ -267,6 +508,12 @@ void HistoryTreeItem::setItem(QTreeWidgetItem* item) m_pItem = item; } +void HistoryTreeItem::setDurWidth(uint width) +{ + m_pLengthL->setMaximumSize(width, 9999 ); + m_pLengthL->setMinimumSize(width, 0 ); +} + /***************************************************************************** * * @@ -277,11 +524,14 @@ void HistoryTreeItem::setItem(QTreeWidgetItem* item) ///Can a contact be associed with this call? bool HistoryTreeItem::getContactInfo(QString phoneNumber) { - Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(phoneNumber); + Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(phoneNumber,true); if (contact) { if (contact->getPhoto() != NULL) m_pIconL->setPixmap(*contact->getPhoto()); + else + m_pIconL->setPixmap(QPixmap(KIcon("user-identity").pixmap(QSize(48,48)))); m_pPeerNameL->setText("<b>"+contact->getFormattedName()+"</b>"); + m_pContact = contact; } else { m_pIconL->setPixmap(QPixmap(KIcon("user-identity").pixmap(QSize(48,48)))); @@ -298,15 +548,21 @@ uint HistoryTreeItem::getTimeStamp() } ///Return the duration -uint HistoryTreeItem::getDuration() +uint HistoryTreeItem::getLength() { - return m_Duration; + return m_Length; } ///Return the caller name QString HistoryTreeItem::getName() { - return m_Name; + if (m_pContact) { + return m_pContact->getFormattedName(); + } + else if (!m_Name.isEmpty()){ + return m_Name; + } + return "Unknow"; } ///Return the caller peer number @@ -319,4 +575,11 @@ QString HistoryTreeItem::getPhoneNumber() QTreeWidgetItem* HistoryTreeItem::getItem() { return m_pItem; -} \ No newline at end of file +} + +///Get the width of the durationWidget +uint HistoryTreeItem::getDurWidth() +{ + QFontMetrics fm(m_pLengthL->font()); + return fm.width(m_pLengthL->text()); +} diff --git a/kde/src/widgets/HistoryTreeItem.h b/kde/src/widgets/HistoryTreeItem.h index 808d394abc..5289947441 100644 --- a/kde/src/widgets/HistoryTreeItem.h +++ b/kde/src/widgets/HistoryTreeItem.h @@ -19,7 +19,7 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ + **************************************************************************/ /** * http://doc.trolltech.com/4.5/itemviews-editabletreemodel.html @@ -29,14 +29,26 @@ #define HISTORYTREE_ITEM_H #include <QtGui/QWidget> +#include <QtCore/QList> +#include <Phonon/MediaObject> //SFLPhone class Call; +class Contact; //Qt class QTreeWidgetItem; class QMenu; class QLabel; +class QToolButton; +class QGridLayout; + +namespace Phonon{ + class SeekSlider; + class MediaObject; + class AudioOutput; + class MediaSource; +} //KDE class KAction; @@ -53,45 +65,71 @@ class HistoryTreeItem : public QWidget //Getters Call* call () const; uint getTimeStamp (); - uint getDuration (); + uint getLength (); QString getName (); QString getPhoneNumber (); QTreeWidgetItem* getItem (); + uint getDurWidth (); //Setters - void setCall (Call* call); - void setItem (QTreeWidgetItem* item); + void setCall ( Call* call ); + void setItem ( QTreeWidgetItem* item ); + void setDurWidth ( uint width ); //Const static const char * callStateIcons[12]; private: //Attributes - Call* m_pItemCall ; - - QLabel* m_pIconL ; - QLabel* m_pPeerNameL ; - QLabel* m_pCallNumberL ; - QLabel* m_pTimeL ; - QLabel* m_pDurationL ; - - KAction* m_pCallAgain ; - KAction* m_pAddContact ; - KAction* m_pAddToContact ; - KAction* m_pCopy ; - KAction* m_pEmail ; - KAction* m_pBookmark ; - QMenu* m_pMenu ; - - uint m_TimeStamp ; - uint m_Duration ; - QString m_Name ; - QString m_PhoneNumber ; + Call* m_pItemCall ; + + QLabel* m_pIconL ; + QLabel* m_pPeerNameL ; + QLabel* m_pCallNumberL ; + QLabel* m_pTimeL ; + QLabel* m_pLengthL ; + + KAction* m_pCallAgain ; + KAction* m_pAddContact ; + KAction* m_pAddToContact ; + KAction* m_pCopy ; + KAction* m_pEmail ; + KAction* m_pBookmark ; + QMenu* m_pMenu ; + + QToolButton* m_pPlay ; + QToolButton* m_pRemove ; + + uint m_TimeStamp ; + uint m_Length ; + QString m_Name ; + QString m_PhoneNumber ; + QGridLayout* m_pMainLayout ; + Contact* m_pContact; QTreeWidgetItem* m_pItem; + Phonon::MediaObject* m_pMediaObject ; + Phonon::MediaObject* m_pMetaInformationResolver ; + Phonon::AudioOutput* m_pAudioOutput ; + QList<Phonon::MediaSource> m_lSources ; + + //Recorded call player + Phonon::SeekSlider* m_pAudioSlider ; + QLabel* m_pTimeLeftL ; + QLabel* m_pTimePlayedL ; + QToolButton* m_pPause ; + QToolButton* m_pStop ; + QToolButton* m_pNote ; + QWidget* m_pPlayer ; + +protected: + virtual void resizeEvent(QResizeEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + public slots: void updated(); + bool getContactInfo(QString phone); private slots: void showContext(const QPoint& pos); @@ -101,7 +139,14 @@ private slots: void addContact(); void addToContact(); void bookmark(); - bool getContactInfo(QString phone); + void removeRecording(); + void showRecordPlayer(); + void stopPlayer(); + void playPausePlayer(); + void editNote(); + void metaStateChanged(Phonon::State newState, Phonon::State oldState); + void tick(qint64 time); + void stateChanged(Phonon::State newState, Phonon::State /* oldState */); signals: void over(Call*); diff --git a/plugins/configure.ac b/plugins/configure.ac index 413d6be4d0..5c9157abce 100644 --- a/plugins/configure.ac +++ b/plugins/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([sflphone],[1.0.2],[sflphoneteam@savoirfairelinux.com],[sflphone-plugins]) +AC_INIT([sflphone],[1.1.0],[sflphoneteam@savoirfairelinux.com],[sflphone-plugins]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE diff --git a/tools/asterisk/keys/500.crt b/tools/asterisk/keys/500.crt new file mode 100644 index 0000000000..ebb4a7539d --- /dev/null +++ b/tools/asterisk/keys/500.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDYTCCAUkCAQEwDQYJKoZIhvcNAQEFBQAwQDEcMBoGA1UEAxMTQXN0ZXJpc2sg +UHJpdmF0ZSBDQTEgMB4GA1UEChMXVGVzdCBTYXZvaXItRmFpcmUgTGludXgwHhcN +MTIwNDI3MTMyNzM2WhcNMTMwNDI3MTMyNzM2WjAxMRIwEAYDVQQDEwkxMjcuMC4w +LjExGzAZBgNVBAoTElNhdm9pci1GYWlyZSBMaW51eDCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEA0Ht4X+Iitm1akm/m7YRKh2uh14xHyTNbpQDDLfIS4qzhzl1Z +n+WflXxoGN2WFUj1lBtI2tbM3rbg702eoj4WzkNQY4ipNjKcdoMmZ9fJT3IYa8GI +XBL8CMjS9aqNBc3yJ8jT8Y4IhDhGiZoUyL7DblsXbGVH6m5xP9uf9dEA7JsCAwEA +ATANBgkqhkiG9w0BAQUFAAOCAgEAl845XKxQTKmqNAE2vRbWNsKWuOUU0biDmNYr +mc/63vPt3yNA+rNaLD3dfkJq+qQfVMfo47eUfcikq5YE6/vazUAWyE6jrWoMIPrL +ylt0lgX6f0b19LyECBlrfJ61BpjGBxmqAbWNmMzxv85e0f98ANWg2JkQgUGrwpW1 +NY1zr8v7m3U+JWQgBb0yhXvlyLmAHGpHvyaU9jKxKXHa2d/69rs+3Y3C82/eCJAM +ZMp0BLKUxXG1EkSBkLs/2Ag3AGPWTUi5a4HT4LlS1zpigFISdUsICNfsfQ9W5Nry +2EYpsPooh6GTeKqFUtWloA6AgARWAMxCMouXsHg1RpITdxFreWB58sQtW9vfKkrd +Qzj3NJPwaa2HkP6XJ8kulaPGboS/CFYFT5brIHBnZQcuy/mdHMTAXgB0mwW1hajy +A7LUFBgRBZNYWLRTQ9Mc4K0QlS4Nc0tgel6KkLhxz8jdigp/qMahC54krz/vG8zJ +a6TOmQelgIxCdRhyaocrsilXrfkY61BOCO6FiBQ3V4LDHMXr3Pz+Gc3J+9MIdxSC +YqLTrZbvrW9uufOPjslK3MPeD1Eughscfj513wMF2tuvfChBJ/nwIJ3etM3Q5i3b +OnoYHipWxGDj0JDOTkqd9GbZmhS34qQWIUMOZ9oNC+rWHOnM5PR2j8eVQOGQAQCt +fXLPgfc= +-----END CERTIFICATE----- diff --git a/tools/asterisk/keys/500.csr b/tools/asterisk/keys/500.csr new file mode 100644 index 0000000000..86a11bf429 --- /dev/null +++ b/tools/asterisk/keys/500.csr @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBcDCB2gIBADAxMRIwEAYDVQQDEwkxMjcuMC4wLjExGzAZBgNVBAoTElNhdm9p +ci1GYWlyZSBMaW51eDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0Ht4X+Ii +tm1akm/m7YRKh2uh14xHyTNbpQDDLfIS4qzhzl1Zn+WflXxoGN2WFUj1lBtI2tbM +3rbg702eoj4WzkNQY4ipNjKcdoMmZ9fJT3IYa8GIXBL8CMjS9aqNBc3yJ8jT8Y4I +hDhGiZoUyL7DblsXbGVH6m5xP9uf9dEA7JsCAwEAAaAAMA0GCSqGSIb3DQEBBQUA +A4GBAFIQ8XAzHEZ16KCtV0EkePMArJt/xgSZ1Gydw/F/Wxoxevjq5Ft6A9AZYBWJ +aWLO0lJ2eqJikhdXXL75suBhDMcs4CKPJyl/LvDbNds5ua9UixLwQV7sOB4IzpEJ +dfLO1U1/WPc+7LpCwTurP1sXHSrHWKZj0EEygZq+DVQNoGaw +-----END CERTIFICATE REQUEST----- diff --git a/tools/asterisk/keys/500.key b/tools/asterisk/keys/500.key new file mode 100644 index 0000000000..39dcde1a56 --- /dev/null +++ b/tools/asterisk/keys/500.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDQe3hf4iK2bVqSb+bthEqHa6HXjEfJM1ulAMMt8hLirOHOXVmf +5Z+VfGgY3ZYVSPWUG0ja1szetuDvTZ6iPhbOQ1BjiKk2Mpx2gyZn18lPchhrwYhc +EvwIyNL1qo0FzfInyNPxjgiEOEaJmhTIvsNuWxdsZUfqbnE/25/10QDsmwIDAQAB +AoGBALZAKYPQgL3vLK0067AY5Loraiiu9hY6MlQ1LWqd4sqLjT5EttOj/XTFc47B +LrFevWgCzhaYjjHntw0bUqDMHEwRWTRP6RGLn4geDnA/LzjSka1fUbAi2hvbPWQF +Uz98Kidpi/Z1LSx0hW3hG+aZIbouRQzx7eEXUBpdwMQuePrZAkEA9FkxnkkgQY8y +6hGLPvOLvzb/s9FnpYpTcXyBPBf9SwfJTuBg4kABIRtXOzdlTqmOcVrG5+hMCC/V +IALDJQrXLQJBANpsc8L3eBig02FJT4R0+oE60UWq+1wufKBgmNGtWFZ5aM3hR8Sp +GvAEWd1O/F1j7sr5rNO0PviZiReIgmxFr+cCQQCHaH5Et0V2z0Jp0DsYMaL53iKp +pZwIcrV3KIX9pVWqpK/8U/+codd+X0Zh/HrZssDLNIERtvubddZnnOBDwNQpAkEA +tTuLidggE/9NpMlZa0RMnnGZNr86NTB1Q/Uil8fHJmkyprEoBWty6HgTwGdLSooi +ltQ3rKlAHrH2aEpiPUhNPQJARWuoMI7fayI1wLOjWXu23rXXP6ObAGpJDuPLM7aB +oGmRYVVe9eMe1SfNuNib1fw5I4GSLLhEe0qzoCZ6jv3L6g== +-----END RSA PRIVATE KEY----- diff --git a/tools/asterisk/keys/500.pem b/tools/asterisk/keys/500.pem new file mode 100644 index 0000000000..179f66ad74 --- /dev/null +++ b/tools/asterisk/keys/500.pem @@ -0,0 +1,36 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDQe3hf4iK2bVqSb+bthEqHa6HXjEfJM1ulAMMt8hLirOHOXVmf +5Z+VfGgY3ZYVSPWUG0ja1szetuDvTZ6iPhbOQ1BjiKk2Mpx2gyZn18lPchhrwYhc +EvwIyNL1qo0FzfInyNPxjgiEOEaJmhTIvsNuWxdsZUfqbnE/25/10QDsmwIDAQAB +AoGBALZAKYPQgL3vLK0067AY5Loraiiu9hY6MlQ1LWqd4sqLjT5EttOj/XTFc47B +LrFevWgCzhaYjjHntw0bUqDMHEwRWTRP6RGLn4geDnA/LzjSka1fUbAi2hvbPWQF +Uz98Kidpi/Z1LSx0hW3hG+aZIbouRQzx7eEXUBpdwMQuePrZAkEA9FkxnkkgQY8y +6hGLPvOLvzb/s9FnpYpTcXyBPBf9SwfJTuBg4kABIRtXOzdlTqmOcVrG5+hMCC/V +IALDJQrXLQJBANpsc8L3eBig02FJT4R0+oE60UWq+1wufKBgmNGtWFZ5aM3hR8Sp +GvAEWd1O/F1j7sr5rNO0PviZiReIgmxFr+cCQQCHaH5Et0V2z0Jp0DsYMaL53iKp +pZwIcrV3KIX9pVWqpK/8U/+codd+X0Zh/HrZssDLNIERtvubddZnnOBDwNQpAkEA +tTuLidggE/9NpMlZa0RMnnGZNr86NTB1Q/Uil8fHJmkyprEoBWty6HgTwGdLSooi +ltQ3rKlAHrH2aEpiPUhNPQJARWuoMI7fayI1wLOjWXu23rXXP6ObAGpJDuPLM7aB +oGmRYVVe9eMe1SfNuNib1fw5I4GSLLhEe0qzoCZ6jv3L6g== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAUkCAQEwDQYJKoZIhvcNAQEFBQAwQDEcMBoGA1UEAxMTQXN0ZXJpc2sg +UHJpdmF0ZSBDQTEgMB4GA1UEChMXVGVzdCBTYXZvaXItRmFpcmUgTGludXgwHhcN +MTIwNDI3MTMyNzM2WhcNMTMwNDI3MTMyNzM2WjAxMRIwEAYDVQQDEwkxMjcuMC4w +LjExGzAZBgNVBAoTElNhdm9pci1GYWlyZSBMaW51eDCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEA0Ht4X+Iitm1akm/m7YRKh2uh14xHyTNbpQDDLfIS4qzhzl1Z +n+WflXxoGN2WFUj1lBtI2tbM3rbg702eoj4WzkNQY4ipNjKcdoMmZ9fJT3IYa8GI +XBL8CMjS9aqNBc3yJ8jT8Y4IhDhGiZoUyL7DblsXbGVH6m5xP9uf9dEA7JsCAwEA +ATANBgkqhkiG9w0BAQUFAAOCAgEAl845XKxQTKmqNAE2vRbWNsKWuOUU0biDmNYr +mc/63vPt3yNA+rNaLD3dfkJq+qQfVMfo47eUfcikq5YE6/vazUAWyE6jrWoMIPrL +ylt0lgX6f0b19LyECBlrfJ61BpjGBxmqAbWNmMzxv85e0f98ANWg2JkQgUGrwpW1 +NY1zr8v7m3U+JWQgBb0yhXvlyLmAHGpHvyaU9jKxKXHa2d/69rs+3Y3C82/eCJAM +ZMp0BLKUxXG1EkSBkLs/2Ag3AGPWTUi5a4HT4LlS1zpigFISdUsICNfsfQ9W5Nry +2EYpsPooh6GTeKqFUtWloA6AgARWAMxCMouXsHg1RpITdxFreWB58sQtW9vfKkrd +Qzj3NJPwaa2HkP6XJ8kulaPGboS/CFYFT5brIHBnZQcuy/mdHMTAXgB0mwW1hajy +A7LUFBgRBZNYWLRTQ9Mc4K0QlS4Nc0tgel6KkLhxz8jdigp/qMahC54krz/vG8zJ +a6TOmQelgIxCdRhyaocrsilXrfkY61BOCO6FiBQ3V4LDHMXr3Pz+Gc3J+9MIdxSC +YqLTrZbvrW9uufOPjslK3MPeD1Eughscfj513wMF2tuvfChBJ/nwIJ3etM3Q5i3b +OnoYHipWxGDj0JDOTkqd9GbZmhS34qQWIUMOZ9oNC+rWHOnM5PR2j8eVQOGQAQCt +fXLPgfc= +-----END CERTIFICATE----- diff --git a/tools/asterisk/keys/600.crt b/tools/asterisk/keys/600.crt new file mode 100644 index 0000000000..32e6b9c937 --- /dev/null +++ b/tools/asterisk/keys/600.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZjCCAU4CAQEwDQYJKoZIhvcNAQEFBQAwQDEcMBoGA1UEAxMTQXN0ZXJpc2sg +UHJpdmF0ZSBDQTEgMB4GA1UEChMXVGVzdCBTYXZvaXItRmFpcmUgTGludXgwHhcN +MTIwNDI3MTMzMDI2WhcNMTMwNDI3MTMzMDI2WjA2MRcwFQYDVQQDEw4xOTIuMTY4 +LjUwLjE3MjEbMBkGA1UEChMSU2F2b2lyLUZhaXJlIExpbnV4MIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDQsm0AjqfDmwoCGcGNz4jgU54/yz4pWip1A2OlHUYX +XOxKoFJQPjMSRUVuVw0ZpdL3phw4GyL7CNtAbALRg6qKLj6Sf5ZCn8sFnmsVrW+v +Md0sYnf+b/u8KQyJdpuga9vKWn31e6P3RsdGVZBhSkx28V7/5iFF6TpZDhM+Ql3N +FQIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQBnCugdLIWsZrHtv3jEC1D3RVume58O +z98q3OVap3ZxfSo5V9I1iU5W6t4wz/YP7QmGFbThFkE4Sj4CQGmKJMh9oEwBqzuY +wuPjfgymrBk7yKy0XCkVDZ+q4yidPd1tS8WMQlklnb0TR4bNB07C2QAQoKb50fLm +K5GycOfNb5sjAl790ugM5z7QW912XCHkF1/ymTcCso+rK8vAaO9tkpk6l22igIEE +Pq1W/OLkm5u+u2HSISxdozXj4keK/0kuvzVnTuvqtwftESJaA4mfehE6Z5dW/AlU +dLyZnZIUEQmLN2zET2E5rABNLAeRCKCyPITmj8/v9yr10MDI3I/BZXM3BI4QgqoS +JOhNFCeRFtyy/bzBAh7o6tq9YEohvVztjFwCZWthDiPPKxTO6HnTlUFDbG3Gv9Wb +BP/f/v52Tm7LvY4jHo5LFILaF/HXHRrryCkdw3wjjtpAkl5zGh+E0C4yeqmdjsP9 +bH9a9mAa1N3LgtL52cxadfCacoH3oI+FwymOdnf6+tyv+D6BZWtX5t4WINVkdGuD +RzUZi08VH9Vd3d0qjzO7Vve028w/cM3QE+si4SVHHfV08a4zIGOTP5edJYJ58QWC +jWajYyTw1mhCzSEFofxw29aDO5cXw1lKmjCjoVi+Ae3tKUyhPTK1+9e0MAsR+cLG +OKKct2tGWeuGHA== +-----END CERTIFICATE----- diff --git a/tools/asterisk/keys/600.csr b/tools/asterisk/keys/600.csr new file mode 100644 index 0000000000..47395498bc --- /dev/null +++ b/tools/asterisk/keys/600.csr @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBdTCB3wIBADA2MRcwFQYDVQQDEw4xOTIuMTY4LjUwLjE3MjEbMBkGA1UEChMS +U2F2b2lyLUZhaXJlIExpbnV4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQ +sm0AjqfDmwoCGcGNz4jgU54/yz4pWip1A2OlHUYXXOxKoFJQPjMSRUVuVw0ZpdL3 +phw4GyL7CNtAbALRg6qKLj6Sf5ZCn8sFnmsVrW+vMd0sYnf+b/u8KQyJdpuga9vK +Wn31e6P3RsdGVZBhSkx28V7/5iFF6TpZDhM+Ql3NFQIDAQABoAAwDQYJKoZIhvcN +AQEFBQADgYEAForeBGuC/JjnLQ7/aafWGZZJWkGqqTtkO8ksuMfm09Hy0viyMzJr +DXcCE8lGNukB8NXWkl7khLnuxNHCsbFsbpzI9dx1b6GiKI+95U+Nu9HvHh4o7Vmv +7O4kt75M/HtM15nXbKEGiYmRLcJKWkenQUEasVMfp/giZx7hjaQO10I= +-----END CERTIFICATE REQUEST----- diff --git a/tools/asterisk/keys/600.key b/tools/asterisk/keys/600.key new file mode 100644 index 0000000000..50c2934016 --- /dev/null +++ b/tools/asterisk/keys/600.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDQsm0AjqfDmwoCGcGNz4jgU54/yz4pWip1A2OlHUYXXOxKoFJQ +PjMSRUVuVw0ZpdL3phw4GyL7CNtAbALRg6qKLj6Sf5ZCn8sFnmsVrW+vMd0sYnf+ +b/u8KQyJdpuga9vKWn31e6P3RsdGVZBhSkx28V7/5iFF6TpZDhM+Ql3NFQIDAQAB +AoGAIJOZfDrIaTosR8OpeO9qWEn1K9QX8fCHLBjJVx7IsCDrKYL5Fll/M1zox56D +BvvhgJLHWOKzhSgOwXGaxwWcewkrhy4UbQ7+8wm/LdgT8nKU7OyU+oKAz/6+bFX3 +M9aA8cKOwDQCrZvKCHDPJzab71HAe8uWA54T798S3HyFOgkCQQDsFiST3XH6ortD +YLQIwIl+LUCeb9UpksjitYvtjA+CANPpjdpPASNpTNVoS7adecfU01cC6spw/1EF +7izTkm23AkEA4kzbL/LLDdwD3pBFvA/tu+kwcfRDtryRymiHz4qKg7xtHphAV3Sx +K2nRs0WRJ/br1CE3kz1PEvFcVsDUyf2bkwJBALqFnAx+zohYfV70TgkEJRzdH8qN +THp2D+Sdzpm1KKNriAFkI3B708BkBc9K0lKEXo8VEg+p9Jtl/FuVGzFk5O0CQA6k +Cko/2wM6iMWNb/WK0kal/4xf0UGxUX1W5fJ3dB6xwh2InCEMW6oDXp3KkmmTgA5p +V78e6E7BbsfuEdY/oiECQBlR/WfYeoZpHueRwx8M3jICOR5WBjmu7c+rLjaEvGCB +kXhsM8UrMHncz1fNHDLgLcPneiw+tReeuKVHBSDYwBg= +-----END RSA PRIVATE KEY----- diff --git a/tools/asterisk/keys/600.pem b/tools/asterisk/keys/600.pem new file mode 100644 index 0000000000..b2d4d0cc32 --- /dev/null +++ b/tools/asterisk/keys/600.pem @@ -0,0 +1,36 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDQsm0AjqfDmwoCGcGNz4jgU54/yz4pWip1A2OlHUYXXOxKoFJQ +PjMSRUVuVw0ZpdL3phw4GyL7CNtAbALRg6qKLj6Sf5ZCn8sFnmsVrW+vMd0sYnf+ +b/u8KQyJdpuga9vKWn31e6P3RsdGVZBhSkx28V7/5iFF6TpZDhM+Ql3NFQIDAQAB +AoGAIJOZfDrIaTosR8OpeO9qWEn1K9QX8fCHLBjJVx7IsCDrKYL5Fll/M1zox56D +BvvhgJLHWOKzhSgOwXGaxwWcewkrhy4UbQ7+8wm/LdgT8nKU7OyU+oKAz/6+bFX3 +M9aA8cKOwDQCrZvKCHDPJzab71HAe8uWA54T798S3HyFOgkCQQDsFiST3XH6ortD +YLQIwIl+LUCeb9UpksjitYvtjA+CANPpjdpPASNpTNVoS7adecfU01cC6spw/1EF +7izTkm23AkEA4kzbL/LLDdwD3pBFvA/tu+kwcfRDtryRymiHz4qKg7xtHphAV3Sx +K2nRs0WRJ/br1CE3kz1PEvFcVsDUyf2bkwJBALqFnAx+zohYfV70TgkEJRzdH8qN +THp2D+Sdzpm1KKNriAFkI3B708BkBc9K0lKEXo8VEg+p9Jtl/FuVGzFk5O0CQA6k +Cko/2wM6iMWNb/WK0kal/4xf0UGxUX1W5fJ3dB6xwh2InCEMW6oDXp3KkmmTgA5p +V78e6E7BbsfuEdY/oiECQBlR/WfYeoZpHueRwx8M3jICOR5WBjmu7c+rLjaEvGCB +kXhsM8UrMHncz1fNHDLgLcPneiw+tReeuKVHBSDYwBg= +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAU4CAQEwDQYJKoZIhvcNAQEFBQAwQDEcMBoGA1UEAxMTQXN0ZXJpc2sg +UHJpdmF0ZSBDQTEgMB4GA1UEChMXVGVzdCBTYXZvaXItRmFpcmUgTGludXgwHhcN +MTIwNDI3MTMzMDI2WhcNMTMwNDI3MTMzMDI2WjA2MRcwFQYDVQQDEw4xOTIuMTY4 +LjUwLjE3MjEbMBkGA1UEChMSU2F2b2lyLUZhaXJlIExpbnV4MIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDQsm0AjqfDmwoCGcGNz4jgU54/yz4pWip1A2OlHUYX +XOxKoFJQPjMSRUVuVw0ZpdL3phw4GyL7CNtAbALRg6qKLj6Sf5ZCn8sFnmsVrW+v +Md0sYnf+b/u8KQyJdpuga9vKWn31e6P3RsdGVZBhSkx28V7/5iFF6TpZDhM+Ql3N +FQIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQBnCugdLIWsZrHtv3jEC1D3RVume58O +z98q3OVap3ZxfSo5V9I1iU5W6t4wz/YP7QmGFbThFkE4Sj4CQGmKJMh9oEwBqzuY +wuPjfgymrBk7yKy0XCkVDZ+q4yidPd1tS8WMQlklnb0TR4bNB07C2QAQoKb50fLm +K5GycOfNb5sjAl790ugM5z7QW912XCHkF1/ymTcCso+rK8vAaO9tkpk6l22igIEE +Pq1W/OLkm5u+u2HSISxdozXj4keK/0kuvzVnTuvqtwftESJaA4mfehE6Z5dW/AlU +dLyZnZIUEQmLN2zET2E5rABNLAeRCKCyPITmj8/v9yr10MDI3I/BZXM3BI4QgqoS +JOhNFCeRFtyy/bzBAh7o6tq9YEohvVztjFwCZWthDiPPKxTO6HnTlUFDbG3Gv9Wb +BP/f/v52Tm7LvY4jHo5LFILaF/HXHRrryCkdw3wjjtpAkl5zGh+E0C4yeqmdjsP9 +bH9a9mAa1N3LgtL52cxadfCacoH3oI+FwymOdnf6+tyv+D6BZWtX5t4WINVkdGuD +RzUZi08VH9Vd3d0qjzO7Vve028w/cM3QE+si4SVHHfV08a4zIGOTP5edJYJ58QWC +jWajYyTw1mhCzSEFofxw29aDO5cXw1lKmjCjoVi+Ae3tKUyhPTK1+9e0MAsR+cLG +OKKct2tGWeuGHA== +-----END CERTIFICATE----- diff --git a/tools/build-system/launch-build-machine-2.sh b/tools/build-system/launch-build-machine-2.sh index 8202380ff7..048a45c6ab 100755 --- a/tools/build-system/launch-build-machine-2.sh +++ b/tools/build-system/launch-build-machine-2.sh @@ -22,7 +22,7 @@ DO_LOGGING=1 DO_UPLOAD=1 SNAPSHOT_TAG=`date +%Y%m%d` TAG_NAME_PREFIX= -VERSION_NUMBER="1.0.2" +VERSION_NUMBER="1.1.0" LAUNCHPAD_PACKAGES=( "sflphone-client-gnome" "sflphone-common" "sflphone-plugins") @@ -40,7 +40,7 @@ do echo "Options :" echo " --skip-push" echo " --skip-upload" - echo " --kde-client" + echo " --kde-client" echo " --no-logging" echo " --release" echo " --version-index=[1,2,...]" @@ -118,8 +118,8 @@ if [ ${IS_KDE_CLIENT} ]; then TAG_NAME_PREFIX="kde." LAUNCHPAD_PACKAGES=( "sflphone-client-kde" ) fi -CURRENT_RELEASE_TAG_NAME=$(git for-each-ref refs/tags --sort=-authordate --format='%(refname)' --count=1 | cut -d'/' -f3) -PREVIOUS_RELEASE_TAG_NAME=$(git for-each-ref refs/tags --sort=-authordate --format='%(refname)' --count=2 | cut -d'/' -f3 | tail -n1) +CURRENT_RELEASE_TAG_NAME=`git describe --tags --abbrev=0` +PREVIOUS_RELEASE_TAG_NAME=`git describe --tags --abbrev=0 ${CURRENT_RELEASE_TAG_NAME}^` CURRENT_RELEASE_COMMIT_HASH=`git show --pretty=format:"%H" -s ${CURRENT_RELEASE_TAG_NAME} | tail -n 1` PREVIOUS_RELEASE_COMMIT_HASH=`git show --pretty=format:"%H" -s ${PREVIOUS_RELEASE_TAG_NAME} | tail -n 1` CURRENT_COMMIT=`git show --pretty=format:"%H" -s | tail -n 1` diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/changelog b/tools/build-system/launchpad/sflphone-client-kde/debian/changelog index 4f977e142e..68d02ba2a2 100644 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/changelog +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/changelog @@ -1,3105 +1,11 @@ -sflphone-client-kde (1.0.0-rc20110930~ppa1~SYSTEM) SYSTEM; urgency=low +sflphone-client-kde (1.1) unstable; urgency=low - ** SNAPSHOT 1.0.0-rc20110930~ppa1~SYSTEM ** + * KDE client now work with sflphone-daemon 1.1 + * Improved contact integration + * Improved history + * Attended transfer support + * Improved libraries (under the hood) + * Configuration cleanup + * Tons of bug fixes - * update kde .gitignore - * Fix bug in volume widget - * More polishing for release - * Bump version to 1.0.0 - * [#7023] Add the ability to load an abstract contact backend in the - library to resolve more data, polish code - * [#7021] More cleanup for release - * Cleanup - * [#7021] Refactor KDE client dbus handling, add a missing call in - daemon and port the DataEngine to the new API - * Remove some annoying debug - * merge language scripts - * remove obsolete 'VERSION' files - * update install instructions - * Add missing translations to gnome - * language update - * Revert "Don't reference count DBus clients, exit core immediately - when one of them request it" - * Don't reference count DBus clients, exit core immediately when one - of them request it - * [7021] Add contact abstraction support - * [#7121] Polishing library (over). Indentation, spacing and naming - are now consistent - * codecs: link to libccrtp, don't use logger - * Fix a daemon bug - * [#7038] Fix adding contact - * * #7037 : stop audio stream after all calls have been hanged up - * [#7025] Add full support for bookmark - * SFLPhone KDE do not destroy history anymore - * Fix config skeleton - * Close the daemon once and for all, no more automatic respawning - * Fix "unregistered account" bug (I hope so) - * Close SFLPhone at the right place, it still respawn, I don't know - why - * Remove dead code - * Fix regressions introduced in the last commit - * Dead code elimination 1/3 - * Fix bug, add "add contact" option, fix warning - * * #7019: Fix IAX codec negociation - * Remove or comment unnecessary/unhelpful debug output - * Fix "same as local" account setting, fix IP2IP LED color - * Add support for some more advanced config options and add missing - config dialog icons - * Fix crash with noise suppressor - * Alternative can now be selected from the call view context menu - * Add drag and drop support, initial context menu and fix 3 bugs in - the account dialog - * Add basic history drag and drop support - * Complete contact support is back - * * #6991 : fix IAX problems - * Fix IAX accounts being disabled by default - * Revert "deb: forge -g flags for pjsip" - * * #5884: Disable debug code in pjsip - * echo suppressor : more assertions - * Don't let the daemon think crypto is enabled when it's not - * Simplify ToneList - * Some progress on contact support - * Remove unused getRegistrationCount() - * remove annoying debug - * revert SIP bit of e27e5c39bad27bae28f574eb2cba7717e8956229 - * Simplify CallManager::placeCallFirstAccount - * Fix crash on hold - * * #6905 : SIP refactor - * gnome client: be sure key exchange is set correctly - * Move code into createSipTransport - * Fix account registration on start - * ManagerImpl::registerAccounts(): simplify - * * #5884: don't mess with pjsip threads in echo suppressor - * * #6905 : simplify udp/stun/tls pjsip transport creation - * Restore and improve support for Call history - * fix launchpad build - * SIPVoIPLink: simplify / refactor - * Fix libwidget linking - * SIP: simplify - * IM : simplify - * gnome: remove some debug - * AudioRtpFactory::stop() cannot fail - * * #6905: simplify SIP code - * pjlib: fix build without SSLv2, fix warnings - * Port history to the new syntax - * Test a dock widget based implementation for contact and history - * Disable SSLv2 support from pjsip and sflphone - * deb: forge -g flags for pjsip - * Fix deb packaging to get debug symbols - * remove debug - * pjproject: update to last stable release (1.10) - * Require gtk >= 2.20 and glib >= 2.24 - * tlsadvanceddialog: simplify - * * #6902 : fix errors spotted by -DGSEAL_ENABLE - * Update daemon dbus XML and port KDE config backend from dbus to - local - * Remove unused but set variables - * * #6929 : fix IM widget, cleanup - * Unconditionally enable debug symbols - * Should fix many KDE issues - * * #6886 : hitting backspace on empty number have no side effects - * * #6905 : fix AudioCodecFactory access in optimized builds (-O > 0) - * Remove unsupported and broken jaunty/karmic packages - * * #6902 : avoid using some gtk deprecated functions - * Update dbus introspection files - * * #6904: removed unused contactmanager - * * #6903 : use correct dbus-cxx package name - * * #6902: don't use individual gtk headers - * Fix a segfault when config is not present - * Merge latest (0.9.13) KDE code. This version is not yet ready for - git master, but better than the previous one - * addressbook : simplify - * * #5659 : sflphone-plugins doesn't depend on libedataserverui - * * #5659 : addressbook doesn't use libedataserverui - * gnome client doesn't depend on evolution - * * #5695: addressbook: simplify - * * #5695: addressbook : remove AddrBookHandle from plugin - * * #5695 : addressbook : remove unused stuff in the client - * * #5695 : addressbook : remove unused stuff, use static mutex - * gnome client doesn't use evolution - * gnome: use proper API to set GTK_CAN_FOCUS - * * #6897: removed unused focus state vars/callbacks - * gnome: fix calls to sflphone_fill_codec_list_per_account - * * #6623: gnome: don't leak in mainwindow - * gnome: mainwindow whitespace cleanup - * gnome: actions.c parameter doesn't have to be a double pointer - * * #6895: fix memleaks, cleanup in accountconfigdialog - * * #6893: fixes segfault in client on clean history - * * #6894: fix leaks, cleanup in sflnotify - * daemon: fixed prints in main - * * #6892: simplify, fix leaks in dialpad - * * #6887: audiopreference creates audio layer - * * #6660: use const char * const, not std::string for globally - visible constants - * * #6852: Preferences now solely responsible for audiolayer creation. - * * #6860: refactor uimanager, also fixes #6865 - * * #6853: hangup as soon as all digits have been deleted - * * #6852: alsa: retry if device is busy - * * #6852: audiolayer creation depends only on preference.audioApi - * * #6850: gnome: fix build for gtk < 2.22.0 - * cleanup in iax - * alsa: typo - * pulse: if we can't peek in audio input, we can't drop samples - * * #6849: show error window if codecs are missing, instead of dying - * EchoCancel: unused, remove - * * #6629 : use number of samples as arguments for audio filters - * * #6629 : remove unused Algorithm interface - * * #6629 : use helper to call alsa functions and display error msgs - * Remove unused type - * * #6841: fix some error handling - * * #6629: simplify AlsaLayer::alsa_set_params() - * Get gdk key definition from header - * * #6828: Replace raw key codes by gdk defines - * remove some debug, enhance some other - * mainbuffer: simplify - * * #6561 : fix phantom call after transfer - * Conference Participant set : simplify - * SIPCall: remove unused functions, make invite session public - * * #6229 : remove malloc/free from pulse audio loop - * * #6629 : simplify pulse callbacks - * * #6629 - * Simplify widgets - * * #6629 : keep the correct audio module when frequency changes - * * #6751: fixed erroneous debug msgs - * callable_obj.h: removed unneeded pthread header - * alsalayer: cleanup - * * #6629: Always restart audio driver when changing parameters (ALSA - only) - * gnome GUI: don't block in DBus signal errorAlert() - * * #6629 : simplify AudioLayer creation - * * #6629 : remove unused and unconfigurable frameSize from audiolayer - * * #6629 : remove unused error message from audio layer - * Fix logic error when switching audio API - * Remove unused AudioProcessing class - * AudioRtpRecordHandler::initNoiseSuppress() : use noiseSuppress - directly - * * #6629 : use DC blocker directly in audio layers - * * #6629 : clean AudioLayer - * * #6629 : don't store mainbuffer inside audiolayer - * * #6629 : correct AudioLayer::notifyincomingCall() - * * #6554: cleanup, refactoring in sipvoiplink - * * #6554: cleanup in iaxvoiplink - * * #6554: throw exception in getSIPCall if pointer is NULL - * * #6554: make some methods of sipvoiplink static - * * #6655: cleanup in managerimpl - * * #6554: refactoring, fix memleaks in sipvoiplink - * * #6478: remove throw specs, cleanup in voiplink - * * #6629 : remove unused AudioDevice - * * #6655: removed more dependencies from managerimpl - * * #6744: simplified numbercleaner - * conference : remove one prototype - * * #6743: fix ip2ip - * Don't give glib warnings if icons are not found - * gnome: fixed includes - * Codec.h: removed unused function - * * #6742 : clean dbus & icons - * * #6699: refactor/cleanup accounts - * icons: cleanup - * timer : use second precision, not millisecond - * calltree_update_clock : use correct type, returns something - * * #6737: fixed typo in dbus call - * * #6737: removed tests for removed API - * * #6737: dbus: fixed bug from merge - * * #6737: cleanup in accountlist - * * #6737: cleanup in dbus - * * #6740 : fix history double free - * * #6740 : remove time updating thread from calls - * * #6737 : use c99 for client - * * #6738 : make history loading faster - * sipvoiplink : don't crash on transfers - * fixed typo - * Remove unused file - * Don't build networkmanager.cpp at all if NM is disabled - * _debug* -> _debug - * * #6554 : simplify sipvoiplink - * hudson: added -x to git clean command - * added git clean to hudson script - * audiocodecfactory: cleanup - * * #6718: refactored setTlsSettings into SIPAccount - * * #6718: removed more unused methods - * * #6718: refactored confmanager code into sipaccount - * remove unused functions - * * #6718: confmanager: removed more unused methods - * AudioCodecFactory : cleanup - * #6697 : Turn callableElement struct into union - * * #6718: confmanager: removed more unused methods - * * #6718: confmanager: removed more unused methods - * * #6718: removed unused dbus methods, refactoring - * * #6699: accounts: cleanup/refactoring - * * #6699: refactoring, cleanup in accounts - * * #6699: more account cleanup - * remove unused autoconf variable - * * #6714: fixed hudson script - * make distclean in hudson - * added || exit 1 to run_tests.sh call - * * #6714: fixed make distcheck for sflphone-plugins - * * #6714: fixed make distcheck for gnome client - * * #6714: fixed make distcheck for daemon - * git: #6698 split the main .gitignore file - * gnome: gpointer is already a pointer - * gnome: calltab_init: use calloc instead of malloc - * * #6699: more account cleanup - * * #6699: cleanup account - * * #6554 : more *voiplink cleanup - * * #6558 : more sipvoiplink simplification - * * #6558: saner loadSIPLocalIP prototype - * gnome: #6623 clean calllists - * * #6692: more audiolayer cleanup - * * #6692: cleanup/refactoring in audiolayers - * * #6692: more forward declarations, AudioThread->AlsaThread - * * #6692: audiolayer cleanup - * * #6692: alsalayer cleanup - * * #6558 : remove account creator - * * #6558 : clean sipvoiplink - * * #6554 : cleanup sipvoiplink - * audiortp: cleanup - * * #6657 : fix launchpad builds for good - * * #6675 : send RTP dtmf events only once - * * #6655: more cleanup - * AudioRtpSession::updateSessionMedia() : simplify - * * #6655: more cleanup in managerimpl - * * #6655: removed more code, cleanup - * * #6655: more cleanup, fixed infinite loop - * * #6655: removed more unused files - * * #6655: removed unused mutex - * * #6655 removed more unused code - * * #6655: removed unused methods - * * #6655: cleanup in main - * * #6663: fixed segfault when off hold from transfer - * * #6658: user's active codec selection is respected - * * #6660: static global string should be static const char* const - class member - * * #6659: use g_strcmp0, not strcmp for vals that may be null - * callable_obj: fix double free - * calltree_display_call_info() : simplify - * * #6657: Fix launchpad builds - * Logger::log() : simplify - * AudioRtpSession : privatize members - * * #6655: more constness, cleaned up/simplified methods - * * #6654: call DBus::_init_threading so that dbus-c++ to make it - threadaware - * set default credentials on account creation - * AudioCodecFactory::scanCodecDirectory() : simplify and correct - * * #6623: fixed typos - * * #6623: fixed more leaks - * * #6623: fixed more leaks - * * #6623: fixed more leaks, don't print codec name if null - * * #6623: more leaks fixed in client - * * #6623: fix more leaks, fixed some warnings - * * #6623: fixed leak in history - * updated gitignore - * initialize dbus dispatcher correctly - * Fix tests, hudson doesn't have a dbus daemon running - * remove unused code - * removeCall() : simplify , fix leak - * stopRtpThread() : simplify - * *CurrentCall : simplify - * Fix memleak - * fix serialization of audio api (pulse / alsa) - * account map : simplify - * remove call from callmap before terminating it, avoid use after free - * * #6630 : don't make DBusManager a singleton - * call: return confID by value - * add back history code deleted by error - * history : reverse logic - * simplify history serialization and remove some debug - * remove annoying debug - * * #6464 : replace cerr with _error - * * #6464: replace cout with logger macros - * replace printf() with logger macros - * update .gitignore - * remove unused function - * update eclipse projects - * uimanager_new() : simplify - * rename directories - * celt: simplify a bit - * Fix CELT configure.ac test - * * #6612 : template speex codecs - * * #6623: refactored conference obj - * * #6623: refactored callable object, removed leaks - * * #6623: more cleanup, fix leaks, make global vars static and rename - them - * * #6623: calltree: fixed memleaks, simplified code. - * audiolayer: init pointer members - * manager: catch exception on invalid hangup - * * #6623: don't leak on calls to create_new_call - * * #6611 : clarify codecs prototypes - * ringtones : .au and .ul files are both ulaw - * * #6611 : make sure samplerate converters are called correctly - * ManagerImpl::switchAudioManager() : simplify - * * #6623: fixed more leaks - * * #6623: fixed more leaks - * * #6623: fixed more leaks - * * #6623: fixed leak, line-endings in imwidget - * * #6627: zero-initialize pointers if they're going to be deleted - * * #6628: don't leak calls on exceptions - * Revert "audiortp: call join after calling stop on RtpThread" - * sflphone-client: more constness - * audiortp: call join after calling stop on RtpThread - * * #6625: return 0 on successful completion - * * #6624: fix segfault on servercallfailure - * * #6621: Fixed double free, unlock mutex in ManagerImpl::terminate - * * #6220: remove audio stream when peer hangs up - * * #6596: AudioSymmetricSession shouldn't self-delete - * resampler: grow internal buffers dynamically - * merge up and down sampling => resampling - * Leave test directory unchanged when running make check - * audio algorithms : remove unused prototype - * ringtone: detect codec from file extension - * *AudioFile : simplify - * * #6596: create local SDP on the stack, not the heap - * * #6596: don't call Ost::Thread::terminate from dtor - * audiofile: cleanup (samplerate -> unsigned) - * remove unused func - * samplerateconverter: cleanup - * RingBuffer::Put() : remove unused return value - * MainBuffer::putData() : remove unused return argument - * audiolayer::putMain() : remove unused func - * AudioLayer::putUrgent() : remove unused return value - * * #6618: delete any remaining ringbuffers in destructor - * RingBuffer::availForPut() : remove - * * #6617: return from main rather than calling exit - * MainBuffer::availForPut(): remove - * RingBuffer: simplify - * alsa : remove write only variable - * fix memcpy declaration - * bcopy(src, dst) -> memcpy(dst, src) - * RingBuffer::Get() : remove constant volume argument - * return a copy of the call ID, not just a reference. - * MainBuffer::getDataById() : remove volume argument (always 100) - * MainBuffer::getData() : remove constant volume argument - * RingBuffer::Put() : remove constant volume argument - * MainBuffer::putData() : remove constant (=100) volume argument - * audiolayer: remove constant _defaultvolume - * AudioRtpRecordHandler / AudioRtpSession : simplify - * mainbuffer: fix test - * iaxvoiplink : simplify - * sip registration callback: fix a dbus crash - * MainBuffer: simplify - * AudioRtpFactory: return cached type of rtp session. The rtp session - can have disappeared if the call was put on hold - * AudioRtpFactory: remove unused setters - * Fix launchpad builds - * * #6611 : remove unused bandwidth codec information - * * #6611: AudioCodec: remove useless/unused setters - * make sure buffer string is initialized correctly - * * #6596: declare certain destructors virtual - * audiolayer : cleanup - * Simplify doc build rules - * * #6270: don't build dbus-api doc with make, should require make all - * configure.ac: cleanup - * Remove copy of dbus-c++ from libs/ - * * #6596: stop clock thread when peer hangs up - * removed unused Fmtp.h - * * #6595: more logical initialization order - * * #6600 : fix account creation - * * #6601 : fix configure.ac tests - * remove unused variable - * Don't mix stack and heap based allocations - * Fix copyright (2009, 2008, 2009 -> 2008, 2009) - * Fix warnings found by clang - * * #6595: fix initialization order for AudioRTP - * * #6592: removed typedef std::string CallID - * * #6586: implement local g_slist_free_full for older glib versions - * * #6579: fix memory leaks in client (there's a lot left) - * ShortcutPreferences::setShortcuts() : simplify - * Fix merge - * * #6548: remove call to non thread-safe strerror() - * AudioRtpFactory: each instance is associated to exactly one SipCall - * create_audiocodecs_configuration() : make static - * * #6269 : refactor AudioRtpSession - * Fix AudioSymmetricRtpSession.h inclusion guard (cherry picked from - commit c3081dce1cc1370d6d3558a4c4ef5cfac0d21caf) - * * #6269: Rename AudioRtpSession to AudioSymmetricRtpSession - * * #6574: Don't exit when connection to pulseaudio server fails - * accountconfigdialog.h : remove some stuff from header - * * #6560: fix configuration test - * Fix warning in test - * * #6560: don't hide password entry in security tab - * * #6560: set initial password for SIP accounts - * * #6506: remove useless pointer indirection - * * 6560: password is now specific to IAX accounts - * * #6560 : actually use, store, restore, transmit SIP credentials - * * #6560: YamlEmitter: serialize sequences - * YamlEmitterException: typo - * ManagerImpl::computeMd5HashFromCredential() : simplify, fix memleak - * * #6561: invite_session_state_changed_cb() : simplify - * * #6561: More useful debug in VoIPLink::removeCall - * * #6561 : fix ghost call reappearing in GUI after transfer - * while -> for (make the code smaller) - * * #6558 : Account::loadConfig() : move IAX code to IAXAccount - * IAXVoIPLink::getAccountPtr : simplify - * * #6554 : access the SIPVoIPLink directly, not per account - * SIPVoIPLink is instanciated only once and is not associated to a - single account - * yamlnode: use const references when possible (still some left to do) - * Account::_accountID: constify - * VoIPLink: simplify, remove unused method - * hudson test : no need to call run_tests.sh anymore - * Remove AccountID type and AccountNULL define - * Make check runs the test (no need to call run_tests.sh manually - anymore) - * gnome GUI: Fix tests - * Revert "Move registration information from SIPAccount to - SIPVoIPLink" - * * #6392: pluginmanagertest: fix warnings reported by valgrind - * * #6547 : remove unused exceptions - * * #6547: CallManagerException: use runtime exceptions - * * #6547: InstantMessageException: use runtime exceptions - * * #6547: do not throw exceptions if some settings are not present in - config file - * * #6547: YamlParserException: use runtime exceptions - * * #6547: VoipLinkException: use runtime exceptions - * * #6547: YamlEmitterException: use runtime exceptions - * * #6547: DTMFException: use runtime exceptions - * * #6547: AudioFile: use runtime exceptions - * * 6547: AudioZRtpSession: remove impossible error case - * * #6547 : AudioRtpSession: remove impossible error case - * * #6547: AudioZrtp: use runtime exceptions - * * #6408 : send authenticationUsername to GUI - * * #6408 : store/restore authenticationUsername from config file - * SIPAccount: simplify - * Move registration information from SIPAccount to SIPVoIPLink - * SIPAccount::getAccountDetails : simplify - * * #6540: yaml parser: simplify - * sdp.cpp : fix a warning - * * #6540: yaml parser : remove std::string typedefs - * * #6540: Simplify yaml unserialization - * * #6540 : add a Conf::ScalarNode constructor for booleans - * setAccountDetails(): simplify - * * #6408: store authentication username in daemon - * * #6408: Be able to set the authentication username in the GUI - * * #6507 : do not crash if the program is not sflphoned - * Fix tests - * macroify SIPAccount::unserialize() - * Move all .cpp files from sflphoned target to libsflphone.la, except - main.c - * main() : simplify, return positive error codes - * * #6507 : find codecs dir in build directory - * * #6392: Sdp: move clean functions to destructor - * AlsaLayer::adjustVolume() : simplify - * alsalayer : reduce indentation - * malloc/free -> new/delete - * malloc/free -> new[]/delete[] - * malloc/free -> new/delete - * AudioSrtpSession: simplify base64 encoding - * * #6392: Initialize std::string from pj_str_t correctly - * * #6392: AudioRtpSession: Initialize remote port - * Audio settings : Initialize _echoCancelTailLength and - _echoCancelDelay(0) - * Initialize variable - * YamlParserException : fix use of stack variable after it has been - deallocated - * * #6392: fix memory leak in history - * * #6392 AudioCodec : fix memory leak - * * #6392 : fix memory leak in sip account - * * #6408: clean up sipaccount (cosmetics mostly) - * sipaccount.cpp serialize() : reduce number of lines - * * #6392: invalid memory access - * * #6392 : fix invalid memory access - * * #6479: merged useful code from MimeParameters into Codec interface - * * #6462: fixed hangup on IP2IP call - * added run_daemon.sh script - * test: remove unused variable - * Remove functions only used by a failing test (cherry picked from - commit fcf718cb75de7f1882dc61c07bb8d300dfa10f85) - * * #6360 : make client tests build (cherry picked from commit - 028b2835f040e51ab8ab979b32732b07b8798fce) - * * #6360 : fix warnings in check_global test (cherry picked from - commit 9e2bd6a7496dd64f6f48595e385760019aab1193) - * * 6360: updated API calls in tests, but they're not building yet - (cherry picked from commit 548f6f0f919b43772a3e9c667e5e292791281795) - * Fixed include in tests (cherry picked from commit - aeadc7525c1e31f936670ac8b02f0bcf387c38a8) - * Remove unused variables and functions - * IAX: fix warnings (cherry picked from commit - fd7a113a11cac2cd9a7c36929e88ad28195c4c35) - * Remove unused DEBUG define which interferes with logger.h (cherry - picked from commit b2f72b91d0f43cb1dd94d138882a8caa9c841c24) - * * #6392: no need to check for account NULLity since it is - dereferenced above - * * #6392: fix a memory leak, replace by stack allocation - * * #6392: remove a variable assignement which confuses cppcheck - * process_conference_participant_from_serialized() : remove unused - function - * * #6392: s/free/g_free/ - * * #6392: fix a memory leak in abookfactory_load_module() - * * #6392: remove generate_call_id() used only once - * * #6392: fix memory leak (opendir() without closedir()) - * * #6392: AudioRecorder(): ensures mbuffer is set - * Remove SFLPHONED_VERSION from global.h, use autoconf PACKAGE_VERSION - * #6298: Cleanup - * #6331: Fix deleting ringtone file after call have been answered - * * #6330: merged user_cfg into headers - * #6298: Fix conference recording file update at conference end - * #6298: Fix record file name serialization for conference - * * #6295: cleanup of codec hierarchy - * #6298: Fix gtk warnings - * * #6300: added script to run tests - * #6109: Add recording playback for conference - * * #6300: tests do not require an installed sflphone - * * #6295: re-removed clone methods - * #6109: Fix gtk_critical warnings for incoming calls - * #6109: Fix GTK_CRITICAL warning - * #6109: Fix icons when history is not activated - * #6109: Fix warnings - * #6109: Implement stop recorded file playback signal - * Revert "* #6295: removed unused clone method" - * * #6295: removed unused clone method - * * #6296: removed non existant file from Makefile.am - * #6109: Stop fileplayback for outgoing call - * #6109: Implement stop recording playback button - * Fix binding names errors in dbus introspection file - * #6109: Implement playback recorded file callback in client - * #6109: Store recorded file path on client side - * #6109: Add dbus methods for call recording playback - * * #6290: remove unused classes from utilspp - * * #6288: cleanup sdp - * * #6288: fix exception usage - * * #6288: simplify SdpException - * * #6288: cleanup in sdp.cpp/h - * #6109: Only display playback button if record file is set and valid - * * 6290: updated configure.ac to remove functor Makefile - * * #6290, #6289: removed unused classes from utilspp, fixed make - check - * #6109: Add button for history playback of recorded file - * * #6289: removed unused observer class - * * #6282: forward declare sdpMedia in sdp.h - * * #6281: renamed setCallAudioLocal->setCallMediaLocal - * #6183: Handle conference with more tahn two calls - * #6183: Fix history icons when calling back a conference from history - * #6183: Fix icons inconsistencies in history for conference hang up - * #6183: Fix toolbar actions when selecting a conference in history - * #6183: Fix conference serialization - * #6268: Serialize only calls - * * #6269: removed useless type testing - * ignore some files in test/ - * * #6268: Remove dead class AudioSymmetricRtpSession - * #6251: Do not had history calls in calllist when loading history - file - * #6251: Fix insertion in history map in before saving history file in - daemon - * #6251: Fix history unit tests - * #6251: Order the list before serailization, get rid of the hashtable - in history - * #6251: Implement history serialization using a list wether than a - map - * * #6253: remove external audioport from header, make all members - private - * * #6253: don't store external local audio port (used for NAT) in - Call - * #6251: Add start_time timestamp in history serialization - * #6251: Fix call insertion in conference items - * #6233: Fix serialized account list terminated with a ";" character - * #6238: Fix draggable history calls into current calls - * #6233: Fix toolbar updates - * #6233: Fix history - * * #6235: remove pyc files from git tree - * #6233: Handle cases when one or manuy calls are unreachable in - createConfFomrParticipantList - * #6233: Handle wrong numbers in createConferenceFromParticipantList - * #6231: Fix drag-n-drop issue - * * #6173 : move sippxml in tools - * #6231: Fix merging issue - * #6183: Implement conference unserialize - * * #6212: remove extraneous flags from globals.mak - * #6183: Unserialize conference data in conference - * #6183: Add account information in request for conference call from - history - * #5755: Add -ldl to liker in sflphone-client-gnome - * #5755: Fix fedora 15 compilation issue - * #6183: Serialize conference participant phone number and account - * #6183: Add conference timestamp in serialization - * * #6186: don't include global.h, just logger.h - * #6183: Fix saving history to file - * #6183: Fix removing call from calllist - * * #6184: remove pointers to Manager from AudioRtpSessions - * #6183: Calling calltree_add_call explicitely for history - * #6183: Ability to store conference inside history tab queue - * * 6181: remove unused API from sipcall - * #6171: Implment nreCallCreated callback - * #6167: Fix participant list NULL ending - * #6149: First draft of conference creation from history - * #6149: Fix multiple call/conf selection callbacks ... - * #6129: Fix place_call function called twice for pressing enter - action - * #6129: Fix double click action for history - * #6149: Add dbus call for creating conference from history - * #6129: Fix placing call from history and addressbook (still need to - fix icon) - * * #6148: removed unused AudioRtpFactory constructor - * * #6145: remove unused isAudioStarted - * * #6145: remove unused isAudioStarted - * #6129: Add conference into history, fix call/conference selection - * * #6143: don't use getType outside of serialization methods - * * #6132: forward declarations instead of includes - * * #6132: add constness, remove redundant "inline" keywords - * #6129: Add timestamp to conference object to order history entries - * * #6128: remove unused forward declarations from header - * * #6127: make noncopyable class actually noncopyable - * * #6125: don't include AudioRtpFactory in sipcall.h - * #6123: Fix alsa ringback audio file - * #6123: Fix raw audio file loading problem - * #6109: Fix daemon plugin manager unit test - * #6109: Fix history manager unit tests - * #6109: Recording filename in daemon and client for history items + - serialization - * #6109: Refactor AudioFile to play recorded call - * * #6104: AudioCodec moved to sfl namespace - * * #6099: remove active flags from codec classes - * #6095: Add notification-daemon as a runtime dependencies for rpm - packages - * #6095: Fix fedora 15 compilation in MineParameters.h - * #6095: Declare static variable explicitely for client - * #6095: Add logs to build OSC build machine - * * #6098: global variables should have file-scope to avoid name - conflicts - * #6095: Fix compilation error for Fedora 15 - * #6095: Update SFLphone version to 0.9.14 - * #6095: Add specification file in opensusse build service for - sflphone-plugins - * #6073: Fix sflphone-plugins build on launchpad - * #6093: Rename CodecDescriptor for AudioCodecFactory - * * #6089: fix warnings in make check - * * #6086: renamed codecs methods to audio_codecs - * * #6085: renamed codec related dbus calls to audio_codec - * #6065: Remove g_print from client, use DEBUG instead - * #6065: Add actions name for addressbook - * * #6085: renamed codecs* widgets/functions audiocodecs* - * #6065: Fix Addressbook runtime warnings - * #6065: Replace Codecs tab for Audio in account preference dialog - * #6065: Fix "transfert" typo - * #6065: Fix addressbook action runtime warning in uimanager - * * #6082: fixes make check by adding libcrypto libs to test - dependencies - * #6073: Rename plugin/addressbook folders for addressbook/evolution - in sflphone-plugins - * #6074: Removed AC_SUBST from configure.ac when using - PKG_CHECK_MODULE - * #6073: Fix sflphone-plugins package build - * #6073: Fix sflphone-common build - * #6065: Fix runtime gtk warning when initializing searchbar without - addressbook - * #6063: Fix mozilla-tellify gitignore - * #6063: Remove stream copy file using ifdef macro - * * #6012: fix make dist for sflphone-common - * #6063: Update .gitignore file - * #6058: Fix base64 encoding related warnings - * #6056: Fix SdpException handling - * #6055: Fix unknown pargma warning for gcc <= 4.5 - * * #5949: test gcc version before disabling unused-but-set warning - * #6054: Fix addressbook plugin compilation warning - * #6048: Fix uimanager static initialization - * #6046: Fix addressbook factory static initialization of member - addrbook - * #5979: Fix implicit function declaration warning - * #6042: Fixed discarding qualifier warnings in client - * #6041: Fix instant messaging unhandled case warning - * #5994: Implement set current addressbook name and search type in - addressbook plugin - * #5994: add rules for launchpad packaging of addressbook plugin - * #5994: Fix addressbook plugin configuration loading - * #6027: Fix addressbook enabled test from configuration - * #6027: No need of gnomedoc related macros in addressbook plugin - * #6027: Add NEWS file required for build - * #6027: Add addressbook plugin autogen.sh script - * #6027: Remove plugins from client - * #6027: Add sflphone-plugins folder at project's root level - * #5994: Move addressbook folder from contacts to plugin folder - * * #6011: removed unused Makefiles - * * #6010: remove unused headers - * * #5952: fix "string constant to char*" warnings - * * #6009 fixed warnings - * * #6003: finished cleanup of account classes - * * #6003, #6004: cleanup of account classes, defaultAccount no longer - global - * * #6000: fix memory leak of args object - * * #5998: removed using namespace std from networkmanager - * * #5998: removed "using namespace std" from ZrtpSessionCallback - * * #5998: removed using namespacestd from AudioZrtpSession.h - * * #5998: remove "using namespace std" from auriorecord.h and - MimeParameters.h - * * #5998: remove using namespace std in main - * * #5998: removed "using namespace std" from logger - * * #5949: test gcc version before disabling unused-but-set warning - * #5994: Installation of addressbook plugin - * #5979: Implement codec full addressbook search from plugin - * #5979: Implement addressbook factory and plugin - * * #5981: unused webwidget removed - * #5966: Account config synchronization fix (for stun) - * #5954: Handle media name exception - * #5954: Fix audio codec name display in client - * #5954: Clean up getSessionMedia methods - * * #5957: getRecordingSmplRate returns a value - * #5954: Clean up getCurrentCodec methods - * * #5950: remove "converting to non-pointer type 'int' from NULL" - warnings - * #5915: Full gain control version - * * #5949: remove more unused variable warnings - * * #5949: remove unused/unused-but-set variable warnings - * * #5949: show_preferences_dialog returns a success value - * * #5946: cleanup of include directives, undefined function - * * #5515: comment out SSLv2 calls in pjsip - * #5915: Implement different slope for attack tme and release time for - gain control - * #5915: use only one input signal for gain control (removed output - buffer) - * #5921: Fix no audio after holding a conference - * #5916: Add gaincontrol files - * #5916: Implement FFMPEG/CCRTP video streaming prototype - * #5903: Fix call transfer during a conference - * #5915: implement rms detector, first order averager, limiter for - gain control - * #5914: Fix call transfer when no notification request is required - * #5899: Fix conference right-click segfault - * #5884: temporary fix segfault in pjsip memory pool - * #5883: Fix compilation issues on maverick and lucid - * #5755: Fix fedora 15 compilation without patching ccrtp - * [#5855] Make echo canceller optional - * #5855: Fix echo suppression activation/deactivation - * #5855: Implement pjsip echo canceller - * #5814: Speex initialization function uses samples, not bytes - * #5814: Test using more unbalanced signals - * #5814: Fix buffer size for long echo length or long echo delay - * #5814: Adjust level for echo cancellation at runtime - * #5814: Process noise reduction before echo cancelling - * #5814: Implement speex post echo canceller processing - * #5814: Dump echo cancel file to disk - * #5814: Add parameters for echo cancel - * #5809: Add configuration parameters - * #5809: Implement speex echo canceller in audio rtp session - * #5814: Code cleanup - * #5814: Fix conf creation with several incomming ringing calls - * #5814: Fix conf creation segfault when dragging a call on hold on a - ringing call - * #5809: Added unit test for echo cancellation and implemented - "process" virtual method - * #5709: Add always recording option in configuration - * #5709: Add always recording option in audio conference panel - * #5709: Add core functionnality for always recording (missing config - options) - * #5769: Fix conference participant handling (detach/attach) and hold - actions - * #5747: Fix recording icons and state for conference when adding new - participant - * #5769: Code cleanup - * #5769: Fix hangup unsent calls - * #5769: Fix remove/add additional participant to conference - * 5769: Several fixes concerning confererence handling - * #5769: Fix compilation error - * [#5769] Fix audio streams binding in main buffer - * #5769: Removed access to audio mixer from audio layer - * #5765: Fix audio crash for illformated wavefiles - * #5765: Add maximum iteration for finding fmt and data "chunck" - * #5589: Fix compilation of libnotify under - * #5757: Fix abort signal when receiving INFO - * #5747: Add usersDetached.svg - * #5747: Handle offhold action for recording conference - * #5747: Fix off hold action for conferences - * #5747: Implement update conference in record action in calltree - * #5747: Add new icons for recording conferences - * #5747: Add recording state for conferences - * [#5738] Remove getAudioDriver call from manager (replace by - _audiodriver var) - * [#5738] Refactor mutex protecting audiolayer - * [#5737] Fix HD conference recording - * [#5730] Fix start audio session after changing sampling rate - * [#5714] Fix enter keyboard event for addressbbok and history - * [5695] Fix addressbook combo box update when no addressbook selected - * [#5695] Fix addressbook initialization and search bar update - * [#5695] Add mutex for books_data in addressbook to protect async - calls - * [#5695] Get back addressbook open from uri - * [#5695] Fix absolute addressbook URI for local addressbooks - * [#5695] Implement libebook 3.0 interface - * [#5571] Better logic for hangup (for case where call have not been - sent yet) - * [#5571] Update error handling in voip links - * [#5571] Fix compile time warnings - * [#5696] Fix installation dependencies for Natty - * [#5669] Add mention that sflphone.org is for testing only - * [#5693] Add natty in teh dput.conf file - * [#5690] Remove not useful logs - * [#5670] Use dynamic payload type for rtp dtmf - * [#5668] Clean up sflphone configuration logging - * [#5668] Fix hook checkbox configuration update - * [#5666] Fix unit tests - * [#5666] Manage event subscription - * [#5666] Emit bye request when subscription is terminated - * [#5666] Bye request should be sent after event subscription - notification is done on transfer - * [#5666] Make reinvite method static (to be called in pjsip - callbacks) - * [#5666] Hangup Call in manager for AccountNULL and IP2IP - * [#5589] Use PKG_CHECK_MODULE for every client's dependencies - * [#5623] Enlarge initial size of pjsip memory pool for calls (16k) - * [#5564] Fix audio recording resampling for g722 - * [#5571] Move attribute handling for onhold/offhold actions in SDP - session - * [#5571] Codec negotiation refactored and unittested - * [#5571] Implement tests - * [#5571] Implement pjsip negociator - * [#5571] Fix unit tests - * [#5571] Add Fmtp.h to repository - * [#5571] Integrate mime types and codec factory - * [#5571] Handle exception when SDP negotiation fails - * [#5570] Add sflphoned-sample.yml in repository - * [#5564]: Implement stereo to mono mixing for rigntone - * [#5342] Update audio stream initialization - * [#5514] Restore test ni historytest suite - * [#5514] Fix - * [#5514] Disable test_create_history_path - * [#5514] use pulseaudio in sample config file - * [#5514] Fix test: load history from file - * [#5514] Do not use X - * [#5513] Make unit tests compile successfully - * [#3947] Enable unit tests in Jenkins - * [#5454] Fix build system to handle new version number - * [#5454] Update languages from launchpad - * [#5454] Add --without-celt in OpenSuse build service - * [#5454] Change version number - * [#5331] Added first SDP session tests - * [#5273] Update nightly build version tags to conform dpkg rules - * [#5211] Refactor send register method for iaxvoiplink and - sipvoiplink - * [#3950] Remove call being transfered from calltree - * [#5211] Use appropriate memory pool for transport selector - * [#5211] Fix strict aliasing rules warning in pjsip - * [#5211] Bring back pjsip shutting down sleep to 1000 ms - * [#5211] Fix registration callback segfault when closing the - application - * [#5211] Use the dialog memory pool for Route header in INVITE - request - * [#5211] Add temporary memory pool for findLocalAddressFromUri and - findLocalPortFromUri - * [#5211] Use individual memory pool for dtmfs - * [#5211] SipVoipLink refactoring - * [#3950] Attended transfer for conference calls - * [#5284] Fix DNS resolution for Route with specified port number - * [#5284] Some code cleanup - * [#3947] Fix typo in hudson script - * [#5284] Added sip route to REGISTER, INVITE, BYE request, plus DNS - resolution - * [#5266] Use RTP dtmf as default - * [#5284] Added pjsip_process_route_set after setting routes in regc - structure - * [#5286] Fix parsing error due to long configuration file (removed - max event) - * [#5286] Fix false test in configuration emmiter - * [#5286] Code cleanup - * [#5286] Updated exception handling in configuration system - * [#4969] Fix put SRTP call on hold - * [#3950] Add debug messages - * [#3950] Ability to perform an attended transfer - * [#5276] Fix initialization problem in g722 - * [#3950] Add replace header in SIPVoIPLink::transferWithReplaces - method - * [#3950] Implemented attended method in SIPVoIPLink - * [#3950] Cleanup transaction request received callback - * [#3950] Implement dummy attended transfer in gnome-client - * [#5249] Fix audio samplerate update algorithm for g722 - * [#5249] Fix uninitialized variable used in conditional jumps - * [#5249] Fix conditional jump error in audiolayer (uninitialized - value) - * [#5267] Use autoconf 2.65 as a requirement (instead of 2.67) - * [#5267] Restore manual pjsip configuration and compilation - * [#5267] Autodetect celt version (0.9.1, 0.7.1) - * [#5267] Fix deprecated macros in gnome client configure.ac - * [#5267] Update configuration for libcelt-dev - * [#5267] Fix build autoconf and automake - * [#5227] Deactivate automatic call to astyle after compilation - * [#5242] Hangup every calls before leaving - * [#5237] Will now nightly-build for natty, Karmic deprecated - * [#5229] Use inner class for rtp thread instead of inheritance - * [#5211] Move mainbuffer unbind call in rtp final method - * [#5211] Initialize sip call memory pool using 16 kb - * [#5211] Use call memory pool in session reinvite - * [#5211] Add debug messages - * [#5211] Use and internal pool for calls - * [#5211] Reduce pjsip memory pool usage for stateless error messages - * [#5211] Refactor call deletion - * [#5212] - * [#5208] Refactor codec management for accounts - * [#5168] Remove printf from codec's encode & decode method - * [#5168] Fix celt compilation on launchpad - * [#5168] Fix sflphoned compilation warnings in audiocodec.h - * [#[#5168] Must keep the g722 specific RTP rate to avoid incoming - packet timeout - * [#5168] Fix static/dynamic payload rtp session update - * [#5168] Throw SIPVoipLink Error if codec not instantiated in new - outgoing call - * [#5168] Fix dynamic/static codec payload type ambiguity - * [#5169] Fix doubled IP2IP profile when no config file - * [#4867] Add gtkinfobar in configuration panel - * [#4867] Disable input/output/ringtone selection when using default - alsa plugin - * [#4952] Patches for possible buffer overflows - * [$4885] Fix schemas problem - * [#4885] sflphone-client-gnome.schemas not present during build - * [#4885] Add gconf shemas directories in opensuse build system - * [#4885] Add file/folder ownership for opensuse-factory build system - * [#4906] Fix opensuse-factory build - * [#4885] Update name dependency for libedataserver - * [#4885] Fix non-void function without return in dbus-c++ - * [#4895] Update language translation - * [#4896] Update session timestamp when updating media - * [#4896] Reapply RTP hack for G722 payload type - * [#4896] Update recording sampling rate when updating codec - * [#4897] Save codecs in config for each configuration changes - * [#4895] Do not save config when sflphone quit - * [#4885] Update date for copyright - * [#4885] Deactivate siptest that require more than one sipp instance - * [#4879] Remove inmcoming call notification from IAX - * [#4885] Some cleanup - * [#4874] Add setCancel immediate/deffered for ost::Thread - * [#4879] Fix incoming call notification - * [#4878] Set keyboard focus on searchbar when selecting addressbook - * [#4874] Fixed compilation warning - * [#4874] Fixed compilation warning in sipvoiplink - * [#4874] Fix compile time warning in RTP record handler - * [#4874] Fix conditional jump in SDP - * [#4874] Fix conditional jump based on uninitialized value - * [#4874] Store call id within rtp thread context - * [#4874] Fixed conditional jump based on uninitialised value in - conference - * [#4871] Fix default account fetching - * [#4870] Delete RTP session when Refusing an incoming call - * Restore IP to IP call - * [#4857] Fix audio codec negotiation problem - * [#3947] Adjust ressources allocated to compilation - * [#3947] Disable unit tests in Hudson - * [#4305] Free mutex only when really quiting SFLphone - * [#4859] Update copyright to 2011 in every source file - * [#3218] Character '.' stripped by the caller engine - * [#4854] Fix typos, desktop entry - * [#4847] Apply RTP modification to ZRTP session - * [#4852] Update Karmic and Lucid dependencies - * [#4852] Add Libedataserver and libedataserverui as gnome client - dependencies - * [#4852] Add authentication mechanism for EDS - * [#4851] Fix segfault when closing pulseaudio layer too rapidly - * [#4808] Some otehr cleanup - * [#4808] Made some cleanup - * [#4808] Added mutex in rtp session for codecs and noise process - * [#4847] Update audio processing when updating RTP media - * [#4842] Add support for linking with gold/ld --no-add-needed - * [#4808] Make update g722 related static/dynamic payload logic - * [#4827] Upper limit on the number of contacts to import from EDS is - hard-coded to 500 - * [#4808] Fix put call on/off hold - * [#4808] Implement early RTP start for incoming calls - * [#4808] Audio stream is no longer start within RTP session. - * [#4808] Removed coupling between audio layer and and RTP session - * [#4702] Start audio rtp session as soon as it is created - * [#4702] Init timestamp to 0 - * #4702: Send RTP packets immediately, no need of outgoing queue - * [#4784] Update dbus-c++ version from gitorious - * [#4702] Update RTP timeouts - * [#4702] Lengthen RTP timeouts - * [PATCH] Fixed compatibility with old libtool versions. - * [PATCH] Accept older libebook (Maemo 5 has 1.4.2) - * [PATCH] Fixed double-free error in preferences dialog - * [PATCH] Fixed building of sflphone-common on Maemo5 - * [PATCH] Improved Gnome client initialization error handling. 1. It - no longer segfaults when sflphoned isn't available. 2. User is - provided with GUI error dialog. - * [PATCH] Improved autogen.sh scripts 1. They do not require bash - anymore 2. Added workaround for Debian bug #565663 3. Replaced - manual autotools invocations with single autoreconf call 4. Non-zero - return status on failure - * Revert "[#4468] libtool <= 2.2 doesn't have LT_INIT macro so - AC_PROG_LIBTOOL should be used instead." - * Revert "[#4468] Libebook 1.4 is sufficient" - * Revert "[#4468] Apply big path on dbus communication system" - * [#4468] Apply big path on dbus communication system - * [#4468] Libebook 1.4 is sufficient - * [#4468] libtool <= 2.2 doesn't have LT_INIT macro so AC_PROG_LIBTOOL - should be used instead. - * [#4639] Fix determining default addressbook if this property is not - set in gconf - * [#4639] Fix memory leaks in Addressbook - * [#4637] Fix opening default addressbook at sflphone init - * [#4622] Free yaml events while parsing configuration file - * [#4623] Fix conditional jumps based on uninitialized variable - * [#4622] Fix leaks in yaml serialization engine - * [#4616] Fix addressbook warnings - * [#4514] Adjust RTP timestamp - * #4527: Rename Karmic libyaml and Celt package in debian control file - * #4495: Rework addressbook opening loop - * [#4524] Increment RTP count when sending data - * [#4524] DO NOT start RTP session twice - * [#4367] Use PKG_CHECK_MODULE for celt - * [#4367] Fedora package celt as celt (not libcelt) - * [#4367] Astyling - * [#4367] Update .po files - * [#4367] Fix segfault in gensin - * [#4354] Make celt a direct dependency on launchpad opensuse build - service - * [#4367] Make celt a required package, option --without-celt valid - * [#4367] Fix zrtp timestamping error - * [#4367] Fix audio zrtp timing - * [#4367] Dispatch ZRTP packets - * [#4367] Fix segfault when unloading account map - * [#4367] Fix zrtp session - * [#4367] Implement on packet receive - * [#4367] use symetric audio rtp session, not dual - * [#4367] Reduce packet receive/sent timeout - * [#4367] Reduce RTP timeouts - * [#4367] Move speaker data receive - * [#4367] Move speaker data receive - * [#4367] Move receive speaker data method - * [#4367] Remove debug in rtp session - * [#4367] Fix g722 codec clock rate - * [#4367] Fix noise suppression initialization - * [#4367] Fix segfault in RTP mic fadein method - * [#4367] Refactor mic data encoding in rtp session - * [#4367] Implement RTP main loop - * [#4367] Fix compilation problem - * [#4367] Fix AudioRtpclass using TRTPSessionBase - * [#4367] Fix AudioRtpSession putDtmfEvent shadowing - * [#4367] Fix AudioRtpSession putDtmfEvent shadowing - * [#4367] Refactor RTP session (phase 2) - * [#4367] Refactor RTP session (phase 1) - * [#4367] Remove Redeclaration of SymetricAudioRtpSession in - rtpfactory - * [#4265] Add continue statement in for loop for invalid addressbook - * [#4261] Makes addressbook initialization more robust - * [#4257] Add maverick in build system - * [#4233] Add sdp related unit tests - * [#4233] Add condition and signal in two incoming call test - * [#4243] Fix segfault in AudioSrtpSession - * [#4243] Fix memory leak in AudioSrtpSession - * [#4243] Make audio srtp optional in for incoming call - * [#4243] Add boolean variable to make sure remote crypto context - initialized only once - * [#4243] Add documentation to AudioSrtpSession - * [#4243] Use 80 bits authentication tags by default - * [#4243] Init audio srtp remote crypto context in - call_on_media_update - * [#4243] Move SDP negotiastion in mod_on_rx_request - * [#4243] Implement initLocalCryptoInfo to be called at different - momment - * [#4243] Init init local crypto context in when initializing audiortp - * [#4243] Change key length according to sdes negociation - * [#4243] Associate callid to accountid for incoming calls - * [#4242] Fix no SDES keys in IP2IP calls - * [#4242] Fix no SDES keys in IP2IP calls - * [#4233] Test for call on/off hold - * [#4233] Add two incoming call test - * [#4233] - * [#4233] Add 2 outgoing simultaneous call unit tests - - -- Julien Bonjean <julien.bonjean@savoirfairelinux.com> Fri, 30 Sep 2011 13:51:04 -0400 - -sflphone-client-kde (0.9.7~rc1~ppa1~SYSTEM) SYSTEM; urgency=low - - ** 0.9.7~rc1~ppa1~SYSTEM ** - - * [#2462] Set explicitly the transport on incoming call too - * [#2462] fix typo - * [#2462] Use different address for SDP and call IP - * [#2462] Use published address in SIP-SDP - * [#2181] Fixed changelog files - * [#2181] Updated spec file - * [#2402] Fix pointer to int conversion warning (atoi) - * [#2402] Remove daemon warnings, make indent - * [#2459] Make sure the stream is opened when the call is answered - * [#2402] Add conference related picture in documentation - * [#2443] Not much ... - * [#2399] Fix dialing display problem - * [#2450] Fix incoming call already in conference crash - * [#2399] Display peer name on the first line and peer number on the - second - * [#2450] Handle 403 FORBIDDEN when refused - * [#2447] Bind offHold/onHold actions to button in gtk client - * [#2447] Bind hangup action to button for conference - * [#2447] Add conference action in gtk client's ToolBar - * [#2381] Disable the password hashing in config file - * [#2402] Cleanup - * [#2366] Set callback to null when deleting Pulseaudio streams - * [#1313] Fix main buffer unit test - * [#1313] Fix audio layer unit test - * [#2315] Hide pw in security tab, display when editing, sync with - basic tab - * [#1313] UnitTest change AudioRtpSession for AudioSymetricRtpSession - instance - * [#2402] Code cleanup - * [#2444] Add debug to catch occasional crash when loading client's - config - * [#2444] Add debug info to catch occasional crash when loading config - dialog - * [#2402] Restore Call menu translations - * [#2403] Use the published address if checked in GUI - * [#2442] Add protection test in sdp - * [#1841] Reapply pjsip patch concerning DNS SRV resolution - * [#2384] Tags incoming call as direct SIP call, if applicable - * [#2402] Change the monkey face - * [#2315] Enable user to display password in clear text - * [#2434] Force optimization level at 2 - * [#2284] Fix dbus_get_all_ip_interface compilation warnings - * [#2431] Popup main window on incoming if applicable - * [$2402] Fix simple warnings - * [#2402] Fix implicit variable init order in LibraryManagerException - * [#2402] Fixing implicit variable initialization warnings in - AudioRtpSession - * [#2402] Revert atoi change, fixing codec list doubled entries - * [#2402] Fix gpointer to gint conversion - * [#2402] Fix pointer casting to integer different size warning in - codec list - * [#2402] Fix warning discarting qualifiers from pointer target - * [#2402] Fix gtk tree view assignement from incompatible type warning - * [#1669] Fix audio recording folder utf-8 non compatibility issue - * [#2414] Clean up debugs - * [#2414] Use transport set in iptoip Account and update it frm - preference - * [#2348] Use macro N_() to mark ui.xml strings as translatable - * [#2414] Rename getSipAddress/setSipAddress functions - * [#2407] Fix volume controls display - * [#2407] Fixes dialpad - * [#2383] Set ip to ip config when clicking apply button - * [#2404] Update call-to script - Maxime Chambreuil - * [#2405] Client handles unknown call in current state as well - * [#2383] Add DBUS signal to send IPtoIP local address and port as - string - * [#2383] Add Ip to IP config change apply call back - * Clonflict - * [#2402] Code cleanup - * [#2383] Do the same for IPtoIP (init localn ip with first in the - list) - * [#2383] Use first interface in the list if local addresss is not - defined - * [#2403] Clean up unuseful addresses/ports - * [#2403] Use the IP profile SIP port as global SIP port - * [#2383] Fix dbus_get_all_ip_interface warnings - * [#2383] Take into account sameAsLocal when loading published address - * [#2383] Tsake into account sameAsLocal option when saving published - address - * [#2383] Update local ip address in ip to ip config - * [#2383] Save ip 2 ip local port in config - * [#2406] Update toolbar at startup - * [#2284] Remove redefinition warnings + speex warnings - * [#2383] Fix security table in account config - * [#2383] Save ip 2 ip network interface parameters in config - * [#2403] Restore sip transport selector - * [#2383] Fix filling the Localt IP Address on account creation - * [#2383] Fix Gtk-Critical when checking STUN - * [#2383] Fix reopening account configuration display issue - * [#2383] Load IPtoIP local address and port in preference iptoiptab - * [#2383] Add LocalAddress and Localport in Preference IpToIp tab - * [#2403] Use the address and port associated to the account as often - as possible - * [#1753] Removed pjsip generated files - * [#1753] Removed remaining milenage lib references - * [#2383] Add _publishedSameasLocal variable in sipaccount - * [#2383] Add PUBLISHED_SAMEAS_LOCAL variable in config - * [#2383] Fix stun set active or not when opening config - * [#2181] Added RPM 64bits dbus patch - * [#2402] Code indentation - * [#2313] Force $(HOME).cache directory creation at startup - * [#2383] Separate network interface and published address in account - config - * [#2400] Change dbus service installation path to libdir - * [#2382] Move TLS related published address options in security tab - * [#2382] Indent accountconfigdialog.c - * [#2181] Install libdbus-c++ in $pkglib instead of $lib - * [#1753] Remove ILBC code and disable it by default in the configure - * [#1753] Remove milenage directory - * [#2382] Fix switching interaface instabilities - * [#2396] Save local ip in account creation wizard - * [#2284] Remove warning on hold - * [#2387] Fixes history searching and filtering - * [#1215] Add samplerate display in the GUI - * [#1663] Voicemail icon reflects voice messages - * [#2395] Fix account registration ( specifically with callcentric) - * [#2386] Strip "sip:" on incoming call, fixing history call back - * [#2181] Updated spec files - * [#1215] Display codec name in calltree instead of status bar - * [#2390] Move back nbCalls and stopStream higher in refuseCall - * [#2392] Fix ringtone during call in IAX - * [#2391] Stop audio streams when there is 0 calls only - * [#2391] Add debug when call state is not valid - * [#2390] Clear returns in IAXvoipLink::sendAudioFromMic() method - * [#2380] Fixing IncomingCallNotification not regular - * [#2339] Query conference at client startup - * [#2339] Working conference querying at startup - * [#2339] Add conference in call tree - * [#2339] Primitives to query conferences at client startup - * [#2320] Add account selection in history - * [#2355] Temporary solution: do not delete pointer when removing - account - * [#2380] Change algorithm in AudioRtp to trigger an - IncomingCallNotification - * [#2274] Comment sdebug in MainBuffer flush method - * [#2274] Add flushMain() in ManagerImpl::addStream - * [#2274] Add getBufferID() method in ring buffer - * [#2274] Fix warning, comment debug in ringbuffer's flush method - * [#2274] Use AudioLayer flushMain() and flushUrgent() in ALSA - * [#2274] Clean up unused variable warning - * [#2274] Protect minbudffer pointer on flushing - * [#2274] Fix playATone method which writing empty buffer in urgent - ringbuffer - * [#2274] Use audio layer flushUrgent and flushMain in createStreams - * [#2274] Use flush audio calls from audiolayer - * [#2274] Flush when peer answered call - * [#2375] Flush main buffer in iax when answering a call - * [#2274] Parse displayname using c++ string method - * [#2375] Flush main buffer when off holding calls - * [#2375] Flush main buffer mon RTP startup - * [#2376] Use now Pulseaudio module-cork-music-on-phone - * Updated OSC packaging - - -- Julien Bonjean <julien.bonjean@savoirfairelinux.com> Fri, 20 Nov 2009 14:00:02 -0500 - -sflphone-client-kde (0.9.7~beta~ppa1~SYSTEM) SYSTEM; urgency=low - - ** 0.9.7~beta~ppa1~SYSTEM ** - - * [#1933] Cleanup debug - * [#1933] Clean up debug - * Fix mic - * [#1933] Set the IAx format earlier - * [#1933] Move IAX sendAudioFromMic outside if (call) statement - * [#1933] Fix startstream when offhold in iax and add debug concerning - codec neg. - * [#2371] sflphone_notify_voice_mail: minor gettext message formatting - cleanup - * [#2371] select_account_cb: properly gettextize status message - * [#2371] show_account_list_config_dialog: properly gettextize status - message - * INSTALL: Minor tidyup of core install guide - * Add /sflphone-client-gnome/src/icons/Makefile to .gitignore - * [#2181] Updated OpenSUSE files (tmp) - * [#1933] Add debug for codec negociation for iax - * [#1933] Get rid of getMicAvail and getMicData in audiolayer (not - used anymore) - * [#1933] Add "audio codec not determined" error in IAX - * [#1933] Test flush data - * [#1933] Do not need to start audio stream in iax anymore - * [#1933] Protecting pointer - * [#2284] Remove more compilation/execution warnings - * [#2284] Cleanup debug in client, use DEBUG instead of g_print - * [#2284] Clean up uimanager - * [#2370] Remove warnings - * [#2366] Clean up other debug - * [#2366] Clean up debug - * [#2366] Call pa_xfree explicitely in writeToSpeaker - * [#2284] Remove address book warnings - * [#2365] Fixes bad cast - * [#2352] Fix continuous ringing when peer hangup and call not yet - answered - * [#2181] Added version support - * [#2181] Fixed some minor issues - * [#2360] Moved MainBuffer from AudioLayer to ManagerImpl - * [#2352] Makes getMainBuffer() everywhere - * [#2352] Use 50 sec latency on pulseaudio stream creation - * [#2352] Add alsa debug - * [#2359] Update repository documentation - * [#2354] Move pulseaudio disconnectAudioStream after stopping main - loop - * [#2352] Adjust nb byte copied in pulseaudio according to - writeableSize - * [#2352] Specify pulseaudio tlength parameters using pa_usec_to_bytes - * [#2322] Convert italian translation to UTF-8 - * [#2357] Fixes window size - * [#2357] Display only actionnable tool item - * [#2333] Update streams parameters - * [#2347] Use GNOME user settings for Menu and Toolbar appareance - * [#2349] Load/Save properly audio params - * [#2322] Update translations from Launchpad - * [#2181] Added Francois Marier script - * [#2350] Remove non-valid test - * [#2181] Updated launchpad packaging - * [#2333] Fix Pulseaudio Capture - * [#2333] Use pulseaudio ADJUST_LATENCY flag and ALSA RT-SCHEDULING - * [#2333] Pulseaudio Interpolate timing - * [#2333] Change (again) Pulseaudio settings to fit logiteck usb hdw - requirement - * [#2333] Adjust pulseaudio fragment size to 4096 (max sflphone's - frames per buffer) - * [#2284] Remove recurrent compilation warning (g++ linker problem) - * [#2333] Safer Audiostream parameters - * [#2333] Fix alsa playback to reduce underrun - * [#2333] Better audiostream parameters - * [#2181] Updated version management - * [#2333] Exclusive test in playback loop - * [#2181] Updated build system - * [#2333] Less underrun with these value - * [#2333] Update playback audiostream parameters - * [#2333] Lengthen the audio buffer reduce number of underrun in - pulseaudio - * [#2333] Add ALSA recovery functions for underrun (begin) - * [#2333] Add pa_stream_trigger in pulse audio underrun callabck - * [#2048] Reduce prebuffering in pulseaudio (which affect incomming - calls' plbck) - * [#2316] Do not display any icons to the right on the history tab - * [#2333] Comment pa_stream_trigger in pulseaudio underrun - * [#2333] Modify pulseaudio streams parameters - * [#2318] Fix transfer tool button double signal - * [#2181] Updated - * [#2333] Fix ALSA ringtone - * [#2333] Flush all main buffer before starting audio - * [#2333] Open/Close Alsa thread between calls while there is no audio - * [#2333] Add debug message and test condition on starting playback - and capture - * [#2181] Fixed gnome client makefile - * [#2181] Updated - * [#2308] Remove getTelephoneTone debug - * [#2308] Change plughw for default in ALSA - * [#2308] Oups, forgot to change function name in audiolayertest.cpp - * [#2308] Cleanup in pulseaudio code (debug, function name) - * [#2308] Fix pulseaudio stream closing assertion failure - * [#2308] Moved pulseaudio mainloop locking from AudioStream - disconnect stream - * [2308] Fix latency at the beginning of a call, when playing DTMF and - wehn starting tone - * [#2181] Updated karmic - * [#2317] [#2319] Fix address book toggle button contextual behaviour - * [#2308] Stop stream when refusing a call - * [#2308] Stop pulseaudio stream when peer hungup - * [#2308] Fix tone and ringtone - * [#2312] Display the STUN entry widget when opening the tab - * [#2308] Implement two different callbacks for capture/playback in - pulseaudio - * [#2309] Open/close pulseaudio connections in startStream/stopStream - * [2308] Leave pulseaudio stream running, do not cork/uncork them - anymore - * [#2295] Set gtk file chooser to None if nothing is set in - configuration - * [#1976] Add codec and conference documentation - * [#2209] Fix recording in regard of resamling - * [#2297] Update .gitignore - * [#2297] Update translation files - * [#2297] Add reference to our coding standards - * [#2297] Remove old docbook code - * [#2296] Reinit tls account settings after modification - * [#2253] Add DcBlocker class to remove capture's dc offset - * [#2034] Fixes for TLS transport to initialize - * [#2284] Add silent build rule + client clean warnings - * [#2274] Fix unserialize history items in cilent at startup - * [#2274] Complete display name parsing and displaying - * [#2274] Parse the Display Name in sip INVITE message - * [#2050] Fix capture volume control in ALSA - * [#1970] Volume controls disable when using pulseaudio - * [#1970] Disable volume controls when using pulseaudio - * [#2277] Fix direct ip2ip ZRTP enabling/disabling in ip2ip - preferences - * [#2181] Added launchpad debian files - * [#2181] Added spec files for OSC - * [#2274] Set display name for "Contact" sip header as the hostname - * [#2181] Fixed daemon issues - * [#2181] Fixed gnome client issues - * [#1976] Remove warnings - need to fix the transfer - * [#2006] Add init is_rec variable in ManagerImpl - * [#2006] Update codec display on call selection - * [#2006] Restore double click actions in history and contact calltree - (GTK) - * [#2176] use XDG_CACHE_HOME when initializing sfl.zid file - * [#1976] Fix calltree switching from history - * [#2209] (Re)Fix cache for zid - * [#2209] Clean up debug messages - * [#2209] Clean debug messages - * [#2209] Fix trasnfering a call during a conference - * [#2209] Speex decode must return the number of bytes - * [#2209] Change frameSize speex 32kHz - * [#2209] Fix speex codec framesize - * [#2209] Reinit converterSamplingRate in RTP sessions - * [#2209] Change speex ultra wide band framesize - * [#1747] Add pixmap data - * [#2252] Fix Receiving a server error 488 crashes the callee - * [#2209] Fix iax low rate packate sending - * [#2209] Clean up debug messages - * [#2209] Add resampling changes for IAX - * [#2209] Clean up resampling code - * [#2209] Fix latency introduced by pulseaudio - * [#2209] Fix initialization of mainbuffer's internal sampling rate - * [#2176] Fix upsampling buffer size in audiolayer - * [#2209] Add dynamic converter sampling rate in audiortp sessions - * [#1747] Fixes runtime warnings - * [#1747] Remove from repo - * [#1747] register our icons to be used as stock icons - * [#2209] Fix number of byte in alsa's write to speaker - * [#2209] Fix putting non-resampled data in RTP's mainbuffer - * [#2209] Add alsa resampler - * [#2209] Add a samplerate converter in PulseLayer - * [#2209] Add mainbuffer's internal sampling rate and flushall method - * [#2176] Add mainbuffer stateInfo debug method - * [#2209] Resampling is optimal using SRC_LINEAR not SRC_FASTEST - * [#2176] Remove debug recordings - * [#2176] Fix Holding a conference participant on new calls - * [#2224] Add confID in callable object - * [#2176] Fix putting onhold a call participating to a conference when - pressing new call - * [#2176] Reset auidio buffers when adding streams (rtp, audiolayer) - * [#1976] Use xml to describe toolbars - Add a naviguation toolbar - * [#2176] Remove conference default_id in joinParticipant - * [#2176] Display error message in alsa's snd_pcm_avail_update call - * [#2176] Alsa mic avail data debug - * [#2176] Add some debug message for mic loss problem - * [#2176] Flush mic ring buffer when offholding a call - * [#2176] Reset ringbuffers' readpointer when adding main participant - * [#2176] Fix getAvailData algorithm - * [#2176] Reset ringbuffer's readpointer when adding a new participant - to a conference - * [#1744] Regex object renamed to Pattern. Previous attempt at - providing - * [#2176] Fix detach main participant problem when adding new one - * [#1976] Use right domain to translate - * [#1976] Add xml menu description - * [#2176] Store a list of confernece participant in client - * [#2176] Fix add participant, joinparticipant methods - * [#2181] Do not install dbus-c++ headers + add return value - * [#2176] Fix minor call handling instabilities - * [#2174] Fix incoming IP call contact address - * [#2211] Add test to protect NULL pointer - * [#1163] Add Advanced account configuration section - * [#2176] Add some usefull comments and debugging info - * [#2176] Add conditions to display security icons in conference - * [#2176] Fix detaching one participant while keeping communication to - others - * [#2176] Reenable userActive.svg in call tree - * [#2176] Make user active blue (not red) - * [#2176] Fix user active picture - * [#2176] Fix "hidden" merge conflict in sipvoiplink - * [#2176] Remove iax audio stream on peer hungup - * [#2174] Multiple UDP transports functional (TESTED with 2 accounts - and 3 calls) - * [#2176] Fix fix audio stream binding in iax - * [#2174] Create a default UDP transport + use tp selector for dialogs - also - * [#2176] Register iax audio stream in mainbuffer - * [#2176] Fix getAudioCodecName in IAXvoipLink - * [#2176] Fix iax account init - * [#2176] Handle multiple account using the same sip transport - * [#2165] Add .png files - * [#2176] Small fixes concerning dtmf - * [#2176] Fix make uninstall in codecs - * [#2174] remove stund makefile generation - * [#2176] Add conference lock - * [#2174] Add transport selector for multiple accounts - * [#2176] Change userActive picture from red to blue - * [#2176] Fix security pixbuff in calltree - * [#2176] Replace sfl.zid in .cache/sflphone instead of .sflphone - * [#2176] Fix add call description - * [#2176] Remove detach button from toolbar - * [#2176] Fix calltree call description state and state code in - conferences - * [#2176] Fix pulse audio double free - * [#2176] Fix conference selection - * [#2174] Clean up - remove stun settings in client network - configuration panel - * [#2174] Remove voviva stun code - * [#2174] Rsolve STUN with pjsip - DO NOT WORK - * [#2165] Add user svg - * [#2165] Debugging sip call failed - * [#929] Link against uuid if installed - * Oops - * Fixed bugs related to libsexy (with GTK < 2.16) - * [#929] Remove uuid-dev dependency in the core - * [#2165] Debugging no negociated codecs at communicatio start - * [#2165] Fix calltree bug (gtktreestore instead of gtkliststore) - * [#2165] Fix several merge problems - * Updated opensuse packaging script - * [#1163] Add missing figures - * [#1163] Update INSTALL file - * [#2165] Fix IAX - * [#2165] Add recordabe interface - * [#2165] Finish recording refactoring for call (not for conference) - * [#2165] Enable speaker recording for two different calls - simultanously - * [#2165] Implement call recording using the Recordable interface - * [#2165] Add get and set to AudioLayer's audio recorder - * [#2165] Add class recordable from which inherit call and conference - * [#2006] Fix G722 and Speex 8khz codec conferencing - * [#2006] add recording of audio buffers - * [#1163] Add general settings section - * [#1163] Fixes makefile error - * [#2006] Fix some minor issues - * [#2006] Drag a conference call on another conference call - (difference conferences) - * [#2006] Fix dragging a conference on itself - * [#1744] Integrating some of the needed regular expression patterns - in order - * COmplete call features - * [#1744] Added support for named subgroup in the Regex object. Also, - new - * [#1744] Adds thread safety features, compile() and setPattern() - methods to the Regex class. - * [#1744] Fix inconsistency in the finditer method from the last - commit. - * [#1744] Added regex pattern object built on top of libpcre. To be - used - * [#1744] Initial commit towards implementing RFC4568. Unimplemented - in the - * [#2157] Hide "security" and "advanced" tabs for IAX under account - * [#1163] Add call features section - * [#2006] Add joinConference capabilities - * [#2006] Add dbus joinConference signal - * [#2006] Drag a conference call onto a conference to add it - * [#1163] Add addressbook section - * [#2006] Drag a conference call onto a single call to create a - conference - * [#2006] Expand rows automatically - * [#2006] Add minimal multiple conference handling - * [#2006] Add atached/detached conference icons - * [#2006] Add function processRemainingParticipant - * [#2006] Deep refactoring, fix hangup bug - * [#1163] Update documentation - Accounts part - * [#1976] Integrate user doc to gnome client build system - * [#2122] Remove double inclusion in dbus-c++/src/Makefile.am - * Remove pjproject version number - * [#2006] Fix peerHungup - * [#1976] Make Yelp accessible from the GNOME client (need to install - the sflphone.xml first) - * [#2006] Fix multiconferencing hangup - * [#2006] Fix hangup calls in a conference - * [#2150] Make IAx2 reappear - * [#2006] Fix detach participant on multiple call - * [#2006] Can remove rining call from a conference - * [#2006] Reinit confID when removing a participant - * [#2006] Remove get isCurrentCAll in hangup/peerhungup (SipVoipLink) - * [#2006] Fix refuse call - * [#2006] Fix answerring incoming call - * [#2006] Refactor conference's participant list - * [#2101] Re-integrate test compilation in main build system - * [#2101] Make the test directory compile - * [#2136] Restore history functionality - * [#2006] Fix binding main participant to himself - * [#2006] Fix add current/incoming/onHold participant to an existing - conference - * [#2006] Fix add incoming calls to an already created conference - * [#2006] Fix remove stream - * [#2006] Fix detachParticipant/removeParticipant switchCall ids - * [#2006] Fix adding a call in conference having state "CURRENT" - * [#2006] Remove/add main participant from conferences - * [#2006] Hold/unHold conference - * [#2006] Detach a partcipant from drag n drop - * [#2006] Hangup a conference - * [#2006] Add hold/unhold conference dbus messages - * [#2034] gtk-ui fix under the "basic" tab. - * [#2006] Fix dragging calls on conference calls - * [#2006] Fix detach participant from a conference - * [#2034] Added default message is status bar under the account config - dialog - * [#2112] Fix a crashed caused when a non-md5 password was sent to - pjsip. - * [#2006] Detach participant by ID - * [#2006] Fix addParticipant method in managerImpl to handle - incoming/answered calls - * [#2006] Add addParticipant method in managerimpl and related dbus - messages - * [#2111] Added the ability to configure zrtp on sip.sflphone.org from - * [#2106] Fixed problem in the account assistant under gtk-ui. Also, - assistant.c - * [#2006] Fix dragging a conference call on another conference call - (same conference) - * [#1904] Small UI fix. Assistant was moved from "Call" to "Edit" - menu. - * [#1904] Fix a wrong label under gtk-ui. - * [#2034] Renaming and source code splitting. - * [#2034] Status bar added to account window to better reflect the - registration - * [#2006] Make calltree_remove_call recursive (for GtkTreeStore) - * [#1110] Small gtk-UI fix in the account window (alignment). - * [#2006] Fix remove conference, display children which are still - active - * [#2006] Recursive function call in calltree_update_call - * [#2006] Add multilayered capabilities to calltree (GtkTreeStore) - * [#2006] Implement remove conference in calltree - * [#2034] Now useless as Direct Ip calls settings moved under - Preferences. - * [#2034] Edit/add buttons were set insensitive all the time under - gtk-ui. - * [#1887] Information about the state of the current SIP call is - displayed - * [#2006] Add call tree remove callback - * [#2006] Fix create_conference function - * [#2006] Update conference_added_cb to add new conference to the list - * [#812] Added new tab under GTK-ui Preferences. Moving Direct Ip - Calls from - * [#2121] Disable temporarily test compilation - * [#2006] Fix conferencelist to handle conference_obj_t instead of - gchar - * [#2006] Add conference_obj structure - * [#2121] Update version - * [#2006] Fix conference selection - * [#2101] Use the new source tree to fetch the right object files - * [#2006] Add conference in calltree - * [#2006] Add Dbus signal conference added/removed/changed - * [#2006] Add getConferenceDetails call on dbus - * [#1904] Registration expire now appears as a spin box under gtk-ui. - * [#812] Fixing a segmentation fault caused by a non-existing account - ID - * [#2006] Add getConfList method over dbus - * [#2006] Add a conferencelist data structure in client-gnome - * [#812] Defaults value are now sent if a non-existing account is - requested - * [#2006] Add sflphone action sflphone_join_participant - * [#2006] Fix buffer read pointer problem deletion - * [pjsip] Attempt at fixing via header incompatibility with - Freeswitch. - * [#1797] forget something - * [#2006] Add call new state conferencing in deamon - * [#2006] Remove addParticipant method for conference, use - joinParticipant only - * [#1163] Update INSTALL documentation - * [#812] Msec/sec values were not taken into account. - * [#1797] Make pjproject-1.4 compile - * [#2006] Add Detach participant method - * [#2006] Dragndrop fully functional with INCOMING and HOLD call - * [#1797] Add pjproject-1.4 - * [#1797] Remove pjproject-1.0.3 - * [#2006] Get call state in conference related function - * [#2006] Add joinParticipant (conference) method in ManagerImpl - * [#2006] Add joinConference DBUS message - * [#2006] Store the previously selected call_id on dragndrop - * [#2006] Fix GValue pointer unref in selection callback - * [#2006] Store dragged call_id - * [#2006] Update drag_data_received_cb callback to manipulate CallIDs - * [#2006] Add dragndrop signals - * [#2006] Set calltree reordable - * [#812] Adds the ability to create a TLS listener in case the user - requests - * [#812] Adds the ability to configure local/published address from - * [#1883] Move switchCall in onHoldCall function - * [#812] Deals with the published address/port problem when - integrating TLS. - * [#1883] Switch call id in managerimpl when peerHungUp - * [#1883] Switch call id before hangup - * [#1883] Add usefull and permanent debug info for conference - cretion/deletion - * [#812] Fix various segmentation faults related to Direct IP kind of - calls. - * [#1883] Fix deletion of std::map elements using iterators - * [#2014] Add libzrtpcpp build dependency - * [#1883] Still some for loop test ambiguity (while loop instead) - * [#1883] Fix for loop initial test ambiguity (use while loop instead) - * [#1883] We must discard data in urgent ring buffer if data is get in - mainbuf - * [#1883] Fix availForGet same id for ringbuffer and readpointer - * [#812] Match "sips" as a Direct IP Call when the user enter a sip - uri - * [#812] Fix segmentation fault related to SIP URI creation. - * [#812] Towards integrating multiple tls listeners at the same time. - This - * [#1883] Add debug messages in conference and fix mainbufferTest - * [#812] gkt-ui fix. Private key must be fed as a filename and not as- - is. - * [#812] TLS integration within sipvoiplink and pjsip. Also, - configure.ac - * [#1883] Fix Alsa/Pulse mallocation - * [#1883] Fix data corruption in AudioRtp's micData buffer - * [#812] Full dbus integration for all the tls related options under - gtk-ui. - * [#1883] Fix memory leaks in audiortp session - * [#1883] Fix mem leaks in audio rtp - * [#812] Fix setAccountDetails where TLS_ENABLE was set to the value - * [#812] Small gtk-ui fix. - * [#811][#812] Small gtk-ui fix. - * [#812] Introduced a mechanism for configuration files that makes - possible - * [#812] New dbus bindings added. Also, configuration compliance was - enforced - * [#1881] Remove default buffer from MainBuffer (update unit-tests) - * [#1881] Add ring buffer read pointer tests - * [#1883] Fix issues in ringbuffer reader pointers - * [#2034] Implementing a new configuration dialogue for TLS transport - settings - * [#1883] Add some usefull debug and safety checks - * [#2028] Notify the client with libnotify when the zrtp negotiation - failed. - * [#811] Harmless no to throw an exception, an makes the application - less - * [#2028] A minidialog is showed to the user under sflphone-client- - gnome - * Removed useless file. - * Ignoring Makefile in src/widget - * [#2027] Fix segmentation fault when showMessage callback is called - after - * [#2026] keyExchange was set to ZRTP instead of "1" - * [#2024] Fix the wrong summary at the end of the assistant. - * [#1883] Fix mnagerimpl conference map insertion - * [#1883] Add Mutexes in MainBuffer - * [#811] Gtk ui was not presenting the right information about zrtp - for - * [#2023] security icons were not installed in sflphone-client-gnome. - * [#2021] Fix a mistake in the readme from sflphone-common that gives - wrong - * [#811] The current SRTP mode was not properly displayed for the - IP2IP - * [#1743] Re-implementation of the "automatically remove error dialogs - [...]" - * [#2017] [#2019] Fix the inability to dial a number and place a - registered - * [#811] Final re-integration of ZRTP support in the main branch from - 0.9.6 - * [#1883] Fix map insertion methods - * [#811] Combo box now is now set to the active key exchange method - * [#811] ZRTP options now configurable back again from the Gtk UI. - IP2IP - * Updated hostname for git clone - * [#1883] Add minimal functionalities to create a conference - * [#811] re-integration of all the methods and signals on dbus. - ManagerImpl - * [#811] Got out of a precarious position were nothing would compile. - * [#1976] Build documentation squeleton with docbook - * [#1883] Add sflphone-client "addParticipant" button for conference - * [#1994] Better organize the source directory structure. New - subdirectories - * [#1883] Add a simple Conference class - * [#1882] Use static audio buffer in Pulse and ALSA layer (instead of - malloc) - * [#811] First commit toward re-integration and refactoring of ZRTP - * [#1882] Flush RTP ring buffer before entering mainloop - * [#1882] Fixed MainBuffer::UnBinCallID() in case there is no - ringbuffer - * [#1882] Test (and fixe) high level conference and mixing - functionalities - * [#1772] Apply patch to compile on fedora (sent by Marcin - Zajączkowski <mszpak@wp.pl>) - * [#1882] Update Bind, unBind call_id in MainBuffer - * [#1959] This adds the ability to store password as an MD5 Hash in - the - * [#1538] Fixes rules compilation - * [#1930][#1931] Fixed a mistake (again) related to index and - credential count - * [#1753] Remove ILBC from pjproject - Hacks in pjsip - * [#1930][#1931] Credential was not selected properly using realm - * [#1882] Finilize multiple reading pointer in RingBuffer - * [#1538] Remove configure from autogen.sh to respect debian upstream - authors policy - * [#1773] Remove generated files from repo - * [#1791] Use XDG_CACHE_HOME to save pid file - * [#1791] Fixes path to save history - * [#1791] Fix debian installation scripts - * [#1930][#1931] Settings are now taken into account in the server. - * [#1882] Add ringbuffer default ring buffer pointer in methods - involving mStart - * [#1882] Add default ringbuffer pointer - * [#1882] Add RingBuffer multiple read pointer basic functionnalities - * [#1882] Fix MainBuffer flushData unit test - * [#1930][#1931] Ability to save and retreive the configuration from - * [#1882] Added Multiple CallID mapping to MainBuffer - * [#1791] Not much - * [#1791] If XDG env variables are not null but empty, use default - ones - * [#1791] Make XDG_CONFIG_HOME writable - * [#1930][#1931] Partial commit. Not working yet. Cannot delete - account - * [#1881] Fixed alsa capture latency problem - * [#1881] Fixed Alsa capture temporarily - * [#1930] [#1931] Partial unbroken commit providing the ability to - * [#1881] MainBuffer implemented in AudioLayer/AudioRTP - * [#1881] Add discard and flush unit-tests - * [#1881] Add discard and flush functionnalites to MainRingBuffer - * [#1881] Add availForGet in MainBuffer - * [#1881] Add availForPut function to MainBuffer - * [#1880] Remove AudioRTP* pointer from SipVoIP (reapered while - merging master) - * [#1881] Add a map between call id and coresponding ring buffer - * [#1855] Refresh pot file and upload on Launchpad - * [#1881] MainBuffe now robust to false ids on getData and putData - * [#1881] Fix big big big memory leak - * [#1881] Add getData and putData to mainBuffer - * [#1881] Unit-test basic ring buffer functionnaities - * [#1881] Add class MainBuffer and basic buffer creation unit-tests - * [#1880] Fix call transfer (step2) issues - * [#1880] Moved AudioRtp* pointer from SIPVoIPLink to SIPCall class - * [#1791] Add postinst script to keep user data when migrating - config/history file - * [#1797] Make pjsip compile - * [#1777] Code indentation - * [#1791] Use XDG_DATA_HOME and XDG_CONFIG_HOME for sflphonedrc and - history + unit tests - * [#1746] Useless space does not appear anymore when volume sliders - and - * [#1643] GtkCheckMenuItem is used instead of icons for elements in - the - * [#1110] [#1668] STUN parameters are now located in the preferences, - under - - -- Julien Bonjean <julien.bonjean@savoirfairelinux.com> Fri, 06 Nov 2009 11:23:15 -0500 - -sflphone-client-kde (0.9.6-SYSTEM) SYSTEM; urgency=low - - ** 0.9.6 ** - - * Documentation on echo test - * [redmine_down] codec names not displayed in total - * [redmine_down] crash when hanging up a dialing call because tries to - add it to history whereas no starttime - * [#1927] alternate every time screen changed to call history - * [#1886] clean code - * [#1886] debug messages when loading history removed - * [redmine_down] sflphone-kde icons - * [#1855] Update language files - * [#1502] Update version number - * [redmine_down] setHistory at close - * [#redmine_down] Handle PJ_DECLINE_SC as failure - * [#1923] Fix segmentation fault when adding a new account - * [#1923] Check on iterator before setting the config - * [#1904] Added mnemonic to tabs in sflphone-client-gnome. - * [#1905] The daemon was not sending the currentSelectedCodec signal - on dbus when answering a call. - * [#1922] Default values set to all account details - * [#1886] Spinbox reg expire enables apply, and address book is not - visible when disabled - * [#1905] Bug fix for segmentation fault caused by an empty string, - * [#1910] Warnings in test directory - * [#1919] Error fixed - * [#1855] Update russian translation - Hussein Abdallah - * [#1910] Remove files - * [#1919] fixed - * [#1777] Code indentation - * [#1918] fixed - * [#1917] fixed - * [#1910] Remove warnings compilation in src - * [#1886] removed AccountListModel in configskeleton - * [#1914] - * [#1911] check previous and new port - * [#1910] Remove compilation warnings in src/dbus and src/history - * [#1910] Remove compilation warnings in src/audio - * [1855] Update german translation - Sven Werlen - * [#1909] removed - * [#1906] Done - * [#1904] The registration expire value is now configurable from the - * Cleaned up debug messages. - * [#1886] separated initCallItem in two functions - * [#1886] reversed error in commit - * [#1886] clean debug - * [#1886] changed Name of classes and files - * [#1886] clean - * [#1870] In call_state_cb (dbus.c:126), _time_stop was overridden by - the actual time. - * [#1884] Added some new gpg flags to prevent tty warnings - * [#1886] Clean audio config dialog - * [#1886] No more compile warnings. + 1 comm - * [#1872] Check if the user input is smaller than PJ_MAX_HOSTNAME. - * [#1886] - * [#1785] Fixed build when no new commit - * [#1852] If chosen by the user, the hostname can now be solved and - used - * [#1871] * and # inverted back - * [#1869] Conditional compilation that checks if - * [#1309] removed test in main - * [#1425] Put actions in SFLPhone window class instead of ui view, - made a separate toolbar for screens. - - -- SFLphone Automatic Build System <team@sflphone.org> Mon, 27 Jul 2009 09:53:00 -0400 - -sflphone-client-kde (0.9.6~rc2-SYSTEM) SYSTEM; urgency=low - - ** 0.9.6~rc2 ** - - * [#1755] Remove generated file - * [#1753] restore ilbc ... - * [#1866] Methods getSipPort and setSipPort now have an effect on the - * [#1753] make pjsip compile without ilbc. Use ./autogen.sh --disable- - ilbc-codec - * [#1855] Fix error in russian translation - * [#1805] Remove the old flawed signal mechanism which was failing in - * [#1855] Refresh translation - * Spanish translation finished + po README files updated + echo's in - copy-in-clients - * [#1850] Yun made the chinese HK-CN translation - * [#1848] Fix transfer interface bug - * [#1862] At install, kde client installs only french translation file - * [#1841] A new fallback mechanism was added to the internal resolver - in PJSIP. - * Started AccountList model/view - * [#1855] Remove po subdir in Makefile.am - * [#1855] Fix typo error in sflphone-client-gnome - * [#1855] Do not generate Makefile in sflphone-common/po - * [#1855] Copy translation files into both clients dirs - * [#1855] Remove po dir from sflphone-common - * Comments added - * [#1860] mailbox->voicemail... - * make scripts executable - * [#1855] French translation - * [#1855] Chinese zh_HK partially filled... - * [#1859] An unnamed pipe monitored by poll() was added. When we want - to - * [#1855] Sven completed the first part of the german translation - * [#1855] Cantonese manually filled for already translated, almost - equal strings - * [#1855] Merge russian translation - * [#1855] Spanish manually filled for already translated, almost equal - strings - * [#1855] Update german translation in ./lang/de - * [#1858] This problem was fixed by removing a useless line in - * [#1855] merged existing translations in lang/ sflphone.po's - * [#1842] [#1843] An attempt at improving the expected behaviour that - can't - * [#1855] added po folder in gnome client and scripts for copying from - common lang folder to clients - * [#1853] Edit before call does nothing on call history - * Put most language entries possible in common. From 300 to 250 - entries. Stays underscores problem. Scripts for copy in clients. - * commit to merge master - * [#1825] Changed "Bad authentification" to "Authentication Failed". - * common po files - * [#1753] Remove ILBC from pjproject - - -- SFLphone Automatic Build System <team@sflphone.org> Fri, 17 Jul 2009 19:12:44 -0400 - -sflphone-client-kde (0.9.6~rc1-SYSTEM) SYSTEM; urgency=low - - ** 0.9.6~rc1 ** - - * Update some version number - * [#1792] Creates .sflphone directory with permission 600. Also, - "chmod 600" after - * [#1810] GUI is now notified that the call failed. Also, a segfault - was - * [#1816] Address book search disabled when disabled address book and - enabled it back plus button stays triggered - * codeclistmodel + asynchronous loading of address book + - enable/disable address book - * [#1810] Now checking SDP answer after 200 OK. Still need to - implement full - * [#1794] Can't use the interface during a call - * Updated translation files - * Russian translation integrated - * Codec list model/view started. - * [#1807] Add configure.ac in pjproject-1.0.3 - * [#1787] closeRtpSession added in some places where it should have - been - * Use Item class for contacts and accounts - * Comments + clean code - * [#1794] Improved debug messages - * [#1805] Replaced the old and unreliable mecanism that was was - waiting for - * [#1794] Can't use the interface during a call - * [#1787] For those cases where no registered SIP account is - configured - * [#1797] Make pjsip compile - * [#1787] Minor changes. Removed useless commented line. Changed order - of - * [#1777] Code indentation - * [#1797] Update package generation with new pjsip version - * [#1798] Does not hang up when the call is building up - * [#1797] Update .gitignore with new pjsip version - * [#1797] Remove generated files from repo - * [#1797] Main build system now uses pjproject-1.0.3 - * [#1797] Add pjproject-1.0.3 - * [#1797] Remove pjproject-1.0.2 - * [#1796] Computing time optimization (samplerate conversion) - * [#1787] _audiortp->start() moved away from offhold(), - SIPCallAnswered() - * [#1312] Added new states for calls initialized by other clients - * [#1795] Crashes when adding a new account, checking it and applying - * [#1782] Missing icons - * [#1793] KDE client compilation problem - * Fake ringtone files can no longer be set. - * indentation - * [#1312] Able to fetch to differentiate incoming/ringing call state - * [#1784] Use DESTDIR variable in po Makefile - fix language file - installation - * [#1785] Fixed typo - * [#1785] Fixed changelog update - * [#1759] ./autogen.sh --prefix=/usr --with-debug to use optimization - level 0 - * [#1773] Changed snapshot naming convention - * [#1773] Removed gpg agent use, added repository cache cleaning - * [#1759] Use optimization level 0 for repository, 2 for packages - * [#1777] Code indentation/formatting - * Translated new features in french - * [#1785] Added missing changelog entry - * [#1781] Window title is SFLPhone - * [#1777] Add code indentation/formatting in the buil system - * [#1774] Can't set voicemail number in KDE account creation wizard - * [#1775] Can't modify account information for account created with - the wizard - * [#1771] Add a "Default" button in context menu to disable chosen - prior account - * [#1705] - * [#1224] Remove generated file from the repo - * [#1224] Remove generated file from the repo - * [#1762] distclean target should remove kconfig generated files - (settings.h, settings.cpp). Rename them? - * [#1761] clear history button should really clear history - * Dialpad works. - * Implemented Dialpad widget instead of building it in main view. - * Removed last occurence of the old config dialog, that made the build - crash. - * [#1755] Do not consider G722 as a dynamic payload elsewhere than in - RTP layer - * [#1753] Remove ilbc Makefile generation - * [#1756] Implement a kde configuration dialog with kconfig xt and - kconfigdialog class - * [#1755] fix audiocodec folder parsing problem - * [#1450] Reinit timestamp comparison in RTP, create session in - newOutgoingCall - * [#1753] Remove milenage third party code from pjsip - * New Config Dialog integrated in GUI.(without codecs) - * [#1753] Remove ILBC codec - * kconfig started, tr2i18n -> i18n, icons folder, accountList changed - * [#1705] Fixed Audio RTP thread creation/start - * [#1714] Fix codec negociation result handling - * [#1678] Fix audiortp payload setting - * [#1678] Put bac putData method in rtp - * [#1669] gtk_file_chooser_get_filename() support UTF-8 by default - * [#1735] Add conditions to sdp update call if call declined - * [#1737] substr of recordings destination folder to remove "file://" - should be done in client rather than in daemon - * [#1731] Enlarge audio stream buffer size - * [#1714] Missing true - * [#1317] Fixed Mandriva timeout - * [#1317] Changed tag convention - * [#1317] Cleaned git-dch - - -- SFLphone Automatic Build System <team@sflphone.org> Fri, 10 Jul 2009 15:49:56 -0400 - -sflphone-client-kde (0.9.6~beta-SYSTEM) SYSTEM; urgency=low - - ** 0.9.6~beta ** - - * spec files for mandriva and opensuse updated with buildrequires - libqt4-dev >=4.3 - * [#1700] Cannot build on ubuntu 8.10 and a few other distribs - * [#1502] Update version number where applicable - * [#1642] Update client icons - * [#1450] Clean up useless debug and comments in sipvoiplink and - audiortp - * [#1450] Remove Semaphore object in AudioRtp thread deletion - * [#1450] Audio RTP init now synchronized with Sip/SDP - * [#1693] kde client crashes when changing codecs order/activation - * [#1450] Deep refactoring of audiortp - * [#1450] setRtpSessionRemoteIp - * [#1689] getCallList at start - * [#1224] Change path in package files - * [#1450] Audio RTP initialized only once, payload and remote ip set - at runtime - * [#1450] Add setRtpSessionMedia and setRtpSessionRemoteIp address - * [#1642] Make GNOME GUI fresher and younger ;) - * [#1686] Status bar displaying used account - * added sflphone-kde icon so that it compiles - * [#1659] Ending a call causes the daemon to crash - * corrected introspection XMLs, po files... - * [#1211] g722 media descriptor in codecDescriptor - * [#1310] Install sflphoned in $(prefix)/lib/sflphone - * [#1502] Do not install test binaries and dbus utilitaries - * [#1224] hack for pjsip build system! - * [#1224] Remove pjsip binaries from repo - * [#1224] Upgrade to pjsip 1.0.2 - * [#1658] About SFLphone (bugs) - * [#1658] About SFLphone - * [#1660] Displaying all dialed numbers in a call - * Tested status bar. - * [#790] Optimize pulse audio streams parameters - * [#1678] Some usefull debug messages for mutex/semaphore deadlock - problem - * [#1669] Add/remove some usefull/unusefull debug - * [#1665] Fix latency related to pulse audio stream openning/closing - * [#1457] Make the menus and panels accessible in french - * [#1457] Improve broken keyboard accessibility in menus and conf - panels - * [#961] Instanciate only once the searchbar icons - * [#961] Restore transfer fonction - * [#961] Filter on the history type OK - * [#961] Fix compilation problems on hardy/intrepid - * [#1157] Commit missing files - * [#790] Reduce number of start/stop streams call on pulse audio - * [#1639] kde client crashes when no account registered - * [#1620] Fix the searchbar - * [#1620] Get back caltree as it was during gtkcritical area - * [#1620] Add history filter reinit function - * [#1335] Add a missing label in address book preferences - * [#1561] Update russian translation - Hussein Abdallah - * [#1605] Fix edit menu french translation - * [#961] Enable to search in the history according to the call type - * [#1449] Searchbar does not work anymore - * [#961] Add popup menu on the entry primary icon for history - * [#1317] Fixed KDE client package dependency - * [#936] speex 32 khz integration completed - * [#936] Use 320 frame size - * [#936] Test using a frame size at 320 smpls - * [#1214] Enable / Disable history - * [#1607] Fix compilation problem for ubuntu 8.10 (libsexy) - * [#1313] Implement processDataEncode processDataDecode in audiortp - * [#1613] codec list order can't be set - * Better handling of localisation + added languages + corrected - warnings + begginning of new config dialog with kconfig + 14px - account leds - * [#1214] Save and load history according to the limit timestamp + - unit tests - * [1609] Fix call number copy/paste feature - * [1607] Restore clear action icon in searchbar - * [#936] Try to decode using 1280 samples - * [#936] Add some debug - * [#936] Add .cpp file - * [#936] Oops Forgot speex 32 khz - * [#1214] Add configuration panel for history + D-Bus calls - * [#1313] Test rtp thread function, frame size, nbbytes, resampling - * [#790] Flush audio data before closing audio streams - * [#1214] History displays local time - * [#1214] Skip empty field on display - * [#1214] Associate an account to an history entry - * [#1342] Get addressbook options sensitive/non-sensitive - * [#1211] Clean up and comments - * [#1211] Get back to 20 ms framesize - * [#1211] Use sendImmediate instead of putData in RTP - * [#1211] Fix nb byte available in RTP - * [#1211] Clear condition on maxNbSamples in RTP - * [#1211] Fix max byte available in RTP session - * [#1211] G722: Use 160 samples per frame instead of 320 - * [#1211] Test using a dynamic payload - * [#1211] Test using a dynamic payload type - * [#1211] Rename size variable (nb_samples, nb_bytes) - * [#1211] Test g722 ip-to-ip sending twice the data lenth - * [#1211] Test g722 ip-to-ip - * [#1214] Do not select an history item by default at startup - * [#1214] Remove some compilation warnings - * [#1214] Handle empty field - remove g_print - * [#1214] Add each history item only once - * [#1214] Handle call timestamps properlier - * [#1214] Do not need timestamp files anymore - * [#1214] Use the saved date for history entry - * Clean up - * [#1214] Client doesn't crash if the D-Bus call fails - * [#1214] Client is able to save its history - still some glitches - * [#1211] Forgot 16000 for g722 - * [#1211] G722 initialization - * [#1214] Save name/number, successfully load the history if no fields - are empty - * [#1499] Fixed destination directory bug - * [#1214] Restore all the functionalities; peer name/number way more - easy to handle !! - * [#1214] Add callable_object instead of call_t, refactoring - * [#1211] Test with polycom soundstation 16000 - * [#1211] Remove C like inline function in g722 codec - * [#1342] Finalize gnome client preference window formating - * [#1214] Retrieve the history when the gnome client startsup - * [#1306] Implement localization for KDE client - * [#1593] enable accounts apply button when account checked/unchecked - * [#1214] Implement the dbus calls on server side - * [#1214] Add serialized/unserialized functions to pass data on DBUS - * [#1342] Formating gnome client configuration windows - * [#1214] Save sucessfully a map of history items - * [#1499] Removed multiple jobs compilation for KDE client (2) - * [#1214] Load history from file into memory, add unit tests - * [#1534] Throws a length_error exception in case URL exceeds - std::string max_size - * [#1499] Removed multiple jobs compilation for KDE client - * [#1565] make account leds smaller - * [1430] Fix dbus debug - * [#1562] crashes when trying to change item of a call of state "OVER" - * [#1116] Fix compilation bug - * [#1317] Added mandriva and opensuse-11 64 bits - * [#1108] Add messges in main window concerning transfer success - failure - * [#1116] Fix compilation problems - * [#1211] g722 Makefile - * [#1108] Client side transferFailed/trasferSucceded signals handling - * [#1211] G722 mostly completed, - * [#1555] make bigger toolbar (24x24) - * [#1551] remove default mailbox number in wizard and disable mailbox - button when first account doesn't have mailbox number - * [#1342] Re-add sflphone manpages - * [#1116] Fix compilation on non-jaunty distros - * [#1317] Fixed opensuse startup sleep - * [#1108] Add a signal in the client to notify successful or failed - transfer - * [#1108] Dbus signals concerning call transfer success/failure - * [#1317] Added opensuse to automatic build system - * [#1223] Fix manpages bug - * [#1060] german translation glitch - * Clean up some gnome client warnings - * [#1547] replace ugly account leds by beautiful icons - * [#1548] add close button that hides windowand just hide on clicking - the cross - * [#1549] put introspec XMLs in the client's source - * [#1312] Implement getCallList D-BUS method - * [#1116] Clear text in history and contacts - * [#1499] KDE integration - * [#1469] Modify header linkers in dbus-c++'s Makefile.am's - * [#1469] Remove examples folder from dbus-c++ - * [#1214] History integration in build system; unit test squeleton - * [#1317] Cleaning - * [#1469] Remove configure stuff in dbus-c++ - * [#1469] Add unofficial mainline dbus-c++ - * [#1469] Remove dbus-c++ from freedesktop - * [#1430] Bring account changed signal/callback back to normal - * [#1060] Update german translation - Sven Werlen - * [#1430] Add marshaller one string define - * [#1430] Send account change signal broadcast using account id - * [#1430] Remove condition on setRegistrationState, cause stun to - crash - * [#1317] Centralized version handling - * [#1317] Fixed version number on sfl-git-dch - * [#1317] Refactoring for new distributions - * [#1215] Fix account order at startup if latency - * [#1088] Restore sip dns srv - * [#1214] Add squeleton for history manager - * [#1430] Add accout id to accout changed method - * [#1430] No connectionStatusNotification (account changed) if no - changes - * [#1538] Add COPYING file - * [#1430] Add audio rtp thread tests - * [#1317] Changed version detection - * [#1538] Document license in libs/stund - * [#1317] Added version files - * [#1538] Apply François patches - debian packages - * [#1317] Updated spec files - * add files - * [#1538] Apply François patches - debian packages - * [#1535] Change program file structure (directory src...) - * [#1317] Updated build system scripts - * [#1317] Cleaning - * [#1317] Copied introspect files to gnome client - * [#1317] Added opensuse to build-system : first-shot - * [#1317] Remove spec files from configure - * [#1317] Added missing prefix - * removed debug for daemon account fix - * [#1430] Add a connection reference which most likely belong to - libdbus - * [#1430] Use shared connection instead of private - * make daemon find the account, added userMatch - * Clean code, add comments... - * [#1317] Fixed packaging rules - * [#1317] Updated autogen - * Updated autogen.sh for pjsip - * [#1526] Set accounts order - * [#1317] Fixed pjsip lib dirs - * [#1317] Updated debian packaging for new pjsip configuration script - * [#1317] Switch to autogenerated guess and sub files - * [#1317] Updated pjsip inclusion in build system - * [#1317] Replaced pjsip guess and sub files - * [#1317] Fixed compilation issues on opensuse 11 - * [#1505] account list seem to crash the application when clicking - Apply very fast... - * [#1456] Add a flag to be replaced in the control files - * [#1456] Added version dependancy handling - * put account alias in AccountWidgetItem rather than in the item with - " " before. - * [#1034] The KDE client should start sflphoned if it is not started - * [#1500] Handle options for notifications and display on incoming - call. - * [#1443] Client should not crash when receive an unexpected - stateChanged signal - * [#1403] Do not stop the notification anymore - * [#1456] Added version dependancy handling - * [#1426] Daemon crashes when get alsa plugin - * [#1422] Improved error messages - * commit for merge - * [#1424] Change logo in tray icon and put a different one when - incoming call - * [#1425] first part done, window title... - * [#1413] add manpages creating and installing in build system - * [#1417] The client should start the account creation wizard if - started for the first time (if config file doesn't exist) - * [#1421] Make volume bars horizontal when dialpad is hidden. - * Changed main window title and fixed a mistake in sflphone_const.h - * [#1412] make debian package building work - * changelog changed. - * Changed addAccount method in gnome client. - * Debian and man folders added. - * [#1388] Change project name from sflphone_kde to sflphone-client-kde - * Better handle of kabc check. - * [#1351] Automatic generation of dbus interfaces in makefile - generated by cmake - * [#1307] Implement "edit before call" in history and address book. - * [#1344] change action_call label in call history from "call" to - "call back". - * [#1308] Implement Hook feature in kde client - * Improved build system. - * #1219 : Add address book configuration page - * Better handling of registration to the daemon. - * #1039 : Add tray icon in kde. - * Issue no 1216 : Double click on item in history or address book - causes call. - * display peer name in call list and call history when called from - address book. - * Address book functionnal with photo displayed. - * Help menu kde available but actions disappeared. All fonctions in - view. - * Address book functionnal but ugly and making its own sort in the - complete address book. - * Account choice on right click, clean out includes, page address - book, fixed bugs... - * Wizard, double click, context menu... - * Removed sflphone_kde.kdevelop.filelist - * Added account creation wizard and translated interface in english. - * Transfer functionnal but ugly. - * transfer not functionnal - * Bug fixed : unholding (UNHOLD_CURRENT, UNHOLD_RECORD) - * Commit functional for push. With install.sh - * Before merge. - * Problem with enable accounts. Account display increased. - * Functional with codec order working , playDTMF. - * Commit functional. - * sflphone_kde/build added in .gitignore. - * complete commit for checkout previous. - * Commit before checkout previous version to check the display - bug(little font everywhere...) - * Functionnal client. Rest : history icons, config icons and - functionalities - * commit before merge asavard for isRecording. - * Call and Automate fusion done and seems to work. - * Commiting before putting Automate class in Call class. - * Functionnal main window without recording, history, voicemail, kio - widgets. - * client kde avec kdevelop. - * Config Dialog almost finished. - * Base of QT client - - -- SFLphone Automatic Build System <team@sflphone.org> Tue, 23 Jun 2009 11:12:06 -0400 - -sflphone-client-kde (0.9.5-SYSTEM) SYSTEM; urgency=low - - ** 0.9.5 release ** - - * [#1060] FIx bug in chinese translation - * [#1313] git add rtpTest.cpp rtpTest.h - * [#1313] Add init/close rtp tests - * [#1313] Basic instanciation of the rtp layer - * [#1449] Gtk-Critical concerning history filters and new calls - * [#1400] Make the match with the hostname instead of username - * [#1324] Change status bar label for "Using %s (%s)" - * [#1403] Icon size: 60x60 px - * [#1403] Do not remove notification, improve icon quality - * [#1403] Add smaller icon for gnome notifications - * [#1403] Prevent crash when hangup && no notification - * [#1403] Remove all actions on notifications; code refactoring - * [#1451] Use stun.sflphone.org as default STUN server - * [#1060] New po files - need to be translated - * [#1060] Update french translation - Rebuild template file - * [#1456] Add a flag to be replaced in the control files - * [#1454] Make cppunit optional; remove from build deps in control - files - * [#1401] Add libexpat1-dev dependency in control files - * [#1448] Take off these ugly debug messages - * [#1448] fixed getTelephoneTone and getTelephoneFile() called - repeatedly - * [#1406] add liblog4c-dev in build-depends - * [#1409] Restore .desktop icon - - -- SFLphone Automatic Build System <team@sflphone.org> Mon, 25 May 2009 11:34:40 -0400 - -sflphone-client-kde (0.9.5-SYSTEM~rc2) SYSTEM; urgency=low - - ** 0.9.5 rc2 ** - - * [#1422] Improved error message - * [#1402] Fix pjsip build - * [#1404] Clear GTK-Critical Bug at client startup - * [#1422] Added automatic VM shutdown when building on more than one - VM - * [#1422] Fixed some issues with new changelog generation script - * [#1422] Moved distribution update to specific file - * [#1422] Dropped git-dch, replace by home made implementation - * [#1402] Fix pjsip build - * [#1404] Clear GTK-Critical Bug at client startup - * Changes for name based dbus connection - * Clean changelogs - * [#1343] Gnome: Implement a callback system to handle focus on - different widgets - * Debus Session - * Refactoring Python code, PEP8 - * [#1430] Get back dbus_g_proxy_new_for_name - * [#1430] Get back DBUS_BUS_SESSION type - * [#1430] Dbus fixed owner message binding - * Second test with DBUS owner - * [#1404] Gnome -> Preferences -> Hooks - * [#1404] Gnome -> Preferences -> Recordings - * [#1404] Call History - * [#1404] Gnome -> Preferences -> Address Book - * [#1404] IF the first notification option disable the second - notification - * Dbus with fixed owner does not automatically start the deamon - * Add codec debug tests in pysflphone - * [#1407] Some print info - * [#1407] Add a scenario to pick_up action - * Test client dbus connection to a fixed owner - * Add python dbus test suite - * [#1161] Modified version handling in build system - * [#1314] Test pulse audio and audio streams connect and disconnect - * [#1402] Add info message after configure - * [#1402] Build the daemon with the local pjsip library (vs the - installed one) - * [#1009] Fix Codec Sampling Rate set to zeros - * [#1314] Add mutex to pulse layer audio streams - * [#1314] Refactoring pulseaudio stream to test connect disconnect - * [#1314] Refactoring of pulselayer to test conect/disconnect - * Add debug messages in debus calls concerning account - * [#1314] Add some return values to audio init functions - * [#1406] add liblog4c-dev in build-depends - * [#1409] Restore .desktop icon - * Bug #1405: Fix strings as requested. - * Bug #1404: Fix strings in preferences panel. - - -- SFLphone Automatic Build System <team@sflphone.org> Tue, 19 May 2009 12:08:03 -0400 - -sflphone-client-kde (0.9.5-0ubuntu1~rc1) SYSTEM; urgency=low - - [ SFLphone Project ] - * [#1262] Updated changelogs for version 0.9.5-0ubuntu1 Snapshot 2009- - 05-05 - - [ Emmanuel Milou ] - * Add some python CLI client code; not really functional - * [#1108] Fix peerHungup method for IP to IP call - - [ Alexandre Savard ] - * [#1108] Correct setting of SIP contact for direct IP call - * [#1108] SIP user agent handles incoming REFER - - [ Emmanuel Milou ] - * Remove website from repository - * Update translation - - [ Alexandre Savard ] - * Sflphone icon's tooltip changed for "configured" instead of - "registered" - - [ Emmanuel Milou ] - * Update translation - - [ Sflphone Project ] - - -- Sflphone Project <sflphone@mtl.savoirfairelinux.net> Tue, 05 May 2009 19:16:09 -0400 - -sflphone-client-kde (0.9.5-0ubuntu1~beta) SYSTEM; urgency=low - - [ Julien Bonjean ] - * Updated Eclipse stuff - * Improved addressbook config window - * Added sflphone Eclipse stuff - * Implemented addressbook list server side - * Moved dbus stuff in dbus directory - * Updated addressbook configuration - - [ Emmanuel Milou ] - * Remove unuseful installation scripts. Use apt-get build-dep sflphone - instead - * fix bug #1090 - - [ Alexandre Savard ] - * defining speex 16khz - - [ Emmanuel Milou ] - * Remove unuseful file from build system - * Start dns srv resolver - - [ Alexandre Savard ] - * Basic ogg/vorbis initialization - - [ Emmanuel Milou ] - * Handle incoming IP-to-IP invite correctly - - [ Alexandre Savard ] - * speex wideband 16000 - - [ Emmanuel Milou ] - * Better handling of incoming IP to IP call - * DNS SRV resolution functional - * Implement IAX2 incoming URL - * Allow user to make IP call without any accounts configured - * Add a contextual menu to edit a number from the contacts tab - * Add comments, tooltip and new button to the contextual menu - * add delete event, migrate to GTK 2.16 for sexy icons - * Resolve ticket #1118 - * Update suse spec file - * Add phone number cleanup functions, unit tests and panel - configuration - * Add pertinent test that fails - * fix dependencies for suse package - * Add contextual edit menu in history - #1120 - - [ Alexandre Savard ] - * Temporary comit: make speex wideband (16 khz) - * Temporary: shared object for speex narrow band - * Temporary: speex narrowband and wideband coexist - - [ Julien Bonjean ] - * Fixed bug when no book selected - * Fixed addressbook related compilation warnings - * Fixed GTK client remaining compilation warnings - * Fixed segfault when book removed since last sflphone run - * Fixed bug when book is unreachable (ldap error) - - [ Alexandre Savard ] - * Fix codec list in audio config window - * Active/inactive speex codec by payload - - [ Julien Bonjean ] - * Updated gitignore - * Added some comments - - [ Emmanuel Milou ] - * Add callto: handler script for browsers and al. - * Integrate test compilation in the daemon build-system - - [ Julien Bonjean ] - * Fixed g_object_unref warning for pixbuf - * Cleaned too verbose output - * Fixed toolbar update warning - * Added support for asynchornous books open (first shot) - - [ Emmanuel Milou ] - * Add a DBus call to fetch the call details from a call ID - Ticket - #928 - - [ Julien Bonjean ] - * Improved async open books - * Fixed bug #1139 - - [ Emmanuel Milou ] - * Add a way to save account order - * commit missing files - - [ Julien Bonjean ] - * Introduced log4c (ticket #1162) - - [ Emmanuel Milou ] - * Load/save account order functionnal - ticket #813 - - [ Alexandre Savard ] - * Add CELT codec (#1143) - * Make celt frame size 256 (*1143) - - [ Julien Bonjean ] - * Switched everything to log4c (ticket #1162) - * Updated eclipse settings - - [ Emmanuel Milou ] - * Restore adding account - ticket #1172 - * Add liblog4c dependecy - ticket #1179 - - [ Alexandre Savard ] - * Double maxAvailByte for frame size in rtp (#1143) - - [ Emmanuel Milou ] - * Add User-Agent SIP header - Ticket #1173 - - [ Julien Bonjean ] - * Fixed autoresize issue (#708) - - [ Emmanuel Milou ] - * Remove libcppuint dependency for the debian packages - * Look for libsexy only if gtk version < 2.16 - Ticket #1116 - * Remove libsexy dependency for jaunty. ticket #1116 - - [ Julien Bonjean ] - * Introduced unit tests (#1146) - * Updated gitignore - * Fixed Makefile (#1146) - - [ Emmanuel Milou ] - * [TICKET #1112] Add a test on the voice buffer to send through iax - packets - * Remove doublon in dependencies - * Remove warnings from the client test framework - * Update version number to 0.9.5~beta - * Update build-package script - * Add check dependency in build-deps control file field - * Create debian files for the new sflphone-client-gnome - * [TICKET #1212] Add Replaces field in control files - * [TICKET #1212] Fix manpages installation path - * [TICKET #1212] Add maintainer scripts to create alternatives - * [#1212] Update the manpages generation - edit preinst maintainer - script - * [#1212] Fix reference error in manpage - * [#1212] Add missing files on the client side - * [#1212] Fix debian docs files - no TODO file - * [1212] Fix manpage creation problem - * [#1220] Generate client-side glue files and marshaller at - compilation time - * [#1220] Generate server-side glue files at compilation time - * [#1212] Change binary name to sflphone-client-gnome - * [#1212] Update .gitignore to fit the new working tree - * [#1220] Explicitly generate glue files before building the library - * [#1220] Compile dbus directory before audio - * [#1212] Create sflphone-common at the root of the repository - * [#1212] Re-add pjproject - * [#1212] Remove Makefile from repo - * [#1220] Fix Makefile.am - * [#1212] New working directory functional - * [#1212] Update .gitignore - * [#1212] Hack to make pjsip compile.. - * [#1220] Use non-installed binary for dbusxx-xml2cpp - * [#1212] Add descriptive files, remove unuseful scripts from tools/ - - [ Alexandre Savard ] - * Restore speex codecs - * add frame size for celt (#1143) - * add framesize to codec, independant from audiolayer (#1143) - * use codec frame size in rtp (#1143) - * compute fixed_codec_framesize (#1143) - * do not resample if not required (#1143) - * add condition on resampling for decoder (#1143) - * add a condition on bytesAvail == 0 from mic data - * no maximum in rtp decode (#1143) - * compute maximum for decoding (#1143) - - [ Emmanuel Milou ] - * [#1146] Implement unitary tests on the client-side - - [ Alexandre Savard ] - * use float instead of int to compute max nb of sample (#1143) - * add nbSampleMax for unresampled data (#1143) - * make thread sleep during 5 ms insead of 20 (#1143) - * use unix usleep (#1143) - * 50 usecond thread!!!!! (#1143) - * try with the smallest compression (#1143) - * use timer set at framesize (#1143) - - [ Emmanuel Milou ] - * [#1161] Restore changelog version - - [ Alexandre Savard ] - * Remove celt stuff - - [ Emmanuel Milou ] - * [#1161] Update changelog - * [#1220] Add Conflicts: sflphone in debian control files - * [#1179] Add liblog4c3 runtime dependency - * [#1212] FIx typo error in dependency list for itnrepid - * [#1212] FIx .desktop file to point on the right exec - * [#1212] Modify changelog replacing tag - - [ Sflphone Project ] - * "[#1262] Updated changelogs for version 0.9.5-0ubuntu1~beta" - - [ Emmanuel Milou ] - * [#1212] restore changelogs - - [ Sflphone Project ] - * [#1262] Updated changelogs for version 0.9.5-0ubuntu1 Snapshot 2009- - 04-27 - - [ Emmanuel Milou ] - * [#1212] restore changelogs - - [ Sflphone Project ] - * [#1262] Updated changelogs for version 0.9.5-0ubuntu1~beta - - [ Emmanuel Milou ] - * [#1212] restore changelogs - - [ Sflphone Project ] - - -- Sflphone Project <sflphone@mtl.savoirfairelinux.net> Mon, 27 Apr 2009 16:57:00 -0400 - -sflphone-client-kde (0.9.4-0ubuntu2) SYSTEM; urgency=low - - [ Alexandre Savard ] - * Restore speex and GSM detection - - [ Emmanuel Milou ] - * Fix bug #1090 - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Wed, 8 Apr 2009 11:29:15 -0500 - -sflphone (0.9.4-0ubuntu1) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Integrate DBus-c++ and libiax2 in the main build system - * Clean up in the working repository - * Reorder hooks configuration panel - * Protect case when no codecs are active - * Fix some return values - * Add unitary tests for the hook manager (premisces) - - [Yun Liu] - * Update chinese translation - - [Sven Werlen] - * Update german translation - - [Hussein Abdallah] - * Update russian translation - - [Maxime Chambreuil] - * Update spanish translation - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 3 Apr 2009 18:29:15 -0500 - - -sflphone (0.9.4-rc1) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Fix bug while trying to hold/unhold several simultaneous call - * Improve address book build system - * Implement SIP url popup on incoming call - * Improve GTK+ panel configuration - [ Julien Bonjean ] - * GTK+ client refactoring - * GTK+ clean up - * Address book improvment - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 27 Mar 2009 18:29:15 -0500 - -sflphone (0.9.4-0beta1) SYSTEM; urgency=low - - [ Alexandre Savard ] - * Display codec used during conversation on the GUI - * Enable/disable STUN parameters at runtime - * Refactor search bar use - [ Emmanuel Milou ] - * Build system fixes - * Implement SIP re-invite - * Implement IP to IP call - [ Julien Bonjean ] - * Integrate GNOME address book based on evolution data server - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 20 Mar 2009 18:29:15 -0500 - - -sflphone (0.9.3-0ubuntu3) SYSTEM; urgency=low - - [ Alexandre Savard ] - * Both playback and record streams in PA_STREAM_CORKED (pulseaudio) - * Use PLUGHW device for ALSA capture - * Functional IAX and SIP recording for voicemail - * Use the less CPU-consuming interpolator algorithm for resampling - * Display in GTK GUI the codec used in conversation - * GTK GUI use ASCII instread of utf-8 - * Add record menus in GTK GUI - * Put on hold when dialing a new number - * AccountID's are saved in the history - - [ Emmanuel Milou ] - * Integrate DBUS C++, libiax2 in the git repository - * Update website - * Use libspeexdsp only if available on the system - * Updated .gitignore file - - [Cyrille Béraud] - * Account assistant manager improvment - * Add an email request when creating a new account to receive voicemails - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Sat, 14 Feb 2009 13:29:15 -0500 - -sflphone (0.9.3-0ubuntu2) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Add compilation note in README - * Use default ALSA plugin for capture - * Fix the ALSA capture problem one more time - * Clean up debug messages in dbus.c - * Add libspeexdsp dependency - * Remove implicit declaration compilation warnings - * Fix links in the website, add release note - * Change capture for the website front page - * Add alsa devel dependency in build-depends control file field - * Clean up, indentation, try to handle latency problems in iax/pulseaudio - * Remove pjsip generated files from the repo - * Use the previous declared curAlias function in accountwindow - * Fix bug in history call duration when the call fails - * Remove runtime warning in the GTK+ client - * Add librsvg2-common dependency to load SVG under KDE - * Refresh .gitignore - * Update locales files + french translation - * Add configuration panel for future noise reduction - * Add configuration panel for audio record module - * Daemon less verbose; accounts don't try to access STUn options anymore - * Fix typo in configwindow - * Add content in the official website - * use a GTK_STOCK icon for the record button - * Complete description text in the assistant manager - * Add libtool flags in client configure.ac - * Remove unuseful dependency (snd) - * Fix SIP transfer problems - * Remove previous version of PJSIP from the repo - * Upgrade PJSIP to version 1.0.1 - * Add the new website source in the repository - * Use libspeexdsp for silence detection only if available - - [ Loïc Faure-Lacroix ] - * Ajout du logo gpl3 - * Ajout des images - * Ajout de la section screenshot pour le site - * Ajout du favicon dans le header - * Modification des cartes - - [ Alexandre Savard ] - * Clean up <speex/libspeexdsp> - * Small cleanup - * Save Wave fixed - * Fix new call button when recording - * libspeexdsp added - * Recording: default home folder at startup - * Minor changes to config window - * IAX recording fixed - * Set / get recording path, still need some GTK for client - * AudioRecord file name format - * Now recording in HOME folder - - [ Cyrille Béraud ] - * Fix bug in reqaccount.c - - [ Maxime Chambreuil ] - * Update spanish translation - - [Yun Liu ] - * Update chinese translation - - [ Hussein Abdallah ] - * Update russian translation - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Sat, 14 Feb 2009 13:29:15 -0500 - -sflphone (0.9.3-0ubuntu1) SYSTEM; urgency=low - - * Remove debug - * Join thread before leaving - * Fix implicit declaration in reqaccount - * Add REST code to build the request to server - * Fix GValue initialization warnings - * Update version number, fix implicit declaration, fix GTK markup - warnings - * Apply patch to create custom SIP account from our own server - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 06 Feb 2009 19:17:32 -0500 - -sflphone (0.9.2-2ubuntu9) SYSTEM; urgency=low - - [ Alexandre Savard ] - * Speex audio codec preprocessing initialization - * peer hung up segmentation fault solved - * Stop recording when transfering - * Terminate only one call - * Add isRecording() function - * Fix call_icon GTK client - * Fix SIPCallClose() function, recorded file now close properly - * Function terminateSIPCall added in sipvoiplink and managerimpl - * Fix thread destructor - * setRecordingOption function implement in audiorecord - * Record now implemented in Call class - * Record interface complete (on hold erase previous recording) - * Added recButton in client - * Added: record button related icons - * Record button added - * Overload AudioRecord::recData to get mic and speaker data mixed - * Recording now in audiortp::run() method - * Audio recording working in AudioRTP: receiveSessionForSpeaker - * Open/close a wave file when pulse audio stream start/stop - - [ Emmanuel Milou ] - * Fix path for GTK+ icons; clean up - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Thu, 05 Feb 2009 18:27:53 -0500 - -sflphone (0.9.2-2ubuntu8) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Update changelogs - * Fix bug in merge and in Makefile.am - * Terminate only one call - * Disable PJsip shutdown when changing STUN parameters - * Function terminateSIPCall added in sipvoiplink and managerimpl - * Add a timer to the alsa thread to not jam the CPU load - * Fix bug in sipvoiplink.cpp - * Clean shutdown of pulseaudio on quiting - * Fix DTMF at first start with Pulseaudio - * Remove zeroconf from the build system - * Add a library manager + exception handling - * Clean up in the working directory - * Better handling of capture XRUNs - * Restore mic adjust volume on ALSA layer - * Protect device ALSA operation if not opened - * Fix the switching layer bug - * Use dynamic_cast<> to use audiolayer-specific methods - * Open the audio devices only once at startup - * Refactoring of the ALSA part - * Functional plug-in manager - * Use a C++ thread to handle tones and DTMF in ALSA - * Restore IAXVoIPLink, restore Mutex - * Make the plugins registering against the plugin manager - * Migrate to 1->N relationship between voiplink and accounts - * API plugin for registration - * Use C++ thread in SIP, move everything in sipvoiplink - * Complete singleton pattern for the plugin manager - * Add -Wno-return-type compilation flag to remove warnings; Update - version number in configure.ac - * Add the dynamic loading for the plugin framework; integate unittest - - [ Yun Liu ] - * Update rpm spec file - * modify build package script and spec file for suse - - [ Alexandre Savard ] - * Add audiorecorder plugin and testaudiorecorder - * Add audio Recording class, edit global.h - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Wed, 04 Feb 2009 14:00:30 -0500 - -sflphone (0.9.2-2ubuntu7) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Update changelog to 0.9.2-6 - * Fix some dbus-glib implementation details on the client side - * Init history after dbus initialization - * Add error checking in useragent; Clean sipvoiplink - * Prevent crash when trying to call an empty number - * Set the volume of the playback stream to PA_VOLUME_NORM at startup - * Fix GTK+ generic value double initialization - * Fix jaunty control file dependency problems - * Fix jaunty control file dependency problems - - [ Yun Liu ] - * Fix bug ticket # 137 - * Tolerant to gsm library of OpenSuse 11 - - [ Sven Werlen ] - * Update german translation - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 23 Jan 2009 17:48:13 -0500 - -sflphone (0.9.2-2ubuntu6) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * Migrate STUN configuration to the main config window - * Update french translation - * Other tiny memory leaks - * Fix memory leak in sampleconverter.cpp - * Generate packages from the release branch - * update the build package script - * modify the control files with architecture=any - * Remove valgring uninitialized value - * IAX and SIP use the same global variables to set account - configuration ; fix broken code - - [ Maxime Chambreuil ] - * Update spanish translation - - [ Hussein Abdallah ] - * Update russian translation - - [ Yun Liu ] - * Update translation files - * Fix the bug when user uncheck the account which fails in the - previous registration - * Add stun error status - * Fix bug ticket #143 - * Script for auto-install dependencies - * Fix bug ticket #140 - * Fix bug ticket 141 - * Fix the reregister process when user change the details of an - account - - -- Emmanuel Milou <manu@sulfur.inside.savoirfairelinux.net> Fri, 16 Jan 2009 18:19:05 -0500 - -sflphone (0.9.2-2ubuntu5) SYSTEM; urgency=low - - * Fix memory leak in the pulseaudio callback - * Update debian package generation script - * Warnings removal in GTK+ client - * Clean adjust volume method in alsalayer - * Plug the sflphone playback volume control to the pulseaudio volume - manager - * Display the date in history according to the current locale - * Generate the changelog according to the git commit messages - * Complete header in chinese translation file - * Use the right gpg key to sign the packages - * add debian jaunty jackalope support - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Wed, 14 Jan 2009 21:17:20 -0500 - -sflphone (0.9.2-2ubuntu4) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * add german translation - - [ Yun Liu ] - * Fix GUI crash in Ubuntu8.10 64bit system - - -- Yun Liu <yun.liu@savoirfairelinux.com> Thu, 08 Jan 2009 13:08:51 -0500 - -sflphone (0.9.2-2ubuntu3) SYSTEM; urgency=low - - [ Emmanuel Milou ] - * The main thread synchronizes the ringtone thread - * disable custom ringtone for the ALSA layer - * Fix the Makefile.am in man directory, add a SEE ALSO section - - [ Yun Liu ] - * Fix daemon crash caused by the previous patch ( for bug ticket #129) - - -- Yun Liu <yun.liu@savoirfairelinux.com> Tue, 06 Jan 2009 16:18:38 -0500 - -sflphone (0.9.2-2ubuntu2) SYSTEM; urgency=low - - * Fix bug ticket #129 - - -- Yun Liu <yun.liu@savoirfairelinux.com> Wed, 5 Jan 2009 15:54:53 -0500 - -sflphone (0.9.2-2ubuntu1) SYSTEM; urgency=low - - * Migrate from eXosip library to pjsip - * Add multiple SIP accounts support - * Fix ringtones problems - * Add a pulseaudio support - * Improve audio quality with ALSA - * Add chinese translation - * Improve spanish translation - * Migrate to a maintained C++ DBus bindings - * Clean and improve the build system - * Add build-dependency on Perl because we need pod2man to generate manpages - - -- Yun Liu <yun.liu@savoirfairelinux.com> Wed, 26 Nov 2008 09:47:53 -0500 - -sflphone (0.9.1) unstable; urgency=low - * Add a search tool in the history - * Migrate some gtk_entry_new to sexy_icon_entry_new - * Bug fix (Ticket #78): The voicemail password isn't displayed anymore in - the history tab - * Add the SIP registration expire value in the user file. - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Thu, 22 May 2008 11:14:25 -0500 - -sflphone (0.9.0) unstable; urgency=low - * Add history features - * Call date - * Call duration - * Mouse events in the history tab - * Smooth switch from the history tab to the calls tab - * Remove most of GTK-Critical warnings - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Wed, 13 May 2008 16:58:25 -0500 - -sflphone (0.9-2008-06-06) unstable; urgency=low - * Audio bug correction: capture stopped after a few minutes of conversation - with USB Plantronics sound card - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Tue, 06 May 2008 16:58:25 -0500 - -sflphone (0.9-2008-05-06) unstable; urgency=low - * Bug correction: account creation with the assistant - * GTK+ warnings removal - * libnotify warnings removal - * Remove aliasing on the SFLphone logo - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Mon, 05 May 2008 16:58:25 -0500 - -sflphone (0.9) unstable; urgency=low - * Clean dependencies ( removal of libboost ) - * Several GTK improvement and updates - -account window - -configuration window - * Migrate from GtkCheckMenuItem to GtkImageMenuItem - * ALSA standard I/O transfers: MMAP instead of R/W - * Fix speex audio quality - * IAX2 protocol - -Fix hold/unhold situation - -Add on hold music - * SIP protocol - -Ringtone on incoming call - -Fix transfer situation - * Add desktop notification ( libnotify ) - * Improve the system tray icon behaviour - * Improve registration error handling - * Register/unregister from the account window takes effect without starting back SFLphone - * Compilation warnings removal - * Call history - * Add an account configuration wizard - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Wed, 30 Apr 2008 16:58:25 -0500 - -sflphone (0.8.2) unstable; urgency=low - * Internationalization of the GTK GUI - * English / French - * STUN support - * Slight modifications of the graphical interface ( tooltips, dialpad, ...) - - -- Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Fri, 21 Mar 2008 11:37:53 -0500 + -- Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> Thu May 17 15:14:46 EDT 2012 \ No newline at end of file diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/control b/tools/build-system/launchpad/sflphone-client-kde/debian/control index a4e6a26619..6b38e74ec0 100644 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/control +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/control @@ -1,20 +1,13 @@ Source: sflphone-client-kde -Maintainer: SavoirFaireLinux Inc <julien.bonjean@savoirfairelinux.com> Section: kde Priority: optional -Build-Depends: debhelper, cmake, kdepimlibs5-dev, libcommoncpp2-dev, libqt4-dev -Standards-Version: 3.7.3 +Maintainer: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> +Uploaders: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> +Standards-Version: 1.1 +Build-Depends: debhelper (>= 5.0), cdbs, kdelibs5-dev, cmake, libphonon-dev, kdepimlibs5-dev +Homepage: http://www.sfphone.org/ Package: sflphone-client-kde -Priority: optional -Architecture: i386 -Depends: sflphone-common (>=${source:Version}), libcommoncpp2-1.6-0, kdepimlibs5, libqt4-dbus, libqt4-svg, libqtgui4 -Replaces: sflphone -Conflicts: sflphone -Homepage: http://www.sflphone.org -Description: KDE client for SFLphone - Provide a KDE client for SFLphone. - SFLphone is meant to be a robust enterprise-class desktop phone. - SFLphone is released under the GNU General Public License. - SFLphone is being developed by the global community, and maintained by - Savoir-faire Linux, a Montreal, Quebec, Canada-based Linux consulting company. +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description:KDE client for the sflphone-daemon SIP/AiX softphone \ No newline at end of file diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/control.lucid b/tools/build-system/launchpad/sflphone-client-kde/debian/control.lucid deleted file mode 100644 index 183ca4e831..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/control.lucid +++ /dev/null @@ -1,20 +0,0 @@ -Source: sflphone-client-kde -Maintainer: SavoirFaireLinux Inc <julien.bonjean@savoirfairelinux.com> -Section: kde -Priority: optional -Build-Depends: debhelper, cmake, kdepimlibs5-dev, libcommoncpp2-dev, libqt4-dev -Standards-Version: 3.7.3 - -Package: sflphone-client-kde -Priority: optional -Architecture: i386 -Depends: sflphone-common (>=${source:Version}), ${shlibs:Depends}, ${misc:Depends} -Replaces: sflphone -Conflicts: sflphone -Homepage: http://www.sflphone.org -Description: KDE client for SFLphone - Provide a KDE client for SFLphone. - SFLphone is meant to be a robust enterprise-class desktop phone. - SFLphone is released under the GNU General Public License. - SFLphone is being developed by the global community, and maintained by - Savoir-faire Linux, a Montreal, Quebec, Canada-based Linux consulting company. diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/control.natty b/tools/build-system/launchpad/sflphone-client-kde/debian/control.natty deleted file mode 100644 index 183ca4e831..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/control.natty +++ /dev/null @@ -1,20 +0,0 @@ -Source: sflphone-client-kde -Maintainer: SavoirFaireLinux Inc <julien.bonjean@savoirfairelinux.com> -Section: kde -Priority: optional -Build-Depends: debhelper, cmake, kdepimlibs5-dev, libcommoncpp2-dev, libqt4-dev -Standards-Version: 3.7.3 - -Package: sflphone-client-kde -Priority: optional -Architecture: i386 -Depends: sflphone-common (>=${source:Version}), ${shlibs:Depends}, ${misc:Depends} -Replaces: sflphone -Conflicts: sflphone -Homepage: http://www.sflphone.org -Description: KDE client for SFLphone - Provide a KDE client for SFLphone. - SFLphone is meant to be a robust enterprise-class desktop phone. - SFLphone is released under the GNU General Public License. - SFLphone is being developed by the global community, and maintained by - Savoir-faire Linux, a Montreal, Quebec, Canada-based Linux consulting company. diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/control.oneiric b/tools/build-system/launchpad/sflphone-client-kde/debian/control.oneiric deleted file mode 100644 index 183ca4e831..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/control.oneiric +++ /dev/null @@ -1,20 +0,0 @@ -Source: sflphone-client-kde -Maintainer: SavoirFaireLinux Inc <julien.bonjean@savoirfairelinux.com> -Section: kde -Priority: optional -Build-Depends: debhelper, cmake, kdepimlibs5-dev, libcommoncpp2-dev, libqt4-dev -Standards-Version: 3.7.3 - -Package: sflphone-client-kde -Priority: optional -Architecture: i386 -Depends: sflphone-common (>=${source:Version}), ${shlibs:Depends}, ${misc:Depends} -Replaces: sflphone -Conflicts: sflphone -Homepage: http://www.sflphone.org -Description: KDE client for SFLphone - Provide a KDE client for SFLphone. - SFLphone is meant to be a robust enterprise-class desktop phone. - SFLphone is released under the GNU General Public License. - SFLphone is being developed by the global community, and maintained by - Savoir-faire Linux, a Montreal, Quebec, Canada-based Linux consulting company. diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/copyright b/tools/build-system/launchpad/sflphone-client-kde/debian/copyright index fbde2314be..9a2517742f 100644 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/copyright +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/copyright @@ -1,28 +1,8 @@ -This package was debianized by Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> on -Fri, 3 Apr 2009 09:47:53 -0500. +SFLPhone: -It was downloaded from the git repository of SFLphone: git://sflphone.org/git/sflphone.git + (C) 2004-2012 Savoir-Faire Linux <contact@savoirfairelinux.com> -Upstream Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> +SFLPhone KDE: -Copyright: - -Savoir-Faire Linux Inc. - -License: - -This software is copyright (c) 2004-2009 Savoir-Faire Linux inc. - -You are free to distribute this software under the terms of -the GNU General Public License version 3. -On Debian systems, the complete text of the GNU General Public -License can be found in the file `/usr/share/common-licenses/GPL'. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklyn St, Fifth Floor, Boston, MA 02110-1301, USA. + Copyright (C) 2008-2009 Savoir-Faire Linux <jeremy.quentin@savoirfairelinux.com> + Copyright (C) 2009-2012 Savoir-Faire Linux <emmanuel.lepage@savoirfairelinux.com> diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/cron.d b/tools/build-system/launchpad/sflphone-client-kde/debian/cron.d deleted file mode 100644 index d11e611777..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/cron.d +++ /dev/null @@ -1,4 +0,0 @@ -# -# Regular cron jobs for the sflphone package -# -0 4 * * * root sflphone_maintenance diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/dirs b/tools/build-system/launchpad/sflphone-client-kde/debian/dirs deleted file mode 100644 index e2dc98dcb2..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/dirs +++ /dev/null @@ -1,7 +0,0 @@ -usr/bin -usr/share/applications -usr/share/pixmaps -usr/share/sflphone -usr/share/locale -usr/share/doc -usr/share/man diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/docs b/tools/build-system/launchpad/sflphone-client-kde/debian/docs deleted file mode 100644 index 9830da213f..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/docs +++ /dev/null @@ -1,5 +0,0 @@ -NEWS -README -ChangeLog -AUTHORS - diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/manpages b/tools/build-system/launchpad/sflphone-client-kde/debian/manpages deleted file mode 100644 index 919cf59a8e..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/manpages +++ /dev/null @@ -1,2 +0,0 @@ -debian/sflphone-client-kde/usr/share/man/man1/sflphone.1 -debian/sflphone-client-kde/usr/share/man/man1/sflphone-client-kde.1 diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/menu b/tools/build-system/launchpad/sflphone-client-kde/debian/menu new file mode 100644 index 0000000000..272ceffd65 --- /dev/null +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/menu @@ -0,0 +1,6 @@ +?package(filelight):needs="X11" \ + section="Applications/Multimedia" \ + hints="KDE, Phone, Sip,Call" \ + command="/usr/bin/sflphone-client-kde" \ + title="SFLPhone Client KDE" \ + longtitle="SFLPhone Client KDE: Enterprise class softphone for KDE" diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/postinst b/tools/build-system/launchpad/sflphone-client-kde/debian/postinst deleted file mode 100644 index 03f87b04e8..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -e - -update-alternatives --install /usr/bin/sflphone sflphone /usr/bin/sflphone-client-kde 200 \ - --slave /usr/share/man/man1/sflphone.1.gz sflphone.1.gz \ - /usr/share/man/man1/sflphone-client-kde.1 - -update-alternatives --set sflphone /usr/bin/sflphone-client-kde - -exit 0 diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/preinst b/tools/build-system/launchpad/sflphone-client-kde/debian/preinst deleted file mode 100644 index fdaa8ab8ec..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/preinst +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# postrm script for sflphone -# -# see: dh_installdeb(1) - -set -e - -package=sflphone-client-kde - -case "$1" in - install|upgrade) - ;; -esac - -exit 0 diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/prerm b/tools/build-system/launchpad/sflphone-client-kde/debian/prerm deleted file mode 100644 index 5e90217068..0000000000 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/prerm +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -e - - -if [ "$1" = "remove" ]; then - # Remove alternatives symlink set in postinst - update-alternatives --remove sflphone /usr/bin/sflphone -fi diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/rules b/tools/build-system/launchpad/sflphone-client-kde/debian/rules index b6368f42f4..f31dd2fb77 100755 --- a/tools/build-system/launchpad/sflphone-client-kde/debian/rules +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/rules @@ -1,118 +1,9 @@ #!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 -export DH_OPTIONS - -package=sflphone-client-kde - -CXX = g++-4.0 -# CFLAGS = -Wall -g -# DEB_INSTALL_PAGES_sflphone_client_kde = sflphone.1 sflphone-client-kde.1 - -configure: configure-stamp -configure-stamp: - dh_testdir - # Add here commands to configure the package. - cmake . -DCMAKE_INSTALL_PREFIX=/usr - touch configure-stamp - - -#Architecture -build: build-arch build-indep - -build-arch: build-arch-stamp -build-arch-stamp: configure-stamp - - # Add here commands to compile the arch part of the package. - $(MAKE) - touch $@ - -build-indep: build-indep-stamp -build-indep-stamp: configure-stamp - - # Add here commands to compile the indep part of the package. - #$(MAKE) doc - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-arch-stamp build-indep-stamp configure-stamp - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - -ifneq "$(wildcard /usr/share/misc/config.sub)" "" - cp -f /usr/share/misc/config.sub config.sub -endif -ifneq "$(wildcard /usr/share/misc/config.guess)" "" - cp -f /usr/share/misc/config.guess config.guess -endif - dh_clean - -install: install-indep install-arch -install-indep: - dh_testdir - dh_testroot - dh_clean -k -i - dh_installdirs -i - # Add here commands to install the package into debian/sflphone. - -install-arch: - dh_testdir - dh_testroot - dh_clean -k -s - dh_installdirs -s - # Add here commands to install the arch part of the package into - # debian/tmp. - $(MAKE) DESTDIR=$(CURDIR)/debian/$(package) install - dh_install -s -# Must not depend on anything. This is to be called by -# binary-arch/binary-indep -# in another 'make' thread. - -binary-common: - pwd - dh_testdir - dh_testroot - dh_installchangelogs ChangeLog - dh_installdocs - dh_installexamples -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo -# dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb -# dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb -# Build architecture independant packages using the common target. -binary-indep: build-indep install-indep - $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common - -# Build architecture dependant packages using the common target. -binary-arch: build-arch install-arch - $(MAKE) -f debian/rules DH_OPTIONS=-s binary-common - -binary: binary-arch binary-indep -.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure +# debian/rules file - for filelight (1.0) +# Copyright 2007 Raúl Sánchez Siles +# 2009 Michael Meskes +# This packaging is licensed under GPLv2 +# see /usr/share/common-licenses/GPL-2 for details. + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/cmake.mk diff --git a/tools/build-system/launchpad/sflphone-client-kde/debian/source/format b/tools/build-system/launchpad/sflphone-client-kde/debian/source/format new file mode 100644 index 0000000000..163aaf8d82 --- /dev/null +++ b/tools/build-system/launchpad/sflphone-client-kde/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) -- GitLab