diff options
author | Michele Calgaro <[email protected]> | 2014-03-29 00:54:51 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2014-03-29 00:54:51 +0900 |
commit | 0486034738b850c210b1389a8c3ae51a6b9fad23 (patch) | |
tree | b1e3a4dbf9673b5e0031e8225e88f5dd490585a5 /kopete/protocols/msn | |
parent | 4bd7620e88d450995b78c201f9e7d9181f62ea6a (diff) | |
download | tdenetwork-0486034738b850c210b1389a8c3ae51a6b9fad23.tar.gz tdenetwork-0486034738b850c210b1389a8c3ae51a6b9fad23.zip |
Removed MSN support across Kopete by removing the MSN protocol and the netmeeting plugin.
This resolves bug 1547.
Diffstat (limited to 'kopete/protocols/msn')
107 files changed, 0 insertions, 21900 deletions
diff --git a/kopete/protocols/msn/CMakeLists.txt b/kopete/protocols/msn/CMakeLists.txt deleted file mode 100644 index f38683d8..00000000 --- a/kopete/protocols/msn/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -add_subdirectory( ui ) -add_subdirectory( icons ) -add_subdirectory( config ) - -if( WITH_WEBCAM ) - add_subdirectory( webcam ) - add_definitions( -DMSN_WEBCAM ) - set( WEBCAM_LIBRARIES mimicwrapper-static kopete_videodevice-shared ${GLIB2_LIBRARIES} ) -endif( ) - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/ui - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/ui - ${CMAKE_CURRENT_SOURCE_DIR}/webcam - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/kopete/libkopete - ${CMAKE_SOURCE_DIR}/kopete/libkopete/ui - ${CMAKE_SOURCE_DIR}/kopete/libkopete/private - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### other data ################################ - -install( FILES kopete_msn.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) -install( FILES msnchatui.rc DESTINATION ${DATA_INSTALL_DIR}/kopete_msn ) - - -##### kopete_msn (module) ####################### - -tde_add_kpart( kopete_msn AUTOMOC - SOURCES - dummy.cpp webcam.cpp - LINK kopete_msn_shared-shared - DESTINATION ${PLUGIN_INSTALL_DIR} -) - - -##### kopete_msn_shared (shared) ################ - -tde_add_library( kopete_msn_shared SHARED AUTOMOC - SOURCES - msnprotocol.cpp msnaccount.cpp msnaddcontactpage.cpp msncontact.cpp - msnsocket.cpp msnchatsession.cpp msndebugrawcmddlg.cpp - msnnotifysocket.cpp msnswitchboardsocket.cpp - msnfiletransfersocket.cpp msninvitation.cpp sha1.cpp - msnsecureloginhandler.cpp msnchallengehandler.cpp - dispatcher.cpp p2p.cpp messageformatter.cpp incomingtransfer.cpp - outgoingtransfer.cpp webcam.cpp - VERSION 0.0.0 - LINK - kopetemsnui-static ${WEBCAM_LIBRARIES} kopete-shared - DESTINATION ${LIB_INSTALL_DIR} -) diff --git a/kopete/protocols/msn/Changelog b/kopete/protocols/msn/Changelog deleted file mode 100644 index 80f52264..00000000 --- a/kopete/protocols/msn/Changelog +++ /dev/null @@ -1,106 +0,0 @@ -Have fun using this all-improved plugin and feel free to contribute patches -and other improvements to our mailing list! Although we all like to boast -about our great work, we're sure there are still bugs remaining, which is -why we don't call this release 1.0, but only 0.5. - -Nevertheless, we feel this new MSN plugin is an enormous step forward from -the last 0.4.1 release and we recommend anyone to try out this all-improved -plugin. Please read the release notes first before reporting bugs, but please -do report anything not listed there! - -Thanks for your interest in Kopete! - - October 2002, the Kopete team <[email protected]> - - -CHANGES IN THE MSN PLUGIN SINCE KOPETE 0.4.1 - -- Ported the plugin to the new MetaContact API, allowing a locally cached - copy of the contact list to be always available (even when offline) and - to combine your MSN contacts with other messaging systems in one entry - in the contact list. - -- Added additional online states ('be right back', 'out to lunch', 'busy', - 'invisible') and the possibility to connect directly with a particular - status (especially useful with 'invisible') - -- Fix multi-user chat now the API finally supports it properly - -- Fix a grave bug in Kopete 0.4.1 where Kopete would popup the 'new user' - dialog for every user in your block list, asking whether you want to - allow or block the user, often crashing Kopete completely - -- Fix support for Unicode messages - -- Fix the 'unhandled error 219' problem that caused Kopete to disconnect - unexpectedly for some people - -- Added possibility to talk with users who aren't in the contact list - -- Incoming filetransfers - -- As usual, several other bugfixes - -CHANGES IN THE MSN PLUGIN SINCE KOPETE 0.4 - -- Added block/unblock user - -- Don't show contacts from the allow list if they are not also in the - friend list (like deleted contacts). Small problem: there already was - a need to have a gui for manipulating blocked/allowed contacts, with - this change this is even a bit more urgent... - -- Hopefully fix a problem with an empty reverse list on a fresh MSN account. - can't test, because by the time the recompile was done the reverse list - was no longer empty... - -- Fix a problem with MSN users no longer receiving messages. Apparently - Microsoft changed the server so messages without an explicit font name are - no longer passed on. - -- Fixed UTF8 handling not really being UTF8. MSN should work fine now with - all unicode characters - -- Moved the plugin to use KGenericFactory as preparation for more KDE-style - plugin handling (as opposed to the current custom code) - -- Fixed crash when disconnecting while an earlier connect was still running - -- Made the connect code asynchronous, so connecting doesn't hang kopete - while processing - -- Fixed minor memory leak in the connect code - -CHANGES IN THE MSN PLUGIN SINCE KOPETE 0.3 - -Many things changed since 0.3. I won't mention them all, because so much of -the internal code changed that the individual commits often fix more than I -was even aware of at that time. Below are the bigger changes and fixes: - -- Ported the plugin to the new KopeteMessageManager. This move unifies the - handling of various resources like chat windows, balloons, system tray - flashing, and more. In Kopete 0.3 this was the exclusive domain of the - ICQ plugin, in this release all plugins except IRC already use the shared - code. - -- Rewrote almost all of the internal protocol handling, fixing an awful lot - of bugs during the process. The main goal was to make the code more - maintainable and extensible, but the gratuitous bug fixes are of course - much more useful for most people. The most important fix of all is a - grave bug that caused the plugin to read a fixed-size 1kb buffer in Kopete - 0.3 without checking for additional data, often causing the plugin to - seemingly 'hang'. - -- Added the ability to change the display name while connected. This can - currently only be done from the context menu. The option in the - preferences never worked, and still does not do what you'd expect it to - do. Sorry :) - -- Added much more useful debug code for developers, testers and other - interested people. It is also a lot *more* debug output, so if you're - scared of console output, better not start Kopete from it... - -- All those tiny bugfixes of which I don't even know whether they fix - regressions introduced during the development of version 0.4, or whether - they fix long-standing bugs. - diff --git a/kopete/protocols/msn/Makefile.am b/kopete/protocols/msn/Makefile.am deleted file mode 100644 index 5248d295..00000000 --- a/kopete/protocols/msn/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -if include_msn_webcam -WEBCAM = webcam -WEBCAM_LIBMINICWRAPPER = webcam/libmimicwrapper.la -endif - -KDE_OPTIONS = nofinal -METASOURCES = AUTO -SUBDIRS = ui $(WEBCAM) . icons config -AM_CPPFLAGS = -Iui \ - -I$(srcdir)/webcam \ - -I$(srcdir)/ui \ - $(KOPETE_INCLUDES) \ - -I$(top_srcdir)/kopete/libkopete/private \ - $(all_includes) - -kde_module_LTLIBRARIES = kopete_msn.la -lib_LTLIBRARIES = libkopete_msn_shared.la - -CLEANFILES = dummy.cpp - -libkopete_msn_shared_la_SOURCES = msnprotocol.cpp msnaccount.cpp \ - msnaddcontactpage.cpp msncontact.cpp msnsocket.cpp msnchatsession.cpp msndebugrawcmddlg.cpp \ - msnnotifysocket.cpp msnswitchboardsocket.cpp msnfiletransfersocket.cpp msninvitation.cpp \ - sha1.cpp msnsecureloginhandler.cpp msnchallengehandler.cpp dispatcher.cpp \ - p2p.cpp messageformatter.cpp incomingtransfer.cpp outgoingtransfer.cpp \ - webcam.cpp - -libkopete_msn_shared_la_LIBADD = ./ui/libkopetemsnui.la ../../libkopete/libkopete.la $(WEBCAM_LIBMINICWRAPPER) ../../libkopete/avdevice/libkopete_videodevice.la $(LIB_TDEIO) -libkopete_msn_shared_la_LDFLAGS = -version-info 0:0:0 -no-undefined $(all_libraries) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_TDEIO) -ltdetexteditor -lkopete_videodevice -L../../libkopete/avdevice/ - -kopete_msn_la_SOURCES = dummy.cpp webcam.cpp -kopete_msn_la_LIBADD = libkopete_msn_shared.la - -kopete_msn_la_LDFLAGS = -no-undefined -module $(KDE_PLUGIN) $(all_libraries) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_TDEIO) -ltdetexteditor -lkopete_videodevice -L../../libkopete/avdevice/ - -dummy.cpp: $(srcdir)/Makefile.am - echo '#include "kdemacros.h"' > $@ - echo 'extern "C" KDE_EXPORT void *init_libkopete_msn_shared();' >> $@ - echo 'extern "C" KDE_EXPORT void *init_kopete_msn() { return init_libkopete_msn_shared(); }' >> $@ - -service_DATA = kopete_msn.desktop -servicedir = $(kde_servicesdir) - -mydatadir = $(kde_datadir)/kopete_msn -mydata_DATA = msnchatui.rc -noinst_HEADERS = p2p.h dispatcher.h messageformatter.h incomingtransfer.h \ - outgoingtransfer.h webcam.h diff --git a/kopete/protocols/msn/ReleaseNotes b/kopete/protocols/msn/ReleaseNotes deleted file mode 100644 index 1a36724a..00000000 --- a/kopete/protocols/msn/ReleaseNotes +++ /dev/null @@ -1,31 +0,0 @@ -If you can bear with beta-quality code, we welcome you to try out this -highly improved plugin and use it as your primary instant messaging system! -Patches are always welcome on [email protected]. Trivial fixes can be -committed directly to KDE CVS if you have an account, but please coordinate -larger changes with us to avoid double work. - -Thanks for your interest in Kopete! - - October 2002, the Kopete team <[email protected]> - -RELEASE NOTES FOR THE MSN PLUGIN IN KOPETE 0.5 - -Most of the MSN plugin has seen an enormous improvement since the previous -release, with many bugs fixed in all aspects of the plugin, most notably -the contact list handling and group chats. See the Changelog for a more -detailed description of what was changed in this release. - -Some issues in MSN are still remaining though. We hope to fix them in the -next release, since we think they are not critical enough to delay this -release: - -- MSN allows you to have multiple groups with the same name, because - internally a group ID is used. Kopete currently uses the name as a unique - identifier, however, and will likely get a bit confused by this. If you - do experience problems, you could join both groups using another MSN - client, like the official client, Trillian or Pidgin as a workaround. - -- Kopete contacts can be at Top-Level and in no groups. MSN doesn't - support this freature. The kopete's contact list can differe from server - if you have top-level contact - diff --git a/kopete/protocols/msn/TODO b/kopete/protocols/msn/TODO deleted file mode 100644 index be73e830..00000000 --- a/kopete/protocols/msn/TODO +++ /dev/null @@ -1,5 +0,0 @@ -Some things to think about as of 2003/04/15 -(according to Gof) -Adding 'search for user' -Adding MSN chatroom protocol -Add MSN alerts diff --git a/kopete/protocols/msn/config/CMakeLists.txt b/kopete/protocols/msn/config/CMakeLists.txt deleted file mode 100644 index d9fd401b..00000000 --- a/kopete/protocols/msn/config/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/kopete/libkopete - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### other data ################################ - -install( FILES - kopete_msn_config.desktop - DESTINATION ${SERVICES_INSTALL_DIR}/tdeconfiguredialog ) - - -##### kcm_kopete_msn (module) ################### - -tde_add_kpart( kcm_kopete_msn AUTOMOC - SOURCES - msnprefs.ui msnpreferences.cpp - LINK kopete-shared - DESTINATION ${PLUGIN_INSTALL_DIR} -) diff --git a/kopete/protocols/msn/config/Makefile.am b/kopete/protocols/msn/config/Makefile.am deleted file mode 100644 index 2d84950e..00000000 --- a/kopete/protocols/msn/config/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -METASOURCES = AUTO -AM_CPPFLAGS = $(KOPETE_INCLUDES) $(all_includes) - -kde_module_LTLIBRARIES = kcm_kopete_msn.la - -kcm_kopete_msn_la_SOURCES = msnprefs.ui msnpreferences.cpp -kcm_kopete_msn_la_LDFLAGS = -no-undefined -module $(KDE_PLUGIN) $(all_libraries) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_TDEIO) -ltdetexteditor -kcm_kopete_msn_la_LIBADD = ../../../libkopete/libkopete.la $(LIB_TDEUTILS) - -service_DATA = kopete_msn_config.desktop -servicedir = $(kde_servicesdir)/tdeconfiguredialog - diff --git a/kopete/protocols/msn/config/kopete_msn_config.desktop b/kopete/protocols/msn/config/kopete_msn_config.desktop deleted file mode 100644 index 4754ae1f..00000000 --- a/kopete/protocols/msn/config/kopete_msn_config.desktop +++ /dev/null @@ -1,123 +0,0 @@ -[Desktop Entry] -Icon=msn_protocol -Type=Service -ServiceTypes=TDECModule - -X-TDE-ModuleType=Library -X-TDE-Library=kopete_msn -X-TDE-FactoryName=MSNProtocolConfigFactory -X-TDE-ParentApp=kopete_msn -X-TDE-ParentComponents=kopete_msn - -Name=MSN Plugin -Name[ar]=توصيلة MSN -Name[be]=Модуль MSN -Name[bg]=MSN -Name[bn]=এমএসএন প্লাগিন -Name[br]=Lugent MSN -Name[bs]=MSN dodatak -Name[ca]=Connector de MSN -Name[cs]=MSN modul -Name[cy]=Ategyn MSN -Name[da]=MSN-Plugin -Name[de]=MSN-Modul -Name[el]=Πρόσθετο MSN -Name[es]=Complemento de MSN -Name[et]=MSN plugin -Name[eu]=MSN Plugin-a -Name[fa]=وصلۀ اماسان -Name[fi]=MSN-liitännäinen -Name[fr]=Module MSN -Name[ga]=Breiseán MSN -Name[gl]=Plugin para MSN -Name[he]=תוסף MSN -Name[hi]=एमएसएन प्लगइन -Name[hr]=MSN umetak -Name[hu]=MSN modul -Name[is]=MSN íforrit -Name[it]=Plugin MSN -Name[ja]=MSN プラグイン -Name[ka]=MSN მოდული -Name[kk]=MSN плагин модулі -Name[km]=កម្មវិធីជំនួយ MSN -Name[lt]=MSN įskiepis -Name[mk]=MSN-приклучок -Name[nb]=MSN programtillegg -Name[nds]=MSN-Moduul -Name[ne]=एमएसएन प्लगइन -Name[nl]=MSN-plugin -Name[nn]=MSN-programtillegg -Name[pa]=MSN ਪਲੱਗਇਨ -Name[pl]=Wtyczka MSN -Name[pt]='Plugin' MSN -Name[pt_BR]=Plug-in MSN -Name[ro]=Modul MSN -Name[ru]=Модуль MSN -Name[se]=MSN-lassemoduvla -Name[sk]=Modul MSN -Name[sl]=Vstavek za MSN -Name[sr]=MSN прикључак -Name[sr@Latn]=MSN priključak -Name[sv]=MSN-insticksprogram -Name[ta]=MSN செருகல் -Name[tg]=Модули MSN -Name[tr]=MSN Eklentisi -Name[uk]=Втулок MSN -Name[uz]=MSN plagini -Name[uz@cyrillic]=MSN плагини -Name[wa]=Tchôke-divins MSN -Name[zh_CN]=MSN 插件 -Name[zh_HK]=MSN 插件 -Name[zh_TW]=MSN 外掛程式 -Comment=Microsoft Network Protocol -Comment[ar]=بروتوكول شبكة Microsoft -Comment[be]=Пратакол сеткі Microsoft Network -Comment[bg]=Протокол за връзка с Microsoft Network -Comment[bn]=মাইক্রোসফ্ট নেটওয়ার্ক প্রোটোকল -Comment[br]=Komenad rouedad Microsoft -Comment[bs]=Microsoft Network protokol -Comment[ca]=Protocol per a la xarxa de Microsoft -Comment[cs]=Protokol sítě Microsoft -Comment[cy]=Protocol Rhwydwaith Microsoft -Comment[de]=Microsoft Netzwerk-Protokoll -Comment[el]=Πρωτόκολλο Microsoft Network -Comment[es]=Protocolo de red de Microsoft -Comment[et]=Microsofti võrguprotokoll -Comment[fa]=قرارداد شبکۀ میکروسافت -Comment[fi]=Microsoft Network -yhteyskäytäntö -Comment[fr]=Protocole réseau Microsoft -Comment[ga]=Prótacal Gréasáin Mhicrosoft -Comment[gl]=Protocolo para a rede de Microsoft -Comment[he]=תוסף חיבור לרשת מיקרוסופט -Comment[hi]=माइक्रोसॉफ्ट नेटवर्क प्रोटोकॉल -Comment[hr]=Microsoft mrežni protokol -Comment[hu]=Microsoft hálózati protokoll -Comment[is]=Microsoft Network Protocol -Comment[it]=Protocollo di rete Microsoft -Comment[ja]=Microsoft ネットワークプロトコル -Comment[ka]=Microsoft ქსელის ოქმი -Comment[kk]=Microsoft Network желі протоколы -Comment[km]=ពិធីការបណ្ដាញម៉ៃក្រូសូហ្វ -Comment[lt]=Microsoft tinklo protokolas -Comment[mk]=Мрежен протокол на Microsoft -Comment[nds]=Microsoft-Nettwarkprotokoll -Comment[ne]=माइक्रोसफ्ट सञ्जाल प्रोटोकल -Comment[nl]=Protocol voor Microsoft Network -Comment[nn]=Microsoft Network-protokoll -Comment[pl]=Protokół Microsoft Network -Comment[pt]=Protocolo da Microsoft Network -Comment[pt_BR]=Protocolo de Rede Microsoft -Comment[ru]=Протокол сети Microsoft Network -Comment[sl]=Protokol za povezavo na MSN -Comment[sv]=Microsoft-nätverksprotokoll -Comment[ta]=மைக்ரோசாப்ட் இணைய விதிமுறை -Comment[tg]=Қарордоди Шабакаи Microsoft -Comment[tr]=Microsoft Ağ Protokolü -Comment[uk]=Мережний протокол Microsoft -Comment[uz]=Microsoft tarmogʻi bilan aloqa oʻrnatish uchun protokol -Comment[uz@cyrillic]=Microsoft тармоғи билан алоқа ўрнатиш учун протокол -Comment[wa]=Protocole pol rantoele da Microsoft -Comment[zh_CN]=Microsoft Network 协议 -Comment[zh_HK]=Microsoft 網絡通訊協定 -Comment[zh_TW]=Microsoft 網路協定 - diff --git a/kopete/protocols/msn/config/msnpreferences.cpp b/kopete/protocols/msn/config/msnpreferences.cpp deleted file mode 100644 index a6f5371f..00000000 --- a/kopete/protocols/msn/config/msnpreferences.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - msnpreferences.cpp - MSN Preferences Widget - - Copyright (c) 2002-2003 by Olivier Goffart <ogoffart @ kde.org> - Kopete (c) 2002-2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include <kgenericfactory.h> -#include "kcautoconfigmodule.h" -#include "msnprefs.h" - -class MSNPreferences; - -typedef KGenericFactory<MSNPreferences> MSNProtocolConfigFactory; -K_EXPORT_COMPONENT_FACTORY( kcm_kopete_msn, MSNProtocolConfigFactory( "kcm_kopete_msn" ) ) - -class MSNPreferences : public KCAutoConfigModule -{ -public: - MSNPreferences( TQWidget *parent = 0, const char * = 0, const TQStringList &args = TQStringList() ) : KCAutoConfigModule( MSNProtocolConfigFactory::instance(), parent, args ) - { - setMainWidget( new msnPrefsUI( this ) , "MSN"); - } -}; diff --git a/kopete/protocols/msn/config/msnprefs.ui b/kopete/protocols/msn/config/msnprefs.ui deleted file mode 100644 index 13817584..00000000 --- a/kopete/protocols/msn/config/msnprefs.ui +++ /dev/null @@ -1,217 +0,0 @@ -<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> -<class>msnPrefsUI</class> -<author>Duncan Mac-Vicar P.</author> -<widget class="TQWidget"> - <property name="name"> - <cstring>msnPrefsUI</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>522</width> - <height>347</height> - </rect> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel3_2_2_2_3</cstring> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>General</string> - </property> - </widget> - <widget class="TQFrame"> - <property name="name"> - <cstring>Frame3_3_3_2_3</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>HLine</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>NotifyNewChat</cstring> - </property> - <property name="text"> - <string>&Automatically open a chat window when someone starts a conversation</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>AutoDownloadPicture</cstring> - </property> - <property name="text"> - <string>&Automatically download the display picture if possible</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>useCustomEmoticons</cstring> - </property> - <property name="text"> - <string>Download and show custom emoticons (experimental)</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel1_3_3_3</cstring> - </property> - <property name="text"> - <string></string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel3_2_2_2_2</cstring> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>Away Messages</string> - </property> - </widget> - <widget class="TQFrame"> - <property name="name"> - <cstring>Frame3_3_3_2_2</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>HLine</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>SendAwayMessages</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Send &away messages</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout18</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel3</cstring> - </property> - <property name="text"> - <string>Do not send more than one away message every</string> - </property> - </widget> - <widget class="KIntNumInput"> - <property name="name"> - <cstring>AwayMessageSeconds</cstring> - </property> - <property name="value"> - <number>90</number> - </property> - <property name="minValue"> - <number>1</number> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel4</cstring> - </property> - <property name="text"> - <string>seconds</string> - </property> - </widget> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer7</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>21</width> - <height>70</height> - </size> - </property> - </spacer> - </vbox> -</widget> -<connections> - <connection> - <sender>SendAwayMessages</sender> - <signal>toggled(bool)</signal> - <receiver>AwayMessageSeconds</receiver> - <slot>setEnabled(bool)</slot> - </connection> -</connections> -<tabstops> - <tabstop>NotifyNewChat</tabstop> - <tabstop>AutoDownloadPicture</tabstop> - <tabstop>useCustomEmoticons</tabstop> - <tabstop>SendAwayMessages</tabstop> - <tabstop>AwayMessageSeconds</tabstop> -</tabstops> -<includes> - <include location="global" impldecl="in implementation">knuminput.h</include> -</includes> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>knuminput.h</includehint> - <includehint>knuminput.h</includehint> -</includehints> -</UI> diff --git a/kopete/protocols/msn/dispatcher.cpp b/kopete/protocols/msn/dispatcher.cpp deleted file mode 100644 index 70d43a14..00000000 --- a/kopete/protocols/msn/dispatcher.cpp +++ /dev/null @@ -1,647 +0,0 @@ -/* - dispatcher.cpp - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "dispatcher.h" -#include "incomingtransfer.h" -#include "outgoingtransfer.h" - -#if MSN_WEBCAM -#include "webcam.h" -#endif - -using P2P::Dispatcher; -using P2P::Message; -using P2P::TransferContext; -using P2P::IncomingTransfer; -using P2P::OutgoingTransfer; - -#include "msnswitchboardsocket.h" - -// Kde includes -#include <kdebug.h> -#include <kmdcodec.h> -#include <kstandarddirs.h> -#include <tdetempfile.h> - -// TQt includes -#include <tqdatastream.h> -#include <tqfile.h> -#include <tqregexp.h> -#include <tqtextcodec.h> -#include <tqtextstream.h> - -// Kopete includes -#include <kopetechatsession.h> // Just for getting the contact -#include <kopeteaccount.h> -#include <kopetetransfermanager.h> - -#include <stdlib.h> - -Dispatcher::Dispatcher(TQObject *parent, const TQString& contact, const TQStringList &ip) - : TQObject(parent) , m_contact(contact) , m_callbackChannel(0l) , m_ip(ip) -{} - -Dispatcher::~Dispatcher() -{ - kdDebug(14140) << k_funcinfo << endl; - - if(m_callbackChannel) - { - delete m_callbackChannel; - m_callbackChannel = 0l; - } -} - -void Dispatcher::detach(TransferContext* transfer) -{ - m_sessions.remove(transfer->m_sessionId); - transfer->deleteLater(); -} - -TQString Dispatcher::localContact() -{ - return m_contact; -} - -void Dispatcher::requestDisplayIcon(const TQString& from, const TQString& msnObject) -{ - TQ_UINT32 sessionId = rand()%0xFFFFFF00 + 4; - TransferContext* current = - new IncomingTransfer(from, this, sessionId); - - current->m_branch = P2P::Uid::createUid(); - current->m_callId = P2P::Uid::createUid(); - current->setType(P2P::UserDisplayIcon); - current->m_object = msnObject; - // Add the transfer to the list. - m_sessions.insert(sessionId, current); - - kdDebug(14140) << k_funcinfo << "Requesting, " << msnObject << endl; - - TQString context = TQString::fromUtf8(KCodecs::base64Encode(msnObject.utf8())); - // NOTE remove the \0 character automatically - // appended to a TQCString. - context.replace("=", TQString()); - TQString content = - "EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6}\r\n" - "SessionID: " + TQString::number(sessionId) + "\r\n" - "AppID: 1\r\n" - "Context: " + context + "\r\n" - "\r\n"; - // Send the sending client an invitation message. - current->sendMessage(INVITE, content); -} - -void Dispatcher::sendFile(const TQString& path, TQ_INT64 fileSize, const TQString& to) -{ - // Create a new transfer context that will handle - // the file transfer. - TQ_UINT32 sessionId = rand()%0xFFFFFF00 + 4; - TransferContext *current = - new OutgoingTransfer(to, this, sessionId); - current->m_branch = P2P::Uid::createUid(); - current->m_callId = P2P::Uid::createUid(); - current->setType(P2P::File); - // Add the transfer to the list. - m_sessions.insert(sessionId, current); - - // Set the transfer context file. - current->m_file = new TQFile(path); - // Create the file context data. - TQString context; - - TQByteArray header(638); - header.fill('\0'); - TQDataStream writer(header, IO_WriteOnly); - writer.setByteOrder(TQDataStream::LittleEndian); - - // Write the header length to the stream. - writer << (TQ_INT32)638; - // Write client version to the stream. - writer << (TQ_INT32)3; - // Write the file size to the stream. - writer << fileSize; - // Write the file transfer flag to the stream. - // TODO support file preview. For now disable file preview. - writer << (TQ_INT32)1; - // Write the file name in utf-16 to the stream. - TQTextStream ts(header, IO_WriteOnly); - ts.setEncoding(TQTextStream::RawUnicode); - ts.device()->at(20); - ts << path.section('/', -1); - // NOTE Background Sharing base64 [540..569] - // TODO add support for background sharing. - // Write file exchange type to the stream. - // NOTE File - 0xFFFFFFFF - // NOTE Background Sharing - 0xFFFFFFFE - writer.device()->at(570); - writer << (TQ_UINT32)0xFFFFFFFF; - - // Encode the file context header to base64 encoding. - context = TQString::fromUtf8(KCodecs::base64Encode(header)); - - // Send an INVITE message to the recipient. - TQString content = "EUF-GUID: {5D3E02AB-6190-11D3-BBBB-00C04F795683}\r\n" - "SessionID: " + TQString::number(sessionId) + "\r\n" - "AppID: 2\r\n" - "Context: " + context + "\r\n" - "\r\n"; - current->sendMessage(INVITE, content); -} - -void Dispatcher::sendImage(const TQString& /*fileName*/, const TQString& /*to*/) -{ -// TODO kdDebug(14140) << k_funcinfo << endl; -// TQFile imageFile(fileName); -// if(!imageFile.open(IO_ReadOnly)) -// { -// kdDebug(14140) << k_funcinfo << "Error opening image file." -// << endl; -// return; -// } -// -// OutgoingTransfer *outbound = -// new OutgoingTransfer(to, this, 64); -// -// outbound->sendImage(imageFile.readAll()); -} - -#if MSN_WEBCAM -void Dispatcher::startWebcam(const TQString &/*myHandle*/, const TQString &msgHandle, bool wantToReceive) -{ - TQ_UINT32 sessionId = rand()%0xFFFFFF00 + 4; - Webcam::Who who= wantToReceive ? Webcam::wViewer : Webcam::wProducer; - TransferContext* current = - new Webcam(who, msgHandle, this, sessionId); - - current->m_branch = P2P::Uid::createUid(); - current->m_callId = P2P::Uid::createUid(); - current->setType(P2P::WebcamType); - // Add the transfer to the list. - m_sessions.insert(sessionId, current); - - // {4BD96FC0-AB17-4425-A14A-439185962DC8} <- i want to show you my webcam - // {1C9AA97E-9C05-4583-A3BD-908A196F1E92} <- i want to see your webcam - TQString GUID= (who==Webcam::wProducer) ? "4BD96FC0-AB17-4425-A14A-439185962DC8" : "1C9AA97E-9C05-4583-A3BD-908A196F1E92" ; - - TQString content="EUF-GUID: {"+GUID+"}\r\n" - "SessionID: "+ TQString::number(sessionId)+"\r\n" - "AppID: 4\r\n" - "Context: ewBCADgAQgBFADcAMABEAEUALTQBFADIAQwBBAC0ANAA0ADAAMAAtAEEARTQAwADMALQA4ADgARgBGADgANTQBCADkARgA0AEUAOAB9AA==\r\n\r\n"; - - // context is the base64 of the utf16 of {B8BE70DE-E2CA-4400-AE03-88FF85B9F4E8} - - current->sendMessage( INVITE , content ); -} -#endif - - - -void Dispatcher::slotReadMessage(const TQString &from, const TQByteArray& stream) -{ - P2P::Message receivedMessage = - m_messageFormatter.readMessage(stream); - - receivedMessage.source = from; - - if(receivedMessage.contentType == "application/x-msnmsgrp2p") - { - if((receivedMessage.header.dataSize == 0)/* && ((receivedMessage.header.flag & 0x02) == 0x02)*/) - { - TransferContext *current = 0l; - TQMap<TQ_UINT32, TransferContext*>::Iterator it = m_sessions.begin(); - for(; it != m_sessions.end(); it++) - { - if(receivedMessage.header.ackSessionIdentifier == it.data()->m_identifier){ - current = it.data(); - break; - } - } - - if(current){ - // Inform the transfer object of the acknowledge. - current->m_ackSessionIdentifier = receivedMessage.header.identifier; - current->m_ackUniqueIdentifier = receivedMessage.header.ackSessionIdentifier; - current->acknowledged(); - } - else - { - kdDebug(14140) << k_funcinfo - << "no transfer context with identifier, " - << receivedMessage.header.ackSessionIdentifier - << endl; - } - return; - } - - if(m_messageBuffer.contains(receivedMessage.header.identifier)) - { - kdDebug(14140) << k_funcinfo - << TQString("retrieving buffered messsage, %1").arg(receivedMessage.header.identifier) - << endl; - - // The message was split, try to reconstruct the message - // with this received piece. - Message bufferedMessage = m_messageBuffer[receivedMessage.header.identifier]; - // Remove the buffered message. - m_messageBuffer.remove(receivedMessage.header.identifier); - - bufferedMessage.body.resize(bufferedMessage.body.size() + receivedMessage.header.dataSize); - for(TQ_UINT32 i=0; i < receivedMessage.header.dataSize; i++){ - // Add the remaining message data to the buffered message. - bufferedMessage.body[receivedMessage.header.dataOffset + i] = receivedMessage.body[i]; - } - bufferedMessage.header.dataSize += receivedMessage.header.dataSize; - bufferedMessage.header.dataOffset = 0; - - receivedMessage = bufferedMessage; - } - - // Dispatch the received message. - dispatch(receivedMessage); - } -} - -void Dispatcher::dispatch(const P2P::Message& message) - -{ - TransferContext *messageHandler = 0l; - - if(message.header.sessionId > 0) - { - if(m_sessions.contains(message.header.sessionId)){ - messageHandler = m_sessions[message.header.sessionId]; - } - } - else - { - TQString body = - TQCString(message.body.data(), message.header.dataSize); - TQRegExp regex("SessionID: ([0-9]*)\r\n"); - if(regex.search(body) > 0) - { - TQ_UINT32 sessionId = regex.cap(1).toUInt(); - if(m_sessions.contains(sessionId)){ - // Retrieve the message handler associated with the specified session Id. - messageHandler = m_sessions[sessionId]; - } - } - else - { - // Otherwise, try to retrieve the message handler - // based on the acknowlegded unique identifier. - if(m_sessions.contains(message.header.ackUniqueIdentifier)){ - messageHandler = - m_sessions[message.header.ackUniqueIdentifier]; - } - - if(!messageHandler) - { - // If the message handler still has not been found, - // try to retrieve the handler based on the call id. - regex = TQRegExp("Call-ID: \\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - TQString callId = regex.cap(1); - - TransferContext *current = 0l; - TQMap<TQ_UINT32, TransferContext*>::Iterator it = m_sessions.begin(); - for(; it != m_sessions.end(); it++) - { - current = it.data(); - if(current->m_callId == callId){ - messageHandler = current; - break; - } - } - } - } - } - - if(messageHandler){ - // Process the received message using the - // retrieved registered handler. - messageHandler->m_ackSessionIdentifier = message.header.identifier; - messageHandler->m_ackUniqueIdentifier = message.header.ackSessionIdentifier; - messageHandler->processMessage(message); - } - else - { - // There are no objects registered, with the retrieved session Id, - // to handle the received message; default to this dispatcher. - - if(message.header.totalDataSize > message.header.dataOffset + message.header.dataSize) - { - // The entire message has not been received; - // buffer the recevied portion of the original message. - kdDebug(14140) << k_funcinfo - << TQString("Buffering messsage, %1").arg(message.header.identifier) - << endl; - m_messageBuffer.insert(message.header.identifier, message); - return; - } - - TQString body = - TQCString(message.body.data(), message.header.dataSize); - kdDebug(14140) << k_funcinfo << "received, " << body << endl; - - if(body.startsWith("INVITE")) - { - // Retrieve the branch, call id, and session id. - // These fields will be used later on in the p2p - // transaction. - TQRegExp regex(";branch=\\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - TQString branch = regex.cap(1); - regex = TQRegExp("Call-ID: \\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - TQString callId = regex.cap(1); - regex = TQRegExp("SessionID: ([0-9]*)\r\n"); - regex.search(body); - TQString sessionId = regex.cap(1); - // Retrieve the contact that requested the session. - regex = TQRegExp("From: <msnmsgr:([^>]*)>"); - regex.search(body); - TQString from = regex.cap(1); - // Retrieve the application identifier which - // is used to determine what type of session - // is being requested. - regex = TQRegExp("AppID: ([0-9]*)\r\n"); - regex.search(body); - TQ_UINT32 applicationId = regex.cap(1).toUInt(); - - if(applicationId == 1 || applicationId == 11 || applicationId == 12 ) - { //the AppID is 12 since Messenger 7.5 - // A contact has requested a session to download - // a display icon (User Display Icon or CustomEmotion). - - regex = TQRegExp("Context: ([0-9a-zA-Z+/=]*)"); - regex.search(body); - TQCString msnobj; - - // Decode the msn object from base64 encoding. - KCodecs::base64Decode(regex.cap(1).utf8() , msnobj); - kdDebug(14140) << k_funcinfo << "Contact requested, " - << msnobj << endl; - - // Create a new transfer context that will handle - // the user display icon transfer. - TransferContext *current = - new OutgoingTransfer(from, this, sessionId.toUInt()); - current->m_branch = branch; - current->m_callId = callId; - current->setType(P2P::UserDisplayIcon); - // Add the transfer to the list. - m_sessions.insert(sessionId.toUInt(), current); - - // Determine the display icon being requested. - TQString fileName = objectList.contains(msnobj) - ? objectList[msnobj] - : m_pictureUrl; - TQFile *source = new TQFile(fileName); - // Try to open the source file for reading. - // If an error occurs, send an internal - // error message to the recipient. - if(!source->open(IO_ReadOnly)) - { - current->error(); - return; - } - - current->m_file = source; - // Acknowledge the session request. - current->acknowledge(message); - - current->m_ackSessionIdentifier = message.header.identifier; - current->m_ackUniqueIdentifier = message.header.ackSessionIdentifier; - // Send a 200 OK message to the recipient. - TQString content = TQString("SessionID: %1\r\n\r\n").arg(sessionId); - current->sendMessage(OK, content); - } - else if(applicationId == 2) - { - // A contact has requested a session to - // send a file. - - kdDebug(14140) << k_funcinfo << "File transfer invitation." << endl; - - // Create a new transfer context that will handle - // the file transfer. - TransferContext *transfer = - new IncomingTransfer(from, this, sessionId.toUInt()); - transfer->m_branch = branch; - transfer->m_callId = callId; - transfer->setType(P2P::File); - // Add the transfer to the list. - m_sessions.insert(sessionId.toUInt(), transfer); - - regex = TQRegExp("Context: ([0-9a-zA-Z+/=]*)"); - regex.search(body); - TQByteArray context; - - // Decode the file context from base64 encoding. - KCodecs::base64Decode(regex.cap(1).utf8(), context); - TQDataStream reader(context, IO_ReadOnly); - reader.setByteOrder(TQDataStream::LittleEndian); - //Retrieve the file info from the context field. - // File Size [8..15] Int64 - reader.device()->at(8); - TQ_INT64 fileSize; - reader >> fileSize; - // Flag [15..18] Int32 - // 0x00 File transfer with preview data. - // 0x01 File transfer without preview data. - // 0x02 Background sharing. - TQ_INT32 flag; - reader >> flag; - kdDebug(14140) << flag << endl; - // FileName UTF16 (Unicode) [19..539] - TQByteArray bytes(520); - reader.readRawBytes(bytes.data(), bytes.size()); - TQTextStream ts(bytes, IO_ReadOnly); - ts.setEncoding(TQTextStream::Unicode); - TQString fileName; - fileName = ts.readLine().utf8(); - - emit incomingTransfer(from, fileName, fileSize); - - kdDebug(14140) << - TQString("%1, %2 bytes.").arg(fileName, TQString::number(fileSize)) - << endl - << endl; - - // Get the contact that is sending the file. - Kopete::Contact *contact = getContactByAccountId(from); - - if(contact) - { - // Acknowledge the file invitation message. - transfer->acknowledge(message); - - transfer->m_ackSessionIdentifier = message.header.identifier; - transfer->m_ackUniqueIdentifier = message.header.ackSessionIdentifier; - - TQObject::connect(Kopete::TransferManager::transferManager(), TQT_SIGNAL(accepted(Kopete::Transfer*, const TQString&)), transfer, TQT_SLOT(slotTransferAccepted(Kopete::Transfer*, const TQString&))); - TQObject::connect(Kopete::TransferManager::transferManager(), TQT_SIGNAL(refused(const Kopete::FileTransferInfo&)), transfer, TQT_SLOT(slotTransferRefused(const Kopete::FileTransferInfo&))); - - // Show the file transfer accept/decline dialog. - Kopete::TransferManager::transferManager()->askIncomingTransfer(contact, fileName, fileSize, TQString(), sessionId); - } - else - { - kdWarning(14140) << fileName << " from " << from - << " has failed; could not retrieve contact from contact list." - << endl; - transfer->m_ackSessionIdentifier = message.header.identifier; - transfer->m_ackUniqueIdentifier = message.header.ackSessionIdentifier; - transfer->sendMessage(ERROR); - } - } - else if(applicationId == 4) - { -#if MSN_WEBCAM - regex = TQRegExp("EUF-GUID: \\{([0-9a-zA-Z\\-]*)\\}"); - regex.search(body); - TQString GUID=regex.cap(1); - - kdDebug(14140) << k_funcinfo << "webcam " << GUID << endl; - - Webcam::Who who; - if(GUID=="4BD96FC0-AB17-4425-A14A-439185962DC8") - { //that mean "I want to send MY webcam" - who=Webcam::wViewer; - } - else if(GUID=="1C9AA97E-9C05-4583-A3BD-908A196F1E92") - { //that mean "I want YOU to send YOUR webcam" - who=Webcam::wProducer; - } - else - { //unknown GUID - //current->error(); - kdWarning(14140) << k_funcinfo << "Unknown GUID " << GUID << endl; - return; - } - - TransferContext *current = new P2P::Webcam(who, from, this, sessionId.toUInt()); - current->m_branch = branch; - current->m_callId = callId; - - // Add the transfer to the list. - m_sessions.insert(sessionId.toUInt(), current); - // Acknowledge the session request. - current->acknowledge(message); - TQTimer::singleShot(0,current, TQT_SLOT(askIncommingInvitation()) ); -#endif - } - } - else if(message.header.sessionId == 64) - { - // A contact has sent an inkformat (handwriting) gif. - // NOTE The entire message body is UTF16 encoded. - TQString body = ""; - for (TQ_UINT32 i=0; i < message.header.totalDataSize; i++){ - if (message.body[i] != TQChar('\0')){ - body += TQChar(message.body[i]); - } - } - - TQRegExp regex("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); - regex.search(body); - TQString contentType = regex.cap(1); - - if(contentType == "image/gif") - { - IncomingTransfer transfer(message.source, this, message.header.sessionId); - transfer.acknowledge(message); - - regex = TQRegExp("base64:([0-9a-zA-Z+/=]*)"); - regex.search(body); - TQString base64 = regex.cap(1); - TQByteArray image; -// Convert from base64 encoding to byte array. - KCodecs::base64Decode(base64.utf8(), image); -// Create a temporary file to store the image data. - KTempFile *ink = new KTempFile(locateLocal("tmp", "inkformatgif-" ), ".gif"); - ink->setAutoDelete(true); -// Save the image data to disk. - ink->file()->writeBlock(image); - ink->file()->close(); - displayIconReceived(ink, "inkformatgif"); - ink = 0l; - } - } - } -} - -void Dispatcher::messageAcknowledged(unsigned int correlationId, bool fullReceive) -{ - if(fullReceive) - { - TransferContext *current = 0l; - TQMap<TQ_UINT32, TransferContext*>::Iterator it = m_sessions.begin(); - for(; it != m_sessions.end(); it++) - { - current = it.data(); - if(current->m_transactionId == correlationId) - { - // Inform the transfer object of the acknowledge. - current->readyWrite(); - break; - } - } - } -} - -Kopete::Contact* Dispatcher::getContactByAccountId(const TQString& accountId) -{ - Kopete::Contact *contact = 0l; - if(parent()) - { - // Retrieve the contact from the current chat session context. - Kopete::ChatSession *session = dynamic_cast<Kopete::ChatSession*>(parent()->parent()); - if(session) - { - contact = session->account()->contacts()[accountId]; - session->setCanBeDeleted(false); - } - } - return contact; -} - -Dispatcher::CallbackChannel::CallbackChannel(MSNSwitchBoardSocket *switchboard) -{ - m_switchboard = switchboard; -} - -Dispatcher::CallbackChannel::~CallbackChannel() -{} - -TQ_UINT32 Dispatcher::CallbackChannel::send(const TQByteArray& stream) -{ - return m_switchboard->sendCommand("MSG", "D", true, stream, true); -} - -Dispatcher::CallbackChannel* Dispatcher::callbackChannel() -{ - if(m_callbackChannel == 0l){ - MSNSwitchBoardSocket *callback = dynamic_cast<MSNSwitchBoardSocket *>(parent()); - if(callback == 0l) return 0l; - m_callbackChannel = new Dispatcher::CallbackChannel(callback); - } - - return m_callbackChannel; -} - -#include "dispatcher.moc" diff --git a/kopete/protocols/msn/dispatcher.h b/kopete/protocols/msn/dispatcher.h deleted file mode 100644 index 65b8dd3d..00000000 --- a/kopete/protocols/msn/dispatcher.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - dispatcher.h - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef DISPATCHER_H -#define DISPATCHER_H - -#include <tqobject.h> -#include <tqstringlist.h> - -#include "kopete_export.h" - -#include "p2p.h" -#include "messageformatter.h" -#include "incomingtransfer.h" -#include "outgoingtransfer.h" - - -namespace Kopete { class Contact; } -class MSNSwitchBoardSocket; - -/** -@author Kopete Developers -*/ -namespace P2P{ - class IncomingTransfer; - class OutgoingTransfer; - - class KOPETE_EXPORT Dispatcher : public TQObject - { Q_OBJECT - - public: - Dispatcher(TQObject *parent, const TQString& contact, const TQStringList &ip); - ~Dispatcher(); - - void detach(TransferContext* transfer); - TQString localContact(); - void requestDisplayIcon(const TQString& from, const TQString& msnObject); - void sendFile(const TQString& path, TQ_INT64 fileSize, const TQString& to); - void sendImage(const TQString& fileName, const TQString& to); - TQString m_pictureUrl; - TQMap<TQString, TQString> objectList; - -#if MSN_WEBCAM - void startWebcam(const TQString &myHandle, const TQString &msgHandle, bool wantToReceive); -#endif - - - public slots: - void slotReadMessage(const TQString &from, const TQByteArray& stream); - void messageAcknowledged(unsigned int correlationId, bool fullReceive); - - signals: - void sendCommand(const TQString &cmd, const TQString &args = TQString(), bool addId = true, const TQByteArray &body = TQByteArray(), bool binary=false); - void displayIconReceived(KTempFile* file, const TQString& msnObject); - void incomingTransfer(const TQString& from, const TQString& fileName, TQ_INT64 fileSize); - - private: - class CallbackChannel - { - public: - CallbackChannel(MSNSwitchBoardSocket *switchboard); - ~CallbackChannel(); - - TQ_UINT32 send(const TQByteArray& stream); - - private: - MSNSwitchBoardSocket *m_switchboard; - }; - - public: - CallbackChannel* callbackChannel(); - /** - * IP's of this compiter, the first one is the one seen by the server. - */ - TQStringList localIp() { return m_ip; } - - - private: - void dispatch(const P2P::Message& message); - Kopete::Contact* getContactByAccountId(const TQString& accountId); - - P2P::MessageFormatter m_messageFormatter; - TQMap<TQ_UINT32, P2P::TransferContext*> m_sessions; - TQMap<TQ_UINT32, P2P::Message> m_messageBuffer; - TQString m_contact; - CallbackChannel *m_callbackChannel; - TQStringList m_ip; - - friend class P2P::TransferContext; - friend class P2P::IncomingTransfer; - friend class P2P::OutgoingTransfer; - }; -} - -#endif diff --git a/kopete/protocols/msn/dummy.cpp b/kopete/protocols/msn/dummy.cpp deleted file mode 100644 index 6edd39fa..00000000 --- a/kopete/protocols/msn/dummy.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "kdemacros.h" -extern "C" KDE_EXPORT void *init_libkopete_msn_shared(); -extern "C" KDE_EXPORT void *init_kopete_msn() { return init_libkopete_msn_shared(); } diff --git a/kopete/protocols/msn/icons/CMakeLists.txt b/kopete/protocols/msn/icons/CMakeLists.txt deleted file mode 100644 index ba51467b..00000000 --- a/kopete/protocols/msn/icons/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -tde_install_icons( DESTINATION ${DATA_INSTALL_DIR}/kopete/icons ) diff --git a/kopete/protocols/msn/icons/Makefile.am b/kopete/protocols/msn/icons/Makefile.am deleted file mode 100644 index 9143c6b4..00000000 --- a/kopete/protocols/msn/icons/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -kopeteicondir = $(kde_datadir)/kopete/icons -kopeteicon_ICON = AUTO diff --git a/kopete/protocols/msn/icons/cr128-app-msn_protocol.png b/kopete/protocols/msn/icons/cr128-app-msn_protocol.png Binary files differdeleted file mode 100644 index dc94a4e9..00000000 --- a/kopete/protocols/msn/icons/cr128-app-msn_protocol.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_away.png b/kopete/protocols/msn/icons/cr16-action-msn_away.png Binary files differdeleted file mode 100644 index cbbd45fc..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_away.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_blocked.png b/kopete/protocols/msn/icons/cr16-action-msn_blocked.png Binary files differdeleted file mode 100644 index 80efc4c7..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_blocked.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_brb.png b/kopete/protocols/msn/icons/cr16-action-msn_brb.png Binary files differdeleted file mode 100644 index 3f1a0d30..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_brb.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_busy.png b/kopete/protocols/msn/icons/cr16-action-msn_busy.png Binary files differdeleted file mode 100644 index b3dcac08..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_busy.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_connecting.mng b/kopete/protocols/msn/icons/cr16-action-msn_connecting.mng Binary files differdeleted file mode 100644 index 38629273..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_connecting.mng +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_invisible.png b/kopete/protocols/msn/icons/cr16-action-msn_invisible.png Binary files differdeleted file mode 100644 index ce42bef0..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_invisible.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_lunch.png b/kopete/protocols/msn/icons/cr16-action-msn_lunch.png Binary files differdeleted file mode 100644 index abf42e3f..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_lunch.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_na.png b/kopete/protocols/msn/icons/cr16-action-msn_na.png Binary files differdeleted file mode 100644 index b1aa91af..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_na.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_newmsg.png b/kopete/protocols/msn/icons/cr16-action-msn_newmsg.png Binary files differdeleted file mode 100644 index d42bb0ae..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_newmsg.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_offline.png b/kopete/protocols/msn/icons/cr16-action-msn_offline.png Binary files differdeleted file mode 100644 index 5cf9ffd5..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_offline.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_online.png b/kopete/protocols/msn/icons/cr16-action-msn_online.png Binary files differdeleted file mode 100644 index 71169ad2..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_online.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-action-msn_phone.png b/kopete/protocols/msn/icons/cr16-action-msn_phone.png Binary files differdeleted file mode 100644 index 857ec14a..00000000 --- a/kopete/protocols/msn/icons/cr16-action-msn_phone.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr16-app-msn_protocol.png b/kopete/protocols/msn/icons/cr16-app-msn_protocol.png Binary files differdeleted file mode 100644 index a18ff5d4..00000000 --- a/kopete/protocols/msn/icons/cr16-app-msn_protocol.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr32-app-msn_protocol.png b/kopete/protocols/msn/icons/cr32-app-msn_protocol.png Binary files differdeleted file mode 100644 index 2c9b130b..00000000 --- a/kopete/protocols/msn/icons/cr32-app-msn_protocol.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr48-app-msn_protocol.png b/kopete/protocols/msn/icons/cr48-app-msn_protocol.png Binary files differdeleted file mode 100644 index ad495100..00000000 --- a/kopete/protocols/msn/icons/cr48-app-msn_protocol.png +++ /dev/null diff --git a/kopete/protocols/msn/icons/cr64-app-msn_protocol.png b/kopete/protocols/msn/icons/cr64-app-msn_protocol.png Binary files differdeleted file mode 100644 index 338f81bf..00000000 --- a/kopete/protocols/msn/icons/cr64-app-msn_protocol.png +++ /dev/null diff --git a/kopete/protocols/msn/incomingtransfer.cpp b/kopete/protocols/msn/incomingtransfer.cpp deleted file mode 100644 index 0da4a04c..00000000 --- a/kopete/protocols/msn/incomingtransfer.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/* - incomingtransfer.cpp - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "incomingtransfer.h" -using P2P::TransferContext; -using P2P::IncomingTransfer; -using P2P::Message; - -// Kde includes -#include <kbufferedsocket.h> -#include <kdebug.h> -#include <tdelocale.h> -#include <kserversocket.h> -#include <kstandarddirs.h> -#include <tdetempfile.h> -using namespace KNetwork; - -// TQt includes -#include <tqfile.h> -#include <tqregexp.h> - -// Kopete includes -#include <kopetetransfermanager.h> - -IncomingTransfer::IncomingTransfer(const TQString& from, P2P::Dispatcher *dispatcher, TQ_UINT32 sessionId) -: TransferContext(from,dispatcher,sessionId) -{ - m_direction = P2P::Incoming; - m_listener = 0l; -} - -IncomingTransfer::~IncomingTransfer() -{ - kdDebug(14140) << k_funcinfo << endl; - if(m_listener) - { - delete m_listener; - m_listener = 0l; - } - - if(m_socket) - { - delete m_socket; - m_socket = 0l; - } -} - - -void IncomingTransfer::slotTransferAccepted(Kopete::Transfer* transfer, const TQString& /*fileName*/) -{ - TQ_UINT32 sessionId = transfer->info().internalId().toUInt(); - if(sessionId!=m_sessionId) - return; - - TQObject::connect(transfer , TQT_SIGNAL(transferCanceled()), this, TQT_SLOT(abort())); - m_transfer = transfer; - - TQString content = TQString("SessionID: %1\r\n\r\n").arg(sessionId); - sendMessage(OK, content); - - TQObject::disconnect(Kopete::TransferManager::transferManager(), 0l, this, 0l); -} - -void IncomingTransfer::slotTransferRefused(const Kopete::FileTransferInfo& info) -{ - TQ_UINT32 sessionId = info.internalId().toUInt(); - if(sessionId!=m_sessionId) - return; - - TQString content = TQString("SessionID: %1\r\n\r\n").arg(sessionId); - // Send the sending client a cancelation message. - sendMessage(DECLINE, content); - m_state=Finished; - - TQObject::disconnect(Kopete::TransferManager::transferManager(), 0l, this, 0l); -} - - - -void IncomingTransfer::acknowledged() -{ - kdDebug(14140) << k_funcinfo << endl; - - switch(m_state) - { - case Invitation: - // NOTE UDI: base identifier acknowledge message, ignore. - // UDI: 200 OK message should follow. - if(m_type == File) - { - // FT: 200 OK acknowledged message. - // If this is the first connection between the two clients, a direct connection invitation - // should follow. Otherwise, the file transfer may start right away. - if(m_transfer) - { - TQFile *destination = new TQFile(m_transfer->destinationURL().path()); - if(!destination->open(IO_WriteOnly)) - { - m_transfer->slotError(TDEIO::ERR_CANNOT_OPEN_FOR_WRITING, i18n("Cannot open file for writing")); - m_transfer = 0l; - - error(); - return; - } - m_file = destination; - } - m_state = Negotiation; - } - break; - - case Negotiation: - // 200 OK acknowledge message. - break; - - case DataTransfer: - break; - - case Finished: - // UDI: Bye acknowledge message. - m_dispatcher->detach(this); - break; - } -} - -void IncomingTransfer::processMessage(const Message& message) -{ - if(m_file && (message.header.flag == 0x20 || message.header.flag == 0x01000030)) - { - // UserDisplayIcon data or File data is in this message. - // Write the recieved data to the file. - kdDebug(14140) << k_funcinfo << TQString("Received, %1 bytes").arg(message.header.dataSize) << endl; - - m_file->writeBlock(message.body.data(), message.header.dataSize); - if(m_transfer){ - m_transfer->slotProcessed(message.header.dataOffset + message.header.dataSize); - } - - if((message.header.dataOffset + message.header.dataSize) == message.header.totalDataSize) - { - // Transfer is complete. - if(m_type == UserDisplayIcon){ - m_tempFile->close(); - m_dispatcher->displayIconReceived(m_tempFile, m_object); - m_tempFile = 0l; - m_file = 0l; - } - else - { - m_file->close(); - } - - m_isComplete = true; - // Send data acknowledge message. - acknowledge(message); - - if(m_type == UserDisplayIcon) - { - m_state = Finished; - // Send BYE message. - sendMessage(BYE, "\r\n"); - } - } - } - else if(message.header.dataSize == 4 && message.applicationIdentifier == 1) - { - // Data preparation message. - //if (m_tempFile->name().isEmpty() == false) { - // TQFile::remove(m_tempFile->name()); - //} - m_tempFile = new KTempFile(locateLocal("tmp", "msnpicture--"), ".png"); - m_tempFile->setAutoDelete(true); - m_file = m_tempFile->file(); - m_state = DataTransfer; - // Send data preparation acknowledge message. - acknowledge(message); - } - else - { - TQString body = - TQCString(message.body.data(), message.header.dataSize); -// kdDebug(14140) << k_funcinfo << "received, " << body << endl; - - if(body.startsWith("INVITE")) - { - // Retrieve some MSNSLP headers used when - // replying to this INVITE message. - TQRegExp regex(";branch=\\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - m_branch = regex.cap(1); - // NOTE Call-ID never changes. - regex = TQRegExp("Call-ID: \\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - m_callId = regex.cap(1); - regex = TQRegExp("Bridges: ([^\r\n]*)\r\n"); - regex.search(body); - TQString bridges = regex.cap(1); - // The NetID field is 0 if the Conn-Type is - // Direct-Connect or Firewall, otherwise, it is - // a randomly generated number. - regex = TQRegExp("NetID: (\\-?\\d+)\r\n"); - regex.search(body); - TQString netId = regex.cap(1); - kdDebug(14140) << "net id, " << netId << endl; - // Connection Types - // - Direct-Connect - // - Port-Restrict-NAT - // - IP-Restrict-NAT - // - Symmetric-NAT - // - Firewall - regex = TQRegExp("Conn-Type: ([^\r\n]+)\r\n"); - regex.search(body); - TQString connType = regex.cap(1); - - bool wouldListen = false; - if(netId.toUInt() == 0 && connType == "Direct-Connect"){ - wouldListen = true; - - } - else if(connType == "IP-Restrict-NAT"){ - wouldListen = true; - } -#if 1 - wouldListen = false; // TODO Direct connection support -#endif - TQString content; - - if(wouldListen) - { - // Create a listening socket for direct file transfer. - m_listener = new TDEServerSocket("", ""); - m_listener->setResolutionEnabled(true); - // Create the callback that will try to accept incoming connections. - TQObject::connect(m_listener, TQT_SIGNAL(readyAccept()), TQT_SLOT(slotAccept())); - TQObject::connect(m_listener, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotListenError(int))); - // Listen for incoming connections. - bool isListening = m_listener->listen(1); - kdDebug(14140) << k_funcinfo << (isListening ? "listening" : "not listening") << endl; - kdDebug(14140) << k_funcinfo - << "local endpoint, " << m_listener->localAddress().nodeName() - << endl; - - content = "Bridge: TCPv1\r\n" - "Listening: true\r\n" + - TQString("Hashed-Nonce: {%1}\r\n").arg(P2P::Uid::createUid()) + - TQString("IPv4Internal-Addrs: %1\r\n").arg(m_listener->localAddress().nodeName()) + - TQString("IPv4Internal-Port: %1\r\n").arg(m_listener->localAddress().serviceName()) + - "\r\n"; - } - else - { - content = - "Bridge: TCPv1\r\n" - "Listening: false\r\n" - "Hashed-Nonce: {00000000-0000-0000-0000-000000000000}\r\n" - "\r\n"; - } - - m_state = DataTransfer; - - if (m_type != File) - { - // NOTE For file transfers, the connection invite *must not* be acknowledged in any way - // as this trips MSN 7.5 - - acknowledge(message); - // Send 200 OK message to the sending client. - sendMessage(OK, content); - } - } - else if(body.startsWith("BYE")) - { - m_state = Finished; - // Send the sending client an acknowledge message. - acknowledge(message); - - if(m_file && m_transfer) - { - if(m_isComplete){ - // The transfer is complete. - m_transfer->slotComplete(); - } - else - { - // The transfer has been canceled remotely. - if(m_transfer){ - // Inform the user of the file transfer cancelation. - m_transfer->slotError(TDEIO::ERR_ABORTED, i18n("File transfer canceled.")); - } - // Remove the partially received file. - m_file->remove(); - } - } - - // Dispose of this transfer context. - m_dispatcher->detach(this); - } - else if(body.startsWith("MSNSLP/1.0 200 OK")) - { - if(m_type == UserDisplayIcon){ - m_state = Negotiation; - // Acknowledge the 200 OK message. - acknowledge(message); - } - } - } -} - -void IncomingTransfer::slotListenError(int /*errorCode*/) -{ - kdDebug(14140) << k_funcinfo << m_listener->errorString() << endl; -} - -void IncomingTransfer::slotAccept() -{ - // Try to accept an incoming connection from the sending client. - m_socket = static_cast<TDEBufferedSocket*>(m_listener->accept()); - if(!m_socket) - { - // NOTE If direct connection fails, the sending - // client wil transfer the file data through the - // existing session. - kdDebug(14140) << k_funcinfo << "Direct connection failed." << endl; - // Close the listening endpoint. - m_listener->close(); - return; - } - - kdDebug(14140) << k_funcinfo << "Direct connection established." << endl; - - // Set the socket to non blocking, - // enable the ready read signal and disable - // ready write signal. - // NOTE readyWrite consumes too much cpu usage. - m_socket->setBlocking(false); - m_socket->enableRead(true); - m_socket->enableWrite(false); - - // Create the callback that will try to read bytes from the accepted socket. - TQObject::connect(m_socket, TQT_SIGNAL(readyRead()), this, TQT_SLOT(slotSocketRead())); - // Create the callback that will try to handle the socket close event. - TQObject::connect(m_socket, TQT_SIGNAL(closed()), this, TQT_SLOT(slotSocketClosed())); - // Create the callback that will try to handle the socket error event. - TQObject::connect(m_socket, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotSocketError(int))); -} - -void IncomingTransfer::slotSocketRead() -{ - int available = m_socket->bytesAvailable(); - kdDebug(14140) << k_funcinfo << available << ", bytes available." << endl; - if(available > 0) - { - TQByteArray buffer(available); - m_socket->readBlock(buffer.data(), buffer.size()); - - if(TQString(buffer) == "foo"){ - kdDebug(14140) << "Connection Check." << endl; - } - } -} - -void IncomingTransfer::slotSocketClosed() -{ - kdDebug(14140) << k_funcinfo << endl; -} - -void IncomingTransfer::slotSocketError(int errorCode) -{ - kdDebug(14140) << k_funcinfo << errorCode << endl; -} - -#include "incomingtransfer.moc" diff --git a/kopete/protocols/msn/incomingtransfer.h b/kopete/protocols/msn/incomingtransfer.h deleted file mode 100644 index 3ce3f391..00000000 --- a/kopete/protocols/msn/incomingtransfer.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - incomingtransfer.h - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef INCOMINGTRANSFER_H -#define INCOMINGTRANSFER_H - -#include "p2p.h" -#include "dispatcher.h" - -namespace KNetwork{ - class TDEServerSocket; -} - -/** -@author Kopete Developers -*/ -namespace P2P{ - class IncomingTransfer : public P2P::TransferContext - { Q_OBJECT - - public: - IncomingTransfer(const TQString& from, P2P::Dispatcher *dispatcher, TQ_UINT32 sessionId); - virtual ~IncomingTransfer(); - - private slots: - void slotListenError(int errorCode); - void slotAccept(); - void slotSocketRead(); - void slotSocketClosed(); - void slotSocketError(int errorCode); - - void slotTransferAccepted(Kopete::Transfer* transfer, const TQString& fileName); - void slotTransferRefused(const Kopete::FileTransferInfo& info); - - - private: - virtual void acknowledged(); - virtual void processMessage(const Message& message); - - KTempFile *m_tempFile; - KNetwork::TDEServerSocket *m_listener; - }; -} - -#endif diff --git a/kopete/protocols/msn/kopete_msn.desktop b/kopete/protocols/msn/kopete_msn.desktop deleted file mode 100644 index 8f74c113..00000000 --- a/kopete/protocols/msn/kopete_msn.desktop +++ /dev/null @@ -1,99 +0,0 @@ -[Desktop Entry] -Type=Service -Icon=msn_protocol -ServiceTypes=Kopete/Protocol -X-TDE-Library=kopete_msn -X-Kopete-Version=1000900 -X-Kopete-Messaging-Protocol=messaging/msn -X-TDE-PluginInfo-Author=Kopete Developers -X-TDE-PluginInfo-Name=kopete_msn -X-TDE-PluginInfo-Version=0.8.0 -X-TDE-PluginInfo-Website=http://kopete.kde.org -X-TDE-PluginInfo-Category=Protocols -X-TDE-PluginInfo-Depends= -X-TDE-PluginInfo-License=GPL -X-TDE-PluginInfo-EnabledByDefault=false -Name=MSN Messenger -Name[ar]=مرسال MSN -Name[bn]=এমএসএন বার্তাবাহক -Name[cy]=Negesydd MSN -Name[da]=MSN-Messenger -Name[de]=MSN-Messenger -Name[eo]=MSN-mesaĝilo -Name[fa]=پیامرسان اماسان -Name[gl]=MSN Messanger -Name[hi]=एमएसएन मैसेंजर -Name[ja]=MSN メッセンジャー -Name[km]=កម្មវិធីផ្ញើសារ MSN -Name[lt]=MSN žinučių klientas -Name[mk]=Гласник за MSN -Name[nds]=MSN-Kortnarichtendeenst -Name[ne]=एमएसएन मेसेन्जर -Name[pa]=MSN ਸੁਨੇਹੇਦਾਰ -Name[pl]=Komunikator MSN Messenger -Name[pt_BR]=Mensageiro MSN -Name[ro]=Mesaje instantanee MSN -Name[tg]=MSN Пайёмбар -Name[uk]=Кур'єр MSN -Name[uz]=MSN mesenjer -Name[uz@cyrillic]=MSN месенжер -Comment=Protocol to connect to MSN Messenger -Comment[ar]=البرتوكول سيتصل بمرسال MSN -Comment[be]=Пратакол MSN Messenger -Comment[bg]=Протокол за връзка с MSN Messenger -Comment[bn]=এমএসএন বার্তাবাহকে সংযোগ করতে প্রোটোকল -Comment[br]=Komenad kevreañ ouzh MSN Messenger -Comment[bs]=MSN Messenger protokol -Comment[ca]=Protocol per a connectar-se a MSN Messenger -Comment[cs]=Protokol k připojení k MSN Messengeru -Comment[cy]=Protocol i gysylltu â Negesydd MSN -Comment[da]=Protokol til at forbinde til MSN-Messenger -Comment[de]=Protokoll zur Verbindung mit dem MSN-Messenger -Comment[el]=Πρωτόκολλο για σύνδεση στο MSN Messenger -Comment[es]=Protocolo para conectar con MSN Messenger -Comment[et]=Protokoll ühendumiseks MSN Messengeriga -Comment[eu]=MSN Messenger-era konektatzeko protokoloa -Comment[fa]=قرارداد برای اتصال به پیامرسان اماسان -Comment[fi]=Yhteyskäytäntö MSN Messanger -verkkoon kytkeytymiseen -Comment[fr]=Protocole pour se connecter sur MSN Messenger -Comment[ga]=Prótacal chun ceangal le MSN Messenger -Comment[gl]=Protocolo para se conectar ó MSN Messanger -Comment[he]=פרוטוקול התחברות ל- MSN Messenger -Comment[hi]=एमएसएन मैसेंजर से जुड़ने का प्रोटोकॉल -Comment[hr]=Protokol za povezivanje na MSN Messenger -Comment[hu]=Protokoll az MSN Messenger használatához -Comment[is]=Samskiptamáti til að tengjast MSN Messenger -Comment[it]=Protocollo per connessione a MSN Messenger -Comment[ja]=MSN メッセンジャーに接続するプロトコル -Comment[ka]=MSN Messenger დაკავშირების ოქმი -Comment[kk]=MSN Messenger-ге қосылу протоколы -Comment[km]=ពិធីការដើម្បីភ្ជាប់ទៅកម្មវិធីផ្ញើសារ MSN -Comment[lt]=Protokolas prisijungimui prie MSN žinučių kliento -Comment[mk]=Протокол за поврзување на Гласникот на MSN -Comment[nb]=Protokoll for å koble til MSN Messenger -Comment[nds]=Protokoll för't Tokoppeln na den MSN-Kortnarichtendeenst -Comment[ne]=एमएसएन मेसेन्जरमा जडान गर्नुपर्ने प्रोटोकल -Comment[nl]=Protocol voor MSN Messenger -Comment[nn]=Protokoll for å kopla til MSN Messenger -Comment[pl]=Protokół połączenia z serwerem MSN Messenger -Comment[pt]=Um protocolo para ser ligar ao MSN Messenger -Comment[pt_BR]=Protocolo para conexão ao MSN Messenger -Comment[ro]=Protocol de conectare la MSN Messenger -Comment[ru]=Протокол для подключения к MSN Messenger -Comment[sk]=Protokol pre pripojenie k MSN Messenger -Comment[sl]=Protokol za povezavo na MSN Messenger -Comment[sr]=Протокол за повезивање на MSN Messenger -Comment[sr@Latn]=Protokol za povezivanje na MSN Messenger -Comment[sv]=Protokoll för att ansluta till MSN-meddelandeklient -Comment[ta]= MSN Messenger யுடன் இணைக்க விதிமுறை -Comment[tg]=Қарордоди пайвастшавӣ ба MSN Пайёмбар -Comment[tr]=MSN Messenger'a bağlantı iletişim kuralı -Comment[uk]=Протокол для з'єднання з MSN Messenger -Comment[uz]=MSN mesenjer bilan aloqa oʻrnatish uchun protokol -Comment[uz@cyrillic]=MSN месенжер билан алоқа ўрнатиш учун протокол -Comment[wa]=Protocole po s' raloyî a MSN -Comment[zh_CN]=连接到 MSN Messenger 协议 -Comment[zh_HK]=用來連接至 MSN Messenger 的通訊協定 -Comment[zh_TW]=連線到 MSN 的協定 - diff --git a/kopete/protocols/msn/messageformatter.cpp b/kopete/protocols/msn/messageformatter.cpp deleted file mode 100644 index 0ca71789..00000000 --- a/kopete/protocols/msn/messageformatter.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - messageformatter.cpp - msn p2p protocol - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "messageformatter.h" -#include "p2p.h" - -// TQt includes -#include <tqdatastream.h> -#include <tqregexp.h> - -// Kde includes -#include <kdebug.h> - -using P2P::MessageFormatter; -using P2P::Message; - -MessageFormatter::MessageFormatter(TQObject *parent, const char *name) : TQObject(parent, name) -{} - -MessageFormatter::~MessageFormatter() -{} - -Message MessageFormatter::readMessage(const TQByteArray& stream, bool compact) -{ - Message inbound; - - TQ_UINT32 index = 0; - if(compact == false) - { - // Determine the end position of the message header. - while(index < stream.size()) - { - if(stream[index++] == '\n'){ - if(stream[index - 3] == '\n') - break; - } - } - - // Retrieve the message header. - TQString messageHeader = TQCString(stream.data(), index); - - // Retrieve the message mime version, content type, - // and p2p destination. - TQRegExp regex("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); - regex.search(messageHeader); - TQString contentType = regex.cap(1); - - if(contentType != "application/x-msnmsgrp2p") - return inbound; - -// kdDebug(14140) << k_funcinfo << endl; - - regex = TQRegExp("MIME-Version: (\\d.\\d)"); - regex.search(messageHeader); - inbound.mimeVersion = regex.cap(1); - inbound.contentType = contentType; - regex = TQRegExp("P2P-Dest: ([^\r\n]*)"); - regex.search(messageHeader); - TQString destination = regex.cap(1); - } - - TQDataStream reader(stream, IO_ReadOnly); - reader.setByteOrder(TQDataStream::LittleEndian); - // Seek to the start position of the message - // transport header. - reader.device()->at(index); - - // Read the message transport headers from the stream. - reader >> inbound.header.sessionId; - reader >> inbound.header.identifier; - reader >> inbound.header.dataOffset; - reader >> inbound.header.totalDataSize; - reader >> inbound.header.dataSize; - reader >> inbound.header.flag; - reader >> inbound.header.ackSessionIdentifier; - reader >> inbound.header.ackUniqueIdentifier; - reader >> inbound.header.ackDataSize; - - /*kdDebug(14140) - << "session id, " << inbound.header.sessionId << endl - << "identifier, " << inbound.header.identifier << endl - << "data offset, " << inbound.header.dataOffset << endl - << "total size, " << inbound.header.totalDataSize << endl - << "data size, " << inbound.header.dataSize << endl - << "flag, " << inbound.header.flag << endl - << "ack session identifier, " << inbound.header.ackSessionIdentifier << endl - << "ack unique identifier, " << inbound.header.ackUniqueIdentifier << endl - << "ack data size, " << inbound.header.ackDataSize - << endl;*/ - - // Read the message body from the stream. - if(inbound.header.dataSize > 0){ - inbound.body.resize(inbound.header.dataSize); - reader.readRawBytes(inbound.body.data(), inbound.header.dataSize); - } - - if(compact == false) - { - reader.setByteOrder(TQDataStream::BigEndian); - // Read the message application identifier from the stream. - reader >> inbound.applicationIdentifier; - -/* kdDebug(14140) - << "application identifier, " << inbound.applicationIdentifier - << endl;*/ - } - - return inbound; -} - -void MessageFormatter::writeMessage(const Message& message, TQByteArray& stream, bool compact) -{ -// kdDebug(14140) << k_funcinfo << endl; - - TQDataStream writer(stream, IO_WriteOnly); - writer.setByteOrder(TQDataStream::LittleEndian); - - if(compact == false) - { - const TQCString messageHeader = TQString("MIME-Version: 1.0\r\n" - "Content-Type: application/x-msnmsgrp2p\r\n" - "P2P-Dest: " + message.destination + "\r\n" - "\r\n").utf8(); - // Set the capacity of the message buffer. - stream.resize(messageHeader.length() + 48 + message.body.size() + 4); - // Write the message header to the stream - writer.writeRawBytes(messageHeader.data(), messageHeader.length()); - } - else - { - // Set the capacity of the message buffer. - stream.resize(4 + 48 + message.body.size()); - // Write the message size to the stream. - writer << (TQ_INT32)(48+message.body.size()); - } - - - // Write the transport headers to the stream. - writer << message.header.sessionId; - writer << message.header.identifier; - writer << message.header.dataOffset; - writer << message.header.totalDataSize; - writer << message.header.dataSize; - writer << message.header.flag; - writer << message.header.ackSessionIdentifier; - writer << message.header.ackUniqueIdentifier; - writer << message.header.ackDataSize; - -/* kdDebug(14140) - << "session id, " << message.header.sessionId << endl - << "identifier, " << message.header.identifier << endl - << "data offset, " << message.header.dataOffset << endl - << "total size, " << message.header.totalDataSize << endl - << "data size, " << message.header.dataSize << endl - << "flag, " << message.header.flag << endl - << "ack session identifier, " << message.header.ackSessionIdentifier << endl - << "ack unique identifier, " << message.header.ackUniqueIdentifier << endl - << "ack data size, " << message.header.ackDataSize - << endl; -*/ - if(message.body.size() > 0){ - // Write the messge body to the stream. - writer.writeRawBytes(message.body.data(), message.body.size()); - } - - if(compact == false) - { - // Seek to the message application identifier section. - writer.setByteOrder(TQDataStream::BigEndian); - // Write the message application identifier to the stream. - writer << message.applicationIdentifier; - -/* kdDebug(14140) - << "application identifier, " << message.applicationIdentifier - << endl; - */ - } -} - -#include "messageformatter.moc" diff --git a/kopete/protocols/msn/messageformatter.h b/kopete/protocols/msn/messageformatter.h deleted file mode 100644 index fb29c300..00000000 --- a/kopete/protocols/msn/messageformatter.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - messageformatter.h - msn p2p protocol - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MESSAGEFORMATTER_H -#define MESSAGEFORMATTER_H - -#include <tqobject.h> - -namespace P2P{ - class Message; -} - -/** -@author Kopete Developers -*/ -namespace P2P{ - class MessageFormatter : public TQObject - { Q_OBJECT - - public: - MessageFormatter(TQObject *parent = 0, const char *name = 0); - ~MessageFormatter(); - - Message readMessage(const TQByteArray& stream, bool compact=false); - void writeMessage(const Message& message, TQByteArray& stream, bool compact=false); - }; -} - -#endif diff --git a/kopete/protocols/msn/msnaccount.cpp b/kopete/protocols/msn/msnaccount.cpp deleted file mode 100644 index c987bf1d..00000000 --- a/kopete/protocols/msn/msnaccount.cpp +++ /dev/null @@ -1,1499 +0,0 @@ -/* - msnaccount.h - Manages a single MSN account - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2003 by Martijn Klingens <[email protected]> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnaccount.h" - -#include <config.h> - -#include <tdeaction.h> -#include <tdeconfig.h> -#include <kdebug.h> -#include <kinputdialog.h> -#include <tdemessagebox.h> -#include <tdepopupmenu.h> -#include <kstandarddirs.h> -#include <kmdcodec.h> -#include <tdelocale.h> - -#include <tqfile.h> -#include <tqregexp.h> -#include <tqvalidator.h> -#include <tqimage.h> - -#include "msncontact.h" -#include "msnnotifysocket.h" -#include "msnchatsession.h" -#include "kopetecontactlist.h" -#include "kopetegroup.h" -#include "kopetemetacontact.h" -#include "kopetepassword.h" -#include "kopeteuiglobal.h" -#include "kopeteglobal.h" -#include "kopetechatsessionmanager.h" -#include "contactaddednotifydialog.h" -#include "kopeteutils.h" - -#include "sha1.h" - - -#if !defined NDEBUG -#include "msndebugrawcmddlg.h" -#include <tdeglobal.h> -#endif - -#if MSN_WEBCAM -#include "avdevice/videodevicepool.h" -#endif - -MSNAccount::MSNAccount( MSNProtocol *parent, const TQString& AccountID, const char *name ) - : Kopete::PasswordedAccount ( parent, AccountID.lower(), 0, name ) -{ - m_notifySocket = 0L; - m_connectstatus = MSNProtocol::protocol()->NLN; - m_addWizard_metaContact = 0L; - m_newContactList=false; - - // Init the myself contact - setMyself( new MSNContact( this, accountId(), Kopete::ContactList::self()->myself() ) ); - //myself()->setOnlineStatus( MSNProtocol::protocol()->FLN ); - - TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( groupRenamed( Kopete::Group *, const TQString & ) ), - TQT_SLOT( slotKopeteGroupRenamed( Kopete::Group * ) ) ); - TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( groupRemoved( Kopete::Group * ) ), - TQT_SLOT( slotKopeteGroupRemoved( Kopete::Group * ) ) ); - - TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( globalIdentityChanged(const TQString&, const TQVariant& ) ), TQT_SLOT( slotGlobalIdentityChanged(const TQString&, const TQVariant& ) )); - - m_openInboxAction = new TDEAction( i18n( "Open Inbo&x..." ), "mail_generic", 0, this, TQT_SLOT( slotOpenInbox() ), this, "m_openInboxAction" ); - m_changeDNAction = new TDEAction( i18n( "&Change Display Name..." ), TQString(), 0, this, TQT_SLOT( slotChangePublicName() ), this, "renameAction" ); - m_startChatAction = new TDEAction( i18n( "&Start Chat..." ), "mail_generic", 0, this, TQT_SLOT( slotStartChat() ), this, "startChatAction" ); - - - TDEConfigGroup *config=configGroup(); - - m_blockList = config->readListEntry( "blockList" ) ; - m_allowList = config->readListEntry( "allowList" ) ; - m_reverseList = config->readListEntry( "reverseList" ) ; - - // Load the avatar - m_pictureFilename = locateLocal( "appdata", "msnpicture-"+ accountId().lower().replace(TQRegExp("[./~]"),"-") +".png" ); - resetPictureObject(true); - - static_cast<MSNContact *>( myself() )->setInfo( "PHH", config->readEntry("PHH") ); - static_cast<MSNContact *>( myself() )->setInfo( "PHM", config->readEntry("PHM") ); - static_cast<MSNContact *>( myself() )->setInfo( "PHW", config->readEntry("PHW") ); - //this is the display name - static_cast<MSNContact *>( myself() )->setInfo( "MFN", config->readEntry("MFN") ); - - //construct the group list - //Before 2003-11-14 the MSN server allowed us to download the group list without downloading the whole contactlist, but it's not possible anymore - TQPtrList<Kopete::Group> groupList = Kopete::ContactList::self()->groups(); - for ( Kopete::Group *g = groupList.first(); g; g = groupList.next() ) - { - TQString groupGuid=g->pluginData( protocol(), accountId() + " id" ); - if ( !groupGuid.isEmpty() ) - m_groupList.insert( groupGuid , g ); - } - - // Set the client Id for the myself contact. It sets what MSN feature we support. - m_clientId = MSNProtocol::MSNC4 | MSNProtocol::InkFormatGIF | MSNProtocol::SupportMultiPacketMessaging; - -#if MSN_WEBCAM - Kopete::AV::VideoDevicePool::self()->scanDevices(); - if( Kopete::AV::VideoDevicePool::self()->hasDevices() ) - { - m_clientId |= MSNProtocol::SupportWebcam; - } -#endif -} - - -TQString MSNAccount::serverName() -{ - return configGroup()->readEntry( "serverName" , "messenger.hotmail.com" ); -} - -uint MSNAccount::serverPort() -{ - return configGroup()->readNumEntry( "serverPort" , 1863 ); -} - -bool MSNAccount::useHttpMethod() const -{ - return configGroup()->readBoolEntry( "useHttpMethod" , false ); -} - -TQString MSNAccount::myselfClientId() const -{ - return TQString::number(m_clientId, 10); -} - -void MSNAccount::connectWithPassword( const TQString &passwd ) -{ - m_newContactList=false; - if ( isConnected() ) - { - kdDebug( 14140 ) << k_funcinfo <<"Ignoring Connect request " - << "(Already Connected)" << endl; - return; - } - - if ( m_notifySocket ) - { - kdDebug( 14140 ) << k_funcinfo <<"Ignoring Connect request (Already connecting)" << endl; - return; - } - - m_password = passwd; - - if ( m_password.isNull() ) - { - kdDebug( 14140 ) << k_funcinfo <<"Abort connection (null password)" << endl; - return; - } - - - if ( contacts().count() <= 1 ) - { - // Maybe the contactlist.xml has been removed, and the serial number not updated - // ( the 1 is for the myself contact ) - configGroup()->writeEntry( "serial", 0 ); - } - - m_openInboxAction->setEnabled( false ); - - createNotificationServer(serverName(), serverPort()); -} - -void MSNAccount::createNotificationServer( const TQString &host, uint port ) -{ - if(m_notifySocket) //we are switching from one to another notifysocket. - { - //remove every slots to that socket, so we won't delete receive signals - // from the old socket thinking they are from the new one - TQObject::disconnect( m_notifySocket , 0, this, 0 ); - m_notifySocket->deleteLater(); //be sure it will be deleted - m_notifySocket=0L; - } - - m_msgHandle.clear(); - - myself()->setOnlineStatus( MSNProtocol::protocol()->CNT ); - - - m_notifySocket = new MSNNotifySocket( this, accountId() , m_password); - m_notifySocket->setUseHttpMethod( useHttpMethod() ); - - TQObject::connect( m_notifySocket, TQT_SIGNAL( groupAdded( const TQString&, const TQString& ) ), - TQT_SLOT( slotGroupAdded( const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( groupRenamed( const TQString&, const TQString& ) ), - TQT_SLOT( slotGroupRenamed( const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( groupListed( const TQString&, const TQString& ) ), - TQT_SLOT( slotGroupAdded( const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( groupRemoved( const TQString& ) ), - TQT_SLOT( slotGroupRemoved( const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( contactList(const TQString&, const TQString&, const TQString&, uint, const TQString& ) ), - TQT_SLOT( slotContactListed(const TQString&, const TQString&, const TQString&, uint, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL(contactAdded(const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ), - TQT_SLOT( slotContactAdded(const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( contactRemoved(const TQString&, const TQString&, const TQString&, const TQString& ) ), - TQT_SLOT( slotContactRemoved(const TQString&, const TQString&, const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( statusChanged( const Kopete::OnlineStatus & ) ), - TQT_SLOT( slotStatusChanged( const Kopete::OnlineStatus & ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( invitedToChat( const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ), - TQT_SLOT( slotCreateChat( const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( startChat( const TQString&, const TQString& ) ), - TQT_SLOT( slotCreateChat( const TQString&, const TQString& ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( socketClosed() ), - TQT_SLOT( slotNotifySocketClosed() ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( newContactList() ), - TQT_SLOT( slotNewContactList() ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( receivedNotificationServer(const TQString&, uint ) ), - TQT_SLOT(createNotificationServer(const TQString&, uint ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( hotmailSeted( bool ) ), - m_openInboxAction, TQT_SLOT( setEnabled( bool ) ) ); - TQObject::connect( m_notifySocket, TQT_SIGNAL( errorMessage(int, const TQString& ) ), - TQT_SLOT( slotErrorMessageReceived(int, const TQString& ) ) ); - - m_notifySocket->setStatus( m_connectstatus ); - m_notifySocket->connect(host, port); -} - -void MSNAccount::disconnect() -{ - if ( m_notifySocket ) - m_notifySocket->disconnect(); -} - -TDEActionMenu * MSNAccount::actionMenu() -{ - TDEActionMenu *m_actionMenu=Kopete::Account::actionMenu(); - if ( isConnected() ) - { - m_openInboxAction->setEnabled( true ); - m_startChatAction->setEnabled( true ); - m_changeDNAction->setEnabled( true ); - } - else - { - m_openInboxAction->setEnabled( false ); - m_startChatAction->setEnabled( false ); - m_changeDNAction->setEnabled( false ); - } - - m_actionMenu->popupMenu()->insertSeparator(); - - m_actionMenu->insert( m_changeDNAction ); - m_actionMenu->insert( m_startChatAction ); - -// m_actionMenu->popupMenu()->insertSeparator(); - - m_actionMenu->insert( m_openInboxAction ); - -#if !defined NDEBUG - TDEActionMenu *debugMenu = new TDEActionMenu( "Debug", m_actionMenu ); - debugMenu->insert( new TDEAction( i18n( "Send Raw C&ommand..." ), 0, - this, TQT_SLOT( slotDebugRawCommand() ), debugMenu, "m_debugRawCommand" ) ); - m_actionMenu->popupMenu()->insertSeparator(); - m_actionMenu->insert( debugMenu ); -#endif - - return m_actionMenu; -} - -MSNNotifySocket *MSNAccount::notifySocket() -{ - return m_notifySocket; -} - - -void MSNAccount::setOnlineStatus( const Kopete::OnlineStatus &status , const TQString &reason) -{ - kdDebug( 14140 ) << k_funcinfo << status.description() << endl; - - // HACK: When changing song, do don't anything while connected - if( reason.contains("[Music]") && ( status == MSNProtocol::protocol()->UNK || status == MSNProtocol::protocol()->CNT ) ) - return; - - // Only send personal message when logged. - if( m_notifySocket && m_notifySocket->isLogged() ) - { - // Only update the personal/status message, don't change the online status - // since it's the same. - if( reason.contains("[Music]") ) - { - TQString personalMessage = reason.section("[Music]", 1); - setPersonalMessage( MSNProtocol::PersonalMessageMusic, personalMessage ); - - // Don't send un-needed status change. - return; - } - else - { - setPersonalMessage( MSNProtocol::PersonalMessageNormal, reason ); - } - } - - if(status.status()== Kopete::OnlineStatus::Offline) - disconnect(); - else if ( m_notifySocket ) - { - m_notifySocket->setStatus( status ); - } - else - { - m_connectstatus = status; - connect(); - } - - -} - -void MSNAccount::slotStartChat() -{ - - bool ok; - TQString handle = KInputDialog::getText( i18n( "Start Chat - MSN Plugin" ), - i18n( "Please enter the email address of the person with whom you want to chat:" ), TQString(), &ok ).lower(); - if ( ok ) - { - if ( MSNProtocol::validContactId( handle ) ) - { - if ( !contacts()[ handle ] ) - addContact( handle, handle, 0L, Kopete::Account::Temporary ); - - contacts()[ handle ]->execute(); - } - else - { - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, - i18n( "<qt>You must enter a valid email address.</qt>" ), i18n( "MSN Plugin" ) ); - } - } -} - -void MSNAccount::slotDebugRawCommand() -{ -#if !defined NDEBUG - if ( !isConnected() ) - return; - - MSNDebugRawCmdDlg *dlg = new MSNDebugRawCmdDlg( 0L ); - int result = dlg->exec(); - if ( result == TQDialog::Accepted && m_notifySocket ) - { - m_notifySocket->sendCommand( dlg->command(), dlg->params(), - dlg->addId(), dlg->msg().replace( "\n", "\r\n" ).utf8() ); - } - delete dlg; -#endif -} - -void MSNAccount::slotChangePublicName() -{ - if ( !isConnected() ) - { - return; - //TODO: change it anyway, and sync at the next connection - } - - bool ok; - TQString name = KInputDialog::getText( i18n( "Change Display Name - MSN Plugin" ), - i18n( "Enter the new display name by which you want to be visible to your friends on MSN:" ), - myself()->property( Kopete::Global::Properties::self()->nickName()).value().toString(), &ok ); - - if ( ok ) - { - if ( name.length() > 387 ) - { - KMessageBox::error( Kopete::UI::Global::mainWidget(), - i18n( "<qt>The display name you entered is too long. Please use a shorter name.\n" - "Your display name has <b>not</b> been changed.</qt>" ), - i18n( "Change Display Name - MSN Plugin" ) ); - return; - } - - setPublicName( name ); - } -} - - -void MSNAccount::slotOpenInbox() -{ - if ( m_notifySocket ) - m_notifySocket->slotOpenInbox(); -} - - -void MSNAccount::slotNotifySocketClosed() -{ - kdDebug( 14140 ) << k_funcinfo << endl; - - Kopete::Account::DisconnectReason reason=(Kopete::Account::DisconnectReason)(m_notifySocket->disconnectReason()); - m_notifySocket->deleteLater(); - m_notifySocket = 0l; - myself()->setOnlineStatus( MSNProtocol::protocol()->FLN ); - setAllContactsStatus( MSNProtocol::protocol()->FLN ); - disconnected(reason); - - - if(reason == Kopete::Account::OtherClient) - { //close all chat sessions, so new message will arive to the other client. - - TQValueList<Kopete::ChatSession*> sessions = Kopete::ChatSessionManager::self()->sessions(); - TQValueList<Kopete::ChatSession*>::Iterator it; - for (it=sessions.begin() ; it != sessions.end() ; it++ ) - { - MSNChatSession *msnCS = dynamic_cast<MSNChatSession *>( *it ); - if ( msnCS && msnCS->account() == this ) - { - msnCS->slotCloseSession(); - } - } - } - -#if 0 - else if ( state == 0x10 ) // connection died unexpectedly - { - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Error , i18n( "The connection with the MSN server was lost unexpectedly.\n" - "If you cannot reconnect now, the server might be down. In that case, please try again later." ), - i18n( "Connection Lost - MSN Plugin" ), KMessageBox::Notify ); - } -#endif - m_msgHandle.clear(); - // kdDebug( 14140 ) << "MSNAccount::slotNotifySocketClosed - done" << endl; -} - -void MSNAccount::slotStatusChanged( const Kopete::OnlineStatus &status ) -{ -// kdDebug( 14140 ) << k_funcinfo << status.internalStatus() << endl; - myself()->setOnlineStatus( status ); - - if(m_newContactList) - { - m_newContactList=false; - - TQDictIterator<Kopete::Contact> it( contacts() ); - for ( ; it.current(); ++it ) - { - MSNContact *c = static_cast<MSNContact *>( *it ); - if(c && c->isDeleted() && c->metaContact() && !c->metaContact()->isTemporary() && c!=myself()) - { - if(c->serverGroups().isEmpty()) - { //the contact is new, add it on the server - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - addContactServerside( c->contactId() , c->metaContact()->groups() ); - } - else //the contact had been deleted, remove it. - { - c->deleteLater(); - } - } - } - } -} - - -void MSNAccount::slotPersonalMessageChanged( const TQString& personalMessage ) -{ - TQString oldPersonalMessage=myself()->property(MSNProtocol::protocol()->propPersonalMessage).value().toString() ; - if ( personalMessage != oldPersonalMessage ) - { - myself()->setProperty( MSNProtocol::protocol()->propPersonalMessage, personalMessage ); - configGroup()->writeEntry( "personalMessage" , personalMessage ); - } -} - -void MSNAccount::setPublicName( const TQString &publicName ) -{ - if ( m_notifySocket ) - { - m_notifySocket->changePublicName( publicName, TQString() ); - } -} - -void MSNAccount::setPersonalMessage( MSNProtocol::PersonalMessageType type, const TQString &personalMessage ) -{ - if ( m_notifySocket ) - { - m_notifySocket->changePersonalMessage( type, personalMessage ); - } - /* Eh, if we can't change the display name, don't let make the user think it has changed - else if(type == MSNProtocol::PersonalMessageNormal) // Normal personalMessage, not a dynamic one that need formatting. - { - slotPersonalMessageChanged( personalMessage ); - }*/ -} - -void MSNAccount::slotGroupAdded( const TQString& groupName, const TQString &groupGuid ) -{ - if ( m_groupList.contains( groupGuid ) ) - { - // Group can already be in the list since the idle timer does a 'List Groups' - // command. Simply return, don't issue a warning. - // kdDebug( 14140 ) << k_funcinfo << "Group " << groupName << " already in list, skipped." << endl; - return; - } - - //--------- Find the appropriate Kopete::Group, or create one ---------// - TQPtrList<Kopete::Group> groupList = Kopete::ContactList::self()->groups(); - Kopete::Group *fallBack = 0L; - - //check if we have one in the old group list. if yes, update the id translate map. - for(TQMap<TQString, Kopete::Group*>::Iterator it=m_oldGroupList.begin() ; it != m_oldGroupList.end() ; ++it ) - { - Kopete::Group *g=it.data(); - if (g && g->pluginData( protocol(), accountId() + " displayName" ) == groupName && - g->pluginData( protocol(), accountId() + " id" ).isEmpty() ) - { //it has the same name! we got it. (and it is not yet an msn group) - fallBack=g; - /*if ( g->displayName() != groupName ) - { - // The displayName was changed in Kopete while we were offline - // FIXME: update the server right now - }*/ - break; - } - } - - if(!fallBack) - { - //it's certenly a new group ! search if one already exist with the same displayname. - for ( Kopete::Group *g = groupList.first(); g; g = groupList.next() ) - { - /* --This has been replaced by the loop right before. - if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() ) - { - if ( g->pluginData( protocol(), accountId() + " id" ).toUInt() == groupNumber ) - { - m_groupList.insert( groupNumber, g ); - TQString oldGroupName; - if ( g->pluginData( protocol(), accountId() + " displayName" ) != groupName ) - { - // The displayName of the group has been modified by another client - slotGroupRenamed( groupName, groupNumber ); - } - return; - } - } - else {*/ - if ( g->displayName() == groupName && (groupGuid.isEmpty()|| g->type()==Kopete::Group::Normal) && - g->pluginData( protocol(), accountId() + " id" ).isEmpty() ) - { - fallBack = g; - kdDebug( 14140 ) << k_funcinfo << "We didn't found the group " << groupName <<" in the old MSN group. But kopete has already one with the same name." << endl; - break; - } - } - } - - if ( !fallBack ) - { - if( groupGuid.isEmpty() ) - { // The group #0 is an unremovable group. his default name is "~" , - // but the official client rename it i18n("others contact") at the first - // connection. - // In many case, the users don't use that group as a real group, or just as - // a group to put all contact that are not sorted. - fallBack = Kopete::Group::topLevel(); - } - else - { - fallBack = new Kopete::Group( groupName ); - Kopete::ContactList::self()->addGroup( fallBack ); - kdDebug( 14140 ) << k_funcinfo << "We didn't found the group " << groupName <<" So we're creating a new one." << endl; - - } - } - - fallBack->setPluginData( protocol(), accountId() + " id", groupGuid ); - fallBack->setPluginData( protocol(), accountId() + " displayName", groupName ); - m_groupList.insert( groupGuid, fallBack ); - - // We have pending groups that we need add a contact to - if ( tmp_addToNewGroup.contains(groupName) ) - { - TQStringList list=tmp_addToNewGroup[groupName]; - for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) - { - TQString contactId = *it; - kdDebug( 14140 ) << k_funcinfo << "Adding to new group: " << contactId << endl; - MSNContact *c = static_cast<MSNContact *>(contacts()[contactId]); - if(c && c->hasProperty(MSNProtocol::protocol()->propGuid.key()) ) - notifySocket()->addContact( contactId, MSNProtocol::FL, TQString(), c->guid(), groupGuid ); - else - { - // If we get to here, we're currently adding a new contact, add the groupGUID to the groupList - // to add when contact will be added to contactlist. - if( tmp_addNewContactToGroup.contains( contactId ) ) - tmp_addNewContactToGroup[contactId].append(groupGuid); - else - tmp_addNewContactToGroup.insert(contactId, TQStringList(groupGuid) ); - } - } - tmp_addToNewGroup.remove(groupName); - } -} - -void MSNAccount::slotGroupRenamed( const TQString &groupGuid, const TQString& groupName ) -{ - if ( m_groupList.contains( groupGuid ) ) - { - m_groupList[ groupGuid ]->setPluginData( protocol(), accountId() + " id", groupGuid ); - m_groupList[ groupGuid ]->setPluginData( protocol(), accountId() + " displayName", groupName ); - m_groupList[ groupGuid ]->setDisplayName( groupName ); - } - else - { - slotGroupAdded( groupName, groupGuid ); - } -} - -void MSNAccount::slotGroupRemoved( const TQString& groupGuid ) -{ - if ( m_groupList.contains( groupGuid ) ) - { - m_groupList[ groupGuid ]->setPluginData( protocol(), TQMap<TQString,TQString>() ); - m_groupList.remove( groupGuid ); - } -} - -void MSNAccount::addGroup( const TQString &groupName, const TQString& contactToAdd ) -{ - if ( !contactToAdd.isNull() ) - { - if( tmp_addToNewGroup.contains(groupName) ) - { - tmp_addToNewGroup[groupName].append(contactToAdd); - //A group with the same name is about to be added, - // we don't need to add a second group with the same name - kdDebug( 14140 ) << k_funcinfo << "no need to re-add " << groupName << " for " << contactToAdd << endl; - return; - } - else - { - tmp_addToNewGroup.insert(groupName,TQStringList(contactToAdd)); - kdDebug( 14140 ) << k_funcinfo << "preparing to add " << groupName << " for " << contactToAdd << endl; - } - } - - if ( m_notifySocket ) - m_notifySocket->addGroup( groupName ); - -} - -void MSNAccount::slotKopeteGroupRenamed( Kopete::Group *g ) -{ - if ( notifySocket() && g->type() == Kopete::Group::Normal ) - { - if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() && - g->displayName() != g->pluginData( protocol(), accountId() + " displayName" ) && - m_groupList.contains( g->pluginData( protocol(), accountId() + " id" ) ) ) - { - notifySocket()->renameGroup( g->displayName(), g->pluginData( protocol(), accountId() + " id" ) ); - } - } -} - -void MSNAccount::slotKopeteGroupRemoved( Kopete::Group *g ) -{ - //The old gorup list is only used whe syncing the contactlist. - //We can assume the contactlist is already fully synced at this time. - //The group g is maybe in the oldGroupList. We remove everithing since - //we don't need it anymore, no need to search it - m_oldGroupList.clear(); - - - if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() ) - { - TQString groupGuid = g->pluginData( protocol(), accountId() + " id" ); - if ( !m_groupList.contains( groupGuid ) ) - { - // the group is maybe already removed in the server - slotGroupRemoved( groupGuid ); - return; - } - - //this is also done later, but he have to do it now! - // (in slotGroupRemoved) - m_groupList.remove(groupGuid); - - if ( groupGuid.isEmpty() ) - { - // the group #0 can't be deleted - // then we set it as the top-level group - if ( g->type() == Kopete::Group::TopLevel ) - return; - - Kopete::Group::topLevel()->setPluginData( protocol(), accountId() + " id", "" ); - Kopete::Group::topLevel()->setPluginData( protocol(), accountId() + " displayName", g->pluginData( protocol(), accountId() + " displayName" ) ); - g->setPluginData( protocol(), accountId() + " id", TQString() ); // the group should be soon deleted, but make sure - - return; - } - - if ( m_notifySocket ) - { - bool still_have_contact=false; - // if contact are contains only in the group we are removing, abort the - TQDictIterator<Kopete::Contact> it( contacts() ); - for ( ; it.current(); ++it ) - { - MSNContact *c = static_cast<MSNContact *>( it.current() ); - if ( c && c->serverGroups().contains( groupGuid ) ) - { - /** don't do that becasue theses may already have been sent - m_notifySocket->removeContact( c->contactId(), groupNumber, MSNProtocol::FL ); - */ - still_have_contact=true; - break; - } - } - if(!still_have_contact) - m_notifySocket->removeGroup( groupGuid ); - } - } -} - -void MSNAccount::slotNewContactList() -{ - m_oldGroupList=m_groupList; - for(TQMap<TQString, Kopete::Group*>::Iterator it=m_oldGroupList.begin() ; it != m_oldGroupList.end() ; ++it ) - { //they are about to be changed - if(it.data()) - it.data()->setPluginData( protocol(), accountId() + " id", TQString() ); - } - - m_allowList.clear(); - m_blockList.clear(); - m_reverseList.clear(); - m_groupList.clear(); - TDEConfigGroup *config=configGroup(); - config->writeEntry( "blockList" , TQString() ) ; - config->writeEntry( "allowList" , TQString() ); - config->writeEntry( "reverseList" , TQString() ); - - // clear all date information which will be received. - // if the information is not anymore on the server, it will not be received - TQDictIterator<Kopete::Contact> it( contacts() ); - for ( ; it.current(); ++it ) - { - MSNContact *c = static_cast<MSNContact *>( *it ); - c->setBlocked( false ); - c->setAllowed( false ); - c->setReversed( false ); - c->setDeleted( true ); - c->setInfo( "PHH", TQString() ); - c->setInfo( "PHW", TQString() ); - c->setInfo( "PHM", TQString() ); - c->removeProperty( MSNProtocol::protocol()->propGuid ); - } - m_newContactList=true; -} - -void MSNAccount::slotContactListed( const TQString& handle, const TQString& publicName, const TQString &contactGuid, uint lists, const TQString& groups ) -{ - // On empty lists handle might be empty, ignore that - // ignore also the myself contact. - if ( handle.isEmpty() || handle==accountId()) - return; - - MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] ); - - if ( lists & 1 ) // FL - { - TQStringList contactGroups = TQStringList::split( ",", groups, false ); - if ( c ) - { - if( !c->metaContact() ) - { - kdWarning( 14140 ) << k_funcinfo << "the contact " << c->contactId() << " has no meta contact" <<endl; - Kopete::MetaContact *metaContact = new Kopete::MetaContact(); - - c->setMetaContact(metaContact); - Kopete::ContactList::self()->addMetaContact( metaContact ); - } - - // Contact exists, update data. - // Merging difference between server contact list and Kopete::Contact's contact list into MetaContact's contact-list - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - if(!publicName.isEmpty() && publicName!=handle) - c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName ); - else - c->removeProperty( Kopete::Global::Properties::self()->nickName() ); - c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid); - - const TQMap<TQString, Kopete::Group *> oldServerGroups = c->serverGroups(); - c->clearServerGroups(); - for ( TQStringList::ConstIterator it = contactGroups.begin(); it != contactGroups.end(); ++it ) - { - TQString newServerGroupID = *it; - if(m_groupList.contains(newServerGroupID)) - { - Kopete::Group *newServerGroup=m_groupList[ newServerGroupID ] ; - c->contactAddedToGroup( newServerGroupID, newServerGroup ); - if( !c->metaContact()->groups().contains(newServerGroup) ) - { - // The contact has been added in a group by another client - c->metaContact()->addToGroup( newServerGroup ); - } - } - } - - for ( TQMap<TQString, Kopete::Group *>::ConstIterator it = oldServerGroups.begin(); it != oldServerGroups.end(); ++it ) - { - Kopete::Group *old_group=m_oldGroupList[it.key()]; - if(old_group) - { - TQString oldnewID=old_group->pluginData(protocol() , accountId() +" id"); - if ( !oldnewID.isEmpty() && contactGroups.contains( oldnewID ) ) - continue; //ok, it's correctn no need to do anything. - - c->metaContact()->removeFromGroup( old_group ); - } - } - - c->setDeleted(false); - - // Update server if the contact has been moved to another group while MSN was offline - c->sync(); - } - else - { - Kopete::MetaContact *metaContact = new Kopete::MetaContact(); - - c = new MSNContact( this, handle, metaContact ); - c->setDeleted(true); //we don't want to sync - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - if(!publicName.isEmpty() && publicName!=handle) - c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName ); - else - c->removeProperty( Kopete::Global::Properties::self()->nickName() ); - c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid ); - - for ( TQStringList::Iterator it = contactGroups.begin(); - it != contactGroups.end(); ++it ) - { - TQString groupGuid = *it; - if(m_groupList.contains(groupGuid)) - { - c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] ); - metaContact->addToGroup( m_groupList[ groupGuid ] ); - } - } - Kopete::ContactList::self()->addMetaContact( metaContact ); - - c->setDeleted(false); - } - } - else //the contact is _not_ in the FL, it has been removed - { - if(c) - { - c->setOnlineStatus( static_cast<MSNProtocol*>(protocol())->UNK ); - c->clearServerGroups(); - //TODO: display a message and suggest to remove the contact. - // but i fear a simple messageBox QuestionYesNo here gives a nice crash. - //delete ct; - } - } - if ( lists & 2 ) - slotContactAdded( handle, "AL", publicName, TQString(), TQString() ); - else if(c) - c->setAllowed(false); - if ( lists & 4 ) - slotContactAdded( handle, "BL", publicName, TQString(), TQString() ); - else if(c) - c->setBlocked(false); - if ( lists & 8 ) - slotContactAdded( handle, "RL", publicName, TQString(), TQString() ); - else if(c) - c->setReversed(false); - if ( lists & 16 ) // This contact is on the pending list. Add to the reverse list and delete from the pending list - { - notifySocket()->addContact( handle, MSNProtocol::RL, TQString(), TQString(), TQString() ); - notifySocket()->removeContact( handle, MSNProtocol::PL, TQString(), TQString() ); - } -} - -void MSNAccount::slotContactAdded( const TQString& handle, const TQString& list, const TQString& publicName, const TQString& contactGuid, const TQString &groupGuid ) -{ - if ( list == "FL" ) - { - bool new_contact = false; - if ( !contacts()[ handle ] ) - { - new_contact = true; - - Kopete::MetaContact *m= m_addWizard_metaContact ? m_addWizard_metaContact : new Kopete::MetaContact(); - - MSNContact *c = new MSNContact( this, handle, m ); - if(!publicName.isEmpty() && publicName!=handle) - c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName ); - else - c->removeProperty( Kopete::Global::Properties::self()->nickName() ); - c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid ); - // Add the new contact to the group he belongs. - if ( tmp_addNewContactToGroup.contains(handle) ) - { - TQStringList list = tmp_addNewContactToGroup[handle]; - for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) - { - TQString groupGuid = *it; - - // If the group didn't exist yet (yay for async operations), don't add the contact to the group - // Let slotGroupAdded do it. - if( m_groupList.contains(groupGuid) ) - { - kdDebug( 14140 ) << k_funcinfo << "Adding " << handle << " to group: " << groupGuid << endl; - notifySocket()->addContact( handle, MSNProtocol::FL, TQString(), contactGuid, groupGuid ); - - c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] ); - - m->addToGroup( m_groupList[ groupGuid ] ); - - } - if ( !m_addWizard_metaContact ) - { - Kopete::ContactList::self()->addMetaContact( m ); - } - } - tmp_addNewContactToGroup.remove(handle); - } - - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - - m_addWizard_metaContact = 0L; - } - if ( !new_contact ) - { - // Contact has been added to a group - MSNContact *c = findContactByGuid(contactGuid); - if(c != 0L) - { - // Make sure that the contact has always his contactGUID. - if( !c->hasProperty(MSNProtocol::protocol()->propGuid.key()) ) - c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid ); - - if ( c->onlineStatus() == MSNProtocol::protocol()->UNK ) - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - - if ( c->metaContact() && c->metaContact()->isTemporary() ) - c->metaContact()->setTemporary( false, m_groupList.contains( groupGuid ) ? m_groupList[ groupGuid ] : 0L ); - else - { - if(m_groupList.contains(groupGuid)) - { - if( c->metaContact() ) - c->metaContact()->addToGroup( m_groupList[groupGuid] ); - c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] ); - } - } - } - } - - if ( !handle.isEmpty() && !m_allowList.contains( handle ) && !m_blockList.contains( handle ) ) - { - kdDebug(14140) << k_funcinfo << "Trying to add contact to AL. " << endl; - notifySocket()->addContact(handle, MSNProtocol::AL, TQString(), TQString(), TQString() ); - } - } - else if ( list == "BL" ) - { - if ( contacts()[ handle ] ) - static_cast<MSNContact *>( contacts()[ handle ] )->setBlocked( true ); - if ( !m_blockList.contains( handle ) ) - { - m_blockList.append( handle ); - configGroup()->writeEntry( "blockList" , m_blockList ) ; - } - } - else if ( list == "AL" ) - { - if ( contacts()[ handle ] ) - static_cast<MSNContact *>( contacts()[ handle ] )->setAllowed( true ); - if ( !m_allowList.contains( handle ) ) - { - m_allowList.append( handle ); - configGroup()->writeEntry( "allowList" , m_allowList ) ; - } - } - else if ( list == "RL" ) - { - // search for new Contacts - Kopete::Contact *ct=contacts()[ handle ]; - if ( !ct || !ct->metaContact() || ct->metaContact()->isTemporary() ) - { - // Users in the allow list or block list now never trigger the - // 'new user' dialog, which makes it impossible to add those here. - // Not necessarily bad, but the usability effects need more thought - // before I declare it good :- ) - if ( !m_allowList.contains( handle ) && !m_blockList.contains( handle ) ) - { - TQString nick; //in most case, the public name is not know - if(publicName!=handle) // so we don't whos it if it is not know - nick=publicName; - Kopete::UI::ContactAddedNotifyDialog *dialog= - new Kopete::UI::ContactAddedNotifyDialog( handle,nick,this, - Kopete::UI::ContactAddedNotifyDialog::InfoButton ); - TQObject::connect(dialog,TQT_SIGNAL(applyClicked(const TQString&)), - this,TQT_SLOT(slotContactAddedNotifyDialogClosed(const TQString& ))); - dialog->show(); - } - } - else - { - static_cast<MSNContact *>( ct )->setReversed( true ); - } - m_reverseList.append( handle ); - configGroup()->writeEntry( "reverseList" , m_reverseList ) ; - } -} - -void MSNAccount::slotContactRemoved( const TQString& handle, const TQString& list, const TQString& contactGuid, const TQString& groupGuid ) -{ - kdDebug( 14140 ) << k_funcinfo << "handle: " << handle << " list: " << list << " contact-uid: " << contactGuid << endl; - MSNContact *c=static_cast<MSNContact *>( contacts()[ handle ] ); - if ( list == "BL" ) - { - m_blockList.remove( handle ); - configGroup()->writeEntry( "blockList" , m_blockList ) ; - if ( !m_allowList.contains( handle ) ) - notifySocket()->addContact( handle, MSNProtocol::AL, TQString(), TQString(), TQString() ); - - if(c) - c->setBlocked( false ); - } - else if ( list == "AL" ) - { - m_allowList.remove( handle ); - configGroup()->writeEntry( "allowList" , m_allowList ) ; - if ( !m_blockList.contains( handle ) ) - notifySocket()->addContact( handle, MSNProtocol::BL, TQString(), TQString(), TQString() ); - - if(c) - c->setAllowed( false ); - } - else if ( list == "RL" ) - { - m_reverseList.remove( handle ); - configGroup()->writeEntry( "reverseList" , m_reverseList ) ; - - if ( c ) - { - // Contact is removed from the reverse list - // only MSN can do this, so this is currently not supported - c->setReversed( false ); - /* - InfoWidget *info = new InfoWidget( 0 ); - info->title->setText( "<b>" + i18n( "Contact removed!" ) +"</b>" ); - TQString dummy; - dummy = "<center><b>" + imContact->getPublicName() + "( " +imContact->getHandle() +" )</b></center><br>"; - dummy += i18n( "has removed you from his contact list!" ) + "<br>"; - dummy += i18n( "This contact is now removed from your contact list" ); - info->infoText->setText( dummy ); - info->setCaption( "KMerlin - Info" ); - info->show(); - */ - } - } - else if ( list == "FL" ) - { - // The FL list only use the contact GUID, use the contact referenced by the GUID. - MSNContact *contactRemoved = findContactByGuid(contactGuid); - TQStringList groupGuidList; - bool deleteContact = groupGuid.isEmpty() ? true : false; // Delete the contact when the group GUID is empty. - // Remove the contact from the contact list for all the group he is a member. - if( groupGuid.isEmpty() ) - { - if(contactRemoved) - { - TQPtrList<Kopete::Group> groupList = contactRemoved->metaContact()->groups(); - for( TQPtrList<Kopete::Group>::Iterator it = groupList.begin(); it != groupList.end(); ++it ) - { - Kopete::Group *group = *it; - if ( !group->pluginData( protocol(), accountId() + " id" ).isEmpty() ) - { - groupGuidList.append( group->pluginData( protocol(), accountId() + " id" ) ); - } - } - } - } - else - { - groupGuidList.append( groupGuid ); - } - - if( !groupGuidList.isEmpty() ) - { - TQStringList::const_iterator stringIt; - for( stringIt = groupGuidList.begin(); stringIt != groupGuidList.end(); ++stringIt ) - { - // Contact is removed from the FL list, remove it from the group - if(contactRemoved != 0L) - contactRemoved->contactRemovedFromGroup( *stringIt ); - - //check if the group is now empty to remove it - if ( m_notifySocket ) - { - bool still_have_contact=false; - // if contact are contains only in the group we are removing, abort the - TQDictIterator<Kopete::Contact> it( contacts() ); - for ( ; it.current(); ++it ) - { - MSNContact *c2 = static_cast<MSNContact *>( it.current() ); - if ( c2->serverGroups().contains( *stringIt ) ) - { - still_have_contact=true; - break; - } - } - if(!still_have_contact) - m_notifySocket->removeGroup( *stringIt ); - } - } - } - if(deleteContact && contactRemoved) - { - kdDebug(14140) << k_funcinfo << "Deleting the MSNContact " << contactRemoved->contactId() << endl; - contactRemoved->deleteLater(); - } - } -} - -void MSNAccount::slotCreateChat( const TQString& address, const TQString& auth ) -{ - slotCreateChat( 0L, address, auth, m_msgHandle.first(), m_msgHandle.first() ); -} - -void MSNAccount::slotCreateChat( const TQString& ID, const TQString& address, const TQString& auth, - const TQString& handle_, const TQString& publicName ) -{ - TQString handle = handle_.lower(); - - if ( handle.isEmpty() ) - { - // we have lost the handle? - kdDebug(14140) << k_funcinfo << "Impossible to open a chat session, I forgot the contact to invite" <<endl; - // forget it - return; - } - -// kdDebug( 14140 ) << k_funcinfo <<"Creating chat for " << handle << endl; - - if ( !contacts()[ handle ] ) - addContact( handle, publicName, 0L, Kopete::Account::Temporary ); - - MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] ); - - if ( c && myself() ) - { - // we can't use simply c->manager(true) here to get the manager, because this will re-open - // another chat session, and then, close this new one. We have to re-create the manager manualy. - MSNChatSession *manager = dynamic_cast<MSNChatSession*>( c->manager( Kopete::Contact::CannotCreate ) ); - if(!manager) - { - Kopete::ContactPtrList chatmembers; - chatmembers.append(c); - manager = new MSNChatSession( protocol(), myself(), chatmembers ); - } - - manager->createChat( handle, address, auth, ID ); - - /** - * This code should open a chatwindow when a socket is open - * It has been disabled because pidgin open switchboeard too often - * - * the solution is to open the window only when the contact start typing - * see MSNChatSession::receivedTypingMsg - * - - TDEGlobal::config()->setGroup( "MSN" ); - bool notifyNewChat = TDEGlobal::config()->readBoolEntry( "NotifyNewChat", false ); - if ( !ID.isEmpty() && notifyNewChat ) - { - // this temporary message should open the window if they not exist - TQString body = i18n( "%1 has started a chat with you" ).arg( c->metaContact()->displayName() ); - Kopete::Message tmpMsg = Kopete::Message( c, manager->members(), body, Kopete::Message::Internal, Kopete::Message::PlainText ); - manager->appendMessage( tmpMsg ); - } - */ - } - - if(!m_msgHandle.isEmpty()) - m_msgHandle.pop_front(); -} - -void MSNAccount::slotStartChatSession( const TQString& handle ) -{ - // First create a message manager, because we might get an existing - // manager back, in which case we likely also have an active switchboard - // connection to reuse... - - MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] ); - // if ( isConnected() && c && myself() && handle != m_msnId ) - if ( m_notifySocket && c && myself() && handle != accountId() ) - { - if ( !c->manager(Kopete::Contact::CannotCreate) || !static_cast<MSNChatSession *>( c->manager( Kopete::Contact::CanCreate ) )->service() ) - { - m_msgHandle.prepend(handle); - m_notifySocket->createChatSession(); - } - } -} - -void MSNAccount::slotContactAddedNotifyDialogClosed(const TQString& handle) -{ - const Kopete::UI::ContactAddedNotifyDialog *dialog = - dynamic_cast<const Kopete::UI::ContactAddedNotifyDialog *>(sender()); - if(!dialog || !m_notifySocket) - return; - - if(dialog->added()) - { - Kopete::MetaContact *mc=dialog->addContact(); - if(mc) - { //if the contact has been added this way, it's because the other user added us. - // don't forgot to set the reversed flag (Bug 114400) - MSNContact *c=dynamic_cast<MSNContact*>(mc->contacts().first()); - if(c && c->contactId() == handle ) - { - c->setReversed( true ); - } - } - } - - if ( !dialog->authorized() ) - { - if ( m_allowList.contains( handle ) ) - m_notifySocket->removeContact( handle, MSNProtocol::AL, TQString(), TQString() ); - else if ( !m_blockList.contains( handle ) ) - m_notifySocket->addContact( handle, MSNProtocol::BL, TQString(), TQString(), TQString() ); - } - else - { - if ( m_blockList.contains( handle ) ) - m_notifySocket->removeContact( handle, MSNProtocol::BL, TQString(), TQString() ); - else if ( !m_allowList.contains( handle ) ) - m_notifySocket->addContact( handle, MSNProtocol::AL, TQString(), TQString(), TQString() ); - } - - -} - -void MSNAccount::slotGlobalIdentityChanged( const TQString &key, const TQVariant &value ) -{ - if( !configGroup()->readBoolEntry("ExcludeGlobalIdentity", false) ) - { - if(key == Kopete::Global::Properties::self()->nickName().key()) - { - TQString oldNick = myself()->property( Kopete::Global::Properties::self()->nickName()).value().toString(); - TQString newNick = value.toString(); - - if(newNick != oldNick) - { - setPublicName( value.toString() ); - } - } - else if(key == Kopete::Global::Properties::self()->photo().key()) - { - m_pictureFilename = value.toString(); - kdDebug( 14140 ) << k_funcinfo << m_pictureFilename << endl; - resetPictureObject(false, true); - } - } -} - -void MSNAccount::slotErrorMessageReceived( int type, const TQString &msg ) -{ - TQString caption = i18n( "MSN Plugin" ); - - // Use different notification type based on the error context. - switch(type) - { - case MSNSocket::ErrorConnectionLost: - { - Kopete::Utils::notifyConnectionLost( this, caption, msg ); - break; - } - case MSNSocket::ErrorConnectionError: - { - Kopete::Utils::notifyConnectionError( this, caption, msg ); - break; - } - case MSNSocket::ErrorCannotConnect: - { - Kopete::Utils::notifyCannotConnect( this ); - break; - } - case MSNSocket::ErrorInformation: - { - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Information, msg, caption ); - break; - } - case MSNSocket::ErrorServerError: - default: - { - Kopete::Utils::notifyServerError( this, caption, msg ); - break; - } - } -} - -bool MSNAccount::createContact( const TQString &contactId, Kopete::MetaContact *metaContact ) -{ - if ( !metaContact->isTemporary() && m_notifySocket) - { - m_addWizard_metaContact = metaContact; - - addContactServerside(contactId, metaContact->groups()); - - // FIXME: Find out if this contact was really added or not! - return true; - } - else - { - // This is a temporary contact. ( a person who messaged us but is not on our conntact list. - // We don't want to create it on the server.Just create the local contact object and add it - // Or we are diconnected, and in that case, the contact will be added when connecting - MSNContact *newContact = new MSNContact( this, contactId, metaContact ); - newContact->setDeleted(true); - return true; - } - -} - -void MSNAccount::addContactServerside(const TQString &contactId, TQPtrList<Kopete::Group> groupList) -{ - // First of all, fill the temporary group list. The contact will be moved to his group(s). - // When we receive back his contact GUID(required to move a contact between groups) - for( Kopete::Group *group = groupList.first(); group; group = groupList.next() ) - { - // TODO: It it time that libkopete generate a unique ID that contains protocols, account and contact id. - TQString groupId = group->pluginData( protocol(), accountId() + " id" ); - // If the groupId is empty, that's mean the Kopete group is not on the MSN server. - if( !groupId.isEmpty() ) - { - // Something got corrupted on contactlist.xml - if( !m_groupList.contains(groupId) ) - { - // Clear the group plugin data. - group->setPluginData( protocol() , accountId() + " id" , TQString()); - group->setPluginData( protocol() , accountId() + " displayName" , TQString()); - kdDebug( 14140 ) << k_funcinfo << " Group " << group->displayName() << " marked with id #" << groupId << " does not seems to be anymore on the server" << endl; - - // Add the group on MSN server, will fix the corruption. - kdDebug(14140) << k_funcinfo << "Fixing group corruption, re-adding " << group->displayName() << "to the server." << endl; - addGroup( group->displayName(), contactId); - } - else - { - // Add the group that the contact belong to add it when we will receive the contact GUID. - if( tmp_addNewContactToGroup.contains( contactId ) ) - tmp_addNewContactToGroup[contactId].append(groupId); - else - tmp_addNewContactToGroup.insert(contactId, TQStringList(groupId) ); - } - } - else - { - if( !group->displayName().isEmpty() && group->type() == Kopete::Group::Normal ) - { - kdDebug(14140) << k_funcinfo << "Group not on MSN server, add it" << endl; - addGroup( group->displayName(), contactId ); - } - } - } - - // After add the contact to the top-level, it will be moved to required groups later. - kdDebug( 14140 ) << k_funcinfo << "Add the contact on the server " << endl; - m_notifySocket->addContact( contactId, MSNProtocol::FL, contactId, TQString(), TQString() ); -} - -MSNContact *MSNAccount::findContactByGuid(const TQString &contactGuid) -{ - kdDebug(14140) << k_funcinfo << "Looking for " << contactGuid << endl; - TQDictIterator<Kopete::Contact> it( contacts() ); - for ( ; it.current(); ++it ) - { - MSNContact *c = dynamic_cast<MSNContact *>( it.current() ); - - if(c && c->guid() == contactGuid ) - { - kdDebug(14140) << k_funcinfo << "OK found a contact. " << endl; - // Found the contact GUID - return c; - } - } - - return 0L; -} - -bool MSNAccount::isHotmail() const -{ - if ( !m_openInboxAction ) - return false; - return m_openInboxAction->isEnabled(); -} - -TQString MSNAccount::pictureUrl() -{ - return m_pictureFilename; -} - -void MSNAccount::setPictureUrl(const TQString &url) -{ - m_pictureFilename = url; -} - -TQString MSNAccount::pictureObject() -{ - if(m_pictureObj.isNull()) - resetPictureObject(true); //silent=true to keep infinite loop away - return m_pictureObj; -} - -void MSNAccount::resetPictureObject(bool silent, bool force) -{ - TQString old=m_pictureObj; - - if(!configGroup()->readBoolEntry("exportCustomPicture") && !force) - { - m_pictureObj=""; - myself()->removeProperty( Kopete::Global::Properties::self()->photo() ); - } - else - { - // Check if the picture is a 96x96 image, if not scale, crop and save. - TQImage picture(m_pictureFilename); - if(picture.isNull()) - { - m_pictureObj=""; - myself()->removeProperty( Kopete::Global::Properties::self()->photo() ); - } - else - { - if(picture.width() != 96 || picture.height() != 96) - { - // Save to a new location in msnpictures. - TQString newLocation( locateLocal( "appdata", "msnpictures/"+ KURL(m_pictureFilename).fileName().lower() ) ); - - // Scale and crop the picture. - picture = MSNProtocol::protocol()->scalePicture(picture); - - // Use the cropped/scaled image now. - if(!picture.save(newLocation, "PNG")) - { - m_pictureObj=""; - myself()->removeProperty( Kopete::Global::Properties::self()->photo() ); - } - m_pictureFilename = newLocation; - } - } - - TQFile pictFile( m_pictureFilename ); - if(!pictFile.open(IO_ReadOnly)) - { - m_pictureObj=""; - myself()->removeProperty( Kopete::Global::Properties::self()->photo() ); - } - else - { - TQByteArray ar=pictFile.readAll(); - TQString sha1d= TQString((KCodecs::base64Encode(SHA1::hash(ar)))); - - TQString size=TQString::number( pictFile.size() ); - TQString all= "Creator"+accountId()+"Size"+size+"Type3Locationkopete.tmpFriendlyAAA=SHA1D"+ sha1d; - m_pictureObj="<msnobj Creator=\"" + accountId() + "\" Size=\"" + size + "\" Type=\"3\" Location=\"kopete.tmp\" Friendly=\"AAA=\" SHA1D=\""+sha1d+"\" SHA1C=\""+ TQString(KCodecs::base64Encode(SHA1::hashString(all.utf8()))) +"\"/>"; - myself()->setProperty( Kopete::Global::Properties::self()->photo() , m_pictureFilename ); - } - } - - if(old!=m_pictureObj && isConnected() && m_notifySocket && !silent) - { - //update the msn pict - m_notifySocket->setStatus( myself()->onlineStatus() ); - } -} - -#include "msnaccount.moc" - -// vim: set noet ts=4 sts=4 sw=4: - - diff --git a/kopete/protocols/msn/msnaccount.h b/kopete/protocols/msn/msnaccount.h deleted file mode 100644 index e7a80f4a..00000000 --- a/kopete/protocols/msn/msnaccount.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - msnaccount.h - Manages a single MSN account - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Michaêl Larouche <[email protected]> - - Kopete (c) 2003-2005 by The Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNACCOUNT_H -#define MSNACCOUNT_H - -#include <tqobject.h> - -#include "kopetepasswordedaccount.h" - -#include "msnprotocol.h" - -class TDEAction; -class TDEActionMenu; - -class MSNNotifySocket; -class MSNContact; - -/** - * MSNAccount encapsulates everything that is account-based, as opposed to - * protocol based. This basically means sockets, current status, and account - * info are stored in the account, whereas the protocol is only the - * 'manager' class that creates and manages accounts. - */ -class MSNAccount : public Kopete::PasswordedAccount -{ - Q_OBJECT - - -public: - MSNAccount( MSNProtocol *parent, const TQString &accountID, const char *name = 0L ); - - /* - * return the menu for this account - */ - virtual TDEActionMenu* actionMenu(); - - //------ internal functions - /** - * change the publicName to this new name - */ - void setPublicName( const TQString &name ); - void setPersonalMessage(MSNProtocol::PersonalMessageType type, const TQString &personalMessage ); - - /** - * Returns the address of the MSN server - */ - TQString serverName(); - - /** - * Returns the address of the MSN server port - */ - uint serverPort(); - - MSNNotifySocket *notifySocket(); - - /** - * return true if we are able to send mail, or to open hotmail inbox - */ - bool isHotmail() const; - - - /** - * Return the picture url. - */ - TQString pictureUrl(); - - /** - * Set the picture url. - */ - void setPictureUrl(const TQString &url); - - /** - * return the <msnobj> tag of the display picture - */ - TQString pictureObject(); - - /** - * reset the <msnobj>. This method should be called if the displayimage has changed - * If we are actualy connected, it will imediatly update the <msgobj> on the server, exepted - * if @param silent is set to true - * @param force Force the application of MSN picture - */ - void resetPictureObject(bool silent=false, bool force=false); - - //BEGIN Http - - bool useHttpMethod() const; - - //END - - /** - * Return the client ID for the myself contact of this account. - * It is dynamic to see if we really have a webcam or not. - */ - TQString myselfClientId() const; - -public slots: - virtual void connectWithPassword( const TQString &password ) ; - virtual void disconnect() ; - virtual void setOnlineStatus( const Kopete::OnlineStatus &status , const TQString &reason = TQString()); - - /** - * Ask to the account to create a new chat session - */ - void slotStartChatSession( const TQString& handle ); - - /** - * Single slot to display error message. - */ - void slotErrorMessageReceived( int type, const TQString &msg ); - -protected: - virtual bool createContact( const TQString &contactId, Kopete::MetaContact *parentContact ); - - -private slots: - // Actions related - void slotStartChat(); - void slotOpenInbox(); - void slotChangePublicName(); - -//#if !defined NDEBUG //(Stupid moc which don't see when he don't need to slot this slot) - /** - * Show simple debugging aid - */ - void slotDebugRawCommand(); -//#endif - - // notifySocket related - void slotStatusChanged( const Kopete::OnlineStatus &status ); - void slotNotifySocketClosed(); - void slotPersonalMessageChanged(const TQString& personalMessage); - void slotContactRemoved(const TQString& handle, const TQString& list, const TQString& contactGuid, const TQString& groupGuid ); - void slotContactAdded(const TQString& handle, const TQString& list, const TQString& publicName, const TQString& contactGuid, const TQString &groupGuid ); - void slotContactListed( const TQString& handle, const TQString& publicName, const TQString &contactGuid, uint lists, const TQString& groups ); - void slotNewContactList(); - /** - * The group has successful renamed in the server - * groupName: is new new group name - */ - void slotGroupRenamed(const TQString &groupGuid, const TQString& groupName ); - /** - * A new group was created on the server (or received durring an LSG command) - */ - void slotGroupAdded( const TQString& groupName, const TQString &groupGuid ); - /** - * Group was removed from the server - */ - void slotGroupRemoved( const TQString &groupGuid ); - /** - * Incoming RING command: connect to the Switchboard server and send - * the startChat signal - */ - void slotCreateChat( const TQString& sessionID, const TQString& address, const TQString& auth, - const TQString& handle, const TQString& publicName ); - /** - * Incoming XFR command: this is an result from - * slotStartChatSession(handle) - * connect to the switchboard server and sen startChat signal - */ - void slotCreateChat( const TQString& address, const TQString& auth); - - - // ui related - /** - * A kopetegroup is renamed, rename group on the server - */ - void slotKopeteGroupRenamed( Kopete::Group *g ); - - /** - * A kopetegroup is removed, remove the group in the server - **/ - void slotKopeteGroupRemoved( Kopete::Group* ); - - /** - * add contact ui - */ - void slotContactAddedNotifyDialogClosed( const TQString &handle); - - /** - * When the dispatch server sends us the notification server to use. - */ - void createNotificationServer( const TQString &host, uint port ); - - /** - * When a global identity key get changed. - */ - void slotGlobalIdentityChanged( const TQString &key, const TQVariant &value ); - -private: - MSNNotifySocket *m_notifySocket; - TDEAction *m_openInboxAction; - TDEAction *m_startChatAction; - TDEAction *m_changeDNAction; - - // status which will be using for connecting - Kopete::OnlineStatus m_connectstatus; - - TQStringList m_msgHandle; - - bool m_newContactList; - - - /** - * Add the contact on the server in the given groups. - * this is a helper function called bu createContact and slotStatusChanged - */ - void addContactServerside(const TQString &contactId, TQPtrList<Kopete::Group> groupList); - - - -public: //FIXME: should be private - TQMap<TQString, Kopete::Group*> m_groupList; - - void addGroup( const TQString &groupName, const TQString &contactToAdd = TQString() ); - - /** - * Find and retrive a MSNContact by its contactGuid. (Helper function) - */ - MSNContact *findContactByGuid(const TQString &contactGuid); -private: - - // server data - TQStringList m_allowList; - TQStringList m_blockList; - TQStringList m_reverseList; - - Kopete::MetaContact *m_addWizard_metaContact; - TQMap< TQString, TQStringList > tmp_addToNewGroup; - TQMap< TQString, TQStringList > tmp_addNewContactToGroup; - - TQString m_pictureObj; //a cache of the <msnobj> - TQString m_pictureFilename; // the picture filename. - - //this is the translation between old to new groups id when syncing from server. - TQMap<TQString, Kopete::Group*> m_oldGroupList; - - /** - * I need the password in createNotificationServer. - * but i can't ask it there with password() because a nested loop will provoque crash - * at this place. so i'm forced to keep it here. - * I would like an API to request the password WITHOUT askling it. - */ - TQString m_password; - - /** - * Cliend ID is a bitfield that contains supported features for a MSN contact. - */ - uint m_clientId; -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnaddcontactpage.cpp b/kopete/protocols/msn/msnaddcontactpage.cpp deleted file mode 100644 index 74102e1d..00000000 --- a/kopete/protocols/msn/msnaddcontactpage.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart@ kde.org> - Kopete (c) 2002-2005 by The Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - - -#include <tqlayout.h> -#include <tqlineedit.h> - -#include <tdelocale.h> -#include <tdemessagebox.h> - -#include "msnadd.h" -#include "msnaddcontactpage.h" -#include "msnprotocol.h" -#include "kopeteaccount.h" -#include "kopeteuiglobal.h" - -MSNAddContactPage::MSNAddContactPage(bool connected, TQWidget *parent, const char *name ) - : AddContactPage(parent,name) -{ - (new TQVBoxLayout(this))->setAutoAdd(true); -/* if ( connected ) - {*/ - msndata = new msnAddUI(this); - /* - msndata->cmbGroup->insertStringList(owner->getGroups()); - msndata->cmbGroup->setCurrentItem(0); - */ - canadd = true; - -/* } - else - { - noaddMsg1 = new TQLabel( i18n( "You need to be connected to be able to add contacts." ), this ); - noaddMsg2 = new TQLabel( i18n( "Please connect to the MSN network and try again." ), this ); - canadd = false; -}*/ - -} -MSNAddContactPage::~MSNAddContactPage() -{ -} - -bool MSNAddContactPage::apply( Kopete::Account* i, Kopete::MetaContact*m ) -{ - if ( validateData() ) - { - TQString userid = msndata->addID->text(); - return i->addContact( userid , m, Kopete::Account::ChangeKABC ); - } - return false; -} - - -bool MSNAddContactPage::validateData() -{ - if(!canadd) - return false; - - TQString userid = msndata->addID->text(); - - if(MSNProtocol::validContactId(userid)) - return true; - - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, - i18n( "<qt>You must enter a valid email address.</qt>" ), i18n( "MSN Plugin" ) ); - - return false; - -} - -#include "msnaddcontactpage.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnaddcontactpage.h b/kopete/protocols/msn/msnaddcontactpage.h deleted file mode 100644 index dc81dc44..00000000 --- a/kopete/protocols/msn/msnaddcontactpage.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef MSNADDCONTACTPAGE_H -#define MSNADDCONTACTPAGE_H - -#include <tqwidget.h> -#include <addcontactpage.h> -#include <tqlabel.h> - -/** - *@author duncan - */ -class msnAddUI; -class MSNProtocol; - -class MSNAddContactPage : public AddContactPage -{ - Q_OBJECT - -public: - MSNAddContactPage(bool connected, TQWidget *parent=0, const char *name=0); - ~MSNAddContactPage(); - msnAddUI *msndata; - TQLabel *noaddMsg1; - TQLabel *noaddMsg2; - bool canadd; - virtual bool validateData(); - virtual bool apply( Kopete::Account*, Kopete::MetaContact* ); - -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnchallengehandler.cpp b/kopete/protocols/msn/msnchallengehandler.cpp deleted file mode 100644 index 5492b9e7..00000000 --- a/kopete/protocols/msn/msnchallengehandler.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - msnchallengehandler.h - Computes a msn challenge response hash key. - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - Kopete (c) 2003-2005 by The Kopete developers <[email protected]> - - Portions taken from - http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnchallengehandler.h" - -#include <tqdatastream.h> - -#include <kdebug.h> -#include <kmdcodec.h> - -MSNChallengeHandler::MSNChallengeHandler(const TQString& productKey, const TQString& productId) -{ - m_productKey = productKey; - m_productId = productId; -} - - -MSNChallengeHandler::~MSNChallengeHandler() -{ - kdDebug(14140) << k_funcinfo << endl; -} - -TQString MSNChallengeHandler::computeHash(const TQString& challengeString) -{ - // Step One: THe MD5 Hash. - - // Combine the received challenge string with the product key. - KMD5 md5((challengeString + m_productKey).utf8()); - TQCString digest = md5.hexDigest(); - - kdDebug(14140) << k_funcinfo << "md5: " << digest << endl; - - TQValueVector<TQ_INT32> md5Integers(4); - for(TQ_UINT32 i=0; i < md5Integers.count(); i++) - { - md5Integers[i] = hexSwap(digest.mid(i*8, 8)).toUInt(0, 16) & 0x7FFFFFFF; - kdDebug(14140) << k_funcinfo << ("0x" + hexSwap(digest.mid(i*8, 8))) << " " << md5Integers[i] << endl; - } - - // Step Two: Create the challenge string key - - TQString challengeKey = challengeString + m_productId; - // Pad to multiple of 8. - challengeKey = challengeKey.leftJustify(challengeKey.length() + (8 - challengeKey.length() % 8), '0'); - - kdDebug(14140) << k_funcinfo << "challenge key: " << challengeKey << endl; - - TQValueVector<TQ_INT32> challengeIntegers(challengeKey.length() / 4); - for(TQ_UINT32 i=0; i < challengeIntegers.count(); i++) - { - TQString sNum = challengeKey.mid(i*4, 4), sNumHex; - - // Go through the number string, determining the hex equivalent of each value - // and add that to our new hex string for this number. - for(uint j=0; j < sNum.length(); j++) { - sNumHex += TQString::number((int)sNum[j].latin1(), 16); - } - - // swap because of the byte ordering issue. - sNumHex = hexSwap(sNumHex); - // Assign the converted number. - challengeIntegers[i] = sNumHex.toInt(0, 16); - kdDebug(14140) << k_funcinfo << sNum << (": 0x"+sNumHex) << " " << challengeIntegers[i] << endl; - } - - // Step Three: Create the 64-bit hash key. - - // Get the hash key using the specified arrays. - TQ_INT64 key = createHashKey(md5Integers, challengeIntegers); - kdDebug(14140) << k_funcinfo << "key: " << key << endl; - - // Step Four: Create the final hash key. - - TQString upper = TQString::number(TQString(digest.mid(0, 16)).toULongLong(0, 16)^key, 16); - if(upper.length() % 16 != 0) - upper = upper.rightJustify(upper.length() + (16 - upper.length() % 16), '0'); - - TQString lower = TQString::number(TQString(digest.mid(16, 16)).toULongLong(0, 16)^key, 16); - if(lower.length() % 16 != 0) - lower = lower.rightJustify(lower.length() + (16 - lower.length() % 16), '0'); - - return (upper + lower); -} - -TQ_INT64 MSNChallengeHandler::createHashKey(const TQValueVector<TQ_INT32>& md5Integers, - const TQValueVector<TQ_INT32>& challengeIntegers) -{ - kdDebug(14140) << k_funcinfo << "Creating 64-bit key." << endl; - - TQ_INT64 magicNumber = 0x0E79A9C1L, high = 0L, low = 0L; - - for(uint i=0; i < challengeIntegers.count(); i += 2) - { - TQ_INT64 temp = ((challengeIntegers[i] * magicNumber) % 0x7FFFFFFF) + high; - temp = ((temp * md5Integers[0]) + md5Integers[1]) % 0x7FFFFFFF; - - high = (challengeIntegers[i + 1] + temp) % 0x7FFFFFFF; - high = ((high * md5Integers[2]) + md5Integers[3]) % 0x7FFFFFFF; - - low += high + temp; - } - - high = (high + md5Integers[1]) % 0x7FFFFFFF; - low = (low + md5Integers[3]) % 0x7FFFFFFF; - - TQDataStream buffer(TQByteArray(8), IO_ReadWrite); - buffer.setByteOrder(TQDataStream::LittleEndian); - buffer << (TQ_INT32)high; - buffer << (TQ_INT32)low; - - buffer.device()->reset(); - buffer.setByteOrder(TQDataStream::BigEndian); - TQ_INT64 key; - buffer >> key; - - return key; -} - -TQString MSNChallengeHandler::hexSwap(const TQString& in) -{ - TQString sHex = in, swapped; - while(sHex.length() > 0) - { - swapped = swapped + sHex.mid(sHex.length() - 2, 2); - sHex = sHex.remove(sHex.length() - 2, 2); - } - return swapped; -} - -TQString MSNChallengeHandler::productId() -{ - return m_productId; -} - -#include "msnchallengehandler.moc" diff --git a/kopete/protocols/msn/msnchallengehandler.h b/kopete/protocols/msn/msnchallengehandler.h deleted file mode 100644 index 22024aee..00000000 --- a/kopete/protocols/msn/msnchallengehandler.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - msnchallengehandler.h - Computes a msn challenge response hash key. - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - Kopete (c) 2003-2005 by The Kopete developers <[email protected]> - - Portions taken from - http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNCHALLENGEHANDLER_H -#define MSNCHALLENGEHANDLER_H - -#include <tqobject.h> -#include <tqvaluevector.h> - -/** - * Provides a simple way to compute a msn challenge response hash key. - * - * @author Gregg Edghill - */ -class MSNChallengeHandler : public TQObject -{ -Q_OBJECT - -public: - MSNChallengeHandler(const TQString& productKey, const TQString& productId); - ~MSNChallengeHandler(); - - /** - * Computes the response hash string for the specified challenge string. - */ - TQString computeHash(const TQString& challengeString); - - /** - * Returns the product id used by the challenge handler. - */ - TQString productId(); - -private: - - /** - * Creates a 64-bit hash key. - */ - TQ_INT64 createHashKey(const TQValueVector<TQ_INT32>& md5Integers, const TQValueVector<TQ_INT32>& challengeIntegers); - - /** - * Swaps the bytes in a hex string. - */ - TQString hexSwap(const TQString& in); - - TQString m_productKey; - TQString m_productId; -}; - -#endif diff --git a/kopete/protocols/msn/msnchatsession.cpp b/kopete/protocols/msn/msnchatsession.cpp deleted file mode 100644 index fabd62ab..00000000 --- a/kopete/protocols/msn/msnchatsession.cpp +++ /dev/null @@ -1,775 +0,0 @@ -/* - msnchatsession.cpp - MSN Message Manager - - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnchatsession.h" - -#include <tqlabel.h> -#include <tqimage.h> -#include <tqtooltip.h> -#include <tqfile.h> -#include <tqiconset.h> - - -#include <tdeconfig.h> -#include <kdebug.h> -#include <kinputdialog.h> -#include <tdelocale.h> -#include <tdemessagebox.h> -#include <tdepopupmenu.h> -#include <tdetempfile.h> -#include <tdemainwindow.h> -#include <tdetoolbar.h> -#include <krun.h> - -#include "kopetecontactaction.h" -#include "kopetemetacontact.h" -#include "kopetecontactlist.h" -#include "kopetechatsessionmanager.h" -#include "kopeteuiglobal.h" -#include "kopeteglobal.h" -#include "kopeteview.h" - -#include "msncontact.h" -#include "msnfiletransfersocket.h" -#include "msnaccount.h" -#include "msnswitchboardsocket.h" - -#include "config.h" - -#if !defined NDEBUG -#include "msndebugrawcmddlg.h" -#endif - -MSNChatSession::MSNChatSession( Kopete::Protocol *protocol, const Kopete::Contact *user, - Kopete::ContactPtrList others, const char *name ) -: Kopete::ChatSession( user, others, protocol, name ) -{ - Kopete::ChatSessionManager::self()->registerChatSession( this ); - m_chatService = 0l; - m_timeoutTimer =0L; - m_newSession = true; - m_connectionTry=0; - - setInstance(protocol->instance()); - - connect( this, TQT_SIGNAL( messageSent( Kopete::Message&, - Kopete::ChatSession* ) ), - this, TQT_SLOT( slotMessageSent( Kopete::Message&, - Kopete::ChatSession* ) ) ); - - connect( this, TQT_SIGNAL( invitation(MSNInvitation*& , const TQString & , long unsigned int , MSNChatSession* , MSNContact* ) ) , - protocol, TQT_SIGNAL( invitation(MSNInvitation*& , const TQString & , long unsigned int , MSNChatSession* , MSNContact* ) ) ); - - - m_actionInvite = new TDEActionMenu( i18n( "&Invite" ), "kontact_contacts", actionCollection(), "msnInvite" ); - connect ( m_actionInvite->popupMenu() , TQT_SIGNAL( aboutToShow() ) , this , TQT_SLOT(slotActionInviteAboutToShow() ) ) ; - - #if !defined NDEBUG - new TDEAction( i18n( "Send Raw C&ommand..." ), 0, this, TQT_SLOT( slotDebugRawCommand() ), actionCollection(), "msnDebugRawCommand" ) ; - #endif - - - m_actionNudge=new TDEAction( i18n( "Send Nudge" ), "bell", 0, this, TQT_SLOT(slotSendNudge() ), actionCollection(), "msnSendNudge" ) ; -#if MSN_WEBCAM - // Invite to receive webcam action - m_actionWebcamReceive=new TDEAction( i18n( "View Contact's Webcam" ), "webcamreceive", 0, this, TQT_SLOT(slotWebcamReceive()), actionCollection(), "msnWebcamReceive" ) ; - - //Send webcam action - m_actionWebcamSend=new TDEAction( i18n( "Send Webcam" ), "webcamsend", 0, this, TQT_SLOT(slotWebcamSend()), actionCollection(), "msnWebcamSend" ) ; -#endif - - new TDEAction( i18n( "Send File" ),"attach", 0, this, TQT_SLOT( slotSendFile() ), actionCollection(), "msnSendFile" ); - - MSNContact *c = static_cast<MSNContact*>( others.first() ); - (new TDEAction( i18n( "Request Display Picture" ), "image", 0, this, TQT_SLOT( slotRequestPicture() ), actionCollection(), "msnRequestDisplayPicture" ))->setEnabled(!c->object().isEmpty()); - - if ( !c->object().isEmpty() ) - { - - connect( c, TQT_SIGNAL( displayPictureChanged() ), this, TQT_SLOT( slotDisplayPictureChanged() ) ); - m_image = new TQLabel( 0L, "kde toolbar widget" ); - new KWidgetAction( m_image, i18n( "MSN Display Picture" ), 0, this, TQT_SLOT( slotRequestPicture() ), actionCollection(), "msnDisplayPicture" ); - if(c->hasProperty(Kopete::Global::Properties::self()->photo().key()) ) - { - //if the view doesn't exist yet, we will be unable to get the size of the toolbar - // so when the view will exist, we will show the displaypicture. - //How to know when a our view is created? We can't. - // but chances are the next created view will be for this KMM - // And if it is not? never mind. the icon will just be sized 22x22 - connect( Kopete::ChatSessionManager::self() , TQT_SIGNAL(viewActivated(KopeteView* )) , this, TQT_SLOT(slotDisplayPictureChanged()) ); - //it's viewActivated and not viewCreated because the view get his mainwindow only when it is shown. - } - } - else - { - m_image = 0L; - } - - setXMLFile("msnchatui.rc"); - - setMayInvite( true ); -} - -MSNChatSession::~MSNChatSession() -{ - delete m_image; - //force to disconnect the switchboard - //not needed since the m_chatService has us as parent - // if(m_chatService) - // delete m_chatService; - - TQMap<unsigned long int, MSNInvitation*>::Iterator it; - for( it = m_invitations.begin(); it != m_invitations.end() ; it = m_invitations.begin()) - { - delete *it; - m_invitations.remove( it ); - } -} - -void MSNChatSession::createChat( const TQString &handle, - const TQString &address, const TQString &auth, const TQString &ID ) -{ - /* disabled because i don't want to reopen a chatwindow if we just closed it - * and the contact take much time to type his message - m_newSession= !(ID.isEmpty()); - */ - - if( m_chatService ) - { - kdDebug(14140) << k_funcinfo << "Service already exists, disconnect them." << endl; - delete m_chatService; - } - -// uncomment this line if you don't want to the peer know when you close the window -// setCanBeDeleted( false ); - - m_chatService = new MSNSwitchBoardSocket( static_cast<MSNAccount*>( myself()->account() ) , this); - m_chatService->setUseHttpMethod( static_cast<MSNAccount*>( myself()->account() )->useHttpMethod() ); - m_chatService->setHandle( myself()->account()->accountId() ); - m_chatService->setMsgHandle( handle ); - m_chatService->connectToSwitchBoard( ID, address, auth ); - - connect( m_chatService, TQT_SIGNAL( userJoined(const TQString&,const TQString&,bool)), - this, TQT_SLOT( slotUserJoined(const TQString&,const TQString&,bool) ) ); - connect( m_chatService, TQT_SIGNAL( userLeft(const TQString&,const TQString&)), - this, TQT_SLOT( slotUserLeft(const TQString&,const TQString&) ) ); - connect( m_chatService, TQT_SIGNAL( msgReceived( Kopete::Message & ) ), - this, TQT_SLOT( slotMessageReceived( Kopete::Message & ) ) ); - connect( m_chatService, TQT_SIGNAL( switchBoardClosed() ), - this, TQT_SLOT( slotSwitchBoardClosed() ) ); - connect( m_chatService, TQT_SIGNAL( receivedTypingMsg( const TQString &, bool ) ), - this, TQT_SLOT( receivedTypingMsg( const TQString &, bool ) ) ); - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if(config->readBoolEntry( "SendTypingNotification" , true) ) - { - connect( this, TQT_SIGNAL( myselfTyping( bool ) ), - m_chatService, TQT_SLOT( sendTypingMsg( bool ) ) ); - } - connect( m_chatService, TQT_SIGNAL( msgAcknowledgement(unsigned int, bool) ), - this, TQT_SLOT( slotAcknowledgement(unsigned int, bool) ) ); - connect( m_chatService, TQT_SIGNAL( invitation( const TQString&, const TQString& ) ), - this, TQT_SLOT( slotInvitation( const TQString&, const TQString& ) ) ); - connect( m_chatService, TQT_SIGNAL( nudgeReceived(const TQString&) ), - this, TQT_SLOT( slotNudgeReceived(const TQString&) ) ); - connect( m_chatService, TQT_SIGNAL( errorMessage(int, const TQString& ) ), static_cast<MSNAccount *>(myself()->account()), TQT_SLOT( slotErrorMessageReceived(int, const TQString& ) ) ); - - if(!m_timeoutTimer) - { - m_timeoutTimer=new TQTimer(this); - connect( m_timeoutTimer , TQT_SIGNAL(timeout()), this , TQT_SLOT(slotConnectionTimeout() ) ); - } - m_timeoutTimer->start(20000,true); -} - -void MSNChatSession::slotUserJoined( const TQString &handle, const TQString &publicName, bool IRO ) -{ - delete m_timeoutTimer; - m_timeoutTimer=0L; - - if( !account()->contacts()[ handle ] ) - account()->addContact( handle, TQString(), 0L, Kopete::Account::Temporary); - - MSNContact *c = static_cast<MSNContact*>( account()->contacts()[ handle ] ); - - c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName); - - if(c->clientFlags() & MSNProtocol::MSNC4 ) - { - m_actionNudge->setEnabled(true); - } -#if MSN_WEBCAM - if(c->clientFlags() & MSNProtocol::SupportWebcam ) - { - m_actionWebcamReceive->setEnabled(true); - } -#endif - - addContact(c , IRO); // don't show notificaions when we join wesalef - if(!m_messagesQueue.empty() || !m_invitations.isEmpty()) - sendMessageQueue(); - - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if ( members().count()==1 && config->readNumEntry( "DownloadPicture", 1 ) >= 1 && !c->object().isEmpty() && !c->hasProperty(Kopete::Global::Properties::self()->photo().key())) - slotRequestPicture(); -} - -void MSNChatSession::slotUserLeft( const TQString &handle, const TQString& reason ) -{ - MSNContact *c = static_cast<MSNContact*>( myself()->account()->contacts()[ handle ] ); - if(c) - removeContact(c, reason ); -} - - - -void MSNChatSession::slotSwitchBoardClosed() -{ - //kdDebug(14140) << "MSNChatSession::slotSwitchBoardClosed" << endl; - m_chatService->deleteLater(); - m_chatService=0l; - - cleanMessageQueue( i18n("Connection closed") ); - - if(m_invitations.isEmpty()) - setCanBeDeleted( true ); -} - -void MSNChatSession::slotMessageSent(Kopete::Message &message,Kopete::ChatSession *) -{ - m_newSession=false; - if(m_chatService) - { - int id = m_chatService->sendMsg(message); - if(id == -1) - { - m_messagesQueue.append(message); - kdDebug(14140) << k_funcinfo << "Message added to the queue" <<endl; - } - else if( id== -2 ) //the message has not been sent - { - //FIXME: tell the what window the message has been processed. but we havent't sent it - messageSucceeded(); //that should stop the blonking icon. - } - else if( id == -3) //the message has been sent as an immge - { - appendMessage(message); - messageSucceeded(); - } - else - { - m_messagesSent.insert( id, message ); - message.setBg(TQColor()); // clear the bgColor - message.setBody(message.plainBody() , Kopete::Message::PlainText ); //clear every custom tag which are not sent - appendMessage(message); // send the own msg to chat window - } - } - else // There's no switchboard available, so we must create a new one! - { - startChatSession(); - m_messagesQueue.append(message); -// sendMessageQueue(); - //m_msgQueued=new Kopete::Message(message); - } -} - -void MSNChatSession::slotMessageReceived( Kopete::Message &msg ) -{ - m_newSession=false; - if( msg.plainBody().startsWith( "AutoMessage: " ) ) - { - //FIXME: HardCodded color are not so good - msg.setFg( TQColor( "SlateGray3" ) ); - TQFont f; - f.setItalic( true ); - msg.setFont( f ); - } - appendMessage( msg ); -} - -void MSNChatSession::slotActionInviteAboutToShow() -{ - // We can't simply insert TDEAction in this menu bebause we don't know when to delete them. - // items inserted with insert items are automatically deleted when we call clear - - m_inviteactions.setAutoDelete(true); - m_inviteactions.clear(); - - m_actionInvite->popupMenu()->clear(); - - - TQDictIterator<Kopete::Contact> it( account()->contacts() ); - for( ; it.current(); ++it ) - { - if( !members().contains( it.current() ) && it.current()->isOnline() && it.current() != myself() ) - { - TDEAction *a=new KopeteContactAction( it.current(), this, - TQT_SLOT( slotInviteContact( Kopete::Contact * ) ), m_actionInvite ); - m_actionInvite->insert( a ); - m_inviteactions.append( a ) ; - } - } - TDEAction *b=new TDEAction( i18n ("Other..."), 0, this, TQT_SLOT( slotInviteOtherContact() ), m_actionInvite, "actionOther" ); - m_actionInvite->insert( b ); - m_inviteactions.append( b ) ; -} - -void MSNChatSession::slotCloseSession() -{ - kdDebug(14140) << k_funcinfo << m_chatService <<endl; - if(m_chatService) - m_chatService->slotCloseSession(); -} - -void MSNChatSession::slotInviteContact( Kopete::Contact *contact ) -{ - if(contact) - inviteContact( contact->contactId() ); -} - -void MSNChatSession::inviteContact(const TQString &contactId) -{ - if( m_chatService ) - m_chatService->slotInviteContact( contactId ); - else - startChatSession(); -} - -void MSNChatSession::slotInviteOtherContact() -{ - bool ok; - TQString handle = KInputDialog::getText(i18n( "MSN Plugin" ), - i18n( "Please enter the email address of the person you want to invite:" ), - TQString(), &ok ); - if( !ok ) - return; - - if( handle.contains('@') != 1 || handle.contains('.') <1) - { - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, - i18n("<qt>You must enter a valid email address.</qt>"), i18n("MSN Plugin")); - return; - } - - inviteContact(handle); -} - - -void MSNChatSession::sendMessageQueue() -{ - if(!m_chatService) - { - kdDebug(14140) <<k_funcinfo << "Service doesn't exist" <<endl; - return; - } -// kdDebug(14140) << "MSNChatSession::sendMessageQueue: " << m_messagesQueue.count() <<endl; - for ( TQValueList<Kopete::Message>::iterator it = m_messagesQueue.begin(); it!=m_messagesQueue.end(); it = m_messagesQueue.begin() ) - { - //m_chatService->sendMsg( *it) ; - slotMessageSent(*it , this); - m_messagesQueue.remove(it); - } - - - TQMap<unsigned long int, MSNInvitation*>::Iterator it; - for( it = m_invitations.begin(); it != m_invitations.end() ; ++it) - { - if(! (*it)->incoming() && (*it)->state()<MSNInvitation::Invited) - { - m_chatService->sendCommand( "MSG" , "N", true, (*it)->invitationHead().utf8() ); - (*it)->setState(MSNInvitation::Invited); - } - } -} - -void MSNChatSession::slotAcknowledgement(unsigned int id, bool ack) -{ - if ( !m_messagesSent.contains( id ) ) - { - // This is maybe a ACK/NAK for a non-messaging message - return; - } - - if ( !ack ) - { - Kopete::Message m = m_messagesSent[ id ]; - TQString body = i18n( "The following message has not been sent correctly:\n%1" ).arg( m.plainBody() ); - Kopete::Message msg = Kopete::Message( m.to().first(), members(), body, Kopete::Message::Internal, Kopete::Message::PlainText ); - appendMessage( msg ); - //stop the stupid animation - messageSucceeded(); - } - else - { - messageSucceeded(); - } - - m_messagesSent.remove( id ); -} - -void MSNChatSession::slotInvitation(const TQString &handle, const TQString &msg) -{ - //FIXME! a contact from another account can send a file - MSNContact *c = static_cast<MSNContact*>( myself()->account()->contacts()[ handle ] ); - if(!c) - return; - - TQRegExp rx("Invitation-Cookie: ([0-9]*)"); - rx.search(msg); - long unsigned int cookie=rx.cap(1).toUInt(); - - if(m_invitations.contains(cookie)) - { - MSNInvitation *msnI=m_invitations[cookie]; - msnI->parseInvitation(msg); - } - else if( msg.contains("Invitation-Command: INVITE") ) - { - if( msg.contains(MSNFileTransferSocket::applicationID()) ) - { - MSNFileTransferSocket *MFTS=new MSNFileTransferSocket(myself()->account()->accountId(),c,true,this); - connect(MFTS, TQT_SIGNAL( done(MSNInvitation*) ) , this , TQT_SLOT( invitationDone(MSNInvitation*) )); - m_invitations.insert( cookie , MFTS); - MFTS->parseInvitation(msg); - setCanBeDeleted(false); - } - else - { - MSNInvitation *i=0l; - emit invitation( i , msg, cookie, this, c ); - if(i) - { - m_invitations.insert( cookie , i ); - //don't delete this if all invitation are not done - setCanBeDeleted(false); - } - else - { - rx=TQRegExp("Application-Name: ([^\\r\\n]*)"); - rx.search(msg); - TQString inviteName = rx.cap( 1 ); - - TQString body = i18n( - "%1 has sent an unimplemented invitation, the invitation was rejected.\n" - "The invitation was: %2" ) - .arg( c->property( Kopete::Global::Properties::self()->nickName()).value().toString(), inviteName ); - Kopete::Message tmpMsg = Kopete::Message( c , members() , body , Kopete::Message::Internal, Kopete::Message::PlainText); - appendMessage(tmpMsg); - - m_chatService->sendCommand( "MSG" , "N", true, MSNInvitation::unimplemented(cookie) ); - } - } - } -} - -void MSNChatSession::invitationDone(MSNInvitation* MFTS) -{ - kdDebug(14140) << k_funcinfo <<endl; - m_invitations.remove(MFTS->cookie()); -// MFTS->deleteLater(); - delete MFTS; - if(!m_chatService && m_invitations.isEmpty()) - setCanBeDeleted(true); -} - -void MSNChatSession::sendFile(const TQString &fileLocation, const TQString &/*fileName*/, - long unsigned int fileSize) -{ - // TODO create a switchboard to send the file is one is not available. - if(m_chatService && members().getFirst()) - { - m_chatService->PeerDispatcher()->sendFile(fileLocation, (TQ_INT64)fileSize, members().getFirst()->contactId()); - } -} - -void MSNChatSession::initInvitation(MSNInvitation* invitation) -{ - connect(invitation->object(), TQT_SIGNAL( done(MSNInvitation*) ) , this , TQT_SLOT( invitationDone(MSNInvitation*) )); - m_invitations.insert( invitation->cookie() , invitation); - - if(m_chatService) - { - m_chatService->sendCommand( "MSG" , "N", true, invitation->invitationHead().utf8() ); - invitation->setState(MSNInvitation::Invited); - } - else - { - startChatSession(); - } -} - -void MSNChatSession::slotRequestPicture() -{ - TQPtrList<Kopete::Contact> mb=members(); - MSNContact *c = static_cast<MSNContact*>( mb.first() ); - if(!c) - return; - - if( !c->hasProperty(Kopete::Global::Properties::self()->photo().key())) - { - if(m_chatService) - { - if( !c->object().isEmpty() ) - m_chatService->requestDisplayPicture(); - } - else if(myself()->onlineStatus().isDefinitelyOnline() && myself()->onlineStatus().status() != Kopete::OnlineStatus::Invisible ) - startChatSession(); - } - else - { //we already have the picture, just show it. - KRun::runURL( KURL::fromPathOrURL( c->property(Kopete::Global::Properties::self()->photo()).value().toString() ), "image/png" ); - } - -} - -void MSNChatSession::slotDisplayPictureChanged() -{ - TQPtrList<Kopete::Contact> mb=members(); - MSNContact *c = static_cast<MSNContact *>( mb.first() ); - if ( c && m_image ) - { - if(c->hasProperty(Kopete::Global::Properties::self()->photo().key())) - { - int sz=22; - // get the size of the toolbar were the aciton is plugged. - // if you know a better way to get the toolbar, let me know - TDEMainWindow *w= view(false) ? dynamic_cast<TDEMainWindow*>( view(false)->mainWidget()->topLevelWidget() ) : 0L; - if(w) - { - //We connected that in the constructor. we don't need to keep this slot active. - disconnect( Kopete::ChatSessionManager::self() , TQT_SIGNAL(viewActivated(KopeteView* )) , this, TQT_SLOT(slotDisplayPictureChanged()) ); - - TQPtrListIterator<TDEToolBar> it=w->toolBarIterator() ; - TDEAction *imgAction=actionCollection()->action("msnDisplayPicture"); - if(imgAction) while(it) - { - TDEToolBar *tb=*it; - if(imgAction->isPlugged(tb)) - { - sz=tb->iconSize(); - //ipdate if the size of the toolbar change. - disconnect(tb, TQT_SIGNAL(modechange()), this, TQT_SLOT(slotDisplayPictureChanged())); - connect(tb, TQT_SIGNAL(modechange()), this, TQT_SLOT(slotDisplayPictureChanged())); - break; - } - ++it; - } - } - TQString imgURL=c->property(Kopete::Global::Properties::self()->photo()).value().toString(); - TQImage scaledImg = TQPixmap( imgURL ).convertToImage().smoothScale( sz, sz ); - if(!scaledImg.isNull()) - m_image->setPixmap( scaledImg ); - else - { //the image has maybe not been transfered correctly.. force to download again - c->removeProperty(Kopete::Global::Properties::self()->photo()); - //slotDisplayPictureChanged(); //don't do that or we might end in a infinite loop - } - TQToolTip::add( m_image, "<qt><img src=\"" + imgURL + "\"></qt>" ); - - } - else - { - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if ( config->readNumEntry( "DownloadPicture", 1 ) >= 1 && !c->object().isEmpty() ) - slotRequestPicture(); - } - } -} - -void MSNChatSession::slotDebugRawCommand() -{ -#if !defined NDEBUG - if ( !m_chatService ) - return; - - MSNDebugRawCmdDlg *dlg = new MSNDebugRawCmdDlg( 0L ); - int result = dlg->exec(); - if( result == TQDialog::Accepted && m_chatService ) - { - m_chatService->sendCommand( dlg->command(), dlg->params(), - dlg->addId(), dlg->msg().replace("\n","\r\n").utf8() ); - } - delete dlg; -#endif -} - - -void MSNChatSession::receivedTypingMsg( const TQString &contactId, bool b ) -{ - MSNContact *c = dynamic_cast<MSNContact *>( account()->contacts()[ contactId ] ); - if(c && m_newSession && !view(false)) - { - //this was originaly in MSNAccount::slotCreateChat - TDEGlobal::config()->setGroup( "MSN" ); - bool notifyNewChat = TDEGlobal::config()->readBoolEntry( "NotifyNewChat", false ); - if ( notifyNewChat ) - { - // this internal message should open the window if they not exist - TQString body = i18n( "%1 has started a chat with you" ).arg( c->metaContact()->displayName() ); - Kopete::Message tmpMsg = Kopete::Message( c, members(), body, Kopete::Message::Internal, Kopete::Message::PlainText ); - appendMessage( tmpMsg ); - } - } - m_newSession=false; - if(c) - Kopete::ChatSession::receivedTypingMsg(c,b); -} - -void MSNChatSession::slotSendNudge() -{ - if(m_chatService) - { - m_chatService->sendNudge(); - Kopete::Message msg = Kopete::Message( myself(), members() , i18n ( "has sent a nudge" ), Kopete::Message::Outbound, - Kopete::Message::PlainText, TQString(), Kopete::Message::TypeAction ); - appendMessage( msg ); - - } -} - - -void MSNChatSession::slotNudgeReceived(const TQString& handle) -{ - Kopete::Contact *c = account()->contacts()[ handle ] ; - if(!c) - c=members().getFirst(); - Kopete::Message msg = Kopete::Message(c, myself(), i18n ( "has sent you a nudge" ), Kopete::Message::Inbound, - Kopete::Message::PlainText, TQString(), Kopete::Message::TypeAction ); - appendMessage( msg ); - // Emit the nudge/buzz notification (configured by user). - emitNudgeNotification(); -} - - -void MSNChatSession::slotWebcamReceive() -{ -#if MSN_WEBCAM - if(m_chatService && members().getFirst()) - { - m_chatService->PeerDispatcher()->startWebcam(myself()->contactId() , members().getFirst()->contactId() , true); - } -#endif -} - -void MSNChatSession::slotWebcamSend() -{ -#if MSN_WEBCAM - kdDebug(14140) << k_funcinfo << endl; - if(m_chatService && members().getFirst()) - { - m_chatService->PeerDispatcher()->startWebcam(myself()->contactId() , members().getFirst()->contactId() , false); - } -#endif -} - - -void MSNChatSession::slotSendFile() - { - TQPtrList<Kopete::Contact>contacts = members(); - static_cast<MSNContact *>(contacts.first())->sendFile(); - } - -void MSNChatSession::startChatSession() -{ - TQPtrList<Kopete::Contact> mb=members(); - static_cast<MSNAccount*>( account() )->slotStartChatSession( mb.first()->contactId() ); - - if(!m_timeoutTimer) - { - m_timeoutTimer=new TQTimer(this); - connect( m_timeoutTimer , TQT_SIGNAL(timeout()), this , TQT_SLOT(slotConnectionTimeout() ) ); - } - m_timeoutTimer->start(20000, true); -} - - -void MSNChatSession::cleanMessageQueue( const TQString & reason ) -{ - delete m_timeoutTimer; - m_timeoutTimer=0L; - - uint nb=m_messagesQueue.count()+m_messagesSent.count(); - if(nb==0) - return; - else if(nb==1) - { - Kopete::Message m; - if(m_messagesQueue.count() == 1) - m=m_messagesQueue.first(); - else - m=m_messagesSent.begin().data(); - - TQString body=i18n("The following message has not been sent correctly (%1): \n%2").arg(reason, m.plainBody()); - Kopete::Message msg = Kopete::Message(m.to().first() , members() , body , Kopete::Message::Internal, Kopete::Message::PlainText); - appendMessage(msg); - } - else - { - Kopete::Message m; - TQString body=i18n("These messages have not been sent correctly (%1): <br /><ul>").arg(reason); - for ( TQMap<unsigned int , Kopete::Message>::iterator it = m_messagesSent.begin(); it!=m_messagesSent.end(); it = m_messagesSent.begin() ) - { - m=it.data(); - body+= "<li>"+m.escapedBody()+"</li>"; - m_messagesSent.remove(it); - } - for ( TQValueList<Kopete::Message>::iterator it = m_messagesQueue.begin(); it!=m_messagesQueue.end(); it = m_messagesQueue.begin() ) - { - m=(*it); - body+= "<li>"+m.escapedBody()+"</li>"; - m_messagesQueue.remove(it); - } - body+="</ul>"; - Kopete::Message msg = Kopete::Message(m.to().first() , members() , body , Kopete::Message::Internal, Kopete::Message::RichText); - appendMessage(msg); - - } - m_messagesQueue.clear(); - m_messagesSent.clear(); - messageSucceeded(); //stop stupid animation -} - -void MSNChatSession::slotConnectionTimeout() -{ - m_connectionTry++; - if(m_chatService) - { - disconnect(m_chatService , 0 , this , 0 ); - m_chatService->deleteLater(); - m_chatService=0L; - } - - if( m_connectionTry > 3 ) - { - cleanMessageQueue( i18n("Impossible to establish the connection") ); - delete m_timeoutTimer; - m_timeoutTimer=0L; - return; - } - startChatSession(); - -} - - - - -#include "msnchatsession.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnchatsession.h b/kopete/protocols/msn/msnchatsession.h deleted file mode 100644 index 2fb92d2a..00000000 --- a/kopete/protocols/msn/msnchatsession.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - msnchatsession.h - MSN Message Manager - - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart @ kde.org> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNMESSAGEMANAGER_H -#define MSNMESSAGEMANAGER_H - -#include "kopetechatsession.h" - -class MSNSwitchBoardSocket; -class TDEActionCollection; -class MSNInvitation; -class MSNContact; -class TDEActionMenu; -class TQLabel; - - -/** - * @author Olivier Goffart - */ -class KOPETE_EXPORT MSNChatSession : public Kopete::ChatSession -{ - Q_OBJECT - - -public: - MSNChatSession( Kopete::Protocol *protocol, const Kopete::Contact *user, Kopete::ContactPtrList others, const char *name = 0 ); - ~MSNChatSession(); - - void createChat( const TQString &handle, const TQString &address, const TQString &auth, const TQString &ID = TQString() ); - - MSNSwitchBoardSocket *service() { return m_chatService; }; - - void sendFile( const TQString &fileLocation, const TQString &fileName, - long unsigned int fileSize ); - - /** - * append an invitation in the invitation map, and send the first invitation message - */ - void initInvitation(MSNInvitation* invitation); - - virtual void inviteContact(const TQString& ); - -public slots: - void slotCloseSession(); - void slotInviteOtherContact(); - - void invitationDone( MSNInvitation* ); - - void slotRequestPicture(); - - /** - * this is a reimplementation of ChatSesstion slot. - * the original slot is not virtual, but that's not a problem because it's a slot. - */ - virtual void receivedTypingMsg( const TQString &, bool ); - - void slotConnectionTimeout(); - -private slots: - void slotMessageSent( Kopete::Message &message, Kopete::ChatSession *kmm ); - void slotMessageReceived( Kopete::Message &message ); - - void slotUserJoined( const TQString &handle, const TQString &publicName, bool IRO ); - void slotUserLeft( const TQString &handle, const TQString &reason ); - void slotSwitchBoardClosed(); - void slotInviteContact( Kopete::Contact *contact ); - void slotAcknowledgement( unsigned int id, bool ack ); - void slotInvitation( const TQString &handle, const TQString &msg ); - - void slotActionInviteAboutToShow(); - - void slotDisplayPictureChanged(); - - /** - * (debug) - */ - void slotDebugRawCommand(); - - void slotSendNudge(); - void slotWebcamReceive(); - void slotWebcamSend(); - void slotSendFile(); - - void slotNudgeReceived(const TQString& handle); - -private: - - MSNSwitchBoardSocket *m_chatService; - TQString otherString; - TDEActionMenu *m_actionInvite; - TQPtrList<TDEAction> m_inviteactions; - TDEAction *m_actionNudge; - TDEAction *m_actionWebcamReceive; - TDEAction *m_actionWebcamSend; - - //Messages sent before the ending of the connection are queued - TQValueList<Kopete::Message> m_messagesQueue; - void sendMessageQueue(); - void cleanMessageQueue( const TQString &reason); - void startChatSession(); - - TQMap<unsigned int, Kopete::Message> m_messagesSent; - - TQMap<long unsigned int, MSNInvitation*> m_invitations; - - - /** - * weither or not the "has opened a new chat" message need to be sent if the user is typing - */ - bool m_newSession; - - TQLabel *m_image; - TQTimer *m_timeoutTimer; - uint m_connectionTry; - - -signals: - /* - * This signal is relayed to the protocol and after, to plugins - */ - void invitation(MSNInvitation*& invitation, const TQString &bodyMSG , long unsigned int cookie , MSNChatSession* msnMM , MSNContact* c ); -}; - -#endif - -// vim: set noet ts=4 sts=4 tw=4: - diff --git a/kopete/protocols/msn/msnchatui.rc b/kopete/protocols/msn/msnchatui.rc deleted file mode 100644 index 6dbc94ca..00000000 --- a/kopete/protocols/msn/msnchatui.rc +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE kpartgui> -<kpartgui version="12" name="kopete_msn_chat"> - <MenuBar> - <Menu noMerge="1" name="file"> - <text>&Chat</text> - <Action name="msnWebcamReceive" /> - <Action name="msnWebcamSend" /> - <Action name="msnSendFile" /> - <Action name="msnSendNudge" /> - <Action name="msnRequestDisplayPicture" /> - <Action name="msnInvite" /> -<!-- <Menu name="debug"> - <text>&Debug</text> - <Action name="msnDebugRawCommand" /> - </Menu> --> - </Menu> - </MenuBar> - - - <ToolBar name="statusToolBar"> - <Action name="msnDisplayPicture" /> - <Action name="msnWebcamReceive" /> - <Action name="msnWebcamSend" /> - <Action name="msnSendFile" /> - <Action name="msnSendNudge" /> - </ToolBar> -</kpartgui> diff --git a/kopete/protocols/msn/msncontact.cpp b/kopete/protocols/msn/msncontact.cpp deleted file mode 100644 index e58c3800..00000000 --- a/kopete/protocols/msn/msncontact.cpp +++ /dev/null @@ -1,713 +0,0 @@ -/* - msncontact.cpp - MSN Contact - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002 by Ryan Cumming <[email protected]> - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * 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 of the License, or (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msncontact.h" - -#include <tqcheckbox.h> - -#undef KDE_NO_COMPAT -#include <tdeaction.h> -#include <kdebug.h> -#include <tdefiledialog.h> -#include <klineedit.h> -#include <tdelocale.h> -#include <kstandarddirs.h> -#include <tdemessagebox.h> -#include <krun.h> -#include <tdetempfile.h> -#include <tdeconfig.h> -#include <tdeglobal.h> -#include <tqregexp.h> -#include <tdeio/job.h> - -#include "kopetecontactlist.h" -#include "kopetechatsessionmanager.h" -#include "kopetemetacontact.h" -#include "kopetegroup.h" -#include "kopeteuiglobal.h" -#include "kopeteglobal.h" - -#include "msninfo.h" -#include "msnchatsession.h" -#include "msnnotifysocket.h" -#include "msnaccount.h" - -MSNContact::MSNContact( Kopete::Account *account, const TQString &id, Kopete::MetaContact *parent ) -: Kopete::Contact( account, id, parent ) -{ - m_deleted = false; - m_allowed = false; - m_blocked = false; - m_reversed = false; - m_moving = false; - - m_clientFlags=0; - - setFileCapable( true ); - - // When we are not connected, it's because we are loading the contactlist. - // so we set the initial status to offline. - // We set offline directly because modifying the status after is too slow. - // (notification, contactlist updating,....) - // - // FIXME: Hacks like these shouldn't happen in the protocols, but should be - // covered properly at the libkopete level instead - Martijn - // - // When we are connected, it can be because the user added a contact with the - // wizard, and it can be because we are creating a temporary contact. - // if it's added by the wizard, the status will be set immediately after. - // if it's a temporary contact, better to set the unknown status. - setOnlineStatus( ( parent && parent->isTemporary() ) ? MSNProtocol::protocol()->UNK : MSNProtocol::protocol()->FLN ); - - actionBlock = 0L; - - setProperty(MSNProtocol::protocol()->propEmail, id); -} - -MSNContact::~MSNContact() -{ - kdDebug(14140) << k_funcinfo << endl; -} - -bool MSNContact::isReachable() -{ - if ( account()->isConnected() && isOnline() && account()->myself()->onlineStatus() != MSNProtocol::protocol()->HDN ) - return true; - - MSNChatSession *kmm=dynamic_cast<MSNChatSession*>(manager(Kopete::Contact::CannotCreate)); - if( kmm && kmm->service() ) //the chat socket is open. than mean message will be sent - return true; - - // When we are invisible we can't start a chat with others, make isReachable return false - // (This is an MSN limitation, not a problem in Kopete) - if ( !account()->isConnected() || account()->myself()->onlineStatus() == MSNProtocol::protocol()->HDN ) - return false; - - //if the contact is offline, it is impossible to send it a message. but it is impossible - //to be sure the contact is realy offline. For example, if the contact is not on the contactlist for - //some reason. - if( onlineStatus() == MSNProtocol::protocol()->FLN && ( isAllowed() || isBlocked() ) && !serverGroups().isEmpty() ) - return false; - - return true; -} - -Kopete::ChatSession *MSNContact::manager( Kopete::Contact::CanCreateFlags canCreate ) -{ - Kopete::ContactPtrList chatmembers; - chatmembers.append(this); - - Kopete::ChatSession *_manager = Kopete::ChatSessionManager::self()->findChatSession( account()->myself(), chatmembers, protocol() ); - MSNChatSession *manager = dynamic_cast<MSNChatSession*>( _manager ); - if(!manager && canCreate==Kopete::Contact::CanCreate) - { - manager = new MSNChatSession( protocol(), account()->myself(), chatmembers ); - static_cast<MSNAccount*>( account() )->slotStartChatSession( contactId() ); - } - return manager; -} - -TQPtrList<TDEAction> *MSNContact::customContextMenuActions() -{ - TQPtrList<TDEAction> *m_actionCollection = new TQPtrList<TDEAction>; - - // Block/unblock Contact - TQString label = isBlocked() ? i18n( "Unblock User" ) : i18n( "Block User" ); - if( !actionBlock ) - { - actionBlock = new TDEAction( label, "msn_blocked",0, this, TQT_SLOT( slotBlockUser() ), - this, "actionBlock" ); - - //show profile - actionShowProfile = new TDEAction( i18n("Show Profile") , 0, this, TQT_SLOT( slotShowProfile() ), - this, "actionShowProfile" ); - - // Send mail (only available if it is an hotmail account) - actionSendMail = new TDEAction( i18n("Send Email...") , "mail_generic",0, this, TQT_SLOT( slotSendMail() ), - this, "actionSendMail" ); - - // Invite to receive webcam - actionWebcamReceive = new TDEAction( i18n( "View Contact's Webcam" ), "webcamreceive", 0, this, TQT_SLOT(slotWebcamReceive() ), this, "msnWebcamReceive" ) ; - - //Send webcam action - actionWebcamSend = new TDEAction( i18n( "Send Webcam" ), "webcamsend", 0, this, TQT_SLOT(slotWebcamSend() ), this, "msnWebcamSend" ) ; - } - else - actionBlock->setText( label ); - - actionSendMail->setEnabled( static_cast<MSNAccount*>(account())->isHotmail()); - - m_actionCollection->append( actionBlock ); - m_actionCollection->append( actionShowProfile ); - m_actionCollection->append( actionSendMail ); - m_actionCollection->append( actionWebcamReceive ); - m_actionCollection->append( actionWebcamSend ); - - - return m_actionCollection; -} - -void MSNContact::slotBlockUser() -{ - MSNNotifySocket *notify = static_cast<MSNAccount*>( account() )->notifySocket(); - if( !notify ) - { - KMessageBox::error( Kopete::UI::Global::mainWidget(), - i18n( "<qt>Please go online to block or unblock a contact.</qt>" ), - i18n( "MSN Plugin" )); - return; - } - - if( m_blocked ) - { - notify->removeContact( contactId(), MSNProtocol::BL, TQString(), TQString() ); - } - else - { - if(m_allowed) - notify->removeContact( contactId(), MSNProtocol::AL, TQString(), TQString() ); - else - notify->addContact( contactId(), MSNProtocol::BL, TQString(), TQString(), TQString() ); - } -} - -void MSNContact::slotUserInfo() -{ - KDialogBase *infoDialog=new KDialogBase( 0l, "infoDialog", /*modal = */false, TQString(), KDialogBase::Close , KDialogBase::Close, false ); - TQString nick=property( Kopete::Global::Properties::self()->nickName()).value().toString(); - TQString personalMessage=property( MSNProtocol::protocol()->propPersonalMessage).value().toString(); - MSNInfo *info=new MSNInfo ( infoDialog,"info"); - info->m_id->setText( contactId() ); - info->m_displayName->setText(nick); - info->m_personalMessage->setText(personalMessage); - info->m_phh->setText(m_phoneHome); - info->m_phw->setText(m_phoneWork); - info->m_phm->setText(m_phoneMobile); - info->m_reversed->setChecked(m_reversed); - - connect( info->m_reversed, TQT_SIGNAL(toggled(bool)) , this, TQT_SLOT(slotUserInfoDialogReversedToggled())); - - infoDialog->setMainWidget(info); - infoDialog->setCaption(nick); - infoDialog->show(); -} - -void MSNContact::slotUserInfoDialogReversedToggled() -{ - //workaround to make this checkboxe readonly - const TQCheckBox *cb=dynamic_cast<const TQCheckBox*>(sender()); - if(cb && cb->isChecked()!=m_reversed) - const_cast<TQCheckBox*>(cb)->setChecked(m_reversed); -} - -void MSNContact::deleteContact() -{ - kdDebug( 14140 ) << k_funcinfo << endl; - - MSNNotifySocket *notify = static_cast<MSNAccount*>( account() )->notifySocket(); - if( notify ) - { - if( hasProperty(MSNProtocol::protocol()->propGuid.key()) ) - { - // Remove from all groups he belongs (if applicable) - for( TQMap<TQString, Kopete::Group*>::Iterator it = m_serverGroups.begin(); it != m_serverGroups.end(); ++it ) - { - kdDebug(14140) << k_funcinfo << "Removing contact from group \"" << it.key() << "\"" << endl; - notify->removeContact( contactId(), MSNProtocol::FL, guid(), it.key() ); - } - - // Then trully remove it from server contact list, - // because only removing the contact from his groups isn't sufficent from MSNP11. - kdDebug( 14140 ) << k_funcinfo << "Removing contact from top-level." << endl; - notify->removeContact( contactId(), MSNProtocol::FL, guid(), TQString()); - } - else - { - kdDebug( 14140 ) << k_funcinfo << "The contact is already removed from server, just delete it" << endl; - deleteLater(); - } - } - else - { - // FIXME: This case should be handled by Kopete, not by the plugins :( - Martijn - // FIXME: We should be able to delete contacts offline, and remove it from server next time we go online - Olivier - KMessageBox::error( Kopete::UI::Global::mainWidget(), i18n( "<qt>Please go online to remove a contact from your contact list.</qt>" ), i18n( "MSN Plugin" )); - } -} - -bool MSNContact::isBlocked() const -{ - return m_blocked; -} - -void MSNContact::setBlocked( bool blocked ) -{ - if( m_blocked != blocked ) - { - m_blocked = blocked; - //update the status - setOnlineStatus(m_currentStatus); - //m_currentStatus is used here. previously it was onlineStatus() but this may cause problem when - // the account is offline because of the Kopete::Contact::OnlineStatus() account offline hack. - } -} - -bool MSNContact::isAllowed() const -{ - return m_allowed; -} - -void MSNContact::setAllowed( bool allowed ) -{ - m_allowed = allowed; -} - -bool MSNContact::isReversed() const -{ - return m_reversed; -} - -void MSNContact::setReversed( bool reversed ) -{ - m_reversed= reversed; -} - -bool MSNContact::isDeleted() const -{ - return m_deleted; -} - -void MSNContact::setDeleted( bool deleted ) -{ - m_deleted= deleted; -} - -uint MSNContact::clientFlags() const -{ - return m_clientFlags; -} - -void MSNContact::setClientFlags( uint flags ) -{ - if(m_clientFlags != flags) - { - if(hasProperty( MSNProtocol::protocol()->propClient.key() )) - { - if( flags & MSNProtocol::WebMessenger) - setProperty( MSNProtocol::protocol()->propClient , i18n("Web Messenger") ); - else if( flags & MSNProtocol::WindowsMobile) - setProperty( MSNProtocol::protocol()->propClient , i18n("Windows Mobile") ); - else if( flags & MSNProtocol::MSNMobileDevice) - setProperty( MSNProtocol::protocol()->propClient , i18n("MSN Mobile") ); - else if( m_obj.contains("kopete") ) - setProperty( MSNProtocol::protocol()->propClient , i18n("Kopete") ); - } - - } - m_clientFlags=flags; -} - -void MSNContact::setInfo(const TQString &type,const TQString &data ) -{ - if( type == "PHH" ) - { - m_phoneHome = data; - setProperty(MSNProtocol::protocol()->propPhoneHome, data); - } - else if( type == "PHW" ) - { - m_phoneWork=data; - setProperty(MSNProtocol::protocol()->propPhoneWork, data); - } - else if( type == "PHM" ) - { - m_phoneMobile = data; - setProperty(MSNProtocol::protocol()->propPhoneMobile, data); - } - else if( type == "MOB" ) - { - if( data == "Y" ) - m_phone_mob = true; - else if( data == "N" ) - m_phone_mob = false; - else - kdDebug( 14140 ) << k_funcinfo << "Unknown MOB " << data << endl; - } - else if( type == "MFN" ) - { - setProperty(Kopete::Global::Properties::self()->nickName(), data ); - } - else - { - kdDebug( 14140 ) << k_funcinfo << "Unknow info " << type << " " << data << endl; - } -} - - -void MSNContact::serialize( TQMap<TQString, TQString> &serializedData, TQMap<TQString, TQString> & /* addressBookData */ ) -{ - // Contact id and display name are already set for us, only add the rest - TQString groups; - bool firstEntry = true; - for( TQMap<TQString, Kopete::Group *>::ConstIterator it = m_serverGroups.begin(); it != m_serverGroups.end(); ++it ) - { - if( !firstEntry ) - { - groups += ","; - firstEntry = true; - } - groups += it.key(); - } - - TQString lists="C"; - if(m_blocked) - lists +="B"; - if(m_allowed) - lists +="A"; - if(m_reversed) - lists +="R"; - - serializedData[ "groups" ] = groups; - serializedData[ "PHH" ] = m_phoneHome; - serializedData[ "PHW" ] = m_phoneWork; - serializedData[ "PHM" ] = m_phoneMobile; - serializedData[ "lists" ] = lists; - serializedData[ "obj" ] = m_obj; - serializedData[ "contactGuid" ] = guid(); -} - - -TQString MSNContact::guid(){ return property(MSNProtocol::protocol()->propGuid).value().toString(); } - -TQString MSNContact::phoneHome(){ return m_phoneHome ;} -TQString MSNContact::phoneWork(){ return m_phoneWork ;} -TQString MSNContact::phoneMobile(){ return m_phoneMobile ;} - - -const TQMap<TQString, Kopete::Group*> MSNContact::serverGroups() const -{ - return m_serverGroups; -} -void MSNContact::clearServerGroups() -{ - m_serverGroups.clear(); -} - - -void MSNContact::sync( unsigned int changed ) -{ - if( ! (changed & Kopete::Contact::MovedBetweenGroup) ) - return; //we are only interested by a change in groups - - if(!metaContact() || metaContact()->isTemporary() ) - return; - - if(m_moving) - { - //We need to make sure that syncGroups is not called twice successively - // because m_serverGroups will be only updated with the reply of the server - // and then, the same command can be sent twice. - // FIXME: if this method is called a seconds times, that mean change can be - // done in the contactlist. we should found a way to recall this - // method later. (a TQTimer?) - kdDebug( 14140 ) << k_funcinfo << " This contact is already moving. Abort sync id: " << contactId() << endl; - return; - } - - MSNNotifySocket *notify = static_cast<MSNAccount*>( account() )->notifySocket(); - if( !notify ) - { - //We are not connected, we will doing it next connection. - //Force to reload the whole contactlist from server to suync groups when connecting - account()->configGroup()->writeEntry("serial", 0 ); - return; - } - - if(m_deleted) //the contact hasn't been synced from server yet. - return; - - unsigned int count=m_serverGroups.count(); - - //Don't add the contact if it's myself. - if(count==0 && contactId() == account()->accountId()) - return; - - //STEP ONE : add the contact to every kopetegroups where the MC is - TQPtrList<Kopete::Group> groupList = metaContact()->groups(); - for ( Kopete::Group *group = groupList.first(); group; group = groupList.next() ) - { - //For each group, ensure it is on the MSN server - if( !group->pluginData( protocol() , account()->accountId() + " id" ).isEmpty() ) - { - TQString Gid=group->pluginData( protocol(), account()->accountId() + " id" ); - if( !static_cast<MSNAccount*>( account() )->m_groupList.contains(Gid) ) - { // ohoh! something is corrupted on the contactlist.xml - // anyway, we never should add a contact to an unexisting group on the server. - // This shouln't be possible anymore 2004-06-10 -Olivier - - //repair the problem - group->setPluginData( protocol() , account()->accountId() + " id" , TQString()); - group->setPluginData( protocol() , account()->accountId() + " displayName" , TQString()); - kdWarning( 14140 ) << k_funcinfo << " Group " << group->displayName() << " marked with id #" <<Gid << " does not seems to be anymore on the server" << endl; - - if(!group->displayName().isEmpty() && group->type() == Kopete::Group::Normal) //not the top-level - { - //Create the group and add the contact - static_cast<MSNAccount*>( account() )->addGroup( group->displayName(),contactId() ); - count++; - m_moving=true; - } - } - else if( !m_serverGroups.contains(Gid) ) - { - //Add the contact to the group on the server - notify->addContact( contactId(), MSNProtocol::FL, TQString(), guid(), Gid ); - count++; - m_moving=true; - } - } - else - { - if(!group->displayName().isEmpty() && group->type() == Kopete::Group::Normal) //not the top-level - { - //Create the group and add the contact - static_cast<MSNAccount*>( account() )->addGroup( group->displayName(),contactId() ); - - //WARNING: if contact is not correctly added (because the group was not aded corrdctly for hinstance), - // if we increment the count, the contact can be deleted from the old group, and be lost :-( - count++; - m_moving=true; - } - } - } - - //STEP TWO : remove the contact from groups where the MC is not, but let it at least in one group - - //contact is not in that group. on the server. we will remove them dirrectly after the loop - TQValueList<TQString> removinglist; - - for( TQMap<TQString, Kopete::Group*>::Iterator it = m_serverGroups.begin();(count > 1 && it != m_serverGroups.end()); ++it ) - { - if( !static_cast<MSNAccount*>( account() )->m_groupList.contains(it.key()) ) - { // ohoh! something is corrupted on the contactlist.xml - // anyway, we never should add a contact to an unexisting group on the server. - - //repair the problem ... //contactRemovedFromGroup( it.key() ); - // ... later (we can't remove it from the map now ) - removinglist.append(it.key()); - count--; - - kdDebug( 14140 ) << k_funcinfo << "the group marked with id #" << it.key() << " does not seems to be anymore on the server" << endl; - - continue; - } - - Kopete::Group *group=it.data(); - if(!group) //we can't trust the data of it() see in MSNProtocol::deserializeContact why - group=static_cast<MSNAccount*>( account() )->m_groupList[it.key()]; - if( !metaContact()->groups().contains(group) ) - { - m_moving=true; - notify->removeContact( contactId(), MSNProtocol::FL, guid(), it.key() ); - count--; - } - } - - for(TQValueList<TQString>::Iterator it= removinglist.begin() ; it != removinglist.end() ; ++it ) - contactRemovedFromGroup(*it); - - //FINAL TEST: is the contact at least in a group.. - // this may happens if we just added a temporary contact to top-level - // we add the contact to the group #0 (the default one) - /*if(count==0) - { -// notify->addContact( contactId(), MSNProtocol::FL, TQString(), guid(), "0"); - }*/ -} - -void MSNContact::contactAddedToGroup( const TQString& groupId, Kopete::Group *group ) -{ - m_serverGroups.insert( groupId, group ); - m_moving=false; -} - -void MSNContact::contactRemovedFromGroup( const TQString& groupId ) -{ - m_serverGroups.remove( groupId ); - if(m_serverGroups.isEmpty() && !m_moving) - { - deleteLater(); - } - m_moving=false; -} - - -void MSNContact::rename( const TQString &newName ) -{ - //kdDebug( 14140 ) << k_funcinfo << "From: " << displayName() << ", to: " << newName << endl; - -/* if( newName == displayName() ) - return;*/ - - // FIXME: This should be called anymore. - MSNNotifySocket *notify = static_cast<MSNAccount*>( account() )->notifySocket(); - if( notify ) - { - notify->changePublicName( newName, contactId() ); - } -} - -void MSNContact::slotShowProfile() -{ - KRun::runURL( KURL( TQString::fromLatin1("http://members.msn.com/?pgmarket=it-it&mem=") + contactId()) , "text/html" ); -} - - -/** - * FIXME: Make this a standard KMM API call - */ -void MSNContact::sendFile( const KURL &sourceURL, const TQString &altFileName, uint /*fileSize*/ ) -{ - TQString filePath; - - //If the file location is null, then get it from a file open dialog - if( !sourceURL.isValid() ) - filePath = KFileDialog::getOpenFileName( TQString() ,"*", 0l , i18n( "Kopete File Transfer" )); - else - filePath = sourceURL.path(-1); - - //kdDebug(14140) << "MSNContact::sendFile: File chosen to send:" << fileName << endl; - - if ( !filePath.isEmpty() ) - { - TQ_UINT32 fileSize = TQFileInfo(filePath).size(); - //Send the file - static_cast<MSNChatSession*>( manager(Kopete::Contact::CanCreate) )->sendFile( filePath, altFileName, fileSize ); - - } -} - -void MSNContact::setOnlineStatus(const Kopete::OnlineStatus& status) -{ - if(isBlocked() && status.internalStatus() < 15) - { - Kopete::Contact::setOnlineStatus( - Kopete::OnlineStatus(status.status() , - (status.weight()==0) ? 0 : (status.weight() -1) , - protocol() , - status.internalStatus()+15 , - status.overlayIcons() + TQStringList("msn_blocked") , - i18n("%1|Blocked").arg( status.description() ) ) ); - } - else if(!isBlocked() && status.internalStatus() >= 15) - { //the user is not blocked, but the status is blocked - switch(status.internalStatus()-15) - { - case 1: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->NLN); - break; - case 2: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->BSY); - break; - case 3: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->BRB); - break; - case 4: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->AWY); - break; - case 5: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->PHN); - break; - case 6: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->LUN); - break; - case 7: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->FLN); - break; - case 8: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->HDN); - break; - case 9: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->IDL); - break; - default: - Kopete::Contact::setOnlineStatus(MSNProtocol::protocol()->UNK); - break; - } - } - else - Kopete::Contact::setOnlineStatus(status); - m_currentStatus=status; -} - -void MSNContact::slotSendMail() -{ - MSNNotifySocket *notify = static_cast<MSNAccount*>( account() )->notifySocket(); - if( notify ) - { - notify->sendMail( contactId() ); - } -} - -void MSNContact::setDisplayPicture(KTempFile *f) -{ - //copy the temp file somewere else. - // in a better world, the file could be dirrectly wrote at the correct location. - // but the custom emoticon code is to deeply merged in the display picture code while it could be separated. - TQString newlocation=locateLocal( "appdata", "msnpictures/"+ contactId().lower().replace(TQRegExp("[./~]"),"-") +".png" ) ; - - TDEIO::Job *j=TDEIO::file_move( KURL::fromPathOrURL( f->name() ) , KURL::fromPathOrURL( newlocation ) , -1, true /*overwrite*/ , false /*resume*/ , false /*showProgressInfo*/ ); - - f->setAutoDelete(false); - delete f; - - //let the time to TDEIO to copy the file - connect(j, TQT_SIGNAL(result(TDEIO::Job *)) , this, TQT_SLOT(slotEmitDisplayPictureChanged() )); -} - -void MSNContact::slotEmitDisplayPictureChanged() -{ - TQString newlocation=locateLocal( "appdata", "msnpictures/"+ contactId().lower().replace(TQRegExp("[./~]"),"-") +".png" ) ; - setProperty( Kopete::Global::Properties::self()->photo() , newlocation ); - emit displayPictureChanged(); -} - -void MSNContact::setObject(const TQString &obj) -{ - if(m_obj==obj && (obj.isEmpty() || hasProperty(Kopete::Global::Properties::self()->photo().key()))) - return; - - m_obj=obj; - - removeProperty( Kopete::Global::Properties::self()->photo() ) ; - emit displayPictureChanged(); - - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if ( config->readNumEntry( "DownloadPicture", 2 ) >= 2 && !obj.isEmpty() - && account()->myself()->onlineStatus().status() != Kopete::OnlineStatus::Invisible ) - manager(Kopete::Contact::CanCreate); //create the manager which will download the photo automatically. -} - -#include "msncontact.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msncontact.h b/kopete/protocols/msn/msncontact.h deleted file mode 100644 index 759be403..00000000 --- a/kopete/protocols/msn/msncontact.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - msncontact.h - MSN Contact - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002 by Ryan Cumming <[email protected]> - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNCONTACT_H -#define MSNCONTACT_H - -#include "kopetecontact.h" -#include "kopeteonlinestatus.h" - -#include <kurl.h> - -class TQListView; -class TQListViewItem; -class TQPixmap; -class TQTimer; - -class MSNChatSession; -class TDEAction; -class TDEActionCollection; -class KTempFile; - -namespace Kopete { class Protocol; } -namespace Kopete { class OnlineStatus; } - -class MSNContact : public Kopete::Contact -{ - Q_OBJECT - - -public: - MSNContact( Kopete::Account *account, const TQString &id, Kopete::MetaContact *parent ); - ~MSNContact(); - - /** - * Indicate whether this contact is blocked - */ - bool isBlocked() const; - void setBlocked( bool b ); - - /** - * Indicate whether this contact is deleted - * (not on the serverside list) - */ - bool isDeleted() const; - void setDeleted( bool d ); - - /** - * Indicate whether this contact is allowed - */ - bool isAllowed() const; - void setAllowed( bool d ); - - /** - * Indicate whether this contact is on the reversed list - */ - bool isReversed() const; - void setReversed( bool d ); - - /** - * set one phone number - */ - void setInfo(const TQString &type, const TQString &data); - - /** - * The groups in which the user is located on the server. - */ - const TQMap<TQString, Kopete::Group *> serverGroups() const; - /** - * clear that map - */ - void clearServerGroups(); - - /** - * client flags (say what version of msn messenger the contact is using) - */ - uint clientFlags() const; - void setClientFlags( uint ); - - virtual bool isReachable(); - - virtual TQPtrList<TDEAction> *customContextMenuActions(); - - /** - * update the server group map - */ - void contactRemovedFromGroup( const TQString& groupId ); - void contactAddedToGroup(const TQString& groupId, Kopete::Group *group ); - - virtual void serialize( TQMap<TQString, TQString> &serializedData, TQMap<TQString, TQString> &addressBookData ); - - /** - * Rename contact on server - */ - virtual void rename( const TQString &newName ) KDE_DEPRECATED; - - /** - * Returns the MSN Message Manager associated with this contact - */ - virtual Kopete::ChatSession *manager( Kopete::Contact::CanCreateFlags = Kopete::Contact::CannotCreate ); - - - /** - * Because blocked contact have a small auto-modified status - */ - void setOnlineStatus(const Kopete::OnlineStatus&); - - TQString guid(); - TQString phoneHome(); - TQString phoneWork(); - TQString phoneMobile(); - - void setObject(const TQString &obj); - TQString object() const { return m_obj; } - -public slots: - virtual void slotUserInfo(); - virtual void deleteContact(); - virtual void sendFile( const KURL &sourceURL = KURL(), - const TQString &fileName = TQString(), uint fileSize = 0L ); - - /** - * Every time the kopete's contactlist is modified, we sync the serverlist with it - */ - virtual void sync( unsigned int cvhanged= 0xff); - - - void setDisplayPicture(KTempFile *f) ; - -signals: - void displayPictureChanged(); - -private slots: - void slotBlockUser(); - void slotShowProfile(); - void slotSendMail(); - void slotEmitDisplayPictureChanged(); - - /** - * Workaround to make this checkboxe readonly - */ - void slotUserInfoDialogReversedToggled(); - -private: - TQMap<TQString, Kopete::Group *> m_serverGroups; - - bool m_blocked; - bool m_allowed; - bool m_deleted; - bool m_reversed; - bool m_moving; - bool m_phone_mob; - - uint m_clientFlags; - - TQString m_phoneHome; - TQString m_phoneWork; - TQString m_phoneMobile; - - - TDEAction *actionBlock; - TDEAction *actionShowProfile; - TDEAction *actionSendMail; - TDEAction *actionWebcamReceive; - TDEAction *actionWebcamSend; - - TQString m_obj; //the MSNObject - - /** - * keep the current status here. (it's normally already in Kopete::Contact::d->onlineStatus) - * This is a workaround to prevent problems with the account offline status. - */ - Kopete::OnlineStatus m_currentStatus; - - //MSNProtocol::deserializeContact need to acess some contact insternals - friend class MSNProtocol; -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msndebugrawcmddlg.cpp b/kopete/protocols/msn/msndebugrawcmddlg.cpp deleted file mode 100644 index b2a4ebbd..00000000 --- a/kopete/protocols/msn/msndebugrawcmddlg.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - msndebugrawcmddlg.cpp - Send a raw MSN command for debugging - - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Kopete (c) 2002 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msndebugrawcmddlg.h" - -#include "ui/msndebugrawcommand_base.h" - -#include <tqcheckbox.h> -#include <tqlineedit.h> -#include <ktextedit.h> - -#include <tdelocale.h> - -MSNDebugRawCmdDlg::MSNDebugRawCmdDlg( TQWidget *parent ) -: KDialogBase( parent, 0L, true, - i18n( "DEBUG: Send Raw Command - MSN Plugin" ), Ok | Cancel, - Ok, true ) -{ - setInitialSize( TQSize( 350, 200 ) ); - - m_main = new MSNDebugRawCommand_base( this ); - setMainWidget( m_main ); -} - -MSNDebugRawCmdDlg::~MSNDebugRawCmdDlg() -{ -} - -TQString MSNDebugRawCmdDlg::command() -{ - return m_main->m_command->text(); -} - -TQString MSNDebugRawCmdDlg::params() -{ - return m_main->m_params->text(); -} - -bool MSNDebugRawCmdDlg::addNewline() -{ - return m_main->m_addNewline->isChecked(); -} - -bool MSNDebugRawCmdDlg::addId() -{ - return m_main->m_addId->isChecked(); -} - -TQString MSNDebugRawCmdDlg::msg() -{ - return m_main->m_msg->text(); -} - -#include "msndebugrawcmddlg.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msndebugrawcmddlg.h b/kopete/protocols/msn/msndebugrawcmddlg.h deleted file mode 100644 index 443b8c05..00000000 --- a/kopete/protocols/msn/msndebugrawcmddlg.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - msndebugrawcmddlg.h - Send a raw MSN command for debugging - - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Kopete (c) 2002 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNDEBUGRAWCMDDLG_H -#define MSNDEBUGRAWCMDDLG_H - -#include <kdialogbase.h> - -class MSNDebugRawCommand_base; - -/** - * @author Martijn Klingens <[email protected]> - * - * Simple debugging help - */ -class MSNDebugRawCmdDlg : public KDialogBase -{ - Q_OBJECT - - -public: - MSNDebugRawCmdDlg( TQWidget *parent ); - ~MSNDebugRawCmdDlg(); - - TQString command(); - TQString params(); - bool addNewline(); - bool addId(); - TQString msg(); - -private: - MSNDebugRawCommand_base *m_main; -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnfiletransfersocket.cpp b/kopete/protocols/msn/msnfiletransfersocket.cpp deleted file mode 100644 index b7121c30..00000000 --- a/kopete/protocols/msn/msnfiletransfersocket.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/*************************************************************************** - msnfiletransfersocket.cpp - description - ------------------- - begin : mer jui 31 2002 - copyright : (C) 2002 by Olivier Goffart - email : ogoffart @ kde.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "msnfiletransfersocket.h" - -#include <stdlib.h> -#include <math.h> - -//qt -#include <tqtimer.h> - -// kde -#include <kdebug.h> -#include <kserversocket.h> -#include <kbufferedsocket.h> -#include <tdefiledialog.h> -#include <tdelocale.h> - -#include "kopetetransfermanager.h" -#include "kopetecontact.h" -#include "kopetemetacontact.h" -#include "msnchatsession.h" -#include "msnswitchboardsocket.h" -#include "msnnotifysocket.h" -#include "msnaccount.h" - -using namespace KNetwork; - -MSNFileTransferSocket::MSNFileTransferSocket(const TQString &handle, Kopete::Contact *c,bool incoming, TQObject* parent) - : MSNSocket(parent) , MSNInvitation(incoming, MSNFileTransferSocket::applicationID() , i18n("File Transfer - MSN Plugin")) -{ - m_handle=handle; - m_kopeteTransfer=0l; - m_file=0L; - m_server=0L; - m_contact=c; - ready=true; - - TQObject::connect( this, TQT_SIGNAL( socketClosed() ), this, TQT_SLOT( slotSocketClosed() ) ); - TQObject::connect( this, TQT_SIGNAL( blockRead( const TQByteArray & ) ), this, TQT_SLOT(slotReadBlock( const TQByteArray & ) ) ); -} - -MSNFileTransferSocket::~MSNFileTransferSocket() -{ - delete m_file; - delete m_server; - kdDebug(14140) << "MSNFileTransferSocket::~MSNFileTransferSocket" <<endl; -} - -void MSNFileTransferSocket::parseCommand(const TQString & cmd, uint id, const TQString & data) -{ - if( cmd == "VER" ) - { - if(data.section( ' ', 0, 0 ) != "MSNFTP") - { - kdDebug(14140) << "MSNFileTransferSocket::parseCommand (VER): bad version: disconnect" <<endl; - disconnect(); - } - else - { - if( m_incoming ) - sendCommand( "USR", m_handle + " " + m_authcook, false ); - else - sendCommand( "VER", "MSNFTP" , false ); - } - } - else if( cmd == "FIL" ) - { - m_size=id; //data.toUInt(); //BUG: the size is take as id bye MSNSocket because it is a number - - m_downsize=0; - m_file=new TQFile(m_fileName); - - if( m_file->open( IO_WriteOnly )) - sendCommand( "TFR" ,NULL,false); - else - { - kdDebug(14140) << "MSNFileTransferSocket::parseCommand: ERROR: unable to open file - disconnect " <<endl; - disconnect(); - } - } - else if( cmd == "BYE" ) - { - kdDebug(14140) << "MSNFileTransferSocket::parseCommand : end of transfer " <<endl; - disconnect(); - } - else if( cmd == "USR" ) - { - if(data.section( ' ', 1, 1 )!= m_authcook) - { - kdDebug(14140) << "MSNFileTransferSocket::parseCommand (USR): bad auth" <<endl; - disconnect(); - } - else - sendCommand("FIL" , TQString::number(size()) , false); - } - else if( cmd == "TFR" ) - { - m_downsize=0; - ready=true; - TQTimer::singleShot( 0, this, TQT_SLOT(slotSendFile()) ); - } - else if( cmd == "CCL" ) - { - disconnect(); - } - else - kdDebug(14140) << "MSNFileTransferSocket::parseCommand : unknown command " <<cmd <<endl; - -// kdDebug(14140) << "MSNFileTransferSocket::parseCommand : done " <<cmd <<endl; -} - -void MSNFileTransferSocket::doneConnect() -{ - if(m_incoming) - sendCommand( "VER", "MSNFTP", false ); - MSNSocket::doneConnect(); -} - -void MSNFileTransferSocket::bytesReceived(const TQByteArray & head) -{ - if(head[0]!='\0') - { - kdDebug(14140) << "MSNFileTransferSocket::bytesReceived: transfer aborted" <<endl; - TQTimer::singleShot(0,this,TQT_SLOT(disconnect())); - } - unsigned int sz=(int)((unsigned char)head.data()[2])*256+(int)((unsigned char)head.data()[1]); -// kdDebug(14140) << "MSNFileTransferSocket::bytesReceived: " << sz <<endl; - readBlock(sz); -} - -void MSNFileTransferSocket::slotSocketClosed() -{ - kdDebug(14140) << "MSNFileTransferSocket::slotSocketClose "<< endl; - if(m_file) - m_file->close(); - delete m_file; - m_file=0L; - delete m_server; - m_server=0L; - if(m_kopeteTransfer) - { - if( (m_downsize!=m_size || m_downsize==0 ) ) - m_kopeteTransfer->slotError( TDEIO::ERR_UNKNOWN , i18n( "An unknown error occurred" ) ); - else - m_kopeteTransfer->slotComplete(); - } - emit done(this); -} - -void MSNFileTransferSocket::slotReadBlock(const TQByteArray &block) -{ - m_file->writeBlock( block.data(), block.size() ); // write to file - - m_downsize+=block.size(); - if(m_kopeteTransfer) m_kopeteTransfer->slotProcessed(m_downsize); - kdDebug(14140) << "MSNFileTransferSocket - " << m_downsize << " of " << m_size <<" done"<<endl; - - if(m_downsize==m_size) - { - //the transfer seems to be finished. - sendCommand( "BYE" ,"16777989",false); - // if we are not already disconected in 30 seconds, do it. - TQTimer::singleShot( 30000 , this, TQT_SLOT(disconnect() ) ); - - } -} - -void MSNFileTransferSocket::setKopeteTransfer(Kopete::Transfer *kt) -{ - m_kopeteTransfer=kt; - if(kt) - { - TQObject::connect(kt , TQT_SIGNAL(transferCanceled()), this, TQT_SLOT(abort())); - TQObject::connect(kt, TQT_SIGNAL(destroyed()) , this , TQT_SLOT(slotKopeteTransferDestroyed())); - } -} - -void MSNFileTransferSocket::listen(int port) -{ - m_server = new TDEServerSocket(); - - TQObject::connect( m_server, TQT_SIGNAL(readyAccept()), this, TQT_SLOT(slotAcceptConnection())); - m_server->setAddress(TQString::number(port)); - - kdDebug(14140) << "MSNFileTransferSocket::listen: about to listen"<<endl; - bool listenResult = m_server->listen(1); - kdDebug(14140) << "MSNFileTransferSocket::listen: result: "<< listenResult <<endl; - TQTimer::singleShot( 60000, this, TQT_SLOT(slotTimer()) ); - kdDebug(14140) << "MSNFileTransferSocket::listen done" <<endl; -} - -void MSNFileTransferSocket::slotAcceptConnection() -{ - kdDebug(14140) << "MSNFileTransferSocket::slotAcceptConnection" <<endl; - if(!accept(m_server)) - { - if( m_kopeteTransfer) - m_kopeteTransfer->slotError( TDEIO::ERR_UNKNOWN , i18n( "An unknown error occurred" ) ); - emit done(this); - } -} - -void MSNFileTransferSocket::slotTimer() -{ - if(onlineStatus() != Disconnected) - return; - kdDebug(14140) << "MSNFileTransferSocket::slotTimer: timeout "<< endl; - if( m_kopeteTransfer) - { - m_kopeteTransfer->slotError( TDEIO::ERR_CONNECTION_BROKEN , i18n( "Connection timed out" ) ); - } - - MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager()); - if(manager && manager->service()) - manager->service()->sendCommand( "MSG" , "N", true, rejectMessage("TIMEOUT") ); - - emit done(this); -} - -void MSNFileTransferSocket::abort() -{ - if(m_incoming) - { - sendCommand( "CCL" , NULL ,false); - } - else - { - TQByteArray bytes(3); - bytes[0]='\1'; - bytes[1]='\0'; - bytes[2]='\0'; - sendBytes( bytes ); - m_downsize=m_size; //we don't want to send data anymore; - } - //the timer wait one second, the time to send the CCL or the binary header - //retarding the disconnection keep away from a crash. (in TDEIO::Job::emitResult when `delete this`) - TQTimer::singleShot( 1000, this, TQT_SLOT(disconnect()) ); - ready=false; -} - -void MSNFileTransferSocket::setFile( const TQString &fn, long unsigned int fileSize ) -{ - m_fileName=fn; - if(!m_incoming) - { - if(m_file) - { - kdDebug(14140) << "MSNFileTransferSocket::setFileName: WARNING m_file already exists" << endl; - delete m_file; - } - m_file = new TQFile( fn ); - if(!m_file->open(IO_ReadOnly)) - { - //FIXME: abort transfer here - kdDebug(14140) << "MSNFileTransferSocket::setFileName: WARNING unable to open the file" << endl; - } - - //If the fileSize is 0 it was not given, we are to get it from the file - if(fileSize == 0L) - m_size = m_file->size(); - else - m_size = fileSize; - } -} - - -void MSNFileTransferSocket::slotSendFile() -{ -// kdDebug(14140) <<"MSNFileTransferSocket::slotSendFile()" <<endl; - if( m_downsize >= m_size) - { - //the transfer seems to be finished. - // if we are not already disconected in 30 seconds, do it. - TQTimer::singleShot( 30000 , this, TQT_SLOT(disconnect() ) ); - return; - } - - if(ready) - { - char data[2046]; - int bytesRead = m_file->readBlock( data, 2045 ); - - TQByteArray block(bytesRead+3); -// char i1= (char)fmod( bytesRead, 256 ) ; -// char i2= (char)floor( bytesRead / 256 ) ; -// kdDebug(14140) << "MSNFileTransferSocket::slotSendFile: " << (int)i1 <<" + 256* "<< (int)i2 <<" = " << bytesRead <<endl; - block[0]='\0'; - block[1]= (char)fmod( bytesRead, 256 ); - block[2]= (char)floor( bytesRead / 256 ); - - for ( int f = 0; f < bytesRead; f++ ) - { - block[f+3] = data[f]; - } - - sendBytes(block); - - m_downsize+=bytesRead; - if(m_kopeteTransfer) - m_kopeteTransfer->slotProcessed(m_downsize); - kdDebug(14140) << "MSNFileTransferSocket::slotSendFile: " << m_downsize << " of " << m_size <<" done"<<endl; - } - ready=false; - - TQTimer::singleShot( 10, this, TQT_SLOT(slotSendFile()) ); -} - -void MSNFileTransferSocket::slotReadyWrite() -{ - ready=true; - MSNSocket::slotReadyWrite(); -} - -TQString MSNFileTransferSocket::invitationHead() -{ - TQTimer::singleShot( 10 * 60000, this, TQT_SLOT(slotTimer()) ); //the user has 10 mins to accept or refuse or initiate the transfer - - return TQString( MSNInvitation::invitationHead()+ - "Application-File: "+ m_fileName.right( m_fileName.length() - m_fileName.findRev( '/' ) - 1 ) +"\r\n" - "Application-FileSize: "+ TQString::number(size()) +"\r\n\r\n").utf8(); -} - -void MSNFileTransferSocket::parseInvitation(const TQString& msg) -{ - TQRegExp rx("Invitation-Command: ([A-Z]*)"); - rx.search(msg); - TQString command=rx.cap(1); - if( msg.contains("Invitation-Command: INVITE") ) - { - rx=TQRegExp("Application-File: ([^\\r\\n]*)"); - rx.search(msg); - TQString filename = rx.cap(1); - rx=TQRegExp("Application-FileSize: ([0-9]*)"); - rx.search(msg); - unsigned long int filesize= rx.cap(1).toUInt(); - - MSNInvitation::parseInvitation(msg); //for the cookie - - Kopete::TransferManager::transferManager()->askIncomingTransfer( m_contact , filename, filesize, TQString(), TQString::number( cookie() ) ); - - TQObject::connect( Kopete::TransferManager::transferManager(), TQT_SIGNAL( accepted( Kopete::Transfer *, const TQString& ) ),this, TQT_SLOT( slotFileTransferAccepted( Kopete::Transfer *, const TQString& ) ) ); - TQObject::connect( Kopete::TransferManager::transferManager(), TQT_SIGNAL( refused( const Kopete::FileTransferInfo & ) ), this, TQT_SLOT( slotFileTransferRefused( const Kopete::FileTransferInfo & ) ) ); - - } - else if( msg.contains("Invitation-Command: ACCEPT") ) - { - if(incoming()) - { - rx=TQRegExp("IP-Address: ([0-9\\.]*)"); - rx.search(msg); - TQString ip_address = rx.cap(1); - rx=TQRegExp("AuthCookie: ([0-9]*)"); - rx.search(msg); - TQString authcook = rx.cap(1); - rx=TQRegExp("Port: ([0-9]*)"); - rx.search(msg); - TQString port = rx.cap(1); - - setAuthCookie(authcook); - connect(ip_address, port.toUInt()); - } - else - { - unsigned long int auth = (rand()%(999999))+1; - setAuthCookie(TQString::number(auth)); - - setKopeteTransfer(Kopete::TransferManager::transferManager()->addTransfer(m_contact, fileName(), size(), m_contact->metaContact() ? m_contact->metaContact()->displayName() : m_contact->contactId() , Kopete::FileTransferInfo::Outgoing)); - - MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager()); - if(manager && manager->service()) - { - MSNNotifySocket *notify=static_cast<MSNAccount*>(manager->account())->notifySocket(); - if(notify){ - - TQCString message=TQString( - "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n" - "\r\n" - "Invitation-Command: ACCEPT\r\n" - "Invitation-Cookie: " + TQString::number(cookie()) + "\r\n" - "IP-Address: " + notify->localIP() + "\r\n" - "Port: 6891\r\n" - "AuthCookie: "+TQString::number(auth)+"\r\n" - "Launch-Application: FALSE\r\n" - "Request-Data: IP-Address:\r\n\r\n").utf8(); - - manager->service()->sendCommand( "MSG" , "N", true, message ); - } - } - - listen(6891); - } - } - else //CANCEL - { - MSNInvitation::parseInvitation(msg); - if( m_kopeteTransfer) - m_kopeteTransfer->slotError( TDEIO::ERR_ABORTED , i18n( "The remote user aborted" ) ); - emit done(this); - - } -} - -void MSNFileTransferSocket::slotFileTransferAccepted(Kopete::Transfer *trans, const TQString& fileName) -{ - if(trans->info().internalId().toULong() != cookie()) - return; - - if(!trans->info().contact()) - return; - - setKopeteTransfer(trans); - - MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager()); - - if(manager && manager->service()) - { - setFile(fileName); - - TQCString message=TQString( - "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n" - "\r\n" - "Invitation-Command: ACCEPT\r\n" - "Invitation-Cookie: " + TQString::number(cookie()) + "\r\n" - "Launch-Application: FALSE\r\n" - "Request-Data: IP-Address:\r\n" ).utf8(); - manager->service()->sendCommand( "MSG" , "N", true, message ); - - TQTimer::singleShot( 3 * 60000, this, TQT_SLOT(slotTimer()) ); //if after 3 minutes the transfer has not begin, delete this - } - else - { - if( m_kopeteTransfer) - m_kopeteTransfer->slotError( TDEIO::ERR_UNKNOWN , i18n( "An unknown error occurred" ) ); - emit done(this); - - } -} - -void MSNFileTransferSocket::slotFileTransferRefused(const Kopete::FileTransferInfo &info) -{ - if(info.internalId().toULong() != cookie()) - return; - - if(!info.contact()) - return; - - MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager()); - - if(manager && manager->service()) - { - manager->service()->sendCommand( "MSG" , "N", true, rejectMessage() ); - } - - emit done(this); -} - -void MSNFileTransferSocket::slotKopeteTransferDestroyed() -{ - m_kopeteTransfer=0L; -} - - -#include "msnfiletransfersocket.moc" - diff --git a/kopete/protocols/msn/msnfiletransfersocket.h b/kopete/protocols/msn/msnfiletransfersocket.h deleted file mode 100644 index 5803cd01..00000000 --- a/kopete/protocols/msn/msnfiletransfersocket.h +++ /dev/null @@ -1,120 +0,0 @@ -/*************************************************************************** - msnfiletransfersocket.h - description - ------------------- - begin : mer jui 31 2002 - copyright : (C) 2002 by Olivier Goffart - email : ogoffart @ kde.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MSNFILETRANSFERSOCKET_H -#define MSNFILETRANSFERSOCKET_H - -#include <tqwidget.h> - -#include "msnsocket.h" -#include "msninvitation.h" - -class TQFile; - -namespace KNetwork { - class TDEServerSocket; -} - -namespace Kopete { class Transfer; } -namespace Kopete { class FileTransferInfo; } -namespace Kopete { class Protocol; } -namespace Kopete { class Contact; } - -/** - * @author Olivier Goffart - */ -class MSNFileTransferSocket : public MSNSocket , public MSNInvitation -{ - Q_OBJECT - - -public: - MSNFileTransferSocket(const TQString &myID,Kopete::Contact* c, bool incoming, TQObject* parent = 0L ); - ~MSNFileTransferSocket(); - - static TQString applicationID() { return "5D3E02AB-6190-11d3-BBBB-00C04F795683"; } - TQString invitationHead(); - - - void setKopeteTransfer( Kopete::Transfer *kt ); - Kopete::Transfer* kopeteTransfer() { return m_kopeteTransfer; } - void setFile( const TQString &fn, long unsigned int fileSize = 0L ); - void setAuthCookie( const TQString &c ) { m_authcook = c; } - TQString fileName() { return m_fileName;} - long unsigned int size() { return m_size;} - void listen( int port ); - - virtual void parseInvitation(const TQString& invitation); - - virtual TQObject* object() { return this; } - -public slots: - void abort(); - -signals: - void done( MSNInvitation * ); - -protected: - /** - * This reimplementation sets up the negotiating with the server and - * suppresses the change of the status to online until the handshake - * is complete. - */ - virtual void doneConnect(); - - /** - * Handle an MSN command response line. - */ - virtual void parseCommand(const TQString & cmd, uint id, const TQString & data); - virtual void bytesReceived(const TQByteArray & data); - -protected slots: - virtual void slotReadyWrite(); - -private slots: - void slotSocketClosed(); - void slotReadBlock(const TQByteArray &); - void slotAcceptConnection(); - void slotTimer(); - void slotSendFile(); - - void slotFileTransferRefused( const Kopete::FileTransferInfo &info ); - void slotFileTransferAccepted( Kopete::Transfer *trans, const TQString& fileName ); - /* the Kopete::Transfer has been deleted */ - void slotKopeteTransferDestroyed(); - - -private: - TQString m_handle; - Kopete::Contact *m_contact; - - long unsigned int m_size; - long unsigned int m_downsize; - TQString m_authcook; - TQString m_fileName; - Kopete::Transfer* m_kopeteTransfer; - TQFile *m_file ; - KNetwork::TDEServerSocket *m_server; - - bool ready; - -}; - -#endif - -// vim: set noet ts=4 sts=4 tw=4: - diff --git a/kopete/protocols/msn/msninvitation.cpp b/kopete/protocols/msn/msninvitation.cpp deleted file mode 100644 index 8a64aa93..00000000 --- a/kopete/protocols/msn/msninvitation.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - msninvitation.cpp - - Copyright (c) 2003 by Olivier Goffart <ogoffart @ kde.org> - - Kopete (c) 2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ -#include "msninvitation.h" -#include <stdlib.h> -#include <tqregexp.h> - -MSNInvitation::MSNInvitation(bool incoming, const TQString &applicationID , const TQString &applicationName) -{ - m_incoming=incoming; - m_applicationId=applicationID; - m_applicationName=applicationName; - m_cookie= (rand()%(999999))+1; - m_state = Nothing; -} - - -MSNInvitation::~MSNInvitation() -{ -} - -TQCString MSNInvitation::unimplemented(long unsigned int cookie) -{ - return TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n" - "\r\n" - "Invitation-Command: CANCEL\r\n" - "Cancel-Code: REJECT_NOT_INSTALLED\r\n" - "Invitation-Cookie: " + TQString::number(cookie) + "\r\n" - "Session-ID: {120019D9-C3F5-4F94-978D-CB33534C3309}\r\n\r\n").utf8(); - //FIXME: i don't know at all what Seession-ID is -} - -TQString MSNInvitation::invitationHead() -{ - setState(Invited); - return TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n" - "\r\n" - "Application-Name: " + m_applicationName + "\r\n" - "Application-GUID: {" + m_applicationId + "}\r\n" - "Invitation-Command: INVITE\r\n" - "Invitation-Cookie: " +TQString::number(m_cookie) +"\r\n"); -} - -TQCString MSNInvitation::rejectMessage(const TQString & rejectcode) -{ - return TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n" - "\r\n" - "Invitation-Command: CANCEL\r\n" - "Invitation-Cookie: " + TQString::number(cookie()) + "\r\n" - "Cancel-Code: "+ rejectcode +"\r\n").utf8(); -} - -void MSNInvitation::parseInvitation(const TQString& msg) -{ - TQRegExp rx("Invitation-Command: ([A-Z]*)"); - rx.search(msg); - TQString command=rx.cap(1); - - if(command=="INVITE") - { - rx=TQRegExp("Invitation-Cookie: ([0-9]*)"); - rx.search(msg); - m_cookie=rx.cap(1).toUInt(); - } - else if(command=="CANCEL") - { - /*rx=TQRegExp("Cancel-Code: ([0-9]*)"); - rx.search(msg); - TQString code=rx.cap(1).toUInt(); - //TODO: parse the code*/ - } -// else if(command=="ACCEPT") -} - -MSNInvitation::State MSNInvitation::state() -{ - return m_state; -} - -void MSNInvitation::setState(MSNInvitation::State s) -{ - m_state=s; -} - diff --git a/kopete/protocols/msn/msninvitation.h b/kopete/protocols/msn/msninvitation.h deleted file mode 100644 index 88d617b4..00000000 --- a/kopete/protocols/msn/msninvitation.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - msninvitation.cpp - - Copyright (c) 2003 by Olivier Goffart <ogoffart @ kde.org> - - Kopete (c) 2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ -#ifndef MSNINVITATION_H -#define MSNINVITATION_H - -#include <tqstring.h> - -#include "kopete_export.h" - -class TQObject; - -/** - * @author Olivier Goffart - * - * The invitation is the base class which handle an MSN invitation. - * The implemented class must to herits from TQObject too. - * You can accept the invitation by catching @ref MSNProtocol::invitation() signals - * or create one and insert it to a kmm with @ref MSNChatSession::initInvitation() - * you can add action with @ref Kopete::Plugin::customChatActions() - */ -class KOPETE_EXPORT MSNInvitation -{ -public: - /** - * Constructor - * @param incoming say if it is an incoming invitation - * @param applicationID is the exadecimal id of the invitation - * @param applicationName is a i18n'ed string of the name of the application - */ - MSNInvitation(bool incoming,const TQString &applicationID , const TQString &applicationName); - virtual ~MSNInvitation(); - - /** - * @internal - * it is a reject invitation because the invitation is not implemented - */ - static TQCString unimplemented(long unsigned int cookie); - - /** - * you can set manualy the cookie. note that a cookie is automatically generated when a new - * invitation is created, or in @ref parseInvitation - */ - void setCookie( long unsigned int c ) { m_cookie = c; } - /** - * @return the cookie - */ - long unsigned int cookie() { return m_cookie; } - - /** - * @return true if it is an incommijng invitation - */ - bool incoming() { return m_incoming; } - - - /** - * reimplement this. this is the invitation string used in @ref MSNChatSession::initInvitation() - * the default implementation return the common begin. - * You can also set the state to Invited (the default implementation do that) - */ - virtual TQString invitationHead(); - - /** - * This is the reject invitation string - * @param rejectcode is the code, it can be "REJECT" or "TIMEOUT" - */ - TQCString rejectMessage(const TQString & rejectcode = "REJECT"); - - /** - * reimplement this method. it is called when an invitation message with the invitation's cookie is received - * the default implementation parse the cookie, or the reject message - */ - virtual void parseInvitation(const TQString& invitation); - - /** - * return the qobject (this) - */ - virtual TQObject* object()=0; -//signals: - /** - * reimplement this as a signal, and emit it when the invitation has to be destroyed. - * don't delete the invitation yourself - */ - virtual void done(MSNInvitation*)=0; - - /** - * This indiquate the state. it is going to be completed later - * - Nothing means than nothing has been done in the invitaiton (nothing has been sent/received) - * - Invited means than the invitaiton has been sent - */ - enum State { Nothing=0 , Invited=1 }; - /** - * retrun the current state - */ - State state(); - /** - * set the current State - */ - void setState(State); - - - -protected: - bool m_incoming; - long unsigned int m_cookie; - TQString m_applicationId; - TQString m_applicationName; - State m_state; - - -}; - -#endif diff --git a/kopete/protocols/msn/msnnotifysocket.cpp b/kopete/protocols/msn/msnnotifysocket.cpp deleted file mode 100644 index ec9b27c8..00000000 --- a/kopete/protocols/msn/msnnotifysocket.cpp +++ /dev/null @@ -1,1309 +0,0 @@ -/* - msnnotifysocket.cpp - Notify Socket for the MSN Protocol - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - Portions taken from - KMerlin (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnnotifysocket.h" -#include "msncontact.h" -#include "msnaccount.h" -#include "msnsecureloginhandler.h" -#include "msnchallengehandler.h" - -#include <tqdatetime.h> -#include <tqregexp.h> -#include <tqdom.h> - -#include <kdebug.h> -#include <tdeversion.h> -#include <tdelocale.h> -#include <kmdcodec.h> -#include <tdemessagebox.h> -#include <kstandarddirs.h> -#include <tdetempfile.h> -#include <krun.h> -#include <tdeio/job.h> -#include <tqfile.h> -#include <tdeconfig.h> -#include <knotification.h> - -#include "kopeteuiglobal.h" -#include "kopeteglobal.h" - -#include <ctime> - - -MSNNotifySocket::MSNNotifySocket( MSNAccount *account, const TQString& /*msnId*/, const TQString &password ) -: MSNSocket( account ) -{ - m_newstatus = MSNProtocol::protocol()->NLN; - m_secureLoginHandler=0L; - m_challengeHandler = 0L; - - m_isHotmailAccount=false; - m_ping=false; - m_disconnectReason=Kopete::Account::Unknown; - - m_account = account; - m_password=password; - TQObject::connect( this, TQT_SIGNAL( blockRead( const TQByteArray & ) ), - this, TQT_SLOT( slotReadMessage( const TQByteArray & ) ) ); - m_keepaliveTimer = 0L; - m_isLogged = false; -} - -MSNNotifySocket::~MSNNotifySocket() -{ - delete m_secureLoginHandler; - delete m_challengeHandler; - - kdDebug(14140) << k_funcinfo << endl; -} - -void MSNNotifySocket::doneConnect() -{ -// kdDebug( 14140 ) << k_funcinfo << "Negotiating server protocol version" << endl; - sendCommand( "VER", "MSNP11 MSNP10 CVR0" ); -} - - -void MSNNotifySocket::disconnect() -{ - m_isLogged = false; - if( m_disconnectReason==Kopete::Account::Unknown ) - m_disconnectReason=Kopete::Account::Manual; - if( onlineStatus() == Connected ) - sendCommand( "OUT", TQString(), false ); - - if( m_keepaliveTimer ) - m_keepaliveTimer->stop(); - - // the socket is not connected yet, so I should force the signals - if ( onlineStatus() == Disconnected || onlineStatus() == Connecting ) - emit socketClosed(); - else - MSNSocket::disconnect(); -} - -void MSNNotifySocket::handleError( uint code, uint id ) -{ - kdDebug(14140) << k_funcinfo << endl; - - TQString handle; - if(m_tmpHandles.contains(id)) - handle=m_tmpHandles[id]; - - TQString msg; - MSNSocket::ErrorType type; - // See http://www.hypothetic.org/docs/msn/basics.php for a - // description of all possible error codes. - // TODO: Add support for all of these! - switch( code ) - { - case 201: - case 205: - case 208: - { - msg = i18n( "<qt>The MSN user '%1' does not exist.<br>Please check the MSN ID.</qt>" ).arg( handle ); - type = MSNSocket::ErrorServerError; - break; - } - case 207: - case 218: - case 540: - { - msg = i18n( "<qt>An internal error occurred in the MSN plugin.<br>" - "MSN Error: %1<br>" - "please send us a detailed bug report " - "at [email protected] containing the raw debug output on the " - "console (in gzipped format, as it is probably a lot of output.)" ).arg(code); - type = MSNSocket::ErrorServerError; - break; - } - case 209: - { - if(handle==m_account->accountId()) - { - msg = i18n( "Unable to change your display name.\n" - "Please ensure your display is not too long and does not contains censored words." ); - type = MSNSocket::ErrorServerError; - } - /*else - { - TQString msg = i18n( "You are trying to change the display name of a user who has not " - "confirmed his or her email address;\n" - "the contact was not renamed on the server." ); - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Error, msg, i18n( "MSN Plugin" ) ); - }*/ - break; - } - case 210: - { - msg = i18n("Your contact list is full; you cannot add any new contacts."); - type = MSNSocket::ErrorServerError; - break; - } - case 215: - { - msg = i18n( "<qt>The user '%1' already exists in this group on the MSN server;<br>" - "if Kopete does not show the user, please send us a detailed bug report " - "at [email protected] containing the raw debug output on the " - "console (in gzipped format, as it is probably a lot of output.)</qt>" ).arg(handle); - type = MSNSocket::ErrorInformation; - break; - } - case 216: - { - //This might happen is you rename an user if he is not in the contactlist - //currently, we just iniore; - //TODO: try to don't rename user not in the list - //actualy, the bug is in MSNChatSession::slotUserJoined() - break; - } - case 219: - { - msg = i18n( "The user '%1' seems to already be blocked or allowed on the server." ).arg(handle); - type = MSNSocket::ErrorServerError; - break; - } - case 223: - { - msg = i18n( "You have reached the maximum number of groups:\n" - "MSN does not support more than 30 groups." ); - type = MSNSocket::ErrorServerError; - break; - } - case 224: - case 225: - case 230: - { - msg = i18n("Kopete is trying to perform an operation on a group or a contact that does not exists on the server.\n" - "This might happen if the Kopete contact list and the MSN-server contact list are not correctly synchronized; if this is the case, you probably should send a bug report."); - type = MSNSocket::ErrorServerError; - break; - } - - case 229: - { - msg = i18n("The group name is too long; it has not been changed on the MSN server."); - type = MSNSocket::ErrorServerError; - break; - } - case 710: - { - msg = i18n( "You cannot open a Hotmail inbox because you do not have an MSN account with a valid " - "Hotmail or MSN mailbox." ); - type = MSNSocket::ErrorServerError; - break; - } - case 715: - { - /* - //if(handlev==m_account->accountId()) - TQString msg = i18n( "Your email address has not been verified with the MSN server.\n" - "You should have received a mail with a link to confirm your email address.\n" - "Some functions will be restricted if you do not confirm your email address." ); - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, msg, i18n( "MSN Plugin" ) );//TODO don't show again - */ - break; - } - case 800: - { - //This happen when too much commends are sent to the server. - //the command will not be executed, too bad. - // ignore it for now, as we don't really know what command it was. - /* TQString msg = i18#n( "You are trying to change your status, or your display name too rapidly.\n" - "This might happen if you added yourself to your own contact list." ); - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, msg, i18n( "MSN Plugin" ) ); - //FIXME: try to fix this problem*/ - break; - } - case 911: - m_disconnectReason=Kopete::Account::BadPassword; - disconnect(); - break; - case 913: - { - msg = i18n( "You can not send messages when you are offline or when you are invisible." ); - type = MSNSocket::ErrorServerError; - break; - } - case 923: - { - msg = i18n( "You are trying to perform an action you are not allowed to perform in 'kid mode'." ); - type = MSNSocket::ErrorServerError; - break; - } - - default: - MSNSocket::handleError( code, id ); - break; - } - - if( !msg.isEmpty() ) - emit errorMessage( type, msg ); -} - -void MSNNotifySocket::parseCommand( const TQString &cmd, uint id, const TQString &data ) -{ - //kdDebug(14140) << "MSNNotifySocket::parseCommand: Command: " << cmd << endl; - - if ( cmd == "VER" ) - { - sendCommand( "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 7.0.0816 MSMSGS " + m_account->accountId() ); -/* - struct utsname utsBuf; - uname ( &utsBuf ); - - sendCommand( "CVR", i18n( "MS Local code, see http://www.microsoft.com/globaldev/reference/oslocversion.mspx", "0x0409" ) + - " " + escape( utsBuf.sysname ) + " " + escape( utsBuf.release ) + " " + escape( utsBuf.machine ) + " Kopete " + - escape( kapp->aboutData()->version() ) + " Kopete " + m_msnId ); -*/ - } - else if ( cmd == "CVR" ) //else if ( cmd == "INF" ) - { - sendCommand( "USR", "TWN I " + m_account->accountId() ); - } - else if( cmd == "USR" ) //// here follow the auth processus - { - if( data.section( ' ', 1, 1 ) == "S" ) - { - m_secureLoginHandler = new MSNSecureLoginHandler(m_account->accountId(), m_password, data.section( ' ' , 2 , 2 )); - - TQObject::connect(m_secureLoginHandler, TQT_SIGNAL(loginFailed()), this, TQT_SLOT(sslLoginFailed())); - TQObject::connect(m_secureLoginHandler, TQT_SIGNAL(loginBadPassword()), this, TQT_SLOT(sslLoginIncorrect())); - TQObject::connect(m_secureLoginHandler, TQT_SIGNAL(loginSuccesful(TQString )), this, TQT_SLOT(sslLoginSucceeded(TQString ))); - - m_secureLoginHandler->login(); - } - else - { - // Successful authentication. - m_disconnectReason=Kopete::Account::Unknown; - - // Synchronize with the server. - TQString lastSyncTime, lastChange; - - if(m_account->contacts().count() > 1) - { - // Retrieve the last synchronization timestamp, and last change timestamp. - lastSyncTime = m_account->configGroup()->readEntry("lastsynctime", "0"); - lastChange = m_account->configGroup()->readEntry("lastchange", "0"); - } - else - { - //the contactliust has maybe being removed, force to sync - //(the only contact is myself) - lastSyncTime="0"; - lastChange="0"; - } - - sendCommand( "SYN", lastChange + " " + lastSyncTime); - // Get client features. - if(!useHttpMethod()) { - sendCommand( "GCF", "Shields.xml"); - // We are connected start to ping - slotSendKeepAlive(); - } - } - } - else if( cmd == "LST" ) - { - // MSNP11 changed command. Now it's: - // LST [email protected] F=Display%20Name C=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 13 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - // But can be - // LST [email protected] 10 - TQString publicName, contactGuid, groups; - uint lists; - - TQRegExp regex("N=([^ ]+)(?: F=([^ ]+))?(?: C=([0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}))? (\\d+)\\s?((?:[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12},?)*)$"); - regex.search(data); - - // Capture passport email. - m_tmpLastHandle = regex.cap(1); - // Capture public name. - publicName = unescape( regex.cap(2) ); - // Capture contact guid. - contactGuid = regex.cap(3); - // Capture list enum type. - lists = regex.cap(4).toUInt(); - // Capture contact group(s) guid(s) - groups = regex.cap(5); - -// kdDebug(14140) << k_funcinfo << " msnId: " << m_tmpLastHandle << " publicName: " << publicName << " contactGuid: " << contactGuid << " list: " << lists << " groupGuid: " << groups << endl; - - // handle, publicName, Contact GUID, lists, Group GUID - emit contactList( m_tmpLastHandle , publicName, contactGuid, lists, groups ); - } - else if( cmd == "GCF" ) - { - m_configFile = data.section(' ', 0, 0); - readBlock( data.section( ' ', 1, 1 ).toUInt() ); - } - else if( cmd == "MSG" ) - { - readBlock( data.section( ' ', 2, 2 ).toUInt() ); - } - else if( cmd == "ILN" || cmd == "NLN" ) - { - // status handle publicName strangeNumber MSNOBJECT - MSNContact *c = static_cast<MSNContact*>( m_account->contacts()[ data.section( ' ', 1, 1 ) ] ); - if( c && c->contactId() != m_account->accountId() ) - { - TQString publicName=unescape( data.section( ' ', 2, 2 ) ); - if ( (publicName!=c->contactId() || c->hasProperty(Kopete::Global::Properties::self()->nickName().key()) ) && - publicName!=c->property( Kopete::Global::Properties::self()->nickName()).value().toString() ) - - changePublicName(publicName,c->contactId()); - TQString obj=unescape(data.section( ' ', 4, 4 )); - c->setObject( obj ); - c->setOnlineStatus( convertOnlineStatus( data.section( ' ', 0, 0 ) ) ); - c->setClientFlags(data.section( ' ', 3, 3 ).toUInt()); - } - } - else if( cmd == "UBX" ) - { - m_tmpLastHandle = data.section(' ', 0, 0); - uint length = data.section( ' ', 1, 1 ).toUInt(); - if(length > 0) { - readBlock( length ); - } - } - else if( cmd == "UUX" ) - { - // UUX is sended to acknowledge that the server has received and processed the personal Message. - // if the result is 0, set the myself() contact personalMessage. - if( data.section(' ', 0, 0) == TQString::fromUtf8("0") ) - m_account->myself()->setProperty(MSNProtocol::protocol()->propPersonalMessage, m_propertyPersonalMessage); - } - else if( cmd == "FLN" ) - { - MSNContact *c = static_cast<MSNContact*>( m_account->contacts()[ data.section( ' ', 0, 0 ) ] ); - if( c && c->contactId() != m_account->accountId() ) - { - c->setOnlineStatus( MSNProtocol::protocol()->FLN ); - c->removeProperty( MSNProtocol::protocol()->propClient ); - } - } - else if( cmd == "XFR" ) - { - TQString stype=data.section( ' ', 0, 0 ); - if( stype=="SB" ) //switchboard connection (chat) - { - // Address, AuthInfo - emit startChat( data.section( ' ', 1, 1 ), data.section( ' ', 3, 3 ) ); - } - else if( stype=="NS" ) //notifysocket ; Got our notification server - { //we are connecting and we receive the initial NS, or the msn server encounter a problem, and we are switching to another switchboard - TQString host = data.section( ' ', 1, 1 ); - TQString server = host.section( ':', 0, 0 ); - uint port = host.section( ':', 1, 1 ).toUInt(); - setOnlineStatus( Connected ); - emit receivedNotificationServer( server, port ); - disconnect(); - } - - } - else if( cmd == "RNG" ) - { - // SessionID, Address, AuthInfo, handle, publicName - emit invitedToChat( TQString::number( id ), data.section( ' ', 0, 0 ), data.section( ' ', 2, 2 ), - data.section( ' ', 3, 3 ), unescape( data.section( ' ', 4, 4 ) ) ); - } - else if( cmd == "ADC" ) - { - TQString msnId, list, publicName, contactGuid, groupGuid; - - // Retrieve the list parameter (FL/AL/BL/RL) - list = data.section( ' ', 0, 0 ); - - // Examples of received data - // ADC TrID xL [email protected] - // ADC TrID FL C=contactGuid groupdGuid - // ADC TrID RL [email protected] F=friednly%20name - // ADC TrID FL [email protected] F=My%20Name C=contactGuid - // Thanks Gregg for that complex RegExp. - TQRegExp regex("(?:N=([^ ]+))?(?: F=([^ ]+))?(?: C=([0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}))?\\s?((?:[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12},?)*)$"); - regex.search( data.section( ' ', 1 ) ); - - // Capture passport email. - msnId = regex.cap(1); - // Capture public name. - publicName = unescape( regex.cap(2) ); - // Capture contact guid. - contactGuid = regex.cap(3); - // Capture contact group(s) guid(s) - groupGuid = regex.cap(4); - -// kdDebug(14140) << k_funcinfo << list << " msnId: " << msnId << " publicName: " << publicName << " contactGuid: " << contactGuid << " groupGuid: " << groupGuid << endl; - - // handle, list, publicName, contactGuid, groupGuid - emit contactAdded( msnId, list, publicName, contactGuid, groupGuid ); - } - else if( cmd == "REM" ) // someone is removed from a list - { - TQString handle, list, contactGuid, groupGuid; - list = data.section( ' ', 0, 0 ); - if( list == "FL" ) - { - // Removing a contact - if( data.contains( ' ' ) < 2 ) - { - contactGuid = data.section( ' ', 1, 1 ); - } - // Removing a contact from a group - else if( data.contains( ' ' ) < 3 ) - { - contactGuid = data.section( ' ', 1, 1 ); - groupGuid = data.section( ' ', 2, 2 ); - } - } - else - { - handle = data.section( ' ', 1, 1); - } - - // handle, list, contactGuid, groupGuid - emit contactRemoved( handle, list, contactGuid, groupGuid ); - - } - else if( cmd == "OUT" ) - { - if( data.section( ' ', 0, 0 ) == "OTH" ) - { - m_disconnectReason=Kopete::Account::OtherClient; - } - disconnect(); - } - else if( cmd == "CHG" ) - { - TQString status = data.section( ' ', 0, 0 ); - setOnlineStatus( Connected ); - emit statusChanged( convertOnlineStatus( status ) ); - } - else if( cmd == "SBP" ) - { - TQString contactGuid, type, publicName; - contactGuid = data.section( ' ', 0, 0 ); - type = data.section( ' ', 1, 1 ); - if(type == "MFN" ) - { - publicName = unescape( data.section( ' ', 2, 2 ) ); - MSNContact *c = m_account->findContactByGuid( contactGuid ); - if(c != 0L) - { - c->setProperty( Kopete::Global::Properties::self()->nickName(), publicName ); - } - } - } - else if( cmd == "LSG" ) - { - // New Format: LSG Friends xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - // groupDisplayName, groupGuid - emit groupListed( unescape( data.section( ' ', 0, 0 ) ), data.section( ' ', 1, 1) ); - } - else if( cmd == "ADG" ) - { - // groupName, groupGuid - emit groupAdded( unescape( data.section( ' ', 0, 0 ) ), - data.section( ' ', 1, 1 ) ); - } - else if( cmd == "REG" ) - { - // groupGuid, groupName - emit groupRenamed( data.section( ' ', 0, 0 ), unescape( data.section( ' ', 1, 1 ) ) ); - } - else if( cmd == "RMG" ) - { - // groupGuid - emit groupRemoved( data.section( ' ', 1, 1 ) ); - } - else if( cmd == "CHL" ) - { - m_challengeHandler = new MSNChallengeHandler("CFHUR$52U_{VIX5T", "PROD0101{0RM?UBW"); - // Compute the challenge response hash, and send the response. - TQString chlResponse = m_challengeHandler->computeHash(data.section(' ', 0, 0)); - sendCommand("QRY", m_challengeHandler->productId(), true, chlResponse.utf8()); - // Dispose of the challenge handler. - m_challengeHandler->deleteLater(); - m_challengeHandler = 0L; - } - else if( cmd == "SYN" ) - { - // Retrieve the last synchronization timestamp known to the server. - TQString lastSyncTime = data.section( ' ', 1, 1 ); - TQString lastChange = data.section( ' ', 0, 0 ); - if( lastSyncTime != m_account->configGroup()->readEntry("lastsynctime") || - lastChange != m_account->configGroup()->readEntry("lastchange") ) - { - // If the server timestamp and the local timestamp are different, - // prepare to receive the contact list. - emit newContactList(); // remove all contacts datas, msn sends a new contact list - m_account->configGroup()->writeEntry( "lastsynctime" , lastSyncTime); - m_account->configGroup()->writeEntry( "lastchange", lastChange); - }else - kdDebug(14140) << k_funcinfo << "Contact list up-to-date." << endl; - - // set the status - setStatus( m_newstatus ); - } - else if( cmd == "BPR" ) - { - MSNContact *c = static_cast<MSNContact*>( m_account->contacts()[ m_tmpLastHandle ] ); - if( c ) - c->setInfo(data.section( ' ', 0, 0 ),unescape(data.section( ' ', 1, 1 ))); - } - else if( cmd == "PRP" ) - { - MSNContact *c = static_cast<MSNContact*>( m_account->myself() ); - if( c ) - { - TQString type = data.section( ' ', 0, 0 ); - TQString prpData = unescape( data.section( ' ', 1, 1 ) ); //SECURITY???????? - c->setInfo( type, prpData ); - m_account->configGroup()->writeEntry( type, prpData ); - } - } - else if( cmd == "BLP" ) - { - if( id > 0 ) //FROM BLP - { - m_account->configGroup()->writeEntry( "serial" , data.section( ' ', 0, 0 ) ); - m_account->configGroup()->writeEntry( "BLP" , data.section( ' ', 1, 1 ) ); - } - else //FROM SYN - m_account->configGroup()->writeEntry( "BLP" , data.section( ' ', 0, 0 ) ); - } - else if( cmd == "QRY" ) - { - // Do nothing - } - else if( cmd == "QNG" ) - { - //this is a reply from a ping - m_ping=false; - - // id is the timeout in fact, and we remove 5% of it - if( m_keepaliveTimer ) - m_keepaliveTimer->start( id * 950, true ); - kdDebug( 14140 ) << k_funcinfo << "timerTimeout=" << id << "sec"<< endl; - } - else if( cmd == "URL" ) - { - // URL 6 /cgi-bin/HoTMaiL https://loginnet.passport.com/ppsecure/md5auth.srf?lc=1033 2 - //example of reply: URL 10 /cgi-bin/HoTMaiL https://msnialogin.passport.com/ppsecure/md5auth.srf?lc=1036 3 - TQString from_action_url = data.section( ' ', 1, 1 ); - TQString rru = data.section( ' ', 0, 0 ); - TQString id = data.section( ' ', 2, 2 ); - - //write the tmp file - TQString UserID=m_account->accountId(); - - time_t actualTime; - time(&actualTime); - TQString sl = TQString::number( ( unsigned long ) actualTime - m_loginTime.toULong() ); - - TQString md5this( m_MSPAuth + sl + m_password ); - KMD5 md5( md5this.utf8() ); - - TQString hotmailRequest = "<html>\n" - "<head>\n" - "<noscript>\n" - "<meta http-equiv=Refresh content=\"0; url=http://www.hotmail.com\">\n" - "</noscript>\n" - "</head>\n" - "<body onload=\"document.pform.submit(); \">\n" - "<form name=\"pform\" action=\"" + from_action_url + "\" method=\"POST\">\n" - "<input type=\"hidden\" name=\"mode\" value=\"ttl\">\n" - "<input type=\"hidden\" name=\"login\" value=\"" + UserID.left( UserID.find('@') ) + "\">\n" - "<input type=\"hidden\" name=\"username\" value=\"" + UserID + "\">\n" - "<input type=\"hidden\" name=\"sid\" value=\"" + m_sid + "\">\n" - "<input type=\"hidden\" name=\"kv\" value=\"" + m_kv + "\">\n" - "<input type=\"hidden\" name=\"id\" value=\""+ id +"\">\n" - "<input type=\"hidden\" name=\"sl\" value=\"" + sl +"\">\n" - "<input type=\"hidden\" name=\"rru\" value=\"" + rru + "\">\n" - "<input type=\"hidden\" name=\"auth\" value=\"" + m_MSPAuth + "\">\n" - "<input type=\"hidden\" name=\"creds\" value=\"" + TQString::fromLatin1( md5.hexDigest() ) + "\">\n" - "<input type=\"hidden\" name=\"svc\" value=\"mail\">\n" - "<input type=\"hidden\" name=\"js\" value=\"yes\">\n" - "</form></body>\n</html>\n"; - - KTempFile tmpMailFile( locateLocal( "tmp", "kopetehotmail-" ), ".html" ); - *tmpMailFile.textStream() << hotmailRequest; - tmpMailFile.file()->flush(); - - KRun::runURL( KURL::fromPathOrURL( tmpMailFile.name() ), "text/html" , true ); - - } - else if ( cmd == "NOT" ) - { - kdDebug( 14140 ) << k_funcinfo << "Received NOT command, issueing read block for '" << id << " more bytes" << endl; - readBlock( id ); - } - else - { - // Let the base class handle the rest - //MSNSocket::parseCommand( cmd, id, data ); - kdDebug( 14140 ) << k_funcinfo << "Unimplemented command '" << cmd << " " << id << " " << data << "' from server!" << endl; - } -} - - -void MSNNotifySocket::sslLoginFailed() -{ - m_disconnectReason=Kopete::Account::InvalidHost; - disconnect(); -} - -void MSNNotifySocket::sslLoginIncorrect() -{ - m_disconnectReason=Kopete::Account::BadPassword; - disconnect(); -} - -void MSNNotifySocket::sslLoginSucceeded(TQString ticket) -{ - sendCommand("USR" , "TWN S " + ticket); - - m_secureLoginHandler->deleteLater(); - m_secureLoginHandler = 0L; -} - -void MSNNotifySocket::slotMSNAlertUnwanted() -{ - // user not interested .. clean up the list of actions - m_msnAlertURLs.clear(); -} - -void MSNNotifySocket::slotMSNAlertLink(unsigned int action) -{ - // index into our action list and pull out the URL that was clicked .. - KURL tempURLForLaunch(m_msnAlertURLs[action-1]); - - KRun* urlToRun = new KRun(tempURLForLaunch); -} - -void MSNNotifySocket::slotOpenInbox() -{ - sendCommand("URL", "INBOX" ); -} - -void MSNNotifySocket::sendMail(const TQString &email) -{ - sendCommand("URL", TQString("COMPOSE " + email).utf8() ); -} - -bool MSNNotifySocket::setUseHttpMethod(bool useHttp) -{ - bool ret = MSNSocket::setUseHttpMethod( useHttp ); - - if( useHttpMethod() ) { - if( m_keepaliveTimer ) { - delete m_keepaliveTimer; - m_keepaliveTimer = 0L; - } - } - else { - if( !m_keepaliveTimer ) { - m_keepaliveTimer = new TQTimer( this, "m_keepaliveTimer" ); - TQObject::connect( m_keepaliveTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotSendKeepAlive() ) ); - } - } - - return ret; -} - -void MSNNotifySocket::slotReadMessage( const TQByteArray &bytes ) -{ - TQString msg = TQString::fromUtf8(bytes, bytes.size()); - - if(msg.contains("text/x-msmsgsinitialmdatanotification")) - { - //Mail-Data: <MD><E><I>301</I><IU>1</IU><O>4</O><OU>2</OU></E><Q><TQTM>409600</TQTM><TQNM>204800</TQNM></Q></MD> - // MD - Mail Data - // E - email - // I - initial mail - // IU - initial unread - // O - other mail - // OU - other unread. - TQRegExp regex("<MD><E><I>(\\d+)?</I>(?:<IU>(\\d+)?</IU>)<O>(\\d+)?</O><OU>(\\d+)?</OU></E><Q>.*</Q></MD>"); - regex.search(msg); - - bool unread; - // Retrieve the number of unread email messages. - mailCount = regex.cap(2).toUInt(&unread); - if(unread && mailCount > 0) - { - // If there are new email message available, raise the unread email event. - TQObject::connect(KNotification::event( "msn_mail", i18n( "You have one unread message in your MSN inbox.", - "You have %n unread messages in your MSN inbox.", mailCount ), 0 , 0 , i18n( "Open Inbox..." ) ), - TQT_SIGNAL(activated(unsigned int ) ) , this, TQT_SLOT( slotOpenInbox() ) ); - } - } - else if(msg.contains("text/x-msmsgsactivemailnotification")) - { - //this sends the server if mails are deleted - TQString m = msg.right(msg.length() - msg.find("Message-Delta:") ); - m = m.left(msg.find("\r\n")); - mailCount = mailCount - m.right(m.length() -m.find(" ")-1).toUInt(); - } - else if(msg.contains("text/x-msmsgsemailnotification")) - { - //this sends the server if a new mail has arrived - TQRegExp rx("From-Addr: ([A-Za-z0-9@._\\-]*)"); - rx.search(msg); - TQString m=rx.cap(1); - - mailCount++; - - //TODO: it is also possible to get the subject (but warning about the encoding) - TQObject::connect(KNotification::event( "msn_mail",i18n( "You have one new email from %1 in your MSN inbox." ).arg(m), - 0 , 0 , i18n( "Open Inbox..." ) ), - TQT_SIGNAL(activated(unsigned int ) ) , this, TQT_SLOT( slotOpenInbox() ) ); - } - else if(msg.contains("text/x-msmsgsprofile")) - { - //Hotmail profile - if(msg.contains("MSPAuth:")) - { - TQRegExp rx("MSPAuth: ([A-Za-z0-9$!*]*)"); - rx.search(msg); - m_MSPAuth=rx.cap(1); - } - if(msg.contains("sid:")) - { - TQRegExp rx("sid: ([0-9]*)"); - rx.search(msg); - m_sid=rx.cap(1); - } - if(msg.contains("kv:")) - { - TQRegExp rx("kv: ([0-9]*)"); - rx.search(msg); - m_kv=rx.cap(1); - } - if(msg.contains("LoginTime:")) - { - TQRegExp rx("LoginTime: ([0-9]*)"); - rx.search(msg); - m_loginTime=rx.cap(1); - } - else //IN MSNP9 there are no logintime it seems, so set it manualy - { - time_t actualTime; - time(&actualTime); - m_loginTime=TQString::number((unsigned long)actualTime); - } - if(msg.contains("EmailEnabled:")) - { - TQRegExp rx("EmailEnabled: ([0-9]*)"); - rx.search(msg); - m_isHotmailAccount = (rx.cap(1).toUInt() == 1); - emit hotmailSeted(m_isHotmailAccount); - } - if(msg.contains("ClientIP:")) - { - TQRegExp rx("ClientIP: ([0-9.]*)"); - rx.search(msg); - m_localIP = rx.cap(1); - } - - // We are logged when we receive the initial profile from Hotmail. - m_isLogged = true; - } - else if (msg.contains("NOTIFICATION")) - { - // MSN alert (i.e. NOTIFICATION) [for docs see http://www.hypothetic.org/docs/msn/client/notification.php] - // format of msg is as follows: - // - // <NOTIFICATION ver="2" id="1342902633" siteid="199999999" siteurl="http://alerts.msn.com"> - // <TO pid="0x0006BFFD:0x8582C0FB" name="[email protected]"/> - // <MSG pri="1" id="1342902633"> - // <SUBSCR url="http://g.msn.com/3ALMSNTRACKING/199999999ToastChange?http://alerts.msn.com/Alerts/MyAlerts.aspx?strela=1"/> - // <ACTION url="http://g.msn.com/3ALMSNTRACKING/199999999ToastAction?http://alerts.msn.com/Alerts/MyAlerts.aspx?strela=1"/> - // <BODY lang="3076" icon=""> - // <TEXT>utf8-encoded text</TEXT> - // </BODY> - // </MSG> - // </NOTIFICATION> - - // MSN sends out badly formed XML .. fix it for them (thanks MS!) - TQString notificationDOMAsString(msg); - - TQRegExp rx( "&(?!amp;)" ); // match ampersands but not & - notificationDOMAsString.replace(rx, "&"); - TQDomDocument alertDOM; - alertDOM.setContent(notificationDOMAsString); - - TQDomNodeList msgElements = alertDOM.elementsByTagName("MSG"); - for (uint i = 0 ; i < msgElements.count() ; i++) - { - TQString subscString; - TQString actionString; - TQString textString; - - TQDomNode msgDOM = msgElements.item(i); - - TQDomNodeList msgChildren = msgDOM.childNodes(); - for (uint i = 0 ; i < msgChildren.length() ; i++) { - TQDomNode child = msgChildren.item(i); - TQDomElement element = child.toElement(); - if (element.tagName() == "SUBSCR") - { - TQDomAttr subscElementURLAttribute; - if (element.hasAttribute("url")) - { - subscElementURLAttribute = element.attributeNode("url"); - subscString = subscElementURLAttribute.value(); - } - } - else if (element.tagName() == "ACTION") - { - // process ACTION node to pull out URL the alert is tied to - TQDomAttr actionElementURLAttribute; - if (element.hasAttribute("url")) - { - actionElementURLAttribute = element.attributeNode("url"); - actionString = actionElementURLAttribute.value(); - } - } - else if (element.tagName() == "BODY") - { - // process BODY node to get the text of the alert - TQDomNodeList textElements = element.elementsByTagName("TEXT"); - if (textElements.count() >= 1) - { - TQDomElement textElement = textElements.item(0).toElement(); - textString = textElement.text(); - } - } - - - } - -// kdDebug( 14140 ) << "subscString " << subscString << " actionString " << actionString << " textString " << textString << endl; - // build an internal list of actions ... we'll need to index into this list when we receive an event - TQStringList actions; - actions.append(i18n("More Information")); - m_msnAlertURLs.append(actionString); - - actions.append(i18n("Manage Subscription")); - m_msnAlertURLs.append(subscString); - - // Don't do any MSN alerts notification for new blog updates - if( subscString != TQString::fromLatin1("s.htm") && actionString != TQString::fromLatin1("a.htm") ) - { - KNotification* notification = KNotification::event("msn_alert", textString, 0L, 0L, actions); - TQObject::connect(notification, TQT_SIGNAL(activated(unsigned int)), this, TQT_SLOT(slotMSNAlertLink(unsigned int))); - TQObject::connect(notification, TQT_SIGNAL(closed()), this, TQT_SLOT(slotMSNAlertUnwanted())); - } - } // end for each MSG tag - } - - if(!m_configFile.isNull()) - { - // TODO Get client features. - } - - if(!m_tmpLastHandle.isNull()) - { - TQString personalMessage, currentMedia; - TQDomDocument psm; - if( psm.setContent(msg) ) - { - // Get the first child of the xml "document"; - TQDomElement psmElement = psm.documentElement().firstChild().toElement(); - - while( !psmElement.isNull() ) - { - if(psmElement.tagName() == TQString::fromUtf8("PSM")) - { - personalMessage = psmElement.text(); - kdDebug(14140) << k_funcinfo << "Personnal Message received: " << personalMessage << endl; - } - else if(psmElement.tagName() == TQString::fromUtf8("CurrentMedia")) - { - if( !psmElement.text().isEmpty() ) - { - kdDebug(14140) << k_funcinfo << "XML CurrentMedia: " << psmElement.text() << endl; - currentMedia = processCurrentMedia( psmElement.text() ); - } - } - psmElement = psmElement.nextSibling().toElement(); - } - - MSNContact *contact = static_cast<MSNContact*>(m_account->contacts()[ m_tmpLastHandle ]); - if(contact) - { - contact->setProperty(MSNProtocol::protocol()->propPersonalMessage, currentMedia.isEmpty() ? personalMessage : currentMedia); - } - } - m_tmpLastHandle = TQString(); - } -} - -TQString MSNNotifySocket::processCurrentMedia( const TQString &mediaXmlElement ) -{ - /* - The value of the CurrentMedia tag you can think of like an array - seperated by "\0" characters (literal backslash followed by zero, not NULL). - - The elements of this "array" are as follows: - - * Application - This is the app you are using. Usually empty - * Type - This is the type of PSM, either “Music”, “Games” or “Office” - * Enabled - This is a boolean value (0/1) to enable/disable - * Format - A formatter string ala .Net; For example, “{0} - {1}” - * First line - The first line (Matches {0} in the Format) - * Second line - The second line (Matches {1} in the Format) - * Third line - The third line (Matches {2} in the Format) - - There is probably no limit to the number of lines unless you go over the maximum length of the tag. - - Example of currentMedia xml tag: - <CurrentMedia>\0Music\01\0{0} - {1}\0 Song Title\0Song Artist\0Song Album\0\0</CurrentMedia> - <CurrentMedia>\0Games\01\0Playing {0}\0Game Name\0</CurrentMedia> - <CurrentMedia>\0Office\01\0Office Message\0Office App Name\0</CurrentMedia> - - From http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes - */ - TQString application, type, format, currentMedia; - bool enabled=false, test; - // \0 is textual, it's the "array" separator. - TQStringList argumentLists = TQStringList::split(TQString::fromUtf8("\\0"), mediaXmlElement, true); - - // Retrive the "stable" array elements. - application = argumentLists[0]; - type = argumentLists[1]; - enabled = argumentLists[2].toInt(&test); - format = argumentLists[3]; - - // Get the formatter strings - TQStringList formatterStrings; - TQStringList::ConstIterator it; - for( it = argumentLists.at(4); it != argumentLists.end(); ++it ) - { - formatterStrings.append( *it ); - } - - // Replace the formatter in the format string. - currentMedia = format; - for(uint i=0; i<formatterStrings.size(); i++) - { - currentMedia = currentMedia.replace(TQString("{%1}").arg(i), formatterStrings[i]); - } - - if( type == TQString::fromUtf8("Music") ) - { - // the "♫" is encoded in utf8 (and should be in utf8) - currentMedia = i18n("Now Listening: ♫ %1 ♫").arg(currentMedia); - } - - kdDebug(1414) << "Current Media received: " << currentMedia << endl; - - return currentMedia; -} - -void MSNNotifySocket::addGroup(const TQString& groupName) -{ - // escape spaces - sendCommand( "ADG", escape( groupName ) ); -} - -void MSNNotifySocket::renameGroup( const TQString& groupName, const TQString& groupGuid ) -{ - // escape spaces - sendCommand( "REG", groupGuid + " " + escape( groupName ) ); -} - -void MSNNotifySocket::removeGroup( const TQString& groupGuid ) -{ - sendCommand( "RMG", groupGuid ); -} - -void MSNNotifySocket::addContact( const TQString &handle, int list, const TQString& publicName, const TQString& contactGuid, const TQString& groupGuid ) -{ - TQString args; - switch( list ) - { - case MSNProtocol::FL: - { - // Adding the contact to a group - if( !contactGuid.isEmpty() ) - { - args = TQString("FL C=%1 %2").arg( contactGuid ).arg( groupGuid ); - kdDebug(14140) << k_funcinfo << "In adding contact to a group" << endl; - } - // Adding a new contact - else - { - args = TQString("FL N=%1 F=%2").arg( handle ).arg( escape( publicName ) ); - kdDebug(14140) << k_funcinfo << "In adding contact to a new contact" << endl; - } - break; - } - case MSNProtocol::AL: - args = TQString("AL N=%1").arg( handle ); - break; - case MSNProtocol::BL: - args = TQString("BL N=%1").arg( handle ); - break; - case MSNProtocol::RL: - args = TQString("RL N=%1").arg( handle ); - break; - default: - kdDebug(14140) << k_funcinfo <<"WARNING! Unknown list " << list << "!" << endl; - return; - } - unsigned int id=sendCommand( "ADC", args ); - m_tmpHandles[id]=handle; -} - -void MSNNotifySocket::removeContact( const TQString &handle, int list, const TQString& contactGuid, const TQString& groupGuid ) -{ - TQString args; - switch( list ) - { - case MSNProtocol::FL: - args = "FL " + contactGuid; - // Removing a contact from a group - if( !groupGuid.isEmpty() ) - args += " " + groupGuid; - break; - case MSNProtocol::AL: - args = "AL " + handle; - break; - case MSNProtocol::BL: - args = "BL " + handle; - break; - case MSNProtocol::PL: - args = "PL " + handle; - break; - default: - kdDebug(14140) <<k_funcinfo << "WARNING! Unknown list " << list << "!" << endl; - return; - } - unsigned int id=sendCommand( "REM", args ); - m_tmpHandles[id]=handle; -} - -void MSNNotifySocket::setStatus( const Kopete::OnlineStatus &status ) -{ -// kdDebug( 14140 ) << k_funcinfo << statusToString( status ) << endl; - - if( onlineStatus() == Disconnected ) - m_newstatus = status; - else - sendCommand( "CHG", statusToString( status ) + " " + m_account->myselfClientId() + " " + escape(m_account->pictureObject()) ); -} - -void MSNNotifySocket::changePublicName( const TQString &publicName, const TQString &handle ) -{ - TQString tempPublicName = publicName; - - //The maximum length is 387. but with utf8 or encodage, each character may be triple - // 387/3 = 129 so we make sure the length is not longer than 129 char, even if - // it's possible to have longer nicks. - if( escape(publicName).length() > 129 ) - { - tempPublicName = publicName.left(129); - } - - if( handle.isNull() ) - { - unsigned int id = sendCommand( "PRP", "MFN " + escape( tempPublicName ) ); - m_tmpHandles[id] = m_account->accountId(); - } - else - { - MSNContact *currentContact = static_cast<MSNContact *>(m_account->contacts()[handle]); - if(currentContact && !currentContact->guid().isEmpty() ) - { - // FIXME if there is not guid server disconnects. - unsigned int id = sendCommand( "SBP", currentContact->guid() + " MFN " + escape( tempPublicName ) ); - m_tmpHandles[id] = handle; - } - } -} - -void MSNNotifySocket::changePersonalMessage( MSNProtocol::PersonalMessageType type, const TQString &personalMessage ) -{ - TQString tempPersonalMessage; - TQString xmlCurrentMedia; - - // Only espace and cut the personalMessage is the type is normal. - if(type == MSNProtocol::PersonalMessageNormal) - { - tempPersonalMessage = personalMessage; - //Magic number : 129 characters - if( escape(personalMessage).length() > 129 ) - { - // We cut. for now. - tempPersonalMessage = personalMessage.left(129); - } - } - - TQDomDocument xmlMessage; - xmlMessage.appendChild( xmlMessage.createElement( "Data" ) ); - - TQDomElement psm = xmlMessage.createElement("PSM"); - psm.appendChild( xmlMessage.createTextNode( tempPersonalMessage ) ); - xmlMessage.documentElement().appendChild( psm ); - - TQDomElement currentMedia = xmlMessage.createElement("CurrentMedia"); - - /* Example of currentMedia xml tag: - <CurrentMedia>\0Music\01\0{0} - {1}\0 Song Title\0Song Artist\0Song Album\0\0</CurrentMedia> - <CurrentMedia>\0Games\01\0Playing {0}\0Game Name\0</CurrentMedia> - <CurrentMedia>\0Office\01\0Office Message\0Office App Name\0</CurrentMedia> - */ - switch(type) - { - case MSNProtocol::PersonalMessageMusic: - { - xmlCurrentMedia = "\\0Music\\01\\0"; - TQStringList mediaList = TQStringList::split(";", personalMessage); - TQString formatterArguments; - if( !mediaList[0].isEmpty() ) // Current Track - { - xmlCurrentMedia += "{0}"; - formatterArguments += TQString("%1\\0").arg(mediaList[0]); - } - if( !mediaList[1].isEmpty() ) // Current Artist - { - xmlCurrentMedia += " - {1}"; - formatterArguments += TQString("%1\\0").arg(mediaList[1]); - } - if( !mediaList[2].isEmpty() ) // Current Album - { - xmlCurrentMedia += " ({2})"; - formatterArguments += TQString("%1\\0").arg(mediaList[2]); - } - xmlCurrentMedia += "\\0" + formatterArguments + "\\0"; - break; - } - default: - break; - } - - currentMedia.appendChild( xmlMessage.createTextNode( xmlCurrentMedia ) ); - - // Set the status message for myself, check if currentMedia is empty, for either using the normal or Music personal - m_propertyPersonalMessage = xmlCurrentMedia.isEmpty() ? tempPersonalMessage : processCurrentMedia( currentMedia.text() ); - - xmlMessage.documentElement().appendChild( currentMedia ); - - unsigned int id = sendCommand("UUX","",true, xmlMessage.toString().utf8(), false); - m_tmpHandles[id] = m_account->accountId(); - -} - -void MSNNotifySocket::changePhoneNumber( const TQString &key, const TQString &data ) -{ - sendCommand( "PRP", key + " " + escape ( data ) ); -} - - -void MSNNotifySocket::createChatSession() -{ - sendCommand( "XFR", "SB" ); -} - -TQString MSNNotifySocket::statusToString( const Kopete::OnlineStatus &status ) const -{ - if( status == MSNProtocol::protocol()->NLN ) - return "NLN"; - else if( status == MSNProtocol::protocol()->BSY ) - return "BSY"; - else if( status == MSNProtocol::protocol()->BRB ) - return "BRB"; - else if( status == MSNProtocol::protocol()->AWY ) - return "AWY"; - else if( status == MSNProtocol::protocol()->PHN ) - return "PHN"; - else if( status == MSNProtocol::protocol()->LUN ) - return "LUN"; - else if( status == MSNProtocol::protocol()->FLN ) - return "FLN"; - else if( status == MSNProtocol::protocol()->HDN ) - return "HDN"; - else if( status == MSNProtocol::protocol()->IDL ) - return "IDL"; - else - { - kdWarning( 14140 ) << k_funcinfo << "Unknown status " << status.internalStatus() << "!" << endl; - return "UNK"; - } -} - -void MSNNotifySocket::slotSendKeepAlive() -{ - //we did not received the previous TQNG - if(m_ping) - { - m_disconnectReason=Kopete::Account::ConnectionReset; - disconnect(); - /*KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Information, - i18n( "The connection with the MSN network has been lost." ) , i18n ("MSN Plugin") );*/ - return; - } - else - { - // Send a dummy command to fake activity. This makes sure MSN doesn't - // disconnect you when the notify socket is idle. - sendCommand( "PNG" , TQString() , false ); - m_ping=true; - } - - //at least 90 second has been ellapsed since the last messages - // we shouldn't receive error from theses command anymore - m_tmpHandles.clear(); -} - -Kopete::OnlineStatus MSNNotifySocket::convertOnlineStatus( const TQString &status ) -{ - if( status == "NLN" ) - return MSNProtocol::protocol()->NLN; - else if( status == "FLN" ) - return MSNProtocol::protocol()->FLN; - else if( status == "HDN" ) - return MSNProtocol::protocol()->HDN; - else if( status == "PHN" ) - return MSNProtocol::protocol()->PHN; - else if( status == "LUN" ) - return MSNProtocol::protocol()->LUN; - else if( status == "BRB" ) - return MSNProtocol::protocol()->BRB; - else if( status == "AWY" ) - return MSNProtocol::protocol()->AWY; - else if( status == "BSY" ) - return MSNProtocol::protocol()->BSY; - else if( status == "IDL" ) - return MSNProtocol::protocol()->IDL; - else - return MSNProtocol::protocol()->UNK; -} - - -#include "msnnotifysocket.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnnotifysocket.h b/kopete/protocols/msn/msnnotifysocket.h deleted file mode 100644 index 838aee94..00000000 --- a/kopete/protocols/msn/msnnotifysocket.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - msnnotifysocket.h - Notify Socket for the MSN Protocol - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - Portions taken from - KMerlin (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNNOTIFYSOCKET_H -#define MSNNOTIFYSOCKET_H - -#include "msnsocket.h" -#include "msnprotocol.h" - - -class MSNDispatchSocket; -class MSNAccount; -class KTempFile; -class MSNSecureLoginHandler; -class MSNChallengeHandler; - -/** - * @author Olaf Lueg - * @author Olivier Goffart - */ -class MSNNotifySocket : public MSNSocket -{ - Q_OBJECT - - -public: - MSNNotifySocket( MSNAccount* account, const TQString &msnId, const TQString &password ); - ~MSNNotifySocket(); - - virtual void disconnect(); - - void setStatus( const Kopete::OnlineStatus &status ); - void addContact( const TQString &handle, int list, const TQString& publicName, const TQString& contactGuid, const TQString& groupGuid ); - void removeContact( const TQString &handle, int list, const TQString &contactGuid, const TQString &groupGuid ); - - void addGroup( const TQString& groupName ); - void removeGroup( const TQString& group ); - void renameGroup( const TQString& groupName, const TQString& groupGuid ); - - void changePublicName( const TQString& publicName , const TQString &handle=TQString() ); - void changePersonalMessage( MSNProtocol::PersonalMessageType type , const TQString& personalMessage ); - - void changePhoneNumber( const TQString &key, const TQString &data ); - - void createChatSession(); - - void sendMail(const TQString &email); - - /** - * this should return a Kopete::Account::DisconnectReason value - */ - int disconnectReason() { return m_disconnectReason; } - - TQString localIP() { return m_localIP; } - - bool setUseHttpMethod( bool useHttpMethod ); - - bool isLogged() const { return m_isLogged; } - -public slots: - void slotOpenInbox(); - void slotMSNAlertLink(unsigned int action); - void slotMSNAlertUnwanted(); - -signals: - void newContactList(); - void contactList(const TQString& handle, const TQString& publicName, const TQString &contactGuid, uint lists, const TQString& groups); - void contactStatus(const TQString&, const TQString&, const TQString& ); - void contactAdded(const TQString& handle, const TQString& list, const TQString& publicName, const TQString& contactGuid, const TQString& groupGuid); - //void contactRemoved(const TQString&, const TQString&, uint); - void contactRemoved(const TQString& handle, const TQString& list, const TQString& contactGuid, const TQString& groupGuid); - - void groupListed(const TQString&, const TQString&); - void groupAdded( const TQString&, const TQString&); - void groupRenamed( const TQString&, const TQString& ); - void groupRemoved( const TQString& ); - - void invitedToChat(const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ); - void startChat( const TQString&, const TQString& ); - - void statusChanged( const Kopete::OnlineStatus &newStatus ); - - void hotmailSeted(bool) ; - - - /** - * When the dispatch server sends us the notification server to use, this - * signal is emitted. After this the socket is automatically closed. - */ - void receivedNotificationServer( const TQString &host, uint port ); - - -protected: - /** - * Handle an MSN command response line. - */ - virtual void parseCommand( const TQString &cmd, uint id, - const TQString &data ); - - /** - * Handle an MSN error condition. - * This reimplementation handles most of the other MSN error codes. - */ - virtual void handleError( uint code, uint id ); - - /** - * This reimplementation sets up the negotiating with the server and - * suppresses the change of the status to online until the handshake - * is complete. - */ - virtual void doneConnect(); - - -private slots: - /** - * We received a message from the server, which is sent as raw data, - * instead of cr/lf line-based text. - */ - void slotReadMessage( const TQByteArray &bytes ); - - /** - * Send a keepalive to the server to avoid idle connections to cause - * MSN closing the connection - */ - void slotSendKeepAlive(); - - void sslLoginFailed(); - void sslLoginIncorrect(); - void sslLoginSucceeded(TQString ticket); - - -private: - /** - * Convert the MSN status strings to a Kopete::OnlineStatus - */ - Kopete::OnlineStatus convertOnlineStatus( const TQString &statusString ); - - MSNAccount *m_account; - TQString m_password; - TQStringList m_msnAlertURLs; - - unsigned int mailCount; - - Kopete::OnlineStatus m_newstatus; - - /** - * Convert an entry of the Status enum back to a string - */ - TQString statusToString( const Kopete::OnlineStatus &status ) const; - - /** - * Process the CurrentMedia XML element. - * @param mediaXmlElement the source XML element as text. - */ - TQString processCurrentMedia( const TQString &mediaXmlElement ); - - //know the last handle used - TQString m_tmpLastHandle; - TQMap <unsigned int,TQString> m_tmpHandles; - TQString m_configFile; - - //for hotmail inbox opening - bool m_isHotmailAccount; - TQString m_MSPAuth; - TQString m_kv; - TQString m_sid; - TQString m_loginTime; - TQString m_localIP; - MSNSecureLoginHandler *m_secureLoginHandler; - - MSNChallengeHandler *m_challengeHandler; - TQTimer *m_keepaliveTimer; - - bool m_ping; - - int m_disconnectReason; - - /** - * Used to set the myself() personalMessage when the acknowledge(UUX) command is received. - * The personalMessage is built into @ref changePersonalMessage - */ - TQString m_propertyPersonalMessage; - - /** - * Used to tell when we are logged in to MSN Messeger service. - * Logged when we receive the initial profile message from Hotmail. - * - * Some commands only make sense to be done when logged. - */ - bool m_isLogged; -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnprotocol.cpp b/kopete/protocols/msn/msnprotocol.cpp deleted file mode 100644 index 2670d2a0..00000000 --- a/kopete/protocols/msn/msnprotocol.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* - msnprotocol.cpp - Kopete MSN Protocol Plugin - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2003 by Olivier Goffart <ogoffart @ kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include <tqimage.h> - -#include <kdebug.h> -#include <kgenericfactory.h> -#include <tdeconfig.h> -#include <tdeversion.h> -#include <tdeaboutdata.h> - -#include "kopeteaccountmanager.h" -#include "kopeteglobal.h" -#include "kopeteonlinestatusmanager.h" - -#include "msnaddcontactpage.h" -#include "msneditaccountwidget.h" -#include "msncontact.h" -#include "msnaccount.h" -#include "msnprotocol.h" -#include "msnchatsession.h" - -typedef KGenericFactory<MSNProtocol> MSNProtocolFactory; -#if KDE_IS_VERSION(3,2,90) -static const TDEAboutData aboutdata("kopete_msn", I18N_NOOP("MSN Messenger") , "1.0" ); -K_EXPORT_COMPONENT_FACTORY( libkopete_msn_shared, MSNProtocolFactory( &aboutdata ) ) -#else -K_EXPORT_COMPONENT_FACTORY( libkopete_msn_shared, MSNProtocolFactory( "kopete_msn" ) ) -#endif - -MSNProtocol *MSNProtocol::s_protocol = 0L; - -MSNProtocol::MSNProtocol( TQObject *parent, const char *name, const TQStringList & /* args */ ) -: Kopete::Protocol( MSNProtocolFactory::instance(), parent, name ), - NLN( Kopete::OnlineStatus::Online, 25, this, 1, TQString(), i18n( "Online" ) , i18n( "O&nline" ), Kopete::OnlineStatusManager::Online,Kopete::OnlineStatusManager::HasAwayMessage ), - BSY( Kopete::OnlineStatus::Away, 20, this, 2, "msn_busy", i18n( "Busy" ) , i18n( "&Busy" ), Kopete::OnlineStatusManager::Busy, Kopete::OnlineStatusManager::HasAwayMessage ), - BRB( Kopete::OnlineStatus::Away, 22, this, 3, "msn_brb", i18n( "Be Right Back" ), i18n( "Be &Right Back" ) , 0 , Kopete::OnlineStatusManager::HasAwayMessage ), - AWY( Kopete::OnlineStatus::Away, 18, this, 4, "contact_away_overlay", i18n( "Away From Computer" ),i18n( "&Away" ), Kopete::OnlineStatusManager::Away, Kopete::OnlineStatusManager::HasAwayMessage ), - PHN( Kopete::OnlineStatus::Away, 12, this, 5, "contact_phone_overlay", i18n( "On the Phone" ) , i18n( "On The &Phone" ) , 0 , Kopete::OnlineStatusManager::HasAwayMessage ), - LUN( Kopete::OnlineStatus::Away, 15, this, 6, "contact_food_overlay", i18n( "Out to Lunch" ) , i18n( "Out To &Lunch" ) , 0 , Kopete::OnlineStatusManager::HasAwayMessage ), - FLN( Kopete::OnlineStatus::Offline, 0, this, 7, TQString(), i18n( "Offline" ) , i18n( "&Offline" ), Kopete::OnlineStatusManager::Offline,Kopete::OnlineStatusManager::DisabledIfOffline ), - HDN( Kopete::OnlineStatus::Invisible, 3, this, 8, "contact_invisible_overlay", i18n( "Invisible" ) , i18n( "&Invisible" ), Kopete::OnlineStatusManager::Invisible ), - IDL( Kopete::OnlineStatus::Away, 10, this, 9, "contact_away_overlay", i18n( "Idle" ) , i18n( "&Idle" ), Kopete::OnlineStatusManager::Idle , Kopete::OnlineStatusManager::HideFromMenu ), - UNK( Kopete::OnlineStatus::Unknown, 25, this, 0, "status_unknown", i18n( "Status not available" ) ), - CNT( Kopete::OnlineStatus::Connecting, 2, this, 10,"msn_connecting", i18n( "Connecting" ) ), - propEmail(Kopete::Global::Properties::self()->emailAddress()), - propPhoneHome(Kopete::Global::Properties::self()->privatePhone()), - propPhoneWork(Kopete::Global::Properties::self()->workPhone()), - propPhoneMobile(Kopete::Global::Properties::self()->privateMobilePhone()), - propClient("client", i18n("Remote Client"), 0, false), - propGuid("guid", i18n("Contact GUID"), 0, true), - propPersonalMessage(Kopete::Global::Properties::self()->awayMessage()) -{ - s_protocol = this; - - addAddressBookField( "messaging/msn", Kopete::Plugin::MakeIndexField ); - - setCapabilities( Kopete::Protocol::BaseFgColor | Kopete::Protocol::BaseFont | Kopete::Protocol::BaseFormatting ); - - // m_status = m_unknownStatus = UNK; -} - -Kopete::Contact *MSNProtocol::deserializeContact( Kopete::MetaContact *metaContact, const TQMap<TQString, TQString> &serializedData, - const TQMap<TQString, TQString> & /* addressBookData */ ) -{ - TQString contactId = serializedData[ "contactId" ] ; - TQString accountId = serializedData[ "accountId" ] ; - TQString lists = serializedData[ "lists" ]; - TQStringList groups = TQStringList::split( ",", serializedData[ "groups" ] ); - TQString contactGuid = serializedData[ "contactGuid" ] ; - - TQDict<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts( this ); - - Kopete::Account *account = accounts[ accountId ]; - if( !account ) - account = createNewAccount( accountId ); - - // Create MSN contact - MSNContact *c = new MSNContact( account, contactId, metaContact ); - - for( TQStringList::Iterator it = groups.begin() ; it != groups.end(); ++it ) - c->contactAddedToGroup( *it, 0L /* FIXME - m_groupList[ ( *it ).toUInt() ]*/ ); - - c->m_obj= serializedData[ "obj" ]; - c->setInfo( "PHH" , serializedData[ "PHH" ] ); - c->setInfo( "PHW" , serializedData[ "PHW" ] ); - c->setInfo( "PHM" , serializedData[ "PHM" ] ); - c->setProperty( propGuid, contactGuid ); - - c->setBlocked( (bool)(lists.contains('B')) ); - c->setAllowed( (bool)(lists.contains('A')) ); - c->setReversed( (bool)(lists.contains('R')) ); - - return c; -} - -AddContactPage *MSNProtocol::createAddContactWidget(TQWidget *parent , Kopete::Account *i) -{ - return (new MSNAddContactPage(i->isConnected(),parent)); -} - -KopeteEditAccountWidget *MSNProtocol::createEditAccountWidget(Kopete::Account *account, TQWidget *parent) -{ - return new MSNEditAccountWidget(this,account,parent); -} - -Kopete::Account *MSNProtocol::createNewAccount(const TQString &accountId) -{ - return new MSNAccount(this, accountId); -} - - -// NOTE: CALL THIS ONLY BEING CONNECTED -void MSNProtocol::slotSyncContactList() -{ -/* if ( ! mIsConnected ) - { - return; - } - // First, delete D marked contacts - TQStringList localcontacts; - - contactsFile->setGroup("Default"); - - contactsFile->readListEntry("Contacts",localcontacts); - TQString tmpUin; - tmpUin.sprintf("%d",uin); - tmp.append(tmpUin); - cnt=contactsFile->readNumEntry("Count",0); -*/ -} - -MSNProtocol* MSNProtocol::protocol() -{ - return s_protocol; -} - -bool MSNProtocol::validContactId(const TQString& userid) -{ - return ( userid.contains('@') ==1 && userid.contains('.') >=1 && userid.contains(' ') == 0); -} - -TQImage MSNProtocol::scalePicture(const TQImage &picture) -{ - TQImage img(picture); - img = img.smoothScale( 96, 96, TQ_ScaleMin ); - // crop image if not square - if(img.width() < img.height()) - { - img = img.copy((img.width()-img.height())/2, 0, 96, 96); - } - else if(img.width() > img.height()) - { - img = img.copy(0, (img.height()-img.width())/2, 96, 96); - } - - return img; -} -#include "msnprotocol.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnprotocol.h b/kopete/protocols/msn/msnprotocol.h deleted file mode 100644 index 52fb2800..00000000 --- a/kopete/protocols/msn/msnprotocol.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - msnprotocol.h - Kopete MSN Protocol Plugin - - Copyright (c) 2002 by Duncan Mac-Vicar Prett <[email protected]> - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2003 by Olivier Goffart <ogoffart @ kde.org> - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef __msnprotocol_h__ -#define __msnprotocol_h__ - -#include <tqmap.h> -#include <tqstringlist.h> - -#include "kopeteprotocol.h" -#include "kopeteonlinestatus.h" -#include "kopetecontactproperty.h" - -#include "msnsocket.h" - - -class TQImage; - -class TDEAction; -class TDEActionMenu; - -class MSNContact; -class MSNAccount; -class MSNNotifySocket; -class MSNSwitchBoardSocket; -class MSNChatSession; -class MSNInvitation; -namespace Kopete { class ChatSession; } -namespace Kopete { class MetaContact; } -namespace Kopete { class Contact; } -namespace Kopete { class Message; } -namespace Kopete { class Group; } - -/** - * @author duncan - * @author Martijn Klingens <[email protected]> - * @author Olivier Goffart <ogoffart @ kde.org> - */ -class KOPETE_EXPORT MSNProtocol : public Kopete::Protocol -{ - Q_OBJECT - - -public: - MSNProtocol( TQObject *parent, const char *name, const TQStringList &args ); - - /** - * SyncMode indicates whether settings differing between client and - * server should be propagated to keep them in sync. - * SyncToServer - Ignore the server setting when sent. Instead, push - * the local setting to the server. Used when changing - * settings offline. - * SyncFromServer - Update locally stored settings with the value sent - * by the server. Used when connecting to the server if - * no offline changes are pending to force a sync. - * SyncBoth - Changes are updated both ways. This is truly a - * 'first come, first serve' scenario, which breaks if - * the 'old' value is sent by one peer before the other - * end is able to push the new value. An example of this - * is changing the MSN nickname offline - the server can - * only be updated after it has sent the old value to - * the client during connect, destroying the new setting. - * Once connected this is often the most useful setting. - * DontSync - Do not sync values at all. This is used if settings - * are overridden locally, but should not be sent to the - * server, nor should the client update server-pushed - * values. This can be useful for e.g. contact lists. - */ - enum SyncMode - { - DontSync = 0x00, - SyncToServer = 0x01, - SyncFromServer = 0x02, - SyncBoth = 0x03 - }; - - /** - * The possible MSN online statuses - */ - const Kopete::OnlineStatus NLN; //online - const Kopete::OnlineStatus BSY; //busy - const Kopete::OnlineStatus BRB; //be right back - const Kopete::OnlineStatus AWY; //away - const Kopete::OnlineStatus PHN; //on the phone - const Kopete::OnlineStatus LUN; //out to lunch - const Kopete::OnlineStatus FLN; //offline - const Kopete::OnlineStatus HDN; //invisible - const Kopete::OnlineStatus IDL; //idle - const Kopete::OnlineStatus UNK; //inknown (internal) - const Kopete::OnlineStatus CNT; //connecting (internal) - - const Kopete::ContactPropertyTmpl propEmail; - const Kopete::ContactPropertyTmpl propPhoneHome; - const Kopete::ContactPropertyTmpl propPhoneWork; - const Kopete::ContactPropertyTmpl propPhoneMobile; - const Kopete::ContactPropertyTmpl propClient; - const Kopete::ContactPropertyTmpl propGuid; - const Kopete::ContactPropertyTmpl propPersonalMessage; // it's the equivalent of away message. - - enum List - { - FL, // forward - AL, // allow - BL, // blocked - RL, // reverse - PL // pending - }; - - // Enums used to build the Kopete's MSN ClientId. - enum MSNClientInformationFields - { - WindowsMobile = 0x1, - InkFormatGIF = 0x04, - InkFormatISF = 0x08, - SupportWebcam = 0x10, - SupportMultiPacketMessaging = 0x20, - MSNMobileDevice = 0x40, - MSNDirectDevice = 0x80, - WebMessenger = 0x100, - SupportDirectIM = 0x4000, - SupportWinks = 0x8000, - MSNC1 = 0x10000000, - MSNC2 = 0x20000000, - MSNC3 = 0x30000000, - MSNC4 = 0x40000000 - }; - - enum PersonalMessageType - { - PersonalMessageNormal, - PersonalMessageMusic, - PersonalMessageGame, - PersonalMessageOffice - }; - - virtual Kopete::Contact *deserializeContact( Kopete::MetaContact *metaContact, - const TQMap<TQString, TQString> &serializedData, const TQMap<TQString, TQString> &addressBookData ); - - virtual AddContactPage *createAddContactWidget( TQWidget *parent , Kopete::Account *i); - virtual KopeteEditAccountWidget *createEditAccountWidget(Kopete::Account *account, TQWidget *parent); - virtual Kopete::Account *createNewAccount(const TQString &accountId); - - static MSNProtocol* protocol(); - static bool validContactId(const TQString&); - TQImage scalePicture(const TQImage &picture); - -private slots: - void slotSyncContactList(); - -private: - - static MSNProtocol *s_protocol; - -signals: - /** - * A new msn invitation has been arrived. plugins can connect this signal to handle invitations. - * if the invitationID match to their internal id. they can create a new MSNInvitation and pass it via invitation - * - * @param invitation should be set by the plugin to the new invitaiton. plugin should check it is equal to 0L before - * @param bodyMSG is the whole invitation message - * @param cookie is the invitation cookie - * @param msnMM is the message manager - * @param c is the contact - */ - void invitation(MSNInvitation*& invitation, const TQString &bodyMSG , long unsigned int cookie , MSNChatSession* msnMM , MSNContact* c ); -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnsecureloginhandler.cpp b/kopete/protocols/msn/msnsecureloginhandler.cpp deleted file mode 100644 index f8431f9f..00000000 --- a/kopete/protocols/msn/msnsecureloginhandler.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - msnsecureloginhandler.cpp - SSL login for MSN protocol - - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ -#include "msnsecureloginhandler.h" - -// TQt includes -#include <tqregexp.h> - -// KDE includes -#include <tdeio/job.h> -#include <kurl.h> -#include <kdebug.h> - -MSNSecureLoginHandler::MSNSecureLoginHandler(const TQString &accountId, const TQString &password, const TQString &authParameters) - : m_password(password), m_accountId(accountId), m_authentification(authParameters) -{ - -} - -MSNSecureLoginHandler::~MSNSecureLoginHandler() -{ -// kdDebug(14140) << k_funcinfo << endl; -} - -void MSNSecureLoginHandler::login() -{ - // Retrive the login server. - // Do a reload and don't show the progress. - TDEIO::Job *getLoginServer = TDEIO::get(KURL("https://nexus.passport.com/rdr/pprdr.asp"), true, false); - - getLoginServer->addMetaData("cookies", "manual"); - getLoginServer->addMetaData("cache", "reload"); - getLoginServer->addMetaData("PropagateHttpHeader", "true"); - - connect(getLoginServer, TQT_SIGNAL(result(TDEIO::Job *)), this, TQT_SLOT(slotLoginServerReceived(TDEIO::Job* ))); -} - -void MSNSecureLoginHandler::slotLoginServerReceived(TDEIO::Job *loginJob) -{ - if(!loginJob->error()) - { - // Retrive the HTTP header - TQString httpHeaders = loginJob->queryMetaData("HTTP-Headers"); - - // Get the login URL using TQRegExp - TQRegExp rx("PassportURLs: DARealm=(.*),DALogin=(.*),DAReg="); - rx.search(httpHeaders); - - // Set the loginUrl and loginServer - TQString loginUrl = rx.cap(2); - TQString loginServer = loginUrl.section('/', 0, 0); - - kdDebug(14140) << k_funcinfo << loginServer << endl; - - TQString authURL = "https://" + loginUrl; - - TDEIO::Job *authJob = TDEIO::get(KURL(authURL), true, false); - authJob->addMetaData("cookies", "manual"); - - TQString authRequest = "Authorization: Passport1.4 " - "OrgVerb=GET," - "OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom," - "sign-in=" + KURL::encode_string(m_accountId) + - ",pwd=" + KURL::encode_string( m_password ).replace(',',"%2C") + - "," + m_authentification + "\r\n"; - -// warning, this debug contains the password -// kdDebug(14140) << k_funcinfo << "Auth request: " << authRequest << endl; - - authJob->addMetaData("customHTTPHeader", authRequest); - authJob->addMetaData("SendLanguageSettings", "false"); - authJob->addMetaData("PropagateHttpHeader", "true"); - authJob->addMetaData("cookies", "manual"); - authJob->addMetaData("cache", "reload"); - - connect(authJob, TQT_SIGNAL(result(TDEIO::Job *)), this, TQT_SLOT(slotTweenerReceived(TDEIO::Job* ))); - } - else - { - kdDebug(14140) << k_funcinfo << loginJob->errorString() << endl; - - emit loginFailed(); - } -} - -void MSNSecureLoginHandler::slotTweenerReceived(TDEIO::Job *authJob) -{ - if(!authJob->error()) - { - TQString httpHeaders = authJob->queryMetaData("HTTP-Headers"); - -// kdDebug(14140) << k_funcinfo << "HTTP headers: " << httpHeaders << endl; - - // Check if we get "401 Unauthorized", thats means it's a bad password. - if(httpHeaders.contains(TQString::fromUtf8("401 Unauthorized"))) - { -// kdDebug(14140) << k_funcinfo << "MSN Login Bad password." << endl; - emit loginBadPassword(); - } - else - { - TQRegExp rx("from-PP='(.*)'"); - rx.search(httpHeaders); - TQString ticket = rx.cap(1); - - // kdDebug(14140) << k_funcinfo << "Received ticket: " << ticket << endl; - - emit loginSuccesful(ticket); - } - } - else - { - kdDebug(14140) << k_funcinfo << authJob->errorString() << endl; - - emit loginFailed(); - } -} -#include "msnsecureloginhandler.moc" diff --git a/kopete/protocols/msn/msnsecureloginhandler.h b/kopete/protocols/msn/msnsecureloginhandler.h deleted file mode 100644 index 5dc4a277..00000000 --- a/kopete/protocols/msn/msnsecureloginhandler.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - msnsecureloginhandler.h - SSL login for MSN protocol - - Copyright (c) 2005 by Michaël Larouche <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ -#ifndef MSNSECURELOGINHANDLER_H -#define MSNSECURELOGINHANDLER_H - -#include <tqobject.h> - -namespace TDEIO -{ - class Job; - class MetaData; -} - -/** - * This class handle the login process. It connect to the .NET Password service and retrive the ticket(tweener) to login. - * Use TDEIO. - * - * @author Michaël Larouche <[email protected]> -*/ -class MSNSecureLoginHandler : public TQObject -{ -Q_OBJECT - -public: - MSNSecureLoginHandler(const TQString &accountId, const TQString &password, const TQString &authParameters); - - ~MSNSecureLoginHandler(); - - void login(); - -signals: - /** - * TODO: return to const TQString & - */ - void loginSuccesful(TQString ticket); - void loginBadPassword(); - void loginFailed(); - -private slots: - void slotLoginServerReceived(TDEIO::Job *); - /** - * We have received our ticket to login. - */ - void slotTweenerReceived(TDEIO::Job *); - -private: - /** - * Store the password. - */ - TQString m_password; - /** - * Store the accountId. - */ - TQString m_accountId; - /** - * Store the authentification parameters - */ - TQString m_authentification; - - void displayMetaData(TDEIO::MetaData data); -}; - -#endif diff --git a/kopete/protocols/msn/msnsocket.cpp b/kopete/protocols/msn/msnsocket.cpp deleted file mode 100644 index 2bb33c97..00000000 --- a/kopete/protocols/msn/msnsocket.cpp +++ /dev/null @@ -1,1099 +0,0 @@ -/* - msnsocket.cpp - Base class for the sockets used in MSN - - Copyright (c) 2002-2003 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2005 by Olivier Goffart <ogoffart at kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnsocket.h" -//#include "msnprotocol.h" - -#include <tqregexp.h> -#include <tqtimer.h> - -#include <kdebug.h> -#include <tdeconfig.h> -#include <kbufferedsocket.h> -#include <kserversocket.h> -#include <kresolver.h> -#include <tdelocale.h> -#include <tdemessagebox.h> -#include <kurl.h> - -#include "kopeteuiglobal.h" - -using namespace KNetwork; - -class MimeMessage -{ - public: - MimeMessage(const TQString &msg) : message(msg) {} - - TQString getValue(const TQString &key) - { - TQRegExp rx(key+": ([^\r\n]+)"); - rx.search(message); - return rx.cap(1); - } - private: - TQString message; -}; - -MSNSocket::MSNSocket(TQObject* parent) : TQObject (parent) -{ - m_onlineStatus = Disconnected; - m_socket = 0L; - m_useHttp = false; - m_timer = 0L; -} - -MSNSocket::~MSNSocket() -{ - //if ( m_onlineStatus != Disconnected ) - // disconnect(); - delete m_timer; - m_timer = 0L; - doneDisconnect(); - if ( m_socket ) - m_socket->deleteLater(); -} - -void MSNSocket::connect( const TQString &server, uint port ) -{ - if ( m_onlineStatus == Connected || m_onlineStatus == Connecting ) - { - kdWarning( 14140 ) << k_funcinfo << "Already connected or connecting! Not connecting again." << endl; - return; - } - - if( m_onlineStatus == Disconnecting ) - { - // Cleanup first. - // FIXME: More generic!!! - kdWarning( 14140 ) << k_funcinfo << "We're still disconnecting! Deleting socket the hard way first." << endl; - delete m_socket; - } - - setOnlineStatus( Connecting ); - m_id = 0; - //m_lastId = 0; - m_waitBlockSize = 0; - m_buffer = Buffer( 0 ); - - //m_sendQueue.clear(); - - m_server = server; - m_port = port; - - if(!m_useHttp) - m_socket = new TDEBufferedSocket( server, TQString::number(port) ); - else { - m_socket = new TDEBufferedSocket( m_gateway, "80" ); - } - - m_socket->enableRead( true ); - - // enableWrite eats the CPU, and we only need it when the queue is - // non-empty, so disable it until we have actual data in the queue - m_socket->enableWrite( false ); - - TQObject::connect( m_socket, TQT_SIGNAL( readyRead() ), this, TQT_SLOT( slotDataReceived() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( readyWrite() ), this, TQT_SLOT( slotReadyWrite() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( hostFound() ), this, TQT_SLOT( slotHostFound() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( connected( const KResolverEntry&) ), this, TQT_SLOT( slotConnectionSuccess() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( gotError( int ) ), this, TQT_SLOT( slotSocketError( int ) ) ); - TQObject::connect( m_socket, TQT_SIGNAL( closed( ) ), this, TQT_SLOT( slotSocketClosed( ) ) ); - - if(m_useHttp) - { - if(m_timer == 0L) - { - m_timer = new TQTimer(this, "Http poll timer"); - // Connect the slot HttpPoll with the timer timeout signal. - TQObject::connect(m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotHttpPoll())); - } - } - - aboutToConnect(); - - // start the asynchronous connection - m_socket->connect(); -} - -void MSNSocket::disconnect() -{ - if(m_useHttp) - if(m_timer->isActive()) { - // If the timer is still active, stop the timer. - m_timer->stop(); - } - - if ( m_socket ) - m_socket->closeNow(); - else - slotSocketClosed(); -} - -void MSNSocket::aboutToConnect() -{ - /* Empty default implementation */ -} - -void MSNSocket::doneConnect() -{ - setOnlineStatus( Connected ); -} - -void MSNSocket::doneDisconnect() -{ - setOnlineStatus( Disconnected ); -} - -void MSNSocket::setOnlineStatus( MSNSocket::OnlineStatus status ) -{ - if ( m_onlineStatus == status ) - return; - - m_onlineStatus = status; - emit onlineStatusChanged( status ); -} - -void MSNSocket::slotSocketError( int error ) -{ - kdWarning( 14140 ) << k_funcinfo << "Error: " << error << " (" << m_socket->TDESocketBase::errorString() << ")" << endl; - - if(!TDESocketBase::isFatalError(error)) - return; - //we only care about fatal error - - TQString errormsg = i18n( "There was an error while connecting to the MSN server.\nError message:\n" ); - if ( error == TDESocketBase::LookupFailure ) - errormsg += i18n( "Unable to lookup %1" ).arg( m_socket->peerResolver().nodeName() ); - else - errormsg += m_socket->TDESocketBase::errorString() ; - - //delete m_socket; - m_socket->deleteLater(); - m_socket = 0L; - - setOnlineStatus( Disconnected ); - emit connectionFailed(); - //like if the socket is closed - emit socketClosed(); - - emit errorMessage( ErrorConnectionError, errormsg ); -} - -void MSNSocket::slotDataReceived() -{ - int avail = m_socket->bytesAvailable(); - if ( avail < 0 ) - { - // error! - kdWarning( 14140 ) << k_funcinfo << "bytesAvailable() returned " << avail - << ". This should not happen!" << endl - << "Are we disconnected? Backtrace:" << endl << kdBacktrace() << endl; - return; - } - - // incoming data, plus an extra char where we pretend a NUL is so the conversion - // to TQCString doesn't go over the end of the allocated memory. - char *buffer = new char[ avail + 1 ]; - int ret = m_socket->readBlock( buffer, avail ); - - if ( ret < 0 ) - { - kdWarning( 14140 ) << k_funcinfo << "readBlock() returned " << ret << "!" <<endl; - } - else if ( ret == 0 ) - { - kdWarning( 14140 ) << k_funcinfo << "readBlock() returned no data!" <<endl; - } - else - { - if ( avail ) - { - if ( ret != avail) - { - kdWarning( 14140 ) << k_funcinfo << avail << " bytes were reported available, " - << "but readBlock() returned only " << ret << " bytes! Proceeding anyway." << endl; - } - } - else - { - kdDebug( 14140 ) << k_funcinfo << "Read " << ret << " bytes into 4kb block." << endl; - } - - - TQString rawData; - - if(m_useHttp) - { - bool error = false; - TQByteArray bytes; - - // Check if all data has arrived. - rawData = TQString(TQCString(buffer, avail + 1)); - bool headers = (rawData.find(TQRegExp("HTTP/\\d\\.\\d (\\d+) ([^\r\n]+)")) != -1); - - if(headers) - { - // The http header packet arrived. - int endOfHeaders = rawData.find("\r\n\r\n"); - if((endOfHeaders + 4) == avail) - { - // Only the response headers data is included. - TQRegExp re("Content-Length: ([^\r\n]+)"); - if(re.search(rawData) != -1) - { - bool valid; - int l = re.cap(1).toInt(&valid); - if(valid && l > 0) - { - // The packet contains the headers but does not contain the content data; - // buffer the data received and read again. - m_buffer.add(buffer, avail); - - delete[] buffer; - // Update how much data remains. - m_remaining = l; - return; - } - } - } - } - else - { - // Write the received data to the buffer. - m_buffer.add(buffer, avail); - - m_remaining -= avail; - if(m_remaining != 0) - { - // We have not received all the content data, read again. - delete[] buffer; - return; - } - - // At this point, we have all the bytes returned from the web request. - bytes = m_buffer.take(m_buffer.size()); - } - - if(bytes.size() == 0) - { - // The response headers and the content came in one packet. - bytes.assign(buffer, avail); - } - - - // Create the web response object from the response bytes. - WebResponse response(bytes); - - if(response.getStatusCode() == 100) { - return; - } - - if(response.getStatusCode() == 200) - { - // If we received a valid response, read the required headers. - // Retrieve the X-MSN-Messenger header. - TQString header = response.getHeaders()->getValue("X-MSN-Messenger"); - - TQStringList parts = TQStringList::split(";", header.replace(" ", "")); - if(!header.isNull() && (parts.count() >= 2)) - { - if(parts[0].find("SessionID", 0) != -1) - { - // Assign the session id. - m_sessionId = parts[0].section("=", 1, 1); - }else - error = true; - - if(parts[1].find("GW-IP", 0) != -1) - { - // Assign the gateway IP address. - m_gwip = parts[1].section("=", 1, 1); - }else - error = true; - - - if(parts.count() > 2) - if((parts[2].find("Session", 0) != -1) && (parts[2].section("=", 1, 1) == "close")) - { - // The http session has been closed by the server, disconnect. - kdDebug(14140) << k_funcinfo << "Session closed." << endl; - m_bCanPoll = false; - disconnect(); - return; - } - }else - error = true; - - // Retrieve the content length header. - header = response.getHeaders()->getValue("Content-Length"); - - if(!header.isNull()) - { - bool valid; - int length = header.toInt(&valid); - if(valid && (length == 0)) - { - // If the response content length is zero, there is nothing to do. - m_pending = false; - return; - } - - if(valid && (length > 0)) - { - // Otherwise, if the content length is greater than zero, get the web response stream. - TQDataStream *stream = response.getResponseStream(); - buffer = new char[length]; - // Read the web response content. - stream->readRawBytes(buffer, length); - ret = length; - }else - error = true; - }else - error = true; - }else - error = true; - - if(error) - { - kdDebug(14140) << k_funcinfo << "Http error: " << response.getStatusCode() << " " - << response.getStatusDescription() << endl; - - // If we encountered an error, disconnect and return. - m_bCanPoll = false; - // Disconnect from the service. - disconnect(); - return; - } - } - - // Simple check to avoid dumping the binary data from the icons and emoticons to kdDebug: - // all MSN commands start with one or more uppercase characters. - // For now just check the first three chars, let's see how accurate it is. - // Additionally, if we receive an MSN-P2P packet, strip off anything after the P2P header. - rawData = TQString( TQCString( buffer, ((!m_useHttp)? avail : ret) + 1 ) ).stripWhiteSpace().replace( - TQRegExp( "(P2P-Dest:.[a-zA-Z@.]*).*" ), "\\1\n\n(Stripped binary data)" ); - - bool isBinary = false; - for ( uint i = 0; i < 3 ; ++i ) - { - if ( (rawData[ i ] < 'A' || rawData[ i ] > 'Z') && (rawData[ i ] < '0' || rawData[ i ] > '9') ) - isBinary = true; - } - - if ( isBinary ) - kdDebug( 14141 ) << k_funcinfo << "(Stripped binary data)" << endl; - else - kdDebug( 14141 ) << k_funcinfo << rawData << endl; - - // fill the buffer with the received data - m_buffer.add( buffer, ret ); - - slotReadLine(); - - if(m_useHttp) { - // Set data pending to false. - m_pending = false; - } - } - - // Cleanup. - delete[] buffer; -} - -void MSNSocket::slotReadLine() -{ - // We have data, first check if it's meant for a block read, otherwise - // parse the first line (which will recursively parse the other lines) - if ( !pollReadBlock() ) - { - if ( m_buffer.size() >= 3 && ( m_buffer.data()[ 0 ] == '\0' || m_buffer.data()[ 0 ]== '\1' ) ) - { - bytesReceived( m_buffer.take( 3 ) ); - TQTimer::singleShot( 0, this, TQT_SLOT( slotReadLine() ) ); - return; - } - - int index = -1; - for ( uint x = 0; m_buffer.size() > x + 1; ++x ) - { - if ( ( m_buffer[ x ] == '\r' ) && ( m_buffer[ x + 1 ] == '\n' ) ) - { - index = x; - break; - } - } - - if ( index != -1 ) - { - TQString command = TQString::fromUtf8( m_buffer.take( index + 2 ), index ); - command.replace( "\r\n", "" ); - //kdDebug( 14141 ) << k_funcinfo << command << endl; - - // Don't block the GUI while parsing data, only do a single line! - // (Done before parseLine() to prevent a potential crash) - TQTimer::singleShot( 0, this, TQT_SLOT( slotReadLine() ) ); - - parseLine( command ); - // WARNING: At this point 'this' can be deleted (when disconnecting) - } - } -} - -void MSNSocket::readBlock( uint len ) -{ - if ( m_waitBlockSize ) - { - kdWarning( 14140 ) << k_funcinfo << "Cannot wait for data block: still waiting for other block of size " - << m_waitBlockSize << "! Data will not be returned." << endl; - return; - } - - m_waitBlockSize = len; - - //kdDebug( 14140 ) << k_funcinfo << "Preparing for block read of size " << len << endl; - - // Try to return the data now, if available. Otherwise slotDataReady - // will do this whenever all data is there. - pollReadBlock(); -} - -bool MSNSocket::pollReadBlock() -{ - if ( !m_waitBlockSize ) - { - return false; - } - else if ( m_buffer.size() < m_waitBlockSize ) - { - kdDebug( 14140 ) << k_funcinfo << "Waiting for data. Received: " << m_buffer.size() << ", required: " << m_waitBlockSize << endl; - return true; - } - - TQByteArray block = m_buffer.take( m_waitBlockSize ); - - //kdDebug( 14140 ) << k_funcinfo << "Successfully read block of size " << m_waitBlockSize << endl; - - m_waitBlockSize = 0; - emit blockRead( block); - - return false; -} - -void MSNSocket::parseLine( const TQString &str ) -{ - TQString cmd = str.section( ' ', 0, 0 ); - TQString data = str.section( ' ', 2 ).replace( "\r\n" , "" ); - - bool isNum; - uint id = str.section( ' ', 1, 1 ).toUInt( &isNum ); - - // In some rare cases, like the 'NLN' / 'FLN' commands no id at all - // is sent. Here it's actually a real parameter... - if ( !isNum ) - data = str.section( ' ', 1, 1 ) + " " + data; - - //if ( isNum && id ) - // m_lastId = id; - - //kdDebug( 14140 ) << k_funcinfo << "Parsing command " << cmd << " (ID " << id << "): '" << data << "'" << endl; - - data.replace( "\r\n", "" ); - bool isError; - uint errorCode = cmd.toUInt( &isError ); - if ( isError ) - handleError( errorCode, id ); - else - parseCommand( cmd, id, data ); -} - -void MSNSocket::handleError( uint code, uint /* id */ ) -{ - kdDebug(14140) << k_funcinfo << endl; - TQString msg; - ErrorType type = ErrorServerError; - switch ( code ) - { -/* - // We cant show message for error we don't know what they are or not related to the correct socket - // Theses following messages are not so instructive - case 205: - msg = i18n ( "An invalid username has been specified.\nPlease correct it, and try to reconnect.\n" ); - break; - case 201: - msg = i18n ( "Fully Qualified domain name missing.\n" ); - break; - case 207: - msg = i18n ( "You are already logged in!\n" ); - break; - case 208: - msg = i18n ( "You specified an invalid username.\nPlease correct it, and try to reconnect.\n"); - break; - case 209: - msg = i18n ( "Your nickname is invalid. Please check it, correct it,\nand try to reconnect.\n" ); - break; - case 210: - msg = i18n ( "Your list has reached its maximum capacity.\nNo more contacts can be added, unless you remove some first.\n" ); - break; - case 216: - msg = i18n ( "This user is not in your contact list.\n " ); - break; - case 300: - msg = i18n ( "Some required fields are missing. Please fill them in and try again.\n" ); - break; - case 302: - msg = i18n ( "You are not logged in.\n" ); - break; -*/ - case 500: - msg = i18n ( "An internal server error occurred. Please try again later." ); - type = MSNSocket::ErrorCannotConnect; - break; - case 502: - msg = i18n ( "It is no longer possible to perform this operation. The MSN server does not allow it anymore." ); - type = MSNSocket::ErrorServerError; - break; - case 600: - case 910: - case 912: - case 921: - case 922: - msg = i18n ( "The MSN server is busy. Please try again later." ); - type = MSNSocket::ErrorConnectionError; - break; - case 601: - case 604: - case 605: - case 914: - case 915: - case 916: - case 917: - msg = i18n ( "The server is not available at the moment. Please try again later." ); - type = MSNSocket::ErrorCannotConnect; - break; - // Server error - default: - // FIXME: if the error causes a disconnect, it will crash, but we can't disconnect every time - msg = i18n( "Unhandled MSN error code %1 \n" - "Please fill a bug report with a detailed description and if possible the last console debug output." ).arg( code ); - // "See http://www.hypothetic.org/docs/msn/basics.php for a description of all error codes." - break; - } - - if ( !msg.isEmpty() ) - emit errorMessage( type, msg ); - - return; -} - -int MSNSocket::sendCommand( const TQString &cmd, const TQString &args, bool addId, const TQByteArray &body, bool binary ) -{ - if ( !m_socket ) - { - kdWarning( 14140 ) << k_funcinfo << "m_socket == NULL!" << endl; - return -1; - } - - TQCString data = cmd.utf8(); - if ( addId ) - data += " " + TQString::number( m_id ).utf8(); - - if ( !args.isEmpty() ) - data += " " + args.utf8(); - - // Add length in bytes, not characters - if ( !body.isEmpty() ) - data += " " + TQString::number( body.size() - (binary ? 0 : 1 ) ).utf8(); - - data += "\r\n"; - - - // the command will be sent in slotReadyWrite - TQByteArray bytes; - const uint length = data.length(); - bytes.duplicate(data.data(), length); - if(!body.isEmpty()) - { - uint l = body.size() - (binary ? 0 : 1); - bytes.resize(length + l); - for(uint i=0; i < l; i++) - bytes[length + i] = body[i]; - } - - // Add the request to the queue. - m_sendQueue.append(bytes); - m_socket->enableWrite(true); - - if ( addId ) - { - ++m_id; - return m_id - 1; - } - - return 0; -} - -void MSNSocket::slotReadyWrite() -{ - if ( !m_sendQueue.isEmpty() ) - { - // If the command queue is not empty, retrieve the first command. - TQValueList<TQByteArray>::Iterator it = m_sendQueue.begin(); - - if(m_useHttp) - { - // If web response data is not pending, send the http request. - if(!m_pending) - { - m_pending = true; - // Temporarily disable http polling. - m_bCanPoll = false; - // Set the host to the msn gateway by default. - TQString host = m_gateway; - TQString query; // Web request query string. - - if(m_bIsFirstInTransaction) - { - query.append("Action=open&Server="); - query.append(m_type); - - query += "&IP=" + m_server; - - m_bIsFirstInTransaction = false; - } - else - { - // If this is not the first request sent in the transaction, - // only add the session Id. - host = m_gwip; - query += "SessionID=" + m_sessionId; - } - - // Create the web request headers. - TQString s = makeHttpRequestString(host, query, (*it).size()); - - uint length = s.length(); - // Create the web request bytes. - TQByteArray bytes(length + (*it).size()); - - // Copy the request headers into the request bytes. - for(uint i=0; i < length; i++) - bytes[i] = s.ascii()[i]; - // Copy the request body into the request bytes. - for(uint i=0; i < (*it).size(); i++) - bytes[length + i] = (*it)[i]; - - kdDebug( 14141 ) << k_funcinfo << "Sending http command: " << TQString(*it).stripWhiteSpace() << endl; - - // Write the request bytes to the socket. - m_socket->writeBlock(bytes.data(), bytes.size()); - - // Remove the request from the request queue. - m_sendQueue.remove(it); - - if(m_sendQueue.isEmpty()) - { - // Disable sending requests. - m_socket->enableWrite(false); - // If the request queue is empty, poll the server. - m_bCanPoll = true; - } - } - } - else - { - // Otherwise, send the command normally. - - // Simple check to avoid dumping the binary data from the icons and emoticons to kdDebug: - // When sending an MSN-P2P packet, strip off anything after the P2P header. - TQString debugData = TQString( *it ).stripWhiteSpace().replace( - TQRegExp( "(P2P-Dest:.[a-zA-Z@.]*).*" ), "\\1\n\n(Stripped binary data)" ); - kdDebug( 14141 ) << k_funcinfo << "Sending command: " << debugData << endl; - - m_socket->writeBlock( *it, ( *it ).size() ); - m_sendQueue.remove( it ); - - // If the queue is empty agalin stop waiting for readyWrite signals - // because of the CPU usage - if ( m_sendQueue.isEmpty() ) - m_socket->enableWrite( false ); - } - } - else - { - m_socket->enableWrite( false ); - - if(m_useHttp) - { - // If the request queue is empty, poll the server. - m_bCanPoll = true; - } - } -} - -TQString MSNSocket::escape( const TQString &str ) -{ - //return ( KURL::encode_string( str, 106 ) ); - //It's not needed to encode everything. The official msn client only encode spaces and % - //If we encode more, the size can be longer than excepted. - - int old_length= str.length(); - TQChar *new_segment = new TQChar[ old_length * 3 + 1 ]; - int new_length = 0; - - for ( int i = 0; i < old_length; i++ ) - { - unsigned short character = str[i].unicode(); - - if( character <= 32 || character == '%' ) - { - new_segment[ new_length++ ] = '%'; - - unsigned int c = character / 16; - c += (c > 9) ? ('A' - 10) : '0'; - new_segment[ new_length++ ] = c; - - c = character % 16; - c += (c > 9) ? ('A' - 10) : '0'; - new_segment[ new_length++ ] = c; - } - else - new_segment[ new_length++ ] = str[i]; - } - - TQString result = TQString(new_segment, new_length); - delete [] new_segment; - return result; - -} - -TQString MSNSocket::unescape( const TQString &str ) -{ - TQString str2 = KURL::decode_string( str, 106 ); - //remove msn+ colors code - str2 = str2.replace( TQRegExp("[\\x1-\\x8]"), "" ); // old msn+ colors - // added by kaoul <erwin.kwolek at gmail.com> - str2 = str2.replace( TQRegExp("\\xB7[&@\'#0]"),""); // dot ... - str2 = str2.replace( TQRegExp("\\xB7\\$,?\\d{1,2}"),""); // dot dollar (comma)? 0-99 - - return str2; -} - -void MSNSocket::slotConnectionSuccess() -{ - if(m_useHttp) - { - // If we are connected, set the data pending flag to false, - // and disable http polling. - m_pending = false; - m_bCanPoll = false; - // If we are connected, start the timer. - m_timer->start(2000, false); - } - - //kdDebug( 14140 ) << k_funcinfo << endl; - doneConnect(); -} - -void MSNSocket::slotHostFound() -{ - // nothing to do -} - -void MSNSocket::slotSocketClosed() -{ - kdDebug( 14140 ) << k_funcinfo << "Socket closed. " << endl; - - if ( !m_socket || m_onlineStatus == Disconnected ) - { - kdDebug( 14140 ) << k_funcinfo << "Socket already deleted or already disconnected" << endl; - return; - } - - doneDisconnect(); - - m_buffer = Buffer( 0 ); - //delete m_socket; - m_socket->deleteLater(); - m_socket = 0L; - - emit socketClosed(); -} - -void MSNSocket::slotHttpPoll() -{ - if(m_pending || !m_bCanPoll){ - // If data is pending or poll has been temporary disabled, return. - return; - } - - // Create the http request headers. - const TQCString headers = makeHttpRequestString(m_gwip, "Action=poll&SessionID=" + m_sessionId, 0).utf8(); - m_socket->writeBlock(headers, headers.length()); - // Wait for the response. - m_pending = true; - m_socket->enableWrite(true); -} - -// Used in MSNFileTransferSocket -// FIXME: Why is this here if it's only used for file transfer? - Martijn -void MSNSocket::bytesReceived( const TQByteArray & /* data */ ) -{ - kdWarning( 14140 ) << k_funcinfo << "Unknown bytes were received" << endl; -} - -void MSNSocket::sendBytes( const TQByteArray &data ) -{ - if ( !m_socket ) - { - kdWarning( 14140 ) << k_funcinfo << "Not yet connected" << endl; - return; - } - - m_socket->writeBlock( data, data.size() ); - m_socket->enableWrite( true ); -} - -bool MSNSocket::setUseHttpMethod( bool useHttp ) -{ - if( m_useHttp == useHttp ) - return true; - - if( useHttp ) { - TQString s = TQString( this->className() ).lower(); - if( s == "msnnotifysocket" ) - m_type = "NS"; - else if( s == "msnswitchboardsocket" ) - m_type = "SB"; - else - m_type = TQString(); - - if( m_type.isNull() ) - return false; - - m_bCanPoll = false; - m_bIsFirstInTransaction = true; - m_pending = false; - m_remaining = 0; - m_gateway = "gateway.messenger.hotmail.com"; - } - - if ( m_onlineStatus != Disconnected ) - disconnect(); - - m_useHttp = useHttp; - - return true; -} - -bool MSNSocket::useHttpMethod() const -{ - return m_useHttp; -} - -bool MSNSocket::accept( TDEServerSocket *server ) -{ - if ( m_socket ) - { - kdWarning( 14140 ) << k_funcinfo << "Socket already exists!" << endl; - return false; - } - - m_socket = static_cast<TDEBufferedSocket*>(server->accept()); - - if ( !m_socket ) - { -// kdWarning( 14140 ) << k_funcinfo << "Socket not created. Error nb" << server->error() << " : " << server->errorString() << endl; - return false; - } - - kdDebug( 14140 ) << k_funcinfo << "incoming connection accepted" << endl; - - setOnlineStatus( Connecting ); - - m_id = 0; - //m_lastId = 0; - m_waitBlockSize = 0; - - m_socket->setBlocking( false ); - m_socket->enableRead( true ); - m_socket->enableWrite( true ); - - TQObject::connect( m_socket, TQT_SIGNAL( readyRead() ), this, TQT_SLOT( slotDataReceived() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( readyWrite() ), this, TQT_SLOT( slotReadyWrite() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( closed() ), this, TQT_SLOT( slotSocketClosed() ) ); - TQObject::connect( m_socket, TQT_SIGNAL( gotError( int ) ), this, TQT_SLOT( slotSocketError( int ) ) ); - - doneConnect(); - return true; -} - -TQString MSNSocket::getLocalIP() -{ - if ( !m_socket ) - return TQString(); - - const TDESocketAddress address = m_socket->localAddress(); - - TQString ip = address.nodeName(); - - kdDebug( 14140 ) << k_funcinfo << "IP: " << ip <<endl; - //delete address; - return ip; -} - -MSNSocket::Buffer::Buffer( unsigned int sz ) -: TQByteArray( sz ) -{ -} - -MSNSocket::Buffer::~Buffer() -{ -} - -void MSNSocket::Buffer::add( char *str, unsigned int sz ) -{ - char *b = new char[ size() + sz ]; - for ( uint f = 0; f < size(); f++ ) - b[ f ] = data()[ f ]; - for ( uint f = 0; f < sz; f++ ) - b[ size() + f ] = str[ f ]; - - duplicate( b, size() + sz ); - delete[] b; -} - -TQByteArray MSNSocket::Buffer::take( unsigned blockSize ) -{ - if ( size() < blockSize ) - { - kdWarning( 14140 ) << k_funcinfo << "Buffer size " << size() << " < asked size " << blockSize << "!" << endl; - return TQByteArray(); - } - - TQByteArray rep( blockSize ); - for( uint i = 0; i < blockSize; i++ ) - rep[ i ] = data()[ i ]; - - char *str = new char[ size() - blockSize ]; - for ( uint i = 0; i < size() - blockSize; i++ ) - str[ i ] = data()[ blockSize + i ]; - duplicate( str, size() - blockSize ); - delete[] str; - - return rep; -} - -TQString MSNSocket::makeHttpRequestString(const TQString& host, const TQString& query, uint contentLength) -{ - TQString s( - "POST http://" + host + "/gateway/gateway.dll?" + query + " HTTP/1.1\r\n" + - "Accept: */*\r\n" + - "Accept-Language: en-us\r\n" + - "User-Agent: MSMSGS\r\n" + - "Host: " + host + "\r\n" + - "Proxy-Connection: Keep-Alive\r\n" + - "Connection: Keep-Alive\r\n" + - "Pragma: no-cache\r\n" + - "Content-Type: application/x-msn-messenger\r\n" + - "Content-Length: " + TQString::number(contentLength) + "\r\n" + - "\r\n"); - return s; -} - -MSNSocket::WebResponse::WebResponse(const TQByteArray& bytes) -{ - m_statusCode = 0; - m_stream = 0; - - int headerEnd; - TQString header; - TQString data(TQCString(bytes, bytes.size() + 1)); - - // Parse the HTTP status header - TQRegExp re("HTTP/\\d\\.\\d (\\d+) ([^\r\n]+)"); - headerEnd = data.find("\r\n"); - header = data.left( (headerEnd == -1) ? 20 : headerEnd ); - - re.search(header); - m_statusCode = re.cap(1).toInt(); - m_statusDescription = re.cap(2); - - // Remove the web response status header. - data = data.mid(headerEnd + 2, (data.find("\r\n\r\n") + 2) - (headerEnd + 2)); - // Create a MimeMessage, removing the HTTP status header - m_headers = new MimeMessage(data); - - // Retrieve the contentlength header. - header = m_headers->getValue("Content-Length"); - if(!header.isNull()) - { - bool valid; - int length = header.toInt(&valid); - if(valid && length > 0) - { - // If the content length is valid, and not zero, - // copy the web response content bytes. - int offset = bytes.size() - length; - - TQByteArray content(length); - for(int i=0; i < length; i++) - content[i] = bytes[offset + i]; - // Create the web response stream from the response content bytes. - m_stream = new TQDataStream(content, IO_ReadOnly); - } - } -} - -MSNSocket::WebResponse::~WebResponse() -{ - delete m_headers; - m_headers = 0; - delete m_stream; - m_stream = 0; -} - -MimeMessage* MSNSocket::WebResponse::getHeaders() -{ - return m_headers; -} - -TQDataStream* MSNSocket::WebResponse::getResponseStream() -{ - return m_stream; -} - -int MSNSocket::WebResponse::getStatusCode() -{ - return m_statusCode; -} - -TQString MSNSocket::WebResponse::getStatusDescription() -{ - return m_statusDescription; -} - - -#include "msnsocket.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnsocket.h b/kopete/protocols/msn/msnsocket.h deleted file mode 100644 index 5661ee41..00000000 --- a/kopete/protocols/msn/msnsocket.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - msnsocket.h - Base class for the sockets used in MSN - - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2004 by Olivier Goffart <ogoffart @ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - Kopete (c) 2002 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNSOCKET_H -#define MSNSOCKET_H - -#include <tqobject.h> -#include <tqdatastream.h> -#include <tqstringlist.h> -#include <tqtimer.h> -#include <tqvaluelist.h> - -#include "kopete_export.h" - -namespace KNetwork { - class TDEBufferedSocket; - class TDEServerSocket; -} - -class MimeMessage; - -/** - * @author Martijn Klingens <[email protected]> - * - * MSNSocket encapsulates the common functionality shared by the Dispatch - * Server, the Notification Server and the Switchboard Server. It is - * inherited by the various specialized classes. - */ -class KOPETE_EXPORT MSNSocket : public TQObject -{ - Q_OBJECT - - -public: - MSNSocket(TQObject* parent=0l); - ~MSNSocket(); - - /** - * Asynchronously read a block of data of the specified size. When the - * data is available, the blockRead() signal will be emitted with the - * data as parameter. - * - * NOTE: As the block queue takes precedence over the line-based - * command-processing this method can effectively block all - * communications when passed a wrong length! - */ - void readBlock( uint len ); - - /** - * OnlineStatus encapsulates the 4 states a connection can be in, - * Connecting, Connected, Disconnecting, Disconnected. Connecting - * and Disconnecting are in the default implementation not used, - * because the socket connect is an atomic operation and not yet - * performed asynchronously. - * In derived classes, like the Notification Server, this state is - * actively used, because merely having a socket connection established - * by no means indicates we're actually online - the rest of the - * handshake likely has to follow first. - */ - enum OnlineStatus { Connecting, Connected, Disconnecting, Disconnected }; - enum LookupStatus { Processing, Success, Failed }; - enum Transport { TcpTransport, HttpTransport }; - enum ErrorType { ErrorConnectionLost, ErrorConnectionError, ErrorCannotConnect, ErrorServerError, ErrorInformation}; - - OnlineStatus onlineStatus() { return m_onlineStatus; } - - /* - * return the local ip. - * Used for filetransfer - */ - TQString getLocalIP(); - - //BEGIN Http - - virtual bool setUseHttpMethod( bool useHttp ); - bool useHttpMethod() const; - - //END - -public slots: - void connect( const TQString &server, uint port ); - virtual void disconnect(); - - - /** - * Send an MSN command to the socket - * - * For debugging it's convenient to have this method public, but using - * it outside this class is deprecated for any other use! - * - * The size of the body (if any) is automatically added to the argument - * list and shouldn't be explicitly specified! This size is in bytes - * instead of characters to reflect what actually goes over the wire. - * - * if the param binary is set to true, then, the body is send as a binary message - * - * return the id - */ - int sendCommand( const TQString &cmd, const TQString &args = TQString(), - bool addId = true, const TQByteArray &body = TQByteArray() , bool binary=false ); - -signals: - /** - * A block read is ready. - * After this the normal line-based reads go on again - */ - void blockRead( const TQByteArray &block ); - - /** - * The online status has changed - */ - void onlineStatusChanged( MSNSocket::OnlineStatus status ); - - /** - * The connection failed - */ - void connectionFailed(); - - /** - * The connection was closed - */ - void socketClosed(); - - /** - * A error has occured. Handle the display of the message. - */ - void errorMessage( int type, const TQString &msg ); - -protected: - /** - * Convenience method: escape spaces with '%20' for use in the protocol. - * Doesn't escape any other sequence. - */ - TQString escape( const TQString &str ); - - /** - * And the other way round... - */ - TQString unescape( const TQString &str ); - - /** - * Set the online status. Emits onlineStatusChanged. - */ - void setOnlineStatus( OnlineStatus status ); - - /** - * This method is called directly before the socket will actually connect. - * Override in derived classes to setup whatever is needed before connect. - */ - virtual void aboutToConnect(); - - /** - * Directly after the connect, this method is called. The default - * implementation sets the OnlineStatus to Connected, be sure to override - * this if a handshake is required. - */ - virtual void doneConnect(); - - /** - * Directly after the disconnect, this method is called before the actual - * cleanup takes place. The socket is close here. Cleanup internal - * variables here. - */ - virtual void doneDisconnect(); - - /** - * Handle an MSN error condition. - * The default implementation displays a generic error message and - * closes the connection. Override to allow more graceful handling and - * possibly recovery. - */ - virtual void handleError( uint code, uint id ); - - /** - * Handle an MSN command response line. - * This method is pure virtual and *must* be overridden in derived - * classes. - */ - virtual void parseCommand( const TQString &cmd, uint id, - const TQString &data ) = 0; - - /** - * Used in MSNFileTransferSocket - */ - virtual void bytesReceived( const TQByteArray & ); - bool accept( KNetwork::TDEServerSocket * ); - void sendBytes( const TQByteArray &data ); - - const TQString &server() { return m_server; } - uint port() { return m_port; } - - /** - * The last confirmed ID by the server - */ - //uint m_lastId; - -private slots: - void slotDataReceived(); - /** - * If the socket emits a connectionFailed() then this slot is called - * to handle the error. - */ - void slotSocketError( int error ); - - /* - * Calls connectDone() when connection is successfully established. - */ - void slotConnectionSuccess(); - - /** - * Sets m_lookupProgress to 'Finished' if count > 0 or 'Failed' if count = 0. - */ - void slotHostFound( ); - - /** - * Check if new lines of data are available and process the first line - */ - void slotReadLine(); - - void slotSocketClosed(); - - //BEGIN Http - - /** - * Sends a poll request to the msn gateway when using HttpTransport. - * equivalent to sending a PNG command over TcpTransport. - */ - void slotHttpPoll(); - - //END - -protected slots: - virtual void slotReadyWrite(); - -private: - /** - * Check if we're waiting for a block of raw data. Emits blockRead() - * when the data is available. - * Returns true when still waiting and false when there is no pending - * read, or when the read is successfully handled. - */ - bool pollReadBlock(); - - /** - * The id of the message sent to the MSN server. This ID will increment - * for each subsequent message sent. - */ - uint m_id; - - /** - * Queue of pending commands (should be mostly empty, but is needed to - * send more than one command to the server) - */ - TQValueList<TQByteArray> m_sendQueue; - - /** - * Parse a single line of data. - * Will call either parseCommand or handleError depending on the type of - * data received. - */ - void parseLine( const TQString &str ); - - KNetwork::TDEBufferedSocket *m_socket; - OnlineStatus m_onlineStatus; - - TQString m_server; - uint m_port; - - /** - * The size of the requested block for block-based reads - */ - uint m_waitBlockSize; - - class Buffer : public TQByteArray - { - public: - Buffer( unsigned size = 0 ); - ~Buffer(); - void add( char *str, unsigned size ); - TQByteArray take( unsigned size ); - }; - - Buffer m_buffer; - - //BEGIN Http - - /** - * Makes a http request headers string using the specified, host, query, and content length. - * return: The string containing the http request headers. - */ - TQString makeHttpRequestString(const TQString& host, const TQString& query, uint contentLength); - - bool m_useHttp; // Indicates whether to use the msn http gateway to connect to the msn service. - bool m_bCanPoll; // Indicates whether polling of the http server is allowed. - bool m_bIsFirstInTransaction; // Indicates whether pending message to be sent is the first in the transaction. - // If so, the gateway is used. - // Use the gateway only for initial connected state; Otherwise, use the host. - TQString m_gateway; // Msn http gateway domain name. - TQString m_gwip; // The ip address of the msn gateway. - TQString m_sessionId; // session id. - TQTimer *m_timer; // Msn http poll timer. - TQString m_type; // Indicates the type of socket being used. NS or SB - bool m_pending; // Indicates whether a http response is pending. - int m_remaining; // Indicates how many bytes of content data remain - // to be received if the content bytes are sent in - // a seperate packet(s). - - /** - * Provides access to information returned from a URI request. - */ - class WebResponse - { - public: - WebResponse(const TQByteArray& bytes); - ~WebResponse(); - - /** - * Gets the headers associated with this response from the server. - */ - MimeMessage* getHeaders(); - /** - * Gets the data stream used to read the body of the response from the server. - */ - TQDataStream* getResponseStream(); - /** - * Gets the status code of the response. - */ - int getStatusCode(); - /** - * Gets the status description returned with the response. - */ - TQString getStatusDescription(); - - private: - MimeMessage *m_headers; - TQDataStream *m_stream; - int m_statusCode; - TQString m_statusDescription; - }; - - //END -}; - -#endif - diff --git a/kopete/protocols/msn/msnswitchboardsocket.cpp b/kopete/protocols/msn/msnswitchboardsocket.cpp deleted file mode 100644 index 77b7b550..00000000 --- a/kopete/protocols/msn/msnswitchboardsocket.cpp +++ /dev/null @@ -1,1142 +0,0 @@ -/* - msnswitchboardsocket.cpp - switch board connection socket - - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2006 by Olivier Goffart <ogoffart@ kde.org> - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - - -#include "msnswitchboardsocket.h" - -#include <stdlib.h> -#include <time.h> -#include <cmath> - -// qt -#include <tqstylesheet.h> -#include <tqregexp.h> -#include <tqimage.h> -#include <tqtimer.h> -#include <tqfile.h> -#include <tqfileinfo.h> - -// kde -#include <kdebug.h> -#include <tdemessagebox.h> -#include <tdeapplication.h> -#include <tdeaboutdata.h> -#include <tdetempfile.h> -#include <tdeconfig.h> -#include <kmdcodec.h> -#include <kstandarddirs.h> -#include <tdetempfile.h> - -// for the display picture -#include <msncontact.h> -#include "msnnotifysocket.h" - -//kopete -#include "msnaccount.h" -#include "msnprotocol.h" -#include "kopetemessage.h" -#include "kopetecontact.h" -#include "kopeteuiglobal.h" -#include "kopeteemoticons.h" -//#include "kopeteaccountmanager.h" -//#include "kopeteprotocol.h" - -#include "sha1.h" - -#include "dispatcher.h" -using P2P::Dispatcher; - -MSNSwitchBoardSocket::MSNSwitchBoardSocket( MSNAccount *account , TQObject *parent ) -: MSNSocket( parent ) -{ - m_account = account; - m_recvIcons=0; - m_emoticonTimer=0L; - m_chunks=0; - m_clientcapsSent=false; - m_dispatcher = 0l; - m_keepAlive = 0l; - m_keepAliveNb=0; -} - -MSNSwitchBoardSocket::~MSNSwitchBoardSocket() -{ - kdDebug(14140) << k_funcinfo << endl; - - TQMap<TQString , TQPair<TQString , KTempFile*> >::Iterator it; - for ( it = m_emoticons.begin(); it != m_emoticons.end(); ++it ) - { - delete it.data().second; - } -} - -void MSNSwitchBoardSocket::connectToSwitchBoard(TQString ID, TQString address, TQString auth) -{ - // we need these for the handshake later on (when we're connected) - m_ID = ID; - m_auth = auth; - - TQString server = address.left( address.find( ":" ) ); - uint port = address.right( address.length() - address.findRev( ":" ) - 1 ).toUInt(); - - TQObject::connect( this, TQT_SIGNAL( blockRead( const TQByteArray & ) ), - this, TQT_SLOT(slotReadMessage( const TQByteArray & ) ) ); - - TQObject::connect( this, TQT_SIGNAL( onlineStatusChanged( MSNSocket::OnlineStatus ) ), - this, TQT_SLOT( slotOnlineStatusChanged( MSNSocket::OnlineStatus ) ) ); - - TQObject::connect( this, TQT_SIGNAL( socketClosed( ) ), - this, TQT_SLOT( slotSocketClosed( ) ) ); - - connect( server, port ); -} - -void MSNSwitchBoardSocket::handleError( uint code, uint id ) -{ - kdDebug(14140) << k_funcinfo << endl; - - TQString msg; - MSNSocket::ErrorType type; - - switch( code ) - { - case 208: - { - msg = i18n( "Invalid user:\n" - "this MSN user does not exist; please check the MSN ID." ); - type = MSNSocket::ErrorServerError; - - userLeftChat(m_msgHandle , i18n("user never joined")); - break; - } - case 215: - { - msg = i18n( "The user %1 is already in this chat." ).arg( m_msgHandle ); - type = MSNSocket::ErrorServerError; - - //userLeftChat(m_msgHandle , i18n("user was twice in this chat") ); //(the user shouln't join there - break; - } - case 216: - { - msg = i18n( "The user %1 is online but has blocked you:\nyou can not talk to this user." ).arg( m_msgHandle ); - type = MSNSocket::ErrorInformation; - - userLeftChat(m_msgHandle, i18n("user blocked you")); - break; - } - case 217: - { - // TODO: we need to know the nickname instead of the handle. - msg = i18n( "The user %1 is currently not signed in.\n" "Messages will not be delivered." ).arg( m_msgHandle ); - type = MSNSocket::ErrorServerError; - - userLeftChat(m_msgHandle, i18n("user disconnected")); - break; - } - case 713: - { - TQString msg = i18n( "You are trying to invite too many contacts to this chat at the same time" ).arg( m_msgHandle ); - type = MSNSocket::ErrorInformation; - - userLeftChat(m_msgHandle, i18n("user blocked you")); - break; - } - case 911: - { - msg = i18n("Kopete MSN plugin has trouble authenticating with switchboard server."); - type = MSNSocket::ErrorServerError; - - break; - } - default: - MSNSocket::handleError( code, id ); - break; - } - - if( !msg.isEmpty() ) - emit errorMessage( type, msg ); -} - -void MSNSwitchBoardSocket::parseCommand( const TQString &cmd, uint id , - const TQString &data ) -{ - if( cmd == "NAK" ) - { - emit msgAcknowledgement(id, false); // msg was not accepted - } - else if( cmd == "ACK" ) - { - emit msgAcknowledgement(id, true); // msg has received - } - else if( cmd == "JOI" ) - { - // new user joins the chat, update user in chat list - TQString handle = data.section( ' ', 0, 0 ); - TQString screenname = unescape(data.section( ' ', 1, 1 )); - if( !m_chatMembers.contains( handle ) ) - m_chatMembers.append( handle ); - emit userJoined( handle, screenname, false ); - } - else if( cmd == "IRO" ) - { - // we have joined a multi chat session- this are the users in this chat - TQString handle = data.section( ' ', 2, 2 ); - if( !m_chatMembers.contains( handle ) ) - m_chatMembers.append( handle ); - - TQString screenname = unescape(data.section( ' ', 3, 3)); - emit userJoined( handle, screenname, true ); - } - else if( cmd == "USR" ) - { - slotInviteContact(m_msgHandle); - } - else if( cmd == "BYE" ) - { - // some has disconnect from chat, update user in chat list - cleanQueue(); //in case some message are waiting their emoticons, never mind, send them - - TQString handle = data.section( ' ', 0, 0 ).replace( "\r\n" , "" ); - userLeftChat( handle, (data.section( ' ', 1, 1 ) == "1" ) ? i18n("timeout") : TQString() ); - } - else if( cmd == "MSG" ) - { - TQString len = data.section( ' ', 2, 2 ); - - // we need to know who's sending is the block... - m_msgHandle = data.section( ' ', 0, 0 ); - - /*//This is WRONG! the displayName is never updated on the switchboeardsocket - //so we can't trust it. - //that's why the official client does not uptade alaws the nickname immediately. - if(m_account->contacts()[ m_msgHandle ]) - { - TQString displayName=data.section( ' ', 1, 1 ); - if(m_account->contacts()[ m_msgHandle ]->displayName() != displayName) - m_account->contacts()[ m_msgHandle ]->rename(displayName); - }*/ - - readBlock(len.toUInt()); - } -} - -void MSNSwitchBoardSocket::slotReadMessage( const TQByteArray &bytes ) -{ - TQString msg = TQString::fromUtf8(bytes, bytes.size()); - - TQRegExp rx("Content-Type: ([A-Za-z0-9/\\-]*)"); - rx.search(msg); - TQString type=rx.cap(1); - - rx=TQRegExp("User-Agent: ([A-Za-z0-9./\\-]*)"); - rx.search(msg); - TQString clientStr=rx.cap(1); - - if( !clientStr.isNull() && !m_msgHandle.isNull()) - { - Kopete::Contact *c=m_account->contacts()[m_msgHandle]; - if(c) - c->setProperty( MSNProtocol::protocol()->propClient , clientStr ); - } - - // incoming message for File-transfer - if( type== "text/x-msmsgsinvite" ) - { - emit invitation(m_msgHandle,msg); - } - else if( type== "text/x-msmsgscontrol" ) - { - TQString message; - message = msg.right( msg.length() - msg.findRev( " " ) - 1 ); - message = message.replace( "\r\n" ,"" ); - emit receivedTypingMsg( message.lower(), true ); - } - else if(type == "text/x-msnmsgr-datacast") - { - if(msg.contains("ID:")) - { - TQRegExp rx("ID: ([0-9]*)"); - rx.search(msg); - uint dataCastId = rx.cap(1).toUInt(); - if( dataCastId == 1 ) - { - kdDebug(14140) << k_funcinfo << "Received a nudge !" << endl; - emit nudgeReceived(m_msgHandle); - } - } - } - else if(type=="text/plain" /* || type.isEmpty()*/ ) - { - // Some MSN Clients (like CCMSN) don't like to stick to the rules. - // In case of CCMSN, it doesn't send what the content type is when - // sending a text message. So if it's not supplied, we'll just - // assume its that. - - TQColor fontColor; - TQFont font; - - if ( msg.contains( "X-MMS-IM-Format" ) ) - { - TQString fontName; - TQString fontInfo; - TQString color; - - rx=TQRegExp("X-MMS-IM-Format: ([^\r\n]*)"); - rx.search(msg); - fontInfo =rx.cap(1); - - color = parseFontAttr(fontInfo, "CO"); - - // FIXME: this is so BAAAAAAAAAAAAD :( - if (!color.isEmpty() && color.toInt(0,16)!=0) - { - if ( color.length() == 2) // only #RR (red color) given - fontColor.setRgb( - color.mid(0,2).toInt(0,16), - 0, - 0); - else if ( color.length() == 4) // #GGRR (green, red) given. - { - fontColor.setRgb( - color.mid(2,2).toInt(0,16), - color.mid(0,2).toInt(0,16), - 0); - } - else if ( color.length() == 6) // full #BBGGRR given - { - fontColor.setRgb( - color.mid(4,2).toInt(0, 16), - color.mid(2,2).toInt(0,16), - color.mid(0,2).toInt(0,16)); - } - } - - fontName = parseFontAttr(fontInfo, "FN").replace( "%20" , " " ); - - // Some clients like Trillian and Kopete itself send a font - // name of 'MS Serif' since MS changed the server to - // _require_ a font name specified in june 2002. - // MSN's own client defaults to 'MS Sans Serif', which also - // has issues. - // Handle 'MS Serif' and 'MS Sans Serif' as an empty font name - if( !fontName.isEmpty() && fontName != "MS Serif" && fontName != "MS Sans Serif" ) - { - TQString ef=parseFontAttr( fontInfo, "EF" ); - - font = TQFont( fontName, - parseFontAttr( fontInfo, "PF" ).toInt(), // font size - ef.contains( 'B' ) ? TQFont::Bold : TQFont::Normal, - ef.contains( 'I' ) ); - font.setUnderline(ef.contains( 'U' )); - font.setStrikeOut(ef.contains( 'S' )); - } - } - - TQPtrList<Kopete::Contact> others; - others.append( m_account->myself() ); - TQStringList::iterator it2; - for( it2 = m_chatMembers.begin(); it2 != m_chatMembers.end(); ++it2 ) - { - if( *it2 != m_msgHandle ) - others.append( m_account->contacts()[ *it2 ] ); - } - - TQString message=msg.right( msg.length() - msg.find("\r\n\r\n") - 4 ); - - //Stupid MSN PLUS colors code. message with incorrect charactere are not showed correctly in the chatwindow. - //TODO: parse theses one to show the color too in Kopete - message.replace("\3","").replace("\4","").replace("\2","").replace("\5","").replace("\6","").replace("\7",""); - - if(!m_account->contacts()[m_msgHandle]) - { - //this may happens if the contact has been deleted. - kdDebug(14140) << k_funcinfo <<"WARNING: contact is null, adding it" <<endl; - if( !m_chatMembers.contains( m_msgHandle ) ) - m_chatMembers.append( m_msgHandle ); - emit userJoined( m_msgHandle , m_msgHandle , false); - } - - Kopete::Message kmsg( m_account->contacts()[ m_msgHandle ], others, - message, - Kopete::Message::Inbound , Kopete::Message::PlainText ); - - kmsg.setFg( fontColor ); - kmsg.setFont( font ); - - rx=TQRegExp("Chunks: ([0-9]*)"); - rx.search(msg); - unsigned int chunks=rx.cap(1).toUInt(); - rx=TQRegExp("Chunk: ([0-9]*)"); - rx.search(msg); - unsigned int chunk=rx.cap(1).toUInt(); - - if(chunk != 0 && !m_msgQueue.isEmpty()) - { - TQString msg=m_msgQueue.last().plainBody(); - m_msgQueue.pop_back(); //removes the last item - kmsg.setBody( msg+ message, Kopete::Message::PlainText ); - } - - if(chunk == 0 ) - m_chunks=chunks; - else if(chunk+1 >= m_chunks) - m_chunks=0; - - if ( m_recvIcons > 0 || m_chunks > 0) - { //Some custom emoticons are waiting to be received. so append the message to the queue - //Or the message has not been fully received, so same thing - kdDebug(14140) << k_funcinfo << "Message not fully received => append to queue. Emoticon left: " << m_recvIcons << " chunks: " << chunk+1 << " of " << m_chunks <<endl; - m_msgQueue.append( kmsg ); - if(!m_emoticonTimer) //to be sure no message will be lost, we will appends message to - { // the queue in 15 secondes even if we have not received emoticons - m_emoticonTimer=new TQTimer(this); - TQObject::connect(m_emoticonTimer , TQT_SIGNAL(timeout()) , this, TQT_SLOT(cleanQueue())); - m_emoticonTimer->start( 15000 , true ); - } - } - else - emit msgReceived( parseCustomEmoticons( kmsg ) ); - - } - else if( type== "text/x-mms-emoticon" || type== "text/x-mms-animemoticon") - { - // TODO remove Displatcher. - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if ( config->readBoolEntry( "useCustomEmoticons", true ) ) - { - TQRegExp rx("([^\\s]*)[\\s]*(<msnobj [^>]*>)"); - rx.setMinimal(true); - int pos = rx.search(msg); - while( pos != -1) - { - TQString msnobj=rx.cap(2); - TQString txt=rx.cap(1); - kdDebug(14140) << k_funcinfo << "emoticon: " << txt << " msnobj: " << msnobj<< endl; - - if( !m_emoticons.contains(msnobj) || !m_emoticons[msnobj].second ) - { - m_emoticons.insert(msnobj, tqMakePair(txt,(KTempFile*)0L)); - MSNContact *c=static_cast<MSNContact*>(m_account->contacts()[m_msgHandle]); - if(!c) - return; - - // we are receiving emoticons, so delay message display until received signal - m_recvIcons++; - PeerDispatcher()->requestDisplayIcon(m_msgHandle, msnobj); - } - pos=rx.search(msg, pos+rx.matchedLength()); - } - } - } - else if( type== "application/x-msnmsgrp2p" ) - { - PeerDispatcher()->slotReadMessage(m_msgHandle, bytes); - } - else if( type == "text/x-clientcaps" ) - { - rx=TQRegExp("Client-Name: ([A-Za-z0-9.$!*/% \\-]*)"); - rx.search(msg); - clientStr=unescape( rx.cap(1) ); - - if( !clientStr.isNull() && !m_msgHandle.isNull()) - { - Kopete::Contact *c=m_account->contacts()[m_msgHandle]; - if(c) - c->setProperty( MSNProtocol::protocol()->propClient , clientStr ); - } - - if(!m_clientcapsSent) - { - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - - TQString JabberID; - if(config->readBoolEntry("SendJabber", true)) - JabberID=config->readEntry("JabberAccount"); - - if(!JabberID.isEmpty()) - JabberID="JabberID: "+JabberID +"\r\n"; - - if( config->readBoolEntry("SendClientInfo", true) || !JabberID.isEmpty()) - { - - TQCString message = TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-clientcaps\r\n" - "Client-Name: Kopete/"+escape(kapp->aboutData()->version())+"\r\n" - +JabberID+ - "\r\n" ).utf8(); - - TQString args = "U"; - sendCommand( "MSG", args, true, message ); - } - m_clientcapsSent=true; - } - - - } - else if(type == "image/gif" || msg.contains("Message-ID:")) - { - // Incoming inkformatgif. - TQRegExp regex("Message-ID: \\{([0-9A-F\\-]*)\\}"); - regex.search(msg); - TQString messageId = regex.cap(1); - regex = TQRegExp("Chunks: (\\d+)"); - regex.search(msg); - TQString chunks = regex.cap(1); - regex = TQRegExp("Chunk: (\\d+)"); - regex.search(msg); - TQString chunk = regex.cap(1); - - if(!messageId.isNull()) - { - bool valid = true; - // Retrieve the nmber of data chunks. - TQ_UINT32 numberOfChunks = chunks.toUInt(&valid); - if(valid && (numberOfChunks > 1)) - { - regex = TQRegExp("base64:([0-9a-zA-Z+/=]+)"); - regex.search(msg); - // Retrieve the first chunk of the ink format gif. - TQString base64 = regex.cap(1); - // More chunks are expected, buffer the chunk received. - InkMessage inkMessage; - inkMessage.chunks = numberOfChunks; - inkMessage.data += base64; - m_inkMessageBuffer.insert(messageId, inkMessage); - } - } - else - { - // There is only one chunk of data. - regex = TQRegExp("base64:([0-9a-zA-Z+/=]*)"); - regex.search(msg); - // Retrieve the base64 encoded ink data. - TQString data = regex.cap(1); - DispatchInkMessage(data); - } - - if(!messageId.isNull()) - { - if(m_inkMessageBuffer.contains(messageId)) - { - if(chunks.isNull()) - { - InkMessage inkMessage = m_inkMessageBuffer[messageId]; - inkMessage.data += msg.section("\r\n\r\n", -1); - if(inkMessage.chunks == chunk.toUInt() + 1) - { - DispatchInkMessage(inkMessage.data); - // Remove the ink message from the buffer. - m_inkMessageBuffer.remove(messageId); - } - } - } - } - } - else - { - kdDebug(14140) << k_funcinfo <<" Unknown type '" << type << "' message: \n"<< msg <<endl; - } -} - -void MSNSwitchBoardSocket::DispatchInkMessage(const TQString& base64String) -{ - TQByteArray image; - // Convert from base64 encoded string to byte array. - KCodecs::base64Decode(base64String.utf8() , image); - KTempFile *inkImage = new KTempFile(locateLocal( "tmp", "inkformatgif-" ), ".gif"); - inkImage->setAutoDelete(true); - inkImage->file()->writeBlock(image.data(), image.size()); - inkImage->file()->close(); - - slotEmoticonReceived(inkImage , "inkformatgif"); - inkImage = 0l; -} - -void MSNSwitchBoardSocket::sendTypingMsg( bool isTyping ) -{ - if( !isTyping ) - return; - - if ( onlineStatus() != Connected || m_chatMembers.empty()) - { - //we are not yet in a chat. - //if we send that command now, we may get disconnected. - return; - } - - - TQCString message = TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msmsgscontrol\r\n" - "TypingUser: " + m_myHandle + "\r\n" - "\r\n" ).utf8(); - - // Length is appended by sendCommand() - TQString args = "U"; - sendCommand( "MSG", args, true, message ); -} - -// this Invites an Contact -void MSNSwitchBoardSocket::slotInviteContact(const TQString &handle) -{ - m_msgHandle=handle; - sendCommand( "CAL", handle ); -} -// -// Send a custum emoticon -// -int MSNSwitchBoardSocket::sendCustomEmoticon(const TQString &name, const TQString &filename) -{ - TQString picObj; - - //try to find it in the cache. - const TQMap<TQString, TQString> objectList = PeerDispatcher()->objectList; - for (TQMap<TQString,TQString>::ConstIterator it = objectList.begin(); it != objectList.end(); ++it ) - { - if(it.data() == filename) - { - picObj=it.key(); - break; - } - } - - if(picObj.isNull()) - { //if not found in the cache, generate the picture object - TQFileInfo fi(filename); - // open the icon file - TQFile pictFile(fi.filePath()); - if (pictFile.open(IO_ReadOnly)) { - - TQByteArray ar = pictFile.readAll(); - pictFile.close(); - - TQString sha1d = TQString(KCodecs::base64Encode(SHA1::hash(ar))); - TQString size = TQString::number( pictFile.size() ); - TQString all = "Creator" + m_account->accountId() + "Size" + size + "Type2Location" + fi.fileName() + "FriendlyAAA=SHA1D" + sha1d; - TQString sha1c = TQString(KCodecs::base64Encode(SHA1::hashString(all.utf8()))); - picObj = "<msnobj Creator=\"" + m_account->accountId() + "\" Size=\"" + size + "\" Type=\"2\" Location=\""+ fi.fileName() + "\" Friendly=\"AAA=\" SHA1D=\""+sha1d+ "\" SHA1C=\""+sha1c+"\"/>"; - - PeerDispatcher()->objectList.insert(picObj, filename); - } - else - return 0; - } - - TQString msg = "MIME-Version: 1.0\r\n" - "Content-Type: text/x-mms-emoticon\r\n" - "\r\n" + - name + "\t" + picObj + "\t\r\n"; - - return sendCommand("MSG", "A", true, msg.utf8()); - -} - -// this sends a short message to the server -int MSNSwitchBoardSocket::sendMsg( const Kopete::Message &msg ) -{ - if ( onlineStatus() != Connected || m_chatMembers.empty()) - { -// m_messagesQueue.append(msg); - return -1; - } - -#if 0 //this is to test webcam - if(msg.plainBody().contains("/webcam")) - { - PeerDispatcher()->startWebcam( m_myHandle , m_msgHandle); - return -3; - } -#endif - - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - if ( config->readBoolEntry( "exportEmoticons", false ) ) - { - TQMap<TQString, TQStringList> emap = Kopete::Emoticons::self()->emoticonAndPicList(); - - // Check the list for any custom emoticons - for (TQMap<TQString, TQStringList>::const_iterator itr = emap.begin(); itr != emap.end(); itr++) - { - for ( TQStringList::const_iterator itr2 = itr.data().constBegin(); itr2 != itr.data().constEnd(); ++itr2 ) - { - if ( msg.plainBody().contains( *itr2 ) ) - sendCustomEmoticon( *itr2, itr.key() ); - } - } - } - - if( msg.format() & Kopete::Message::RichText ) - { - TQRegExp regex("^\\s*<img src=\"([^>\"]+)\"[^>]*>\\s*$"); - if(regex.search(msg.escapedBody()) != -1) - { - // FIXME why are we sending the images.. the contact should request them. - PeerDispatcher()->sendImage(regex.cap(1), m_msgHandle); - return -3; - } - } - - // User-Agent is not a official flag, but PIDGIN has it - TQString UA; - if( config->readBoolEntry("SendClientInfo", true) ) - { - UA="User-Agent: Kopete/"+escape(kapp->aboutData()->version())+"\r\n"; - } - - TQString head = - "MIME-Version: 1.0\r\n" - "Content-Type: text/plain; charset=UTF-8\r\n" - +UA+ - "X-MMS-IM-Format: "; - - if(msg.font() != TQFont() ) - { - //It's verry strange that if the font name is bigger than 31 char, the _server_ close the socket and don't deliver the message. - // the real question is why ? my guess is that MS patched the server because a bug in their client, but that's just a guess. - // - Olivier 06-2005 - head += "FN=" + escape( msg.font().family().left(31)); - head += "; EF="; - if(msg.font().bold()) - head += "B"; - if(msg.font().italic()) - head += "I"; - if(msg.font().strikeOut()) - head += "S"; - if(msg.font().underline()) - head += "U"; - head += "; "; - } - else head+="FN=; EF=; "; - /* - * I don't know what to set by default, so i decided to set nothing. CF Bug 82734 - * (but don't forgeto to add an empty FN= and EF= , or webmessenger will break. (CF Bug 102371) ) - else head+="FN=MS%20Serif; EF=; "; - */ - - // Color support - if (msg.fg().isValid()) - { - TQString colorCode = TQColor(msg.fg().blue(),msg.fg().green(),msg.fg().red()).name().remove(0,1); //colors aren't sent in RGB but in BGR (O.G.) - head += "CO=" + colorCode; - } - else - { - head += "CO=0"; - } - - head += "; CS=0; PF=0"; - if (msg.plainBody().isRightToLeft()) - head += "; RL=1"; - head += "\r\n"; - - TQString message= msg.plainBody().replace( "\n" , "\r\n" ); - - //-- Check if the message isn't too big, TODO: do that at the libkopete level. - int len_H=head.utf8().length(); // != head.length() because i need the size in butes and - int len_M=message.utf8().length(); // some utf8 char may be longer than one byte - if( len_H+len_M >= 1660 ) //1664 is the maximum size of messages allowed by the server - { - //We will certenly split the message in several ones. - //It's possible to made the opposite client join them, as explained in this MS Word document - //http://www.bot-depot.com/forums/index.php?act=Attach&type=post&id=35110 - - head+="Message-ID: {7B7B34E6-7A8D-44FF-926C-1799156B58"+TQString::number( rand()%10)+TQString::number( rand()%10)+"}\r\n"; - int len_H=head.utf8().length()+ 14; //14 is the size of "Chunks: x" - //this is the size of each part of the message (excluding the header) - int futurmessages_size=1400; //1400 is a common good size - //int futurmessages_size=1664-len_H; - - int nb=(int)ceil((float)(len_M)/(float)(futurmessages_size)); - - if(KMessageBox::warningContinueCancel(0L /* FIXME: we should try to find a parent somewere*/ , - i18n("The message you are trying to send is too long; it will be split into %1 messages.").arg(nb) , - i18n("Message too big - MSN Plugin" ), KStdGuiItem::cont() , "SendLongMessages" ) - == KMessageBox::Continue ) - { - int place=0; - int result; - int chunk=0; - do - { - TQString m=message.mid(place, futurmessages_size); - place += futurmessages_size; - - //make sure the size is not too big because of utf8 - int d=m.utf8().length() + len_H -1664; - if( d > 0 ) - {//it contains some utf8 chars, so we strip the string a bit. - m=m.left( futurmessages_size - d ); - place -= d; - } - - //try to snip on space if possible - int len=m.length(); - d=0; - while(d<200 && !m[len-d].isSpace() ) - d++; - if(d<200) - { - m=m.left(len-d); - place -= d; - } - TQString chunk_str; - if(chunk==0) - chunk_str="Chunks: "+TQString::number(nb)+"\r\n"; - else if(chunk<nb) - chunk_str="Chunk: "+TQString::number(chunk)+"\r\n"; - else - { - kdDebug(14140) << k_funcinfo <<"The message is slit in more than initially estimated" <<endl; - } - result=sendCommand( "MSG", "A", true, (head+chunk_str+"\r\n"+m).utf8() ); - chunk++; - } - while(place < len_M) ; - - while(chunk<nb) - { - kdDebug(14140) << k_funcinfo <<"The message is plit in less than initially estimated. Sending empty message to complete" <<endl; - TQString chunk_str="Chunk: "+TQString::number(chunk); - sendCommand( "MSG", "A", true, (head+chunk_str+"\r\n").utf8() ); - chunk++; - } - return result; - } - return -2; //the message hasn't been sent. - } - - if(!m_keepAlive) - { - m_keepAliveNb=20; - m_keepAlive=new TQTimer(this); - TQObject::connect(m_keepAlive, TQT_SIGNAL(timeout()) , this , TQT_SLOT(slotKeepAliveTimer())); - m_keepAlive->start(50*1000); - } - - - return sendCommand( "MSG", "A", true, (head+"\r\n"+message).utf8() ); -} - -void MSNSwitchBoardSocket::slotSocketClosed( ) -{ - for( TQStringList::Iterator it = m_chatMembers.begin(); it != m_chatMembers.end(); ++it ) - { - emit userLeft( (*it), i18n("connection closed")); - } - - // we have lost the connection, send a message to chatwindow (this will not displayed) -// emit switchBoardIsActive(false); - emit switchBoardClosed( ); -} - -void MSNSwitchBoardSocket::slotCloseSession() -{ - sendCommand( "OUT", TQString(), false ); - disconnect(); -} - -// Check if we are connected. If so, then send the handshake. -void MSNSwitchBoardSocket::slotOnlineStatusChanged( MSNSocket::OnlineStatus status ) -{ - if (status == Connected) - { - TQCString command; - TQString args; - - if( !m_ID ) // we're inviting - { - command = "USR"; - args = m_myHandle + " " + m_auth; - } - else // we're invited - { - command = "ANS"; - args = m_myHandle + " " + m_auth + " " + m_ID; - } - sendCommand( command, args ); - - if(!m_keepAlive) - { - m_keepAliveNb=20; - m_keepAlive=new TQTimer(this); - TQObject::connect(m_keepAlive, TQT_SIGNAL(timeout()) , this , TQT_SLOT(slotKeepAliveTimer())); - m_keepAlive->start(50*1000); - } - } -} - -void MSNSwitchBoardSocket::userLeftChat(const TQString& handle , const TQString &reason) -{ - emit userLeft( handle, reason ); - - if( m_chatMembers.contains( handle ) ) - m_chatMembers.remove( handle ); - - if(m_chatMembers.isEmpty()) - disconnect(); -} - -void MSNSwitchBoardSocket::requestDisplayPicture() -{ - MSNContact *contact = static_cast<MSNContact*>(m_account->contacts()[m_msgHandle]); - if(!contact) return; - - PeerDispatcher()->requestDisplayIcon(m_msgHandle, contact->object()); -} - -void MSNSwitchBoardSocket::slotEmoticonReceived( KTempFile *file, const TQString &msnObj ) -{ - kdDebug(14141) << k_funcinfo << msnObj << endl; - - if(m_emoticons.contains(msnObj)) - { //it's an emoticon - m_emoticons[msnObj].second=file; - - if( m_recvIcons > 0 ) - m_recvIcons--; - kdDebug(14140) << k_funcinfo << "emoticons received queue is now: " << m_recvIcons << endl; - - if ( m_recvIcons <= 0 ) - cleanQueue(); - } - else if(msnObj == "inkformatgif") - { - TQString msg=i18n("<img src=\"%1\" alt=\"Typewrited message\" />" ).arg( file->name() ); - - kdDebug(14140) << k_funcinfo << file->name() <<endl; - - m_typewrited.append(file); - m_typewrited.setAutoDelete(true); - - TQPtrList<Kopete::Contact> others; - others.append( m_account->myself() ); - - TQStringList::iterator it2; - for( it2 = m_chatMembers.begin(); it2 != m_chatMembers.end(); ++it2 ) - { - if( *it2 != m_msgHandle ) - others.append( m_account->contacts()[ *it2 ] ); - } - - if(!m_account->contacts()[m_msgHandle]) - { - //this may happens if the contact has been deleted. - kdDebug(14140) << k_funcinfo <<"WARNING: contact is null, adding it" <<endl; - if( !m_chatMembers.contains( m_msgHandle ) ) - m_chatMembers.append( m_msgHandle ); - emit userJoined( m_msgHandle , m_msgHandle , false); - } - - Kopete::Message kmsg( m_account->contacts()[ m_msgHandle ], others, - msg, Kopete::Message::Inbound , Kopete::Message::RichText ); - - emit msgReceived( kmsg ); - } - else //if it is not an emoticon, - { // it's certenly the displaypicture. - MSNContact *c=static_cast<MSNContact*>(m_account->contacts()[m_msgHandle]); - if(c && c->object()==msnObj) - c->setDisplayPicture(file); - else - delete file; - } -} - -void MSNSwitchBoardSocket::slotIncomingFileTransfer(const TQString& from, const TQString& /*fileName*/, TQ_INT64 /*fileSize*/) -{ - TQPtrList<Kopete::Contact> others; - others.append( m_account->myself() ); - TQStringList::iterator it2; - for( it2 = m_chatMembers.begin(); it2 != m_chatMembers.end(); ++it2 ) - { - if( *it2 != m_msgHandle ) - others.append( m_account->contacts()[ *it2 ] ); - } - - if(!m_account->contacts()[m_msgHandle]) - { - //this may happens if the contact has been deleted. - kdDebug(14140) << k_funcinfo <<"WARNING: contact is null, adding it" <<endl; - if( !m_chatMembers.contains( m_msgHandle ) ) - m_chatMembers.append( m_msgHandle ); - emit userJoined( m_msgHandle , m_msgHandle , false); - } - TQString invite = "Incoming file transfer."; - Kopete::Message msg = - Kopete::Message(m_account->contacts()[from], others, invite, Kopete::Message::Internal, Kopete::Message::PlainText); - emit msgReceived(msg); -} - -void MSNSwitchBoardSocket::cleanQueue() -{ - if(m_emoticonTimer) - { - m_emoticonTimer->stop(); - m_emoticonTimer->deleteLater(); - m_emoticonTimer=0L; - } - kdDebug(14141) << k_funcinfo << m_msgQueue.count() << endl; - - TQValueList<const Kopete::Message>::Iterator it_msg; - for ( it_msg = m_msgQueue.begin(); it_msg != m_msgQueue.end(); ++it_msg ) - { - Kopete::Message kmsg = (*it_msg); - emit msgReceived( parseCustomEmoticons( kmsg ) ); - } - m_msgQueue.clear(); -} - -Kopete::Message &MSNSwitchBoardSocket::parseCustomEmoticons(Kopete::Message &kmsg) -{ - TQString message=kmsg.escapedBody(); - TQMap<TQString , TQPair<TQString , KTempFile*> >::Iterator it; - for ( it = m_emoticons.begin(); it != m_emoticons.end(); ++it ) - { - TQString es=TQStyleSheet::escape(it.data().first); - KTempFile *f=it.data().second; - if(message.contains(es) && f) - { - TQString imgPath = f->name(); - TQImage iconImage(imgPath); - /* We don't use a comple algoritm (like the one in the #if) because the msn client shows - * emoticons like that. So, in that case, we show like the MSN client */ - #if 0 - TQString em = TQRegExp::escape( es ); - message.replace( TQRegExp(TQString::fromLatin1( "(^|[\\W\\s]|%1)(%2)(?!\\w)" ).arg(em).arg(em)), - TQString::fromLatin1("\\1<img align=\"center\" width=\"") + - #endif - //match any occurence which is not in a html tag. - message.replace( TQRegExp(TQString::fromLatin1("%1(?![^><]*>)").arg(TQRegExp::escape(es))), - TQString::fromLatin1("<img align=\"center\" width=\"") + - TQString::number(iconImage.width()) + - TQString::fromLatin1("\" height=\"") + - TQString::number(iconImage.height()) + - TQString::fromLatin1("\" src=\"") + imgPath + - TQString::fromLatin1("\" title=\"") + es + - TQString::fromLatin1("\" alt=\"") + es + - TQString::fromLatin1( "\"/>" ) ); - kmsg.setBody(message, Kopete::Message::RichText); - } - } - return kmsg; -} - -int MSNSwitchBoardSocket::sendNudge() -{ - TQCString message = TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-msnmsgr-datacast\r\n" - "\r\n" - "ID: 1\r\n" - "\r\n\r\n" ).utf8(); - - TQString args = "U"; - return sendCommand( "MSG", args, true, message ); -} - - - -// FIXME: This is nasty... replace with a regexp or so. -TQString MSNSwitchBoardSocket::parseFontAttr(TQString str, TQString attr) -{ - TQString tmp; - int pos1=0, pos2=0; - - pos1 = str.find(attr + "="); - - if (pos1 == -1) - return ""; - - pos2 = str.find(";", pos1+3); - - if (pos2 == -1) - tmp = str.mid(pos1+3, str.length() - pos1 - 3); - else - tmp = str.mid(pos1+3, pos2 - pos1 - 3); - - return tmp; -} - -Dispatcher* MSNSwitchBoardSocket::PeerDispatcher() -{ - if(!m_dispatcher) - { - // Create a new msnslp dispatcher to handle - // all peer to peer requests. - TQStringList ip; - if(m_account->notifySocket()) - { - ip << m_account->notifySocket()->localIP(); - if(m_account->notifySocket()->localIP() != m_account->notifySocket()->getLocalIP()) - ip << m_account->notifySocket()->getLocalIP(); - } - m_dispatcher = new Dispatcher(this, m_account->accountId(),ip ); - -// TQObject::connect(this, TQT_SIGNAL(blockRead(const TQByteArray&)), m_dispatcher, TQT_SLOT(slotReadMessage(const TQByteArray&))); -// TQObject::connect(m_dispatcher, TQT_SIGNAL(sendCommand(const TQString&, const TQString&, bool, const TQByteArray&, bool)), this, TQT_SLOT(sendCommand(const TQString&, const TQString&, bool, const TQByteArray&, bool))); - TQObject::connect(m_dispatcher, TQT_SIGNAL(incomingTransfer(const TQString&, const TQString&, TQ_INT64)), this, TQT_SLOT(slotIncomingFileTransfer(const TQString&, const TQString&, TQ_INT64))); - TQObject::connect(m_dispatcher, TQT_SIGNAL(displayIconReceived(KTempFile *, const TQString&)), this, TQT_SLOT(slotEmoticonReceived( KTempFile *, const TQString&))); - TQObject::connect(this, TQT_SIGNAL(msgAcknowledgement(unsigned int, bool)), m_dispatcher, TQT_SLOT(messageAcknowledged(unsigned int, bool))); - m_dispatcher->m_pictureUrl = m_account->pictureUrl(); - } - return m_dispatcher; -} - -void MSNSwitchBoardSocket::slotKeepAliveTimer( ) -{ - /* - This is a workaround against the bug 113425 - The problem: the P2P::Webcam class is parent of us, and when we get deleted, it get deleted. - the correct solution would be to change that. - The second problem: after one minute of inactivity, the official client close the chat socket. - the workaround: we simulate the activity by sending small packet each 50 seconds - the nice side effect: the "xxx has closed the chat" is now meaningfull - the bad side effect: some switchboard connection may be maintained for really long time! - */ - - if ( onlineStatus() != Connected || m_chatMembers.empty()) - { - //we are not yet in a chat. - //if we send that command now, we may get disconnected. - return; - } - - - TQCString message = TQString( "MIME-Version: 1.0\r\n" - "Content-Type: text/x-keepalive\r\n" - "\r\n" ).utf8(); - - // Length is appended by sendCommand() - TQString args = "U"; - sendCommand( "MSG", args, true, message ); - - m_keepAliveNb--; - if(m_keepAliveNb <= 0) - { - m_keepAlive->deleteLater(); - m_keepAlive=0L; - } -} - -#include "msnswitchboardsocket.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/msnswitchboardsocket.h b/kopete/protocols/msn/msnswitchboardsocket.h deleted file mode 100644 index e47ebdfe..00000000 --- a/kopete/protocols/msn/msnswitchboardsocket.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - msnswitchboardsocket.h - switch board connection socket - - Copyright (c) 2002 by Martijn Klingens <[email protected]> - Copyright (c) 2002-2006 by Olivier Goffart <ogoffart@ kde.org> - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - Portions of this code are taken from KMerlin, - (c) 2001 by Olaf Lueg <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNSWITCHBOARDSOCKET_H -#define MSNSWITCHBOARDSOCKET_H - -#include <tqobject.h> -#include <tqstrlist.h> -#include <tqvaluevector.h> - -#include <kstringhandler.h> - -#include "msnsocket.h" - -namespace Kopete { class Message; } -class MSNAccount; -class TQTimer; - -class MSNP2PDisplatcher; -class KTempFile; - -namespace P2P { class Dispatcher; } - -#include "dispatcher.h" - -class KOPETE_EXPORT MSNSwitchBoardSocket : public MSNSocket -{ - Q_OBJECT - - -public: - /** - * Contructor: id is the KopeteMessageMangager's id - */ - MSNSwitchBoardSocket( MSNAccount * account , TQObject *parent); - ~MSNSwitchBoardSocket(); - -private: - P2P::Dispatcher *m_dispatcher; - MSNAccount *m_account; - - TQString m_myHandle; // our handle - - // contains the handle of the last person that msg'ed us. - // since we receive the actual message by readBlock(), we need - // to remember what the handle was of the person sending us the message. - TQString m_msgHandle; - - TQString m_ID; - TQString m_auth; - TQStringList m_chatMembers; - - //used for emoticons - TQValueList<const Kopete::Message> m_msgQueue; - unsigned m_recvIcons; - TQMap<TQString , TQPair<TQString , KTempFile*> > m_emoticons; - Kopete::Message &parseCustomEmoticons(Kopete::Message &msg); - TQTimer *m_emoticonTimer; - TQPtrList<KTempFile> m_typewrited; - - struct InkMessage{ - TQ_UINT32 chunks; - TQString data; - }; - TQMap<TQString, InkMessage> m_inkMessageBuffer; - - /** the number of chunk for currents messages */ - unsigned int m_chunks; - - /** true is we already sent the x-clientcaps message */ - bool m_clientcapsSent; - -private: - void DispatchInkMessage(const TQString &base64String); - -protected: - /** - * Handle an MSN command response line. - */ - virtual void parseCommand( const TQString &cmd, uint id, - const TQString &data ); - - /** - * Handle exceptions that might occur during a chat. - */ - virtual void handleError( uint code, uint id ); - - TQString parseFontAttr( TQString str, TQString attr ); - - -public: - void connectToSwitchBoard( TQString ID, TQString address, TQString auth ); - void setHandle( TQString handle ) { m_myHandle = handle; } - void setMsgHandle( TQString handle ) { m_msgHandle = handle; } - - const TQStringList &chatMembers() { return m_chatMembers; } - - void userLeftChat( const TQString &handle , const TQString &reason ); - int sendMsg( const Kopete::Message &msg ); - int sendCustomEmoticon(const TQString &name, const TQString &filename); - - int sendNudge(); - - P2P::Dispatcher* PeerDispatcher(); - -public slots: - void slotCloseSession(); - void slotInviteContact(const TQString &handle); - - /** - * Notify the server that the user is typing a message - */ - void sendTypingMsg( bool isTyping ); - - void requestDisplayPicture(); - - /** workaround Bug 113425 . see slotKeepAliveTimer() **/ - TQTimer *m_keepAlive; - int m_keepAliveNb; - - - -private slots: - void slotOnlineStatusChanged( MSNSocket::OnlineStatus status ); - void slotSocketClosed( ); - void slotReadMessage( const TQByteArray &bytes ); - void slotEmoticonReceived( KTempFile *, const TQString& ); - void slotIncomingFileTransfer(const TQString& from, const TQString& fileName, TQ_INT64 fileSize); - void cleanQueue(); - - /** workaround Bug 113425 . see comment inside the function **/ - void slotKeepAliveTimer(); - -signals: - void msgReceived( Kopete::Message &msg ); - void receivedTypingMsg( const TQString &contactId, bool isTyping ); - void msgAcknowledgement(unsigned int, bool); - void userJoined(const TQString& handle , const TQString &publicName , bool IRO); - void userLeft(const TQString& handle , const TQString &reason); - void nudgeReceived(const TQString &handle); - - void switchBoardClosed( ); - void invitation(const TQString& handle, const TQString& msg); - -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/outgoingtransfer.cpp b/kopete/protocols/msn/outgoingtransfer.cpp deleted file mode 100644 index 5d66c495..00000000 --- a/kopete/protocols/msn/outgoingtransfer.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/* - outgoingtransfer.cpp - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "outgoingtransfer.h" - -#include <stdlib.h> - -// Kde includes -#include <kbufferedsocket.h> -#include <kdebug.h> -#include <tdelocale.h> -#include <kmdcodec.h> -using namespace KNetwork; - -// TQt includes -#include <tqfile.h> -#include <tqregexp.h> -#include <tqtimer.h> - -// Kopete includes -#include <kopetetransfermanager.h> - -#include <netinet/in.h> // For htonl -using P2P::TransferContext; -using P2P::Dispatcher; -using P2P::OutgoingTransfer; -using P2P::Message; - -OutgoingTransfer::OutgoingTransfer(const TQString& to, P2P::Dispatcher *dispatcher, TQ_UINT32 sessionId) -: TransferContext(to,dispatcher,sessionId) -{ - m_direction = Outgoing; - m_handshake = 0x01; -} - -OutgoingTransfer::~OutgoingTransfer() -{ - kdDebug(14140) << k_funcinfo << endl; -} - -void OutgoingTransfer::sendImage(const TQByteArray& image) -{ - -// TODO TQByteArray base64 = KCodecs::base64Encode(image); -// -// TQCString body = "MIME-Version: 1.0\r\n" -// "Content-Type: image/gif\r\n" -// "\r\n" -// "base64:" + -// -// Message outbound; -// outbound.header.sessionId = m_sessionId; -// outbound.header.identifier = m_baseIdentifier; -// outbound.header.dataOffset = 0; -// outbound.header.totalDataSize = 4; -// outbound.header.dataSize = 4; -// outbound.header.flag = 0; -// outbound.header.ackSessionIdentifier = rand()%0x8FFFFFF0 + 4; -// outbound.header.ackUniqueIdentifier = 0; -// outbound.header.ackDataSize = 0l; -// TQByteArray bytes(4); -// bytes.fill('\0'); -// outbound.body = bytes; -// outbound.applicationIdentifier = 0; -// outbound.attachApplicationId = false; -// outbound.destination = m_recipient; -// -// sendMessage(outbound, body); -} - -void OutgoingTransfer::slotSendData() -{ - TQ_INT32 bytesRead = 0; - TQByteArray buffer(1202); - if(!m_file) - return; - - // Read a chunk from the source file. - bytesRead = m_file->readBlock(buffer.data(), buffer.size()); - - if (bytesRead < 0) { - m_file->close(); - // ### error handling - } - else { - - if(bytesRead < 1202){ - buffer.resize(bytesRead); - } - - kdDebug(14140) << k_funcinfo << TQString("Sending, %1 bytes").arg(bytesRead) << endl; - - if((m_offset + bytesRead) < m_file->size()) - { - sendData(buffer); - m_offset += bytesRead; - } - else - { - m_isComplete = true; - // Send the last chunk of the file. - sendData(buffer); - m_offset += buffer.size(); - // Close the file. - m_file->close(); - } - } - - if(m_transfer){ - m_transfer->slotProcessed(m_offset); - if(m_isComplete){ - // The transfer is complete. - m_transfer->slotComplete(); - } - } -} - -void OutgoingTransfer::acknowledged() -{ - kdDebug(14140) << k_funcinfo << endl; - - switch(m_state) - { - case Invitation: - { - if(m_type == UserDisplayIcon) - { - m_state = Negotiation; - // Send data preparation message. - sendDataPreparation(); - } - break; - } - - case Negotiation: - { - if(m_type == UserDisplayIcon) - { - // <<< Data preparation acknowledge message. - m_state = DataTransfer; - m_identifier++; - // Start sending data. - slotSendData(); - } - break; - } - - case DataTransfer: - // NOTE <<< Data acknowledged message. - // <<< Bye message should follow. - if(m_type == File) - { - if(m_handshake == 0x01) - { - // Data handshake acknowledge message. - // Start sending data. - slotSendData(); - } - else if(m_handshake == 0x02) - { - // Data acknowledge message. - // Send the recipient a BYE message. - m_state = Finished; - sendMessage(BYE, "\r\n"); - } - } - - break; - - case Finished: - if(m_type == File) - { - // BYE acknowledge message. - m_dispatcher->detach(this); - } - - break; - } -} - -void OutgoingTransfer::processMessage(const Message& message) -{ - TQString body = - TQCString(message.body.data(), message.header.dataSize); - kdDebug(14140) << k_funcinfo << "received, " << body << endl; - - if(body.startsWith("BYE")) - { - m_state = Finished; - // Send the recipient an acknowledge message. - acknowledge(message); - if(!m_isComplete) - { - // The peer cancelled the transfer. - if(m_transfer) - { - // Inform the user of the file transfer cancelation. - m_transfer->slotError(TDEIO::ERR_ABORTED, i18n("File transfer canceled.")); - } - } - // Dispose of this transfer context. - m_dispatcher->detach(this); - } - else if(body.startsWith("MSNSLP/1.0 200 OK")) - { - // Retrieve the message content type. - TQRegExp regex("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); - regex.search(body); - TQString contentType = regex.cap(1); - - if(contentType == "application/x-msnmsgr-sessionreqbody") - { - // Recipient has accepted the file transfer. - // Acknowledge the recipient. - acknowledge(message); - - // Try to open the file for reading. - // If an error occurs, send an internal - // error message to the recipient. - if(!m_file->open(IO_ReadOnly)){ - error(); - return; - } - - // Retrieve the receiving client's contact. - Kopete::Contact *contact = m_dispatcher->getContactByAccountId(m_recipient); - if(contact == 0l) - { - error(); - return; - } - - m_transfer = - Kopete::TransferManager::transferManager()->addTransfer(contact, m_file->name(), m_file->size(), m_recipient, Kopete::FileTransferInfo::Outgoing); - - TQObject::connect(m_transfer , TQT_SIGNAL(transferCanceled()), this, TQT_SLOT(abort())); - - m_state = Negotiation; - - m_branch = P2P::Uid::createUid(); - - // Send the direct connection invitation message. - TQString content = "Bridges: TRUDPv1 TCPv1\r\n" + - TQString("NetID: %1\r\n").arg("-123657987") + - TQString("Conn-Type: %1\r\n").arg("Restrict-NAT") + - "UPnPNat: false\r\n" - "ICF: false\r\n" + - TQString("Hashed-Nonce: {%1}\r\n").arg(P2P::Uid::createUid()) + - "\r\n"; - sendMessage(INVITE, content); - } - else if(contentType == "application/x-msnmsgr-transrespbody") - { - // Determine whether the recipient created - // a listening endpoint. - regex = TQRegExp("Listening: ([^\r\n]+)\r\n"); - regex.search(body); - bool isListening = (regex.cap(1) == "true"); - - // Send the recipient an acknowledge message. - acknowledge(message); - - m_state = DataTransfer; - -#if 1 - isListening = false; // TODO complete direct connection. -#endif - if(isListening) - { - // Retrieve the hashed nonce for this direct connection instance. - regex = TQRegExp("Hashed-Nonce: \\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - m_nonce = regex.cap(1); - // Retrieve the listening endpoints of the receiving client. - regex = TQRegExp("IPv4Internal-Addrs: ([^\r\n]+)\r\n"); - regex.search(body); - m_peerEndpoints = TQStringList::split(" ", regex.cap(1)); - m_endpointIterator = m_peerEndpoints.begin(); - // Retrieve the listening port of the receiving client. - regex = TQRegExp("IPv4Internal-Port: ([^\r\n]+)\r\n"); - regex.search(body); - m_remotePort = regex.cap(1); - - // Try to connect to the receiving client's - // listening endpoint. - connectToEndpoint(*m_endpointIterator); - } - else - { - m_handshake = 0x02; - // Otherwise, send data through the already - // existing session. - slotSendData(); - } - } - } - else if(body.startsWith("MSNSLP/1.0 603 Decline")) - { - // File transfer has been cancelled remotely. - // Send an acknowledge message - acknowledge(message); - if(m_transfer) - { - // Inform the user of the file transfer cancelation. - m_transfer->slotError(TDEIO::ERR_ABORTED, i18n("File transfer canceled.")); - } - - if(m_file && m_file->isOpen()){ - // Close the file. - m_file->close(); - } - m_dispatcher->detach(this); - } -} - -void OutgoingTransfer::readyToSend() -{ - if(m_isComplete){ - // Ignore, do nothing. - return; - } - - slotSendData(); -} - -void OutgoingTransfer::connectToEndpoint(const TQString& hostName) -{ - m_socket = new TDEBufferedSocket(hostName, m_remotePort); - m_socket->setBlocking(false); - m_socket->enableRead(true); - // Disable write signal for now. Only enable - // when we are ready to sent data. - // NOTE readyWrite consumes too much cpu usage. - m_socket->enableWrite(false); - TQObject::connect(m_socket, TQT_SIGNAL(readyRead()), this, TQT_SLOT(slotRead())); - TQObject::connect(m_socket, TQT_SIGNAL(connected(const KResolverEntry&)), this, TQT_SLOT(slotConnected())); - TQObject::connect(m_socket, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotSocketError(int))); - TQObject::connect(m_socket, TQT_SIGNAL(closed()), this, TQT_SLOT(slotSocketClosed())); - // Try to connect to the endpoint. - m_socket->connect(); -} - -void OutgoingTransfer::slotConnected() -{ - kdDebug(14140) << k_funcinfo << endl; - // Check if connection is ok. - TQ_UINT32 bytesWritten = m_socket->writeBlock(TQCString("foo").data(), 4); - if(bytesWritten != 4) - { - // Not all data was written, close the socket. - m_socket->closeNow(); - // Schedule the data to be sent through the existing session. - TQTimer::singleShot(2000, this, TQT_SLOT(slotSendData())); - return; - } - - // Send data handshake message. - P2P::Message handshake; - handshake.header.sessionId = 0; - handshake.header.identifier = ++m_identifier; - handshake.header.dataOffset = 0l; - handshake.header.totalDataSize = 0l; - handshake.header.dataSize = 0; - // Set the flag to indicate that this is - // a direct connection handshake message. - handshake.header.flag = 0x100; - TQString nonce = m_nonce.remove('-'); - handshake.header.ackSessionIdentifier = nonce.mid(0, 8).toUInt(0, 16); - handshake.header.ackUniqueIdentifier = - nonce.mid(8, 4).toUInt(0, 16) | (nonce.mid(12, 4).toUInt(0, 16) << 16); - const TQ_UINT32 lo = nonce.mid(16, 8).toUInt(0, 16); - const TQ_UINT32 hi = nonce.mid(24, 8).toUInt(0, 16); - handshake.header.ackDataSize = - ((TQ_INT64)htonl(lo)) | (((TQ_INT64)htonl(hi)) << 32); - - TQByteArray stream; - // Write the message to the memory stream. - m_messageFormatter.writeMessage(handshake, stream, true); - // Send the byte stream over the wire. - m_socket->writeBlock(stream.data(), stream.size()); -} - -void OutgoingTransfer::slotRead() -{ - TQ_INT32 bytesAvailable = m_socket->bytesAvailable(); - kdDebug(14140) << k_funcinfo << bytesAvailable << ", bytes available." << endl; -} - -void OutgoingTransfer::slotSocketError(int) -{ - kdDebug(14140) << k_funcinfo << m_socket->TDESocketBase::errorString() << endl; - // If an error has occurred, try to connect - // to another available peer endpoint. - // If there are no more available endpoints, - // send the data through the session. - m_socket->closeNow(); - - // Move to the next available endpoint. - m_endpointIterator++; - if(m_endpointIterator != m_peerEndpoints.end()){ - // Try to connect to the endpoint. - connectToEndpoint(*m_endpointIterator); - } - else - { - // Otherwise, send the data through the session. - m_identifier -= 1; - TQTimer::singleShot(2000, this, TQT_SLOT(slotSendData())); - } -} - -void OutgoingTransfer::slotSocketClosed() -{ - kdDebug(14140) << k_funcinfo << endl; - m_socket->deleteLater(); - m_socket = 0l; -} - -#include "outgoingtransfer.moc" diff --git a/kopete/protocols/msn/outgoingtransfer.h b/kopete/protocols/msn/outgoingtransfer.h deleted file mode 100644 index 0ec5846c..00000000 --- a/kopete/protocols/msn/outgoingtransfer.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - outgoingtransfer.h - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef OUTGOINGTRANSFER_H -#define OUTGOINGTRANSFER_H - -#include "p2p.h" -#include "dispatcher.h" -#include <tqstringlist.h> - -/** -@author Kopete Developers -*/ -namespace P2P{ - class OutgoingTransfer : public TransferContext - { Q_OBJECT - - public: - OutgoingTransfer(const TQString& to, P2P::Dispatcher *dispatcher, TQ_UINT32 sessionId); - virtual ~OutgoingTransfer(); - - void sendImage(const TQByteArray& image); - - private slots: - void slotConnected(); - void slotRead(); - void slotSendData(); - void slotSocketError(int); - void slotSocketClosed(); - - private: - virtual void acknowledged(); - void connectToEndpoint(const TQString& hostName); - virtual void processMessage(const Message& message); - - TQStringList m_peerEndpoints; - TQStringList::Iterator m_endpointIterator; - TQString m_remotePort; - TQString m_nonce; - char m_handshake; - - protected: - virtual void readyToSend(); - }; -} - -#endif diff --git a/kopete/protocols/msn/p2p.cpp b/kopete/protocols/msn/p2p.cpp deleted file mode 100644 index 11f308fb..00000000 --- a/kopete/protocols/msn/p2p.cpp +++ /dev/null @@ -1,412 +0,0 @@ -/* - p2p.cpp - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "p2p.h" -#include "dispatcher.h" -using P2P::TransferContext; -using P2P::Message; -using P2P::MessageType; -using P2P::TransferType; - -#include <stdlib.h> - -// Kde includes -#include <kbufferedsocket.h> -#include <kdebug.h> -// TQt includes -#include <tqfile.h> - -// Kopete includes -#include <kopetetransfermanager.h> - -TQString P2P::Uid::createUid() -{ - return (TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) + "-" - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) + "-" - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) + "-" - + TQString::number(rand()%0xAAFF+0x1111, 16) + "-" - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16) - + TQString::number((unsigned long int)rand()%0xAAFF+0x1111, 16)).upper(); -} - -TransferContext::TransferContext(const TQString &contact, P2P::Dispatcher *dispatcher, TQ_UINT32 sessionId) - : TQObject(dispatcher) , - m_sessionId(sessionId) , - m_identifier(0) , - m_file(0) , - m_transactionId (0), - m_ackSessionIdentifier (0) , - m_ackUniqueIdentifier ( 0 ), - m_transfer ( 0l) , - - m_baseIdentifier(rand()%0x0FFFFFF0 + 4), - m_dispatcher (dispatcher), - m_isComplete (false) , - m_offset(0), - m_totalDataSize(0), - m_recipient(contact), - m_sender(dispatcher->localContact()), - m_socket(0), - m_state ( Invitation) -{ - m_type = File ; //uh, why??? -Olivier -} - -TransferContext::~TransferContext() -{ - m_transfer = 0l; - - if(m_file){ - delete m_file; - m_file = 0l; - } -} - -void TransferContext::acknowledge(const Message& message) -{ - kdDebug(14140) << k_funcinfo << m_dispatcher<< endl; - - Message outbound; - outbound.header.sessionId = message.header.sessionId; - - if(m_identifier == 0){ - m_identifier = m_baseIdentifier; - } -// else if(m_state == Finished && m_direction == Incoming){ -// m_identifier = m_baseIdentifier - 1; -// } - else if(m_state == Finished && m_direction == Outgoing){ - m_identifier = m_baseIdentifier + 1; - } - else - ++m_identifier; - - outbound.header.identifier = m_identifier; - outbound.header.dataOffset = 0l; - outbound.header.totalDataSize = message.header.totalDataSize; - outbound.header.dataSize = 0; -// if(m_type == UserDisplayIcon && m_state == Finished){ -// if(m_direction == Outgoing){ -// outbound.header.flag = 0x40; -// } -// } -// else - outbound.header.flag = 2; - - outbound.header.ackSessionIdentifier = message.header.identifier; - outbound.header.ackUniqueIdentifier = message.header.ackSessionIdentifier; - outbound.header.ackDataSize = message.header.totalDataSize; - // NOTE outbound.body is null by default - outbound.applicationIdentifier = 0l; - outbound.destination = m_recipient; - - TQByteArray stream; - // Write the acknowledge message to the stream. - m_messageFormatter.writeMessage(outbound, stream, (m_socket != 0l)); - if(!m_socket) - { - // Send the acknowledge message. - m_dispatcher->callbackChannel()->send(stream); - } - else - { - // Send acknowledge message directly. - m_socket->writeBlock(stream.data(), stream.size()); - } -} - -void TransferContext::error() -{ - kdDebug(14140) << k_funcinfo << endl; - sendMessage(ERROR); - m_dispatcher->detach(this); -} - -void TransferContext::sendData(const TQByteArray& bytes) -{ - Message outbound; - outbound.header.sessionId = m_sessionId; - outbound.header.identifier = m_identifier; - outbound.header.dataOffset = m_offset; - if(m_file){ - outbound.header.totalDataSize = m_file->size(); - } - else - outbound.header.totalDataSize = m_totalDataSize; - - outbound.header.dataSize = bytes.size(); - if(m_type == UserDisplayIcon){ - outbound.header.flag = 0x20; - } - else if(m_type == P2P::File){ - outbound.header.flag = 0x01000030; - } - else outbound.header.flag = 0; - - outbound.header.ackSessionIdentifier = rand()%0x8FFFFFF0 + 4; - outbound.header.ackUniqueIdentifier = 0; - outbound.header.ackDataSize = 0l; - outbound.body = bytes; - outbound.applicationIdentifier = (uint)m_type; - - outbound.destination = m_recipient; - - TQByteArray stream; - m_messageFormatter.writeMessage(outbound, stream, (m_socket != 0l)); - if(!m_socket) - { - // Send the data message. - m_transactionId = m_dispatcher->callbackChannel()->send(stream); - } - else - { - // Send data directly. - m_socket->writeBlock(stream.data(), stream.size()); - } -} - -void TransferContext::sendDataPreparation() -{ - kdDebug(14140) << k_funcinfo << endl; - - Message outbound; - outbound.header.sessionId = m_sessionId; - outbound.header.identifier = ++m_identifier; - outbound.header.dataOffset = 0; - outbound.header.totalDataSize = 4; - outbound.header.dataSize = 4; - outbound.header.flag = 0; - outbound.header.ackSessionIdentifier = rand()%0x8FFFFFF0 + 4; - outbound.header.ackUniqueIdentifier = 0; - outbound.header.ackDataSize = 0l; - TQByteArray bytes(4); - bytes.fill('\0'); - outbound.body = bytes; - outbound.applicationIdentifier = 1; - outbound.destination = m_recipient; - - TQByteArray stream; - m_messageFormatter.writeMessage(outbound, stream); - // Send the receiving client the data prepartion message. - m_dispatcher->callbackChannel()->send(stream); -} - -void TransferContext::sendMessage(MessageType type, const TQString& content, TQ_INT32 flag, TQ_INT32 appId) -{ - Message outbound; - if(appId != 0){ - outbound.header.sessionId = m_sessionId; - } - else - outbound.header.sessionId = 0; - - if(m_identifier == 0){ - m_identifier = m_baseIdentifier; - } - else if(m_state == Invitation && m_direction == P2P::Outgoing && m_type == UserDisplayIcon) - { - m_identifier -= 3; - } - else if(m_state == Invitation && m_direction == P2P::Incoming && m_type == File) - { - m_identifier -= 3; - } - else - ++m_identifier; - - outbound.header.identifier = m_identifier; - outbound.header.flag = flag; - outbound.header.ackSessionIdentifier = m_ackSessionIdentifier; - outbound.header.ackUniqueIdentifier = m_ackUniqueIdentifier; - outbound.header.ackDataSize = 0l; - outbound.applicationIdentifier = appId; - outbound.destination = m_recipient; - - TQString contentType, cSeq, method; - - switch(m_state) - { - case DataTransfer: - contentType = "application/x-msnmsgr-transreqbody"; - if(m_type == File && m_direction == Incoming) - { - contentType = "application/x-msnmsgr-transrespbody"; - } - break; - case Finished: - contentType = "application/x-msnmsgr-sessionclosebody"; - break; - default: - contentType = "application/x-msnmsgr-sessionreqbody"; - if(m_type == File && m_direction == Outgoing) - { - if(m_state == Negotiation){ - contentType = "application/x-msnmsgr-transreqbody"; - } - } - if(m_type == P2P::WebcamType && type==P2P::INVITE && m_state == Negotiation) - { - contentType = "application/x-msnmsgr-transreqbody"; - } - break; - } - - switch(type) - { - case BYE: - method = "BYE MSNMSGR:" + m_recipient + " MSNSLP/1.0"; - cSeq = "0"; - break; - - case DECLINE: - method = "MSNSLP/1.0 603 DECLINE"; - cSeq = "1"; - break; - - case ERROR: - contentType = "null"; - method = "MSNSLP/1.0 500 Internal Error"; - cSeq = "1"; - break; - - case INVITE: - method = "INVITE MSNMSGR:" + m_recipient + " MSNSLP/1.0"; - cSeq = "0"; - break; - - case OK: - method = "MSNSLP/1.0 200 OK"; - cSeq = "1"; - break; - } - - TQCString body = TQString(method + "\r\n" - "To: <msnmsgr:" + m_recipient + ">\r\n" - "From: <msnmsgr:" + m_sender + ">\r\n" - "Via: MSNSLP/1.0/TLP ;branch={" + m_branch.upper() + "}\r\n" - "CSeq: "+ cSeq +"\r\n" - "Call-ID: {" + m_callId.upper() + "}\r\n" - "Max-Forwards: 0\r\n" - "Content-Type: " + contentType + "\r\n" - "Content-Length: "+ TQString::number(content.length() + 1) + "\r\n" - "\r\n" + - content).utf8(); - - // NOTE The body must have a null character at the end. - // TQCString by chance automatically adds a \0 to the - // end of the string. - - outbound.header.totalDataSize = body.size(); - // Send the outbound message. - sendMessage(outbound, body); -} - -void TransferContext::sendMessage(Message& outbound, const TQByteArray& body) -{ - TQ_INT64 offset = 0L, bytesLeft = outbound.header.totalDataSize; - TQ_INT16 chunkLength = 1202; - - // Split the outbound message if necessary. - while(bytesLeft > 0L) - { - if(bytesLeft < chunkLength) - { - // Copy the last chunk of the multipart message. - outbound.body.duplicate(body.data() + offset, bytesLeft); - outbound.header.dataSize = bytesLeft; - outbound.header.dataOffset = offset; - bytesLeft = 0L; - } - else - { - // Copy the next chunk of the multipart message in the sequence. - outbound.body.duplicate(body.data() + offset, chunkLength); - outbound.header.dataSize = chunkLength; - outbound.header.dataOffset = offset; - offset += chunkLength; - bytesLeft -= offset; - } - - kdDebug(14140) << k_funcinfo << - TQCString(outbound.body.data(), outbound.body.size()) - << endl; - - TQByteArray stream; - // Write the outbound message to the stream. - m_messageFormatter.writeMessage(outbound, stream, (m_socket != 0l)); - if(!m_socket) - { - // Send the outbound message. - m_dispatcher->callbackChannel()->send(stream); - } - else - { - // Send outbound message directly. - m_socket->writeBlock(stream.data(), stream.size()); - } - } -} - -void TransferContext::setType(TransferType type) -{ - m_type = type; -} - -void TransferContext::abort() -{ - kdDebug(14140) << k_funcinfo << endl; - if(m_transfer) - { - if(m_transfer->error() == TDEIO::ERR_ABORTED) - { - switch(m_direction) - { - case P2P::Outgoing: - if(m_type == File) - { - // Do nothing. - } - break; - - case P2P::Incoming: - if(m_type == File) - { - // Do nothing. - } - break; - } - } - else - { - m_state = Finished; - sendMessage(BYE, "\r\n"); - } - } -} - -void TransferContext::readyWrite() -{ - if(m_direction == Outgoing && m_state == DataTransfer){ - readyToSend(); - } -} - -void TransferContext::readyToSend() -{} - -#include "p2p.moc" diff --git a/kopete/protocols/msn/p2p.h b/kopete/protocols/msn/p2p.h deleted file mode 100644 index 55a7866a..00000000 --- a/kopete/protocols/msn/p2p.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - p2p.h - msn p2p protocol - - Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org> - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef P2P_H -#define P2P_H - -// TQt includes -#include <tqobject.h> -#include "messageformatter.h" - -#include "kopete_export.h" - -#include "config.h" - -namespace Kopete { class Transfer; } -namespace Kopete { struct FileTransferInfo; } -namespace P2P { class Dispatcher; } -namespace KNetwork { class TDEBufferedSocket; } -class TQFile; -class KTempFile; - -/** -@author Kopete Developers -*/ -namespace System{ - class Guid - { - public: - ~Guid(){} - static Guid newGuid(); - TQString toString(); - - private: - Guid(){} - }; -} - -namespace P2P{ - - enum TransferType { UserDisplayIcon = 1, File = 2, WebcamType=4}; - enum TransferDirection { Incoming = 1, Outgoing = 8}; - enum MessageType { BYE, OK, DECLINE, ERROR, INVITE }; - - enum CommunicationState - { - Invitation = 1, - Negotiation = 2, - DataTransfer = 8, - Finished = 16 - }; - - struct TransportHeader - { - TQ_UINT32 sessionId; - TQ_UINT32 identifier; - TQ_INT64 dataOffset; - TQ_INT64 totalDataSize; - TQ_UINT32 dataSize; - TQ_UINT32 flag; - TQ_UINT32 ackSessionIdentifier; - TQ_UINT32 ackUniqueIdentifier; - TQ_INT64 ackDataSize; - }; - - struct Message - { - public: - TQString mimeVersion; - TQString contentType; - TQString destination; - TQString source; - TransportHeader header; - TQByteArray body; - TQ_INT32 applicationIdentifier; - bool attachApplicationIdentifier; - }; - - class KOPETE_EXPORT Uid - { - public: static TQString createUid(); - }; - - class KOPETE_EXPORT TransferContext : public TQObject - { Q_OBJECT - - public: - virtual ~TransferContext(); - - void acknowledge(const Message& message); - virtual void acknowledged() = 0; - void error(); - virtual void processMessage(const P2P::Message& message) = 0; - void sendDataPreparation(); - void sendMessage(MessageType type, const TQString& content=TQString(), TQ_INT32 flag=0, TQ_INT32 appId=0); - void setType(TransferType type); - - public: - TQ_UINT32 m_sessionId; - TQ_UINT32 m_identifier; - TQFile *m_file; - TQ_UINT32 m_transactionId; - TQ_UINT32 m_ackSessionIdentifier; - TQ_UINT32 m_ackUniqueIdentifier; - Kopete::Transfer *m_transfer; - TQString m_branch; - TQString m_callId; - TQString m_object; - - - public slots: - void abort(); - void readyWrite(); - - protected: - TransferContext(const TQString& contact, P2P::Dispatcher *dispatcher,TQ_UINT32 sessionId); - void sendData(const TQByteArray& bytes); - void sendMessage(P2P::Message& outbound, const TQByteArray& body); - virtual void readyToSend(); - - TQ_UINT32 m_baseIdentifier; - TransferDirection m_direction; - P2P::Dispatcher *m_dispatcher; - bool m_isComplete; - TQ_INT64 m_offset; - TQ_INT64 m_totalDataSize; - P2P::MessageFormatter m_messageFormatter; - TQString m_recipient; - TQString m_sender; - KNetwork::TDEBufferedSocket *m_socket; - CommunicationState m_state; - TransferType m_type; - }; -} - -#endif diff --git a/kopete/protocols/msn/sha1.cpp b/kopete/protocols/msn/sha1.cpp deleted file mode 100644 index d0a13135..00000000 --- a/kopete/protocols/msn/sha1.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * sha1.cpp - Secure Hash Algorithm 1 - * Copyright (C) 2003 Justin Karneges - * - * 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 "sha1.h" - -/**************************************************************************** - SHA1 - from a public domain implementation by Steve Reid ([email protected]) -****************************************************************************/ - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15]^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -SHA1::SHA1() -{ - int wordSize; - - tqSysInfo(&wordSize, &bigEndian); -} - -unsigned long SHA1::blk0(TQ_UINT32 i) -{ - if(bigEndian) - return block->l[i]; - else - return (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) | (rol(block->l[i],8)&0x00FF00FF)); -} - -// Hash a single 512-bit block. This is the core of the algorithm. -void SHA1::transform(TQ_UINT32 state[5], unsigned char buffer[64]) -{ - TQ_UINT32 a, b, c, d, e; - - block = (CHAR64LONG16*)buffer; - - // Copy context->state[] to working vars - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - - // 4 rounds of 20 operations each. Loop unrolled. - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - - // Add the working vars back into context.state[] - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - - // Wipe variables - a = b = c = d = e = 0; -} - -// SHA1Init - Initialize new context -void SHA1::init(SHA1_CONTEXT* context) -{ - // SHA1 initialization constants - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - -// Run your data through this -void SHA1::update(SHA1_CONTEXT* context, unsigned char* data, TQ_UINT32 len) -{ - TQ_UINT32 i, j; - - j = (context->count[0] >> 3) & 63; - if((context->count[0] += len << 3) < (len << 3)) - context->count[1]++; - - context->count[1] += (len >> 29); - - if((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64-j)); - transform(context->state, context->buffer); - for ( ; i + 63 < len; i += 64) { - transform(context->state, &data[i]); - } - j = 0; - } - else i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - -// Add padding and return the message digest -void SHA1::final(unsigned char digest[20], SHA1_CONTEXT* context) -{ - TQ_UINT32 i, j; - unsigned char finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] - >> ((3-(i & 3)) * 8) ) & 255); // Endian independent - } - update(context, (unsigned char *)"\200", 1); - while ((context->count[0] & 504) != 448) { - update(context, (unsigned char *)"\0", 1); - } - update(context, finalcount, 8); // Should cause a transform() - for (i = 0; i < 20; i++) { - digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); - } - - // Wipe variables - i = j = 0; - memset(context->buffer, 0, 64); - memset(context->state, 0, 20); - memset(context->count, 0, 8); - memset(&finalcount, 0, 8); -} - -TQByteArray SHA1::hash(const TQByteArray &a) -{ - SHA1_CONTEXT context; - TQByteArray b(20); - - SHA1 s; - s.init(&context); - s.update(&context, (unsigned char *)a.data(), (unsigned int)a.size()); - s.final((unsigned char *)b.data(), &context); - return b; -} - -TQByteArray SHA1::hashString(const TQCString &cs) -{ - TQByteArray a(cs.length()); - memcpy(a.data(), cs.data(), a.size()); - return SHA1::hash(a); -} - -TQString SHA1::digest(const TQString &in) -{ - TQByteArray a = SHA1::hashString(in.utf8()); - TQString out; - for(int n = 0; n < (int)a.size(); ++n) { - TQString str; - str.sprintf("%02x", (uchar)a[n]); - out.append(str); - } - - return out; -} diff --git a/kopete/protocols/msn/sha1.h b/kopete/protocols/msn/sha1.h deleted file mode 100644 index 9138fd32..00000000 --- a/kopete/protocols/msn/sha1.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * sha1.h - Secure Hash Algorithm 1 - * Copyright (C) 2003 Justin Karneges - * - * 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 CS_SHA1_H -#define CS_SHA1_H - -#include <tqstring.h> - -class SHA1 -{ -public: - static TQByteArray hash(const TQByteArray &); - static TQByteArray hashString(const TQCString &); - static TQString digest(const TQString &); - -private: - SHA1(); - - struct SHA1_CONTEXT - { - TQ_UINT32 state[5]; - TQ_UINT32 count[2]; - unsigned char buffer[64]; - }; - - typedef union { - unsigned char c[64]; - TQ_UINT32 l[16]; - } CHAR64LONG16; - - void transform(TQ_UINT32 state[5], unsigned char buffer[64]); - void init(SHA1_CONTEXT* context); - void update(SHA1_CONTEXT* context, unsigned char* data, TQ_UINT32 len); - void final(unsigned char digest[20], SHA1_CONTEXT* context); - - unsigned long blk0(TQ_UINT32 i); - bool bigEndian; - - CHAR64LONG16* block; -}; - -#endif diff --git a/kopete/protocols/msn/transport.cpp b/kopete/protocols/msn/transport.cpp deleted file mode 100644 index 57b1f356..00000000 --- a/kopete/protocols/msn/transport.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/* - transport.cpp - Peer to peer transport - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * 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; version 2 of the License. * - * * - ************************************************************************* -*/ - -#include "transport.h" -#include "messageformatter.h" - -//BEGIN QT Includes -//END - -//BEGIN KDE Includes -#include <kclientsocketbase.h> -#include <kdebug.h> -#include <kstreamsocket.h> -//END - -//BEGIN Using Directives -using namespace KNetwork; -//END - -#include "msnswitchboardsocket.h" - -namespace PeerToPeer { - -Transport::Transport(TQObject* parent, const char* name) - : TQObject(parent, name) -{ - mFormatter = new PeerToPeer::MessageFormatter(this); -} - - -Transport::~Transport() -{ -} - -//BEGIN Public Methods - -TransportBridge* Transport::getBridge (const TQString& to, TQ_UINT16 port, TransportBridgeType type, const TQString& identifier) -{ - TransportBridge *bridge = 0l; - KInetSocketAddress address; - if (mAddresses.contains(to)) - { - address = mAddresses[to]; - } - else - { - address = KInetSocketAddress(KIpAddress(to), port); - mAddresses[to] = address; - } - - if (PeerToPeer::Tcp == type){ - bridge = new TcpTransportBridge(address, mFormatter, this, identifier.ascii()); - } - - if (PeerToPeer::Udp == type){ -// TODO Add class UdpTransportBridge -// bridge = new UdpTransportBridge(address, this, mFormatter, identifier.ascii()); - } - - if (bridge != 0l) - { - TQObject::connect(bridge, TQT_SIGNAL(readyRead(const TQByteArray&)), TQT_SLOT(slotOnReceive(const TQByteArray&))); - } - - return 0l; -} - -void Transport::setDefaultBridge(MSNSwitchBoardSocket* mss) -{ - mDefaultBridge = mss; - TQObject::connect((MSNSwitchBoardSocket*)mDefaultBridge, TQT_SIGNAL(messageReceived(const TQString&, const TQByteArray&)), TQT_SLOT(slotOnReceive(const TQString&, const TQByteArray&))); -} - -//END - -//BEGIN Private Slot Methods - -// void Transport::slotOnReceive(Message& message) -// { -// } - -void Transport::slotOnReceive(const TQString& contact, const TQByteArray& bytes) -{ - kdDebug (14140) << k_funcinfo << " >> RECEIVED " << bytes.size() << " bytes." << endl; -// Message message = mFormatter->readMessage(bytes); -} - -//END - - - - -TransportBridge::TransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name) -: TQObject(parent, name) -{ - mAddress = to; - mFormatter = formatter; -} - -TransportBridge::TransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name) -: TQObject(parent, name) -{ - mSocket = socket; - mAddress = mSocket->peerAddress(); -} - -TransportBridge::~TransportBridge() -{ -} - -//BEGIN Public Methods - -void TransportBridge::connect() -{ - slotOnConnect(); -} - -void TransportBridge::disconnect() -{ - slotOnDisconnect(); -} - -//END - -//BEGIN Protected Slot Methods - -void TransportBridge::slotOnConnect() -{ -} - -void TransportBridge::slotOnDisconnect() -{ -} - -void TransportBridge::slotOnError(int) -{ -} - -void TransportBridge::slotOnSocketClose() -{ -} - -void TransportBridge::slotOnSocketConnect() -{ -} - -void TransportBridge::slotOnSocketReceive() -{ -} - - -//END - - - -TcpTransportBridge::TcpTransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name) -: TransportBridge(to, formatter, parent, name) -{ - mSocket = new KStreamSocket(mAddress.ipAddress().toString(), TQString::number(mAddress.port()), this); - mSocket->setBlocking(false); - TQObject::connect(mSocket, TQT_SIGNAL(connected(const KResolverEntry&)), TQT_SLOT(slotOnSocketConnect())); - TQObject::connect(mSocket, TQT_SIGNAL(gotError(int)), TQT_SLOT(slotOnError(int))); - mConnected = false; -} - -TcpTransportBridge::TcpTransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name) -: TransportBridge(socket, formatter, parent, name) -{ - mConnected = (mSocket->state() == KStreamSocket::Open) ? true : false; - mSocket->setBlocking(false); -} - -TcpTransportBridge::~TcpTransportBridge() -{ -} - -//BEGIN Protected Slot Methods - -void TcpTransportBridge::slotOnConnect() -{ - if (mConnected) - { - kdDebug(14140) << k_funcinfo << "Bridge (" << name() << ") ALREADY CONNECTED " << mSocket->peerAddress().toString() << " <-> " << mSocket->localAddress().toString() << endl; - return; - } - - KStreamSocket *socket = static_cast<KStreamSocket*>(mSocket); - socket->setTimeout(5000); - TQObject::connect(socket, TQT_SIGNAL(timeOut()), TQT_SLOT(slotOnSocketConnectTimeout())); - mSocket->connect(); -} - -void TcpTransportBridge::slotOnDisconnect() -{ - if (mConnected){ - mSocket->close(); - } -} - -void TcpTransportBridge::slotOnError(int errorCode) -{ - kdDebug(14140) << k_funcinfo << "Bridge (" << name() << ") ERROR occurred on {" << mSocket->localAddress().toString() << " <-> " << mSocket->peerAddress().toString() << "} - " << mSocket->errorString() << endl; - emit bridgeError(TQString("Bridge ERROR %1: %2").arg(errorCode).arg(mSocket->errorString())); - if (mConnected){ - mSocket->disconnect(); - mConnected = false; - } - mSocket->deleteLater(); - mSocket = 0l; -} - -void TcpTransportBridge::slotOnSocketClose() -{ - mSocket->disconnect(); - kdDebug(14140) << k_funcinfo << "Bridge (" << name() << ") DISCONNECTED {" << mSocket->peerAddress().toString() << " <-> " << mSocket->localAddress().toString() << "}" << endl; - mConnected = false; - mSocket->deleteLater(); - mSocket = 0l; - - emit bridgeDisconnect(); -} - -void TcpTransportBridge::slotOnSocketConnect() -{ - kdDebug(14140) << k_funcinfo << "Bridge (" << name() << ") CONNECTED to " << mSocket->peerAddress().toString() << " from " - << mSocket->localAddress().toString() << endl; - mConnected = true; - - TQObject::connect(mSocket, TQT_SIGNAL(readyRead()), TQT_SLOT(slotOnSocketReceive())); - TQObject::connect(mSocket, TQT_SIGNAL(closed()), TQT_SLOT(slotOnSocketClose())); - - mVerified = true; - TQString foo = "foo\0"; - mSocket->writeBlock(foo.ascii(), foo.length()); - foo = TQString(); - - emit bridgeConnect(); -} - -void TcpTransportBridge::slotOnSocketReceive() -{ - kdDebug (14140) << k_funcinfo << "Bridge (" << name() << ") RECEIVED " << mSocket->bytesAvailable() << " bytes." << endl; - - TQByteArray bytes(mSocket->bytesAvailable()); - mSocket->readBlock(bytes.data(), bytes.size()); - // Write the data to the buffer. - mBuffer.write(bytes); - - if (mVerified == false && mBuffer.size() >= 4) - { - TQByteArray foo = mBuffer.read(4); - if (TQString(foo) == "foo"){ - kdDebug (14140) << k_funcinfo << "Bridge (" << name() << ") CONNECTION verified." << endl; - mVerified = true; - } - } - - while(mBuffer.size() > 0) - { - if (mBuffer.size() >= 4 && mLength == 0) - { - TQByteArray array = mBuffer.read(4); - for (int i=0; i < 4; i++){ - ((char*)mLength)[i] = array[i]; - } - } - - if (mLength > 0 && mBuffer.size() >= mLength) - { - kdDebug (14140) << k_funcinfo << "Bridge (" << name() << ") read " << mLength << " bytes." << endl; - bytes = mBuffer.read(mLength); - mLength = 0; -// Message message = mFormatter->readMessage(bytes, true); -// emit messageReceived(message); - } - else - { - kdDebug (14140) << k_funcinfo << "Bridge (" << name() << ") waiting for " << mLength << " bytes." << endl; - break; - } - } -} - -//END - -//BEGIN Private Slot Methods - -void TcpTransportBridge::slotOnSocketConnectTimeout() -{ - kdDebug (14140) << k_funcinfo << "Bridge (" << name() << ") CONNECT timeout." << endl; - emit bridgeConnectTimeout(); - mSocket->deleteLater(); - mSocket = 0l; -} - -//END - - - - -TcpTransportBridge::Buffer::Buffer(TQ_UINT32 length) -: TQByteArray(length) -{ -} - -TcpTransportBridge::Buffer::~Buffer() -{ -} - -//BEGIN Public Methods - -void TcpTransportBridge::Buffer::write(const TQByteArray& bytes) -{ - resize(size() + bytes.size()); - for (uint i=0; i < bytes.size(); i++){ - (*this)[size() + i] = bytes[i]; - } -} - -TQByteArray TcpTransportBridge::Buffer::read(TQ_UINT32 length) -{ - if (length >= size()) return TQByteArray(); - - TQByteArray buffer; - buffer.duplicate(data(), length); - - char *bytes = new char[size() - length]; - for(uint i=0; i < size() - length; i++){ - bytes[i] = data()[length + i]; - } - - duplicate(bytes, size() - length); - delete[] bytes; - - return buffer; -} - -//END - -} - -#include "transport.moc" - diff --git a/kopete/protocols/msn/transport.h b/kopete/protocols/msn/transport.h deleted file mode 100644 index c5554b54..00000000 --- a/kopete/protocols/msn/transport.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - transport.h - Peer to peer transport - - Copyright (c) 2005 by Gregg Edghill <[email protected]> - - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * 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; version 2 of the License. * - * * - ************************************************************************* -*/ - -#ifndef PEERTOPEERTRANSPORT_H -#define PEERTOPEERTRANSPORT_H - -//BEGIN QT Includes -#include <tqobject.h> -#include <tqguardedptr.h> -#include <tqvaluelist.h> -//END - -//BEGIN KDE Includes -#include <tdesocketaddress.h> -//END - -namespace KNetwork { -class KClientSocketBase; -} - -class MSNSwitchBoardSocket; - -namespace PeerToPeer { - -class MessageFormatter; -class TransportBridge; - -enum TransportBridgeType -{ - Tcp = 1, - Udp = 2 -}; - -/** - @author Gregg Edghill <[email protected]> */ -/** @brief Represents the protocol used to send and receive message between peers. */ -class Transport : public TQObject -{ - Q_OBJECT - -public: - /** @brief Creates a new instance of the class Transport. */ - Transport(TQObject* parent, const char* name = 0l); - ~Transport(); - /** @brief Get a transport bridge with the specified address, port, type and identifier. */ - TransportBridge* getBridge(const TQString& address, TQ_UINT16 port, TransportBridgeType type, const TQString& identifier); - /** @brief Sets the default transport bridge. */ - void setDefaultBridge(MSNSwitchBoardSocket* mss); - -private slots: - /** @brief Invokes when a message is received on a transport bridge. */ -// void slotOnReceive(Message& message); - /** @brief Invokes when a message is received on the default transport bridge (relay). */ - void slotOnReceive(const TQString& contact, const TQByteArray& bytes); - -private: - /** @brief Known SocketAddresses of peers. */ - TQMap<TQString, KNetwork::KInetSocketAddress> mAddresses; - /** @brief The list the connected transport bridges. */ - TQValueList<TransportBridge*> mBridges; - /** @brief The default transport bridge (relay). */ - TQGuardedPtr<MSNSwitchBoardSocket> mDefaultBridge; - /** @brief Message formatter used to ser/deser message. */ - MessageFormatter *mFormatter; -}; - -/** @brief Represents the channel connecting two peers. */ -class TransportBridge : public TQObject -{ - Q_OBJECT - -public: - virtual ~TransportBridge(); - -protected: - /** @brief Creates a new instance of the class TransportBridge with the specified address and formatter. */ - TransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); - /** @brief Creates a new instance of the class TransportBridge with the specified socket and formatter. */ - TransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); - -public: - /** @brief Creates a connection between two peers. */ - void connect(); - /** @brief Disconnects the connection between two peers. */ - void disconnect(); - -protected slots: - virtual void slotOnConnect(); - virtual void slotOnDisconnect(); - virtual void slotOnError(int); - virtual void slotOnSocketClose(); - virtual void slotOnSocketConnect(); - virtual void slotOnSocketReceive(); - -signals: - void bridgeConnect(); - void bridgeDisconnect(); - void bridgeError(const TQString& e); - void bytesReceived(const TQByteArray&); - -protected: - - KNetwork::KInetSocketAddress mAddress; - bool mConnected; - MessageFormatter *mFormatter; - TQ_UINT32 mLength; - KNetwork::KClientSocketBase *mSocket; - bool mVerified; -}; - -class TcpTransportBridge : public TransportBridge -{ - Q_OBJECT - - friend class Transport; - -public: - virtual ~TcpTransportBridge(); - -private: - TcpTransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); - TcpTransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); - -protected slots: - virtual void slotOnConnect(); - virtual void slotOnDisconnect(); - virtual void slotOnError(int); - virtual void slotOnSocketClose(); - virtual void slotOnSocketConnect(); - virtual void slotOnSocketReceive(); - -private slots: - void slotOnSocketConnectTimeout(); - -signals: - void bridgeConnectTimeout(); - -private: - class Buffer : public TQByteArray - { - public: - Buffer(TQ_UINT32 length = 0); - ~Buffer(); - - public: - void write(const TQByteArray& bytes); - TQByteArray read(TQ_UINT32 length); - }; - - Buffer mBuffer; - TQ_UINT32 mLength; -}; - - -} - -#endif diff --git a/kopete/protocols/msn/ui/CMakeLists.txt b/kopete/protocols/msn/ui/CMakeLists.txt deleted file mode 100644 index bd70ce80..00000000 --- a/kopete/protocols/msn/ui/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/.. - ${CMAKE_BINARY_DIR}/kopete/libkopete/ui - ${CMAKE_SOURCE_DIR}/kopete/libkopete - ${CMAKE_SOURCE_DIR}/kopete/libkopete/ui - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} -) - - -##### kopetemsnui (static) ###################### - -tde_add_library( kopetemsnui STATIC_PIC AUTOMOC - SOURCES - msnadd.ui msndebugrawcommand_base.ui msninfo.ui msneditaccountui.ui - msneditaccountwidget.cpp -) diff --git a/kopete/protocols/msn/ui/Makefile.am b/kopete/protocols/msn/ui/Makefile.am deleted file mode 100644 index 08a7cbac..00000000 --- a/kopete/protocols/msn/ui/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -METASOURCES = AUTO -AM_CPPFLAGS = $(KOPETE_INCLUDES) \ - -I$(srcdir)/.. \ - $(all_includes) - -noinst_LTLIBRARIES = libkopetemsnui.la - -libkopetemsnui_la_SOURCES = msnadd.ui msndebugrawcommand_base.ui msninfo.ui \ - msneditaccountui.ui msneditaccountwidget.cpp - -EXTRA_DIST = msnadd.ui msninfo.ui - diff --git a/kopete/protocols/msn/ui/msnadd.ui b/kopete/protocols/msn/ui/msnadd.ui deleted file mode 100644 index fab496d3..00000000 --- a/kopete/protocols/msn/ui/msnadd.ui +++ /dev/null @@ -1,97 +0,0 @@ -<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> -<class>msnAddUI</class> -<widget class="TQWidget"> - <property name="name"> - <cstring>msnAddUI</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>397</width> - <height>347</height> - </rect> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout21</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>&MSN Passport ID:</string> - </property> - <property name="alignment"> - <set>AlignTop</set> - </property> - <property name="buddy" stdset="0"> - <cstring>addID</cstring> - </property> - <property name="toolTip" stdset="0"> - <string>The user ID of the MSN contact you would like to add.</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The user ID of the MSN contact you would like to add. This should be in the form of a valid E-mail address.</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>addID</cstring> - </property> - <property name="toolTip" stdset="0"> - <string>The user ID of the MSN contact you would like to add.</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The user ID of the MSN contact you would like to add. This should be in the form of a valid E-mail address.</string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel2</cstring> - </property> - <property name="text"> - <string><i>(for example: [email protected])</i></string> - </property> - <property name="alignment"> - <set>AlignVCenter|AlignRight</set> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer13</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>160</height> - </size> - </property> - </spacer> - </vbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> diff --git a/kopete/protocols/msn/ui/msndebugrawcommand_base.ui b/kopete/protocols/msn/ui/msndebugrawcommand_base.ui deleted file mode 100644 index b5699dd0..00000000 --- a/kopete/protocols/msn/ui/msndebugrawcommand_base.ui +++ /dev/null @@ -1,107 +0,0 @@ -<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> -<class>MSNDebugRawCommand_base</class> -<widget class="TQWidget"> - <property name="name"> - <cstring>MSNDebugRawCommand_base</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>320</width> - <height>201</height> - </rect> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLabel" row="1" column="0"> - <property name="name"> - <cstring>TextLabel2</cstring> - </property> - <property name="text"> - <string>&Parameters:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_params</cstring> - </property> - </widget> - <widget class="TQLineEdit" row="0" column="1"> - <property name="name"> - <cstring>m_command</cstring> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>Co&mmand:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_command</cstring> - </property> - </widget> - <widget class="TQLineEdit" row="1" column="1"> - <property name="name"> - <cstring>m_params</cstring> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>m_addId</cstring> - </property> - <property name="text"> - <string>Add &ID</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>m_addNewline</cstring> - </property> - <property name="text"> - <string>Add &new line</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="KTextEdit" row="5" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>m_msg</cstring> - </property> - <property name="textFormat"> - <enum>PlainText</enum> - </property> - </widget> - <widget class="TQLabel" row="4" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>TextLabel3</cstring> - </property> - <property name="text"> - <string>Message:</string> - </property> - </widget> - </grid> -</widget> -<tabstops> - <tabstop>m_command</tabstop> - <tabstop>m_params</tabstop> - <tabstop>m_addId</tabstop> - <tabstop>m_addNewline</tabstop> -</tabstops> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>ktextedit.h</includehint> -</includehints> -</UI> diff --git a/kopete/protocols/msn/ui/msneditaccountui.ui b/kopete/protocols/msn/ui/msneditaccountui.ui deleted file mode 100644 index 0a764c57..00000000 --- a/kopete/protocols/msn/ui/msneditaccountui.ui +++ /dev/null @@ -1,1421 +0,0 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>MSNEditAccountUI</class> -<author>Olivier Goffart</author> -<widget class="TQWidget"> - <property name="name"> - <cstring>Form1</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>604</width> - <height>437</height> - </rect> - </property> - <property name="caption"> - <string>Account Preferences - MSN</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>0</number> - </property> - <widget class="TQTabWidget"> - <property name="name"> - <cstring>tabWidget3</cstring> - </property> - <property name="tabShape"> - <enum>Rounded</enum> - </property> - <widget class="TQWidget"> - <property name="name"> - <cstring>tab_connection</cstring> - </property> - <attribute name="title"> - <string>&Basic Setup</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer row="2" column="0"> - <property name="name"> - <cstring>spacer41</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>146</height> - </size> - </property> - </spacer> - <widget class="TQGroupBox" row="1" column="0"> - <property name="name"> - <cstring>groupBox5</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Registration</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel6</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="text"> - <string>To connect to the Microsoft network, you will need a Microsoft Passport.<br><br>If you do not currently have a Passport, please click the button to create one.</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignVCenter</set> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>buttonRegister</cstring> - </property> - <property name="text"> - <string>Re&gister New Account</string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQGroupBox" row="0" column="0"> - <property name="name"> - <cstring>m_accountInfo</cstring> - </property> - <property name="title"> - <string>Account Information</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>layout14</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel1_3</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>&MSN Passport ID:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_login</cstring> - </property> - <property name="toolTip" stdset="0"> - <string>The user ID of the MSN contact you would like to use.</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The user ID of the MSN contact you would like to use. This should be in the form of a valid E-mail address.</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_login</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="toolTip" stdset="0"> - <string>The user ID of the MSN contact you would like to use.</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The user ID of the MSN contact you would like to use. This should be in the form of a valid E-mail address.</string> - </property> - </widget> - </hbox> - </widget> - <widget class="Kopete::UI::PasswordWidget" row="1" column="0"> - <property name="name"> - <cstring>m_password</cstring> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="0"> - <property name="name"> - <cstring>m_autologin</cstring> - </property> - <property name="text"> - <string>E&xclude from connect all</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - <property name="whatsThis" stdset="0"> - <string>If you check this checkbox, the account will not be connected when you press the "Connect All" button, or at startup when automatic connection at startup is enabled.</string> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="0"> - <property name="name"> - <cstring>m_globalIdentity</cstring> - </property> - <property name="text"> - <string>Exclu&de from Global Identity</string> - </property> - </widget> - </grid> - </widget> - </grid> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>TabPage</cstring> - </property> - <attribute name="title"> - <string>MSN &Settings</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1_3</cstring> - </property> - <property name="font"> - <font> - <italic>1</italic> - </font> - </property> - <property name="text"> - <string><qt><b>Note:</b> These settings are applicable to all MSN accounts</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignCenter</set> - </property> - </widget> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>global_settings_page</cstring> - </property> - <property name="title"> - <string>Global MSN Options</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>NotifyNewChat</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Au&tomatically open a chat window when someone starts a conversation</string> - </property> - <property name="whatsThis" stdset="0"> - <string>This option will notify you when a contact starts typing their message, before the message is sent or finished.</string> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout13_2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1_4</cstring> - </property> - <property name="text"> - <string>Download the msn picture:</string> - </property> - <property name="whatsThis" stdset="0"> - <string><qt><p>Indicate when Kopete will download the display pictures of contacts</p> -<dl><dt>Only manually</dt><dd>The picture is not downloaded automatically. It is only downloaded when the user requests it</dd> -<dt>When a chat is open</dt><dd>The picture is downloaded when a conversation socket is opened, i.e. when you open a chat window</dd> -<dt>Automatically</dt><dd>Always try to download the picture if the contact has one. <b>Note:</b> this will open a socket, and let the user know you are downloading their picture.</dd></dl></string> - </property> - </widget> - <widget class="TQComboBox"> - <item> - <property name="text"> - <string>Only Manually</string> - </property> - </item> - <item> - <property name="text"> - <string>When a Chat is Open</string> - </property> - </item> - <item> - <property name="text"> - <string>Automatically</string> - </property> - </item> - <property name="name"> - <cstring>DownloadPicture</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="currentItem"> - <number>2</number> - </property> - <property name="whatsThis" stdset="0"> - <string><qt><p>Indicate when Kopete will download the pictures of contacts</p> -<dl><dt>Only manually</dt><dd>The picture is not downloaded automatically. It is only downloaded when the user requests it</dd> -<dt>When a chat is open</dt><dd>The picture is downloaded when a conversation socket is opened, i.e. when you open a chat window</dd> -<dt>Automatically</dt><dd>Always try to download the picture if the contact has one. <b>Note:</b> this will open a socket, and let the user know you are downloading their picture.</dd></dl></string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>useCustomEmoticons</cstring> - </property> - <property name="text"> - <string>&Download and show custom emoticons</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="whatsThis" stdset="0"> - <string>MSN Messenger allows users to download and use custom emoticons. If this option is enabled, Kopete will download these emoticons and show them.</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>exportEmoticons</cstring> - </property> - <property name="text"> - <string>E&xport the current emoticon theme to users</string> - </property> - <property name="toolTip" stdset="0"> - <string>Only work with emoticons in the PNG format</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Export all the emoticon themes as custom emoticons. -Only works for emoticons in the PNG format.</string> - </property> - </widget> - </vbox> - </widget> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>privacy_page</cstring> - </property> - <property name="title"> - <string>Privacy</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>SendClientInfo</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Send client information</string> - </property> - <property name="accel"> - <string></string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="toolTip" stdset="0"> - <string><qt>Make it possible for your contacts to detect if you are using Kopete.<br>We recommend leaving this checked.</qt></string> - </property> - <property name="whatsThis" stdset="0"> - <string>Third party MSN clients, such as Kopete, give users the ability to let other third party clients guess which client they are using. We recommend leaving this checkbox checked.</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>SendTypingNotification</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Send &typing notifications</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="whatsThis" stdset="0"> - <string><qt>Check this box to send <b>Typing notifications</b> to your contacts. When you are composing a message, you might want your contact to know that you are typing so that he knows you are answering.</qt></string> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout28</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>SendJabber</cstring> - </property> - <property name="text"> - <string>Expose my Jabber account to Jabber users</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="whatsThis" stdset="0"> - <string>If you have a Jabber account, you may let Jabber users on an MSN gateway know that you are also using Jabber.</string> - </property> - </widget> - <widget class="KComboBox"> - <property name="name"> - <cstring>JabberAccount</cstring> - </property> - <property name="editable"> - <bool>true</bool> - </property> - <property name="whatsThis" stdset="0"> - <string>If you have a Jabber account, you may let Jabber users on an MSN gateway know that you are also using Jabber.</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer26</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>61</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer25</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Minimum</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>21</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1_5</cstring> - </property> - <property name="text"> - <string>There are also privacy options in the "Contacts" tab</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignCenter</set> - </property> - </widget> - </vbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer20</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>31</width> - <height>40</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>tab_info</cstring> - </property> - <attribute name="title"> - <string>User &Info</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>Layout22_2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel2_2_2</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>4</hsizetype> - <vsizetype>4</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>&Nickname:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_displayName</cstring> - </property> - <property name="whatsThis" stdset="0"> - <string>The alias you would like to use on MSN. You may change this at any time you wish.</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_displayName</cstring> - </property> - <property name="readOnly"> - <bool>false</bool> - </property> - <property name="whatsThis" stdset="0"> - <string>The alias you would like to use on MSN. You may change this at any time you wish.</string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>m_phones</cstring> - </property> - <property name="title"> - <string>Phone Numbers</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel" row="1" column="0"> - <property name="name"> - <cstring>TextLabel5</cstring> - </property> - <property name="text"> - <string>Hom&e:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_phh</cstring> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel6</cstring> - </property> - <property name="text"> - <string>&Work:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_phw</cstring> - </property> - </widget> - <widget class="TQLineEdit" row="0" column="1"> - <property name="name"> - <cstring>m_phw</cstring> - </property> - </widget> - <widget class="TQLineEdit" row="1" column="1"> - <property name="name"> - <cstring>m_phh</cstring> - </property> - </widget> - <widget class="TQLabel" row="2" column="0"> - <property name="name"> - <cstring>TextLabel7</cstring> - </property> - <property name="text"> - <string>&Mobile:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_phm</cstring> - </property> - </widget> - <widget class="TQLineEdit" row="2" column="1"> - <property name="name"> - <cstring>m_phm</cstring> - </property> - </widget> - </grid> - </widget> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>groupBox2</cstring> - </property> - <property name="title"> - <string>Display Picture</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout17</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>m_useDisplayPicture</cstring> - </property> - <property name="text"> - <string>E&xport a display picture</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1_2</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Please select a square image. The image will be scaled to 96x96.</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignVCenter</set> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout13</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m_selectImage</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>&Select Image...</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer5</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>61</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer7_2_2</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Minimum</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>1</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout16</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="spacing"> - <number>0</number> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>m_displayPicture</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>96</width> - <height>96</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>96</width> - <height>96</height> - </size> - </property> - <property name="frameShape"> - <enum>GroupBoxPanel</enum> - </property> - <property name="scaledContents"> - <bool>true</bool> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer7_2</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Minimum</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>1</height> - </size> - </property> - </spacer> - </vbox> - </widget> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer16</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>21</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>m_warning_1</cstring> - </property> - <property name="paletteForegroundColor"> - <color> - <red>255</red> - <green>0</green> - <blue>0</blue> - </color> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>WARNING: You need to be connected to modify this page.</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignVCenter</set> - </property> - </widget> - </vbox> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>tab_contacts</cstring> - </property> - <attribute name="title"> - <string>Con&tacts</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>label_font</cstring> - </property> - <property name="text"> - <string><i>Italics</i> contacts are not on your contact list.<br> -<br> -<b>Bold</b> contacts are in your contact list but you are not in their contact list.</string> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout6</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel" row="0" column="2"> - <property name="name"> - <cstring>textLabel2</cstring> - </property> - <property name="text"> - <string>Bloc&ked contacts:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_BL</cstring> - </property> - </widget> - <widget class="TQListBox" row="1" column="0"> - <property name="name"> - <cstring>m_AL</cstring> - </property> - </widget> - <widget class="TQLayoutWidget" row="1" column="1"> - <property name="name"> - <cstring>layout4</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m_blockButton</cstring> - </property> - <property name="text"> - <string>&></string> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m_allowButton</cstring> - </property> - <property name="text"> - <string>&<</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer13</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="text"> - <string>Allo&wed contacts:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_AL</cstring> - </property> - </widget> - <widget class="TQListBox" row="1" column="2"> - <property name="name"> - <cstring>m_BL</cstring> - </property> - </widget> - </grid> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout58</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer47</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>41</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>m_blp</cstring> - </property> - <property name="text"> - <string>Block all users not in 'Allowed' &list</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Checking this box will block all users not explicitly shown in the allowed list here, including any contacts not on your contact list.</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer50</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>41</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout59</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer48</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>81</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m_RLButton</cstring> - </property> - <property name="maximumSize"> - <size> - <width>200</width> - <height>32767</height> - </size> - </property> - <property name="text"> - <string>View &Reverse List</string> - </property> - <property name="toolTip" stdset="0"> - <string>The reverse list is the list of contacts who added you to their own contact list.</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The reverse list is the list of contacts who added you to their own contact list.</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer49</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>111</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>m_warning_2</cstring> - </property> - <property name="paletteForegroundColor"> - <color> - <red>255</red> - <green>0</green> - <blue>0</blue> - </color> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>WARNING: You need to be connected to modify this page</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignVCenter</set> - </property> - </widget> - </vbox> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>TabPage</cstring> - </property> - <attribute name="title"> - <string>Co&nnection</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>groupBox66</cstring> - </property> - <property name="title"> - <string>Connection Preferences (for advanced users)</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>optionOverrideServer</cstring> - </property> - <property name="text"> - <string>&Override default server information</string> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout20</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout19</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="spacing"> - <number>3</number> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>labelServer</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Ser&ver /</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_serverName</cstring> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>labelPort</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>po&rt:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>m_serverPort</cstring> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_serverName</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>messenger.hotmail.com</string> - </property> - <property name="toolTip" stdset="0"> - <string>Only modify these values if you want to use a special IM proxy server, like SIMP</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Only modify these values if you want to use a special IM proxy server, like SIMP</string> - </property> - </widget> - <widget class="TQSpinBox"> - <property name="name"> - <cstring>m_serverPort</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="maxValue"> - <number>65535</number> - </property> - <property name="minValue"> - <number>1</number> - </property> - <property name="value"> - <number>1863</number> - </property> - <property name="toolTip" stdset="0"> - <string>Only modify these values if you want to use a special IM proxy server, like SIMP</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Only modify these values if you want to use a special IM proxy server, like SIMP</string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>optionUseHttpMethod</cstring> - </property> - <property name="text"> - <string>Use &HTTP method</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Connect to MSN Messenger using an HTTP-like protocol on port 80. -This may be used to connect on a network with a restrictive firewall. -Only check this option if the normal connection doesn't work.</string> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout22</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>m_useWebcamPort</cstring> - </property> - <property name="text"> - <string>S&pecify a base port for incoming webcam connections:</string> - </property> - <property name="whatsThis" stdset="0"> - <string>If you are behind a firewall, you may specify a base port to use for the incoming connection, and configure your firewall to accept connections on a range of 10 ports, starting at this one. Incoming connections are used for the webcam. If you don't specify a port yourself, the operating system will choose an available port for you. It is recommended to leave the checkbox unchecked.</string> - </property> - </widget> - <widget class="TQSpinBox"> - <property name="name"> - <cstring>m_webcamPort</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="maxValue"> - <number>65535</number> - </property> - <property name="minValue"> - <number>1</number> - </property> - <property name="value"> - <number>6891</number> - </property> - <property name="whatsThis" stdset="0"> - <string>If you are behind a firewall, you may specify a base port to use for the incoming connection, and configure your firewall to accept connections on a range of 10 ports, starting at this one. Incoming connections are used for the webcam. If you don't specify a port yourself, the operating system will choose an available port for you. It is recommended to leave the checkbox unchecked.</string> - </property> - </widget> - </hbox> - </widget> - </vbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer7</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>21</width> - <height>70</height> - </size> - </property> - </spacer> - </vbox> - </widget> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>labelStatusMessage</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="alignment"> - <set>AlignCenter</set> - </property> - </widget> - </vbox> -</widget> -<customwidgets> - <customwidget> - <class>Kopete::UI::PasswordWidget</class> - <header location="local">kopetepasswordwidget.h</header> - <sizehint> - <width>50</width> - <height>50</height> - </sizehint> - <container>0</container> - <sizepolicy> - <hordata>1</hordata> - <verdata>0</verdata> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - <pixmap>image0</pixmap> - <signal>changed()</signal> - </customwidget> -</customwidgets> -<images> - <image name="image0"> - <data format="PNG" length="868">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000032b49444154388db59531681b6714c77f32373c8186ef0305eea0050932f8201d944d493bc4d0a1a21e4427bb533a74299dbc25905288a7d0b9836932d58116eac1411932388ba421a5a7a17005174e83e00e2cb80f6ab83708d2e18bec8ada26d0f4c1c1ddbbf7fdeeff3efeefbbda70346419b76fdd7ecd3b88e16858ab2dc183c3c1ebee7a97a99b521515d969f65610e71cd971c6f8d7312ccef3c152e9b39f9e11351d36164acdb819d4a9b4c4362ce5a2c48a45162588253ff5cfe5a2c406862405d9138e5eea2a18609a4fb12d212d7ea42c334089ac92e6423113cab902826d4227568a002480a942780dead16a2767e0ca55949a81668023b2c2e8952139748c270e58aa115aebc2675b86b80b6143710aa1b9049ccd336e064a5979e8e039ec7f5f78544368af1b24807ca64cff50befba6a0b765d8be2b67f00bc1562c95e6441646afe40d54b9f36948af2fb4df078722440c0e2af6f70a064f0be2568beea6c5885b01af2d6f4a2db10dc8ff128e0edc19f4f32f8576dbe1707022fcf2b4647babce175f8780f0c31307a7e0162bdc55c5e52247e742fabbc31843af2f9886c32d40d4b0fb4849278ef20476ee59c62f7ced3831848d55f0aa62816ca6de11ad37ed2fa10f1ce9c4619ac2c647824a45dc1100f2a9e2542e067b9f82155f108adf539c61f781924efc0745c0be57273240b08409e62ac508d0f085c94c112c83e778a54608434331733cbc9f331a5bf2636f85a855bfda15f9694e27565ad785e99fcae0a062fb6e4479a2f43e16eacd3a0fef433175ec7e95a1aa98a6d0e95454f355f2bff65803e8f5bddbf7f70a0687393bf72ced2e74ba253bdfb631a1c139872e948d7e487c83ab15979a2301dcba033a373c7e52f0f851c1f885d0ed080ec88f7374ae672b7f3b72249b115143389fce7f4e5e91d11398cefd986e6c099816839fbd1bd2c9b91ad3147afd16a32387534580ac58957c0e3ece485230d77c5ba6a1f4fa42ef9398719253153e1f5f8f687f9013df80f16684c1e0161969b20aae0d47437fc007d0f950882210c19fad81bf24f04e399701a04820380769a2e485e28a0b14b380e4a5927059e85be67cac5dfae63fc61af87fd4ff027ed7f0e16858fb1ba5cd86c64770b2e90000000049454e44ae426082</data> - </image> -</images> -<connections> - <connection> - <sender>m_useDisplayPicture</sender> - <signal>toggled(bool)</signal> - <receiver>m_selectImage</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>m_useDisplayPicture</sender> - <signal>toggled(bool)</signal> - <receiver>m_selectImage</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>m_useDisplayPicture</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel1_2</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>optionOverrideServer</sender> - <signal>toggled(bool)</signal> - <receiver>labelServer</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>optionOverrideServer</sender> - <signal>toggled(bool)</signal> - <receiver>m_serverName</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>optionOverrideServer</sender> - <signal>toggled(bool)</signal> - <receiver>labelPort</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>optionOverrideServer</sender> - <signal>toggled(bool)</signal> - <receiver>m_serverPort</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>m_useDisplayPicture</sender> - <signal>toggled(bool)</signal> - <receiver>m_displayPicture</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>m_useWebcamPort</sender> - <signal>toggled(bool)</signal> - <receiver>m_webcamPort</receiver> - <slot>setEnabled(bool)</slot> - </connection> -</connections> -<tabstops> - <tabstop>tabWidget3</tabstop> - <tabstop>optionOverrideServer</tabstop> - <tabstop>m_serverName</tabstop> - <tabstop>m_serverPort</tabstop> - <tabstop>optionUseHttpMethod</tabstop> - <tabstop>m_login</tabstop> - <tabstop>m_autologin</tabstop> - <tabstop>buttonRegister</tabstop> - <tabstop>m_displayName</tabstop> - <tabstop>m_phw</tabstop> - <tabstop>m_phh</tabstop> - <tabstop>m_phm</tabstop> - <tabstop>m_useDisplayPicture</tabstop> - <tabstop>m_selectImage</tabstop> - <tabstop>m_AL</tabstop> - <tabstop>m_blockButton</tabstop> - <tabstop>m_allowButton</tabstop> - <tabstop>m_BL</tabstop> - <tabstop>m_blp</tabstop> - <tabstop>m_RLButton</tabstop> -</tabstops> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>kopetepasswordwidget.h</includehint> - <includehint>kcombobox.h</includehint> - <includehint>klineedit.h</includehint> -</includehints> -</UI> diff --git a/kopete/protocols/msn/ui/msneditaccountwidget.cpp b/kopete/protocols/msn/ui/msneditaccountwidget.cpp deleted file mode 100644 index 41a007f9..00000000 --- a/kopete/protocols/msn/ui/msneditaccountwidget.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/* - msneditaccountwidget.cpp - MSN Account Widget - - Copyright (c) 2003 by Olivier Goffart <ogoffart @ kde.org> - Copyright (c) 2003 by Martijn Klingens <[email protected]> - - Kopete (c) 2002-2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msneditaccountwidget.h" - -#include <tqcheckbox.h> -#include <tqgroupbox.h> -#include <tqimage.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <tqlineedit.h> -#include <tqlistbox.h> -#include <tqpushbutton.h> -#include <tqregexp.h> -#include <tqspinbox.h> -#include <kcombobox.h> - -#include <kautoconfig.h> -#include <tdefiledialog.h> -#include <tdelocale.h> -#include <tdemessagebox.h> -#include <kstandarddirs.h> -#include <tdeio/netaccess.h> -#include <kdebug.h> -#include <kpassdlg.h> -#include <krun.h> -#include <tdeconfig.h> -#include <kpixmapregionselectordialog.h> - -#include "kopeteuiglobal.h" -#include "kopeteglobal.h" - -#include "kopetepasswordwidget.h" -#include "kopeteaccountmanager.h" - -#include "msnaccount.h" -#include "msncontact.h" -#include "msneditaccountui.h" -#include "msnnotifysocket.h" -#include "msnprotocol.h" - -class MSNEditAccountWidgetPrivate -{ -public: - MSNProtocol *protocol; - KAutoConfig *autoConfig; - MSNEditAccountUI *ui; - - TQString pictureUrl; - TQImage pictureData; -}; - -MSNEditAccountWidget::MSNEditAccountWidget( MSNProtocol *proto, Kopete::Account *account, TQWidget *parent, const char * /* name */ ) -: TQWidget( parent ), KopeteEditAccountWidget( account ) -{ - d = new MSNEditAccountWidgetPrivate; - - d->protocol=proto; - - ( new TQVBoxLayout( this, 0, 0 ) )->setAutoAdd( true ); - - d->ui = new MSNEditAccountUI( this ); - - d->autoConfig = new KAutoConfig( TQT_TQOBJECT(d->ui) ); - d->autoConfig->addWidget( d->ui->global_settings_page, "MSN" ); - d->autoConfig->addWidget( d->ui->privacy_page, "MSN" ); - //the JabberAccount need to be saved as text, and can't be handled by kautoconfig - d->autoConfig->ignoreSubWidget( d->ui->JabberAccount ); - d->autoConfig->retrieveSettings( true ); - - //Get a list of all jabber accounts - TDEGlobal::config()->setGroup("MSN"); - TQString jab_account=TDEGlobal::config()->readEntry("JabberAccount"); - - TQPtrList<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts(); - for(Kopete::Account *a=accounts.first() ; a; a=accounts.next() ) - { - if(a->protocol()->pluginId()=="JabberProtocol") - { - d->ui->JabberAccount->insertItem(a->accountId()); - if( jab_account.isEmpty() ) - jab_account=a->accountId(); - } - } - d->ui->JabberAccount->setCurrentText(jab_account); - - // FIXME: actually, I don't know how to set fonts for qlistboxitem - Olivier - d->ui->label_font->hide(); - - // default fields - if ( account ) - { - TDEConfigGroup * config=account->configGroup(); - - d->ui->m_login->setText( account->accountId() ); - d->ui->m_password->load( &static_cast<MSNAccount *>(account)->password() ); - - //remove me after we can change account ids (Matt) - d->ui->m_login->setDisabled( true ); - d->ui->m_autologin->setChecked( account->excludeConnect() ); - if ( ( static_cast<MSNAccount*>(account)->serverName() != "messenger.hotmail.com" ) || ( static_cast<MSNAccount*>(account)->serverPort() != 1863) ) { - d->ui->optionOverrideServer->setChecked( true ); - } - - d->ui->m_webcamPort->setDisabled(true); - uint port=config->readNumEntry("WebcamPort" ,0); - d->ui->m_useWebcamPort->setChecked( port != 0); - d->ui->m_webcamPort->setValue( port != 0 ? port : 6891 ); - - d->ui->optionUseHttpMethod->setChecked( static_cast<MSNAccount*>(account)->useHttpMethod() ); - - MSNContact *myself = static_cast<MSNContact *>( account->myself() ); - - d->ui->m_displayName->setText( myself->property( Kopete::Global::Properties::self()->nickName()).value().toString() ); - d->ui->m_phw->setText( config->readEntry("PHW") ); - d->ui->m_phm->setText( config->readEntry("PHM") ); - d->ui->m_phh->setText( config->readEntry("PHH") ); - - bool connected = account->isConnected(); - if ( connected ) - { - d->ui->m_warning_1->hide(); - d->ui->m_warning_2->hide(); - } - d->ui->m_phones->setEnabled( connected ); - d->ui->m_displayName->setEnabled( connected ); - d->ui->m_allowButton->setEnabled( connected ); - d->ui->m_blockButton->setEnabled( connected ); - - MSNAccount *m_account = static_cast<MSNAccount*>( account ); - d->ui->m_serverName->setText( m_account->serverName() ); - d->ui->m_serverPort->setValue( m_account->serverPort() ); - - TQStringList blockList = config->readListEntry( "blockList" ); - TQStringList allowList = config->readListEntry( "allowList" ); - //TQStringList reverseList = config->readListEntry("reverseList" ); - - for ( TQStringList::Iterator it = blockList.begin(); it != blockList.end(); ++it ) - d->ui->m_BL->insertItem( *it ); - - for ( TQStringList::Iterator it = allowList.begin(); it != allowList.end(); ++it ) - d->ui->m_AL->insertItem( *it ); - - d->ui->m_blp->setChecked( config->readEntry( "BLP" ) == "BL" ); - - d->pictureUrl = locateLocal( "appdata", "msnpicture-" + - account->accountId().lower().replace( TQRegExp("[./~]" ), "-" ) + ".png" ); - d->ui->m_displayPicture->setPixmap( d->pictureUrl ); - - d->ui->m_useDisplayPicture->setChecked( config->readBoolEntry( "exportCustomPicture" )); - - // Global Identity - d->ui->m_globalIdentity->setChecked( config->readBoolEntry("ExcludeGlobalIdentity", false) ); - } - else - { - d->ui->tab_contacts->setDisabled( true ); - d->ui->m_displayName->setDisabled( true ); - d->ui->m_phones->setDisabled( true ); - } - - connect( d->ui->m_allowButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotAllow() ) ); - connect( d->ui->m_blockButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotBlock() ) ); - connect( d->ui->m_selectImage, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotSelectImage() ) ); - connect( d->ui->m_RLButton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotShowReverseList() ) ); - connect( d->ui->buttonRegister, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotOpenRegister())); - TQWidget::setTabOrder( d->ui->m_login, d->ui->m_password->mRemembered ); - TQWidget::setTabOrder( d->ui->m_password->mRemembered, d->ui->m_password->mPassword ); - TQWidget::setTabOrder( d->ui->m_password->mPassword, d->ui->m_autologin ); -} - -MSNEditAccountWidget::~MSNEditAccountWidget() -{ - delete d; -} - -Kopete::Account * MSNEditAccountWidget::apply() -{ - d->autoConfig->saveSettings(); - TDEGlobal::config()->setGroup("MSN"); - TDEGlobal::config()->writeEntry("JabberAccount", d->ui->JabberAccount->currentText()); - - if ( !account() ) - setAccount( new MSNAccount( d->protocol, d->ui->m_login->text() ) ); - - TDEConfigGroup *config=account()->configGroup(); - - account()->setExcludeConnect( d->ui->m_autologin->isChecked() ); - d->ui->m_password->save( &static_cast<MSNAccount *>(account())->password() ); - - config->writeEntry( "exportCustomPicture", d->ui->m_useDisplayPicture->isChecked() ); - if (d->ui->optionOverrideServer->isChecked() ) { - config->writeEntry( "serverName", d->ui->m_serverName->text() ); - config->writeEntry( "serverPort", d->ui->m_serverPort->value() ); - } - else { - config->writeEntry( "serverName", "messenger.hotmail.com" ); - config->writeEntry( "serverPort", "1863" ); - } - - config->writeEntry( "useHttpMethod", d->ui->optionUseHttpMethod->isChecked() ); - - if(d->ui->m_useWebcamPort->isChecked()) - config->writeEntry( "WebcamPort" , d->ui->m_webcamPort->value() ); - else - config->writeEntry( "WebcamPort" , 0 ); - - // Global Identity - config->writeEntry( "ExcludeGlobalIdentity", d->ui->m_globalIdentity->isChecked() ); - - // Save the avatar image - if( d->ui->m_useDisplayPicture->isChecked() && !d->pictureData.isNull() ) - { - d->pictureUrl = locateLocal( "appdata", "msnpicture-" + - account()->accountId().lower().replace( TQRegExp("[./~]" ), "-" ) + ".png" ); - if ( d->pictureData.save( d->pictureUrl, "PNG" ) ) - { - static_cast<MSNAccount *>( account() )->setPictureUrl( d->pictureUrl ); - } - else - { - KMessageBox::sorry( this, i18n( "<qt>An error occurred when trying to change the display picture.<br>" - "Make sure that you have selected a correct image file</qt>" ), i18n( "MSN Plugin" ) ); - } - } - - static_cast<MSNAccount *>( account() )->resetPictureObject(); - - if ( account()->isConnected() ) - { - MSNContact *myself = static_cast<MSNContact *>( account()->myself() ); - MSNNotifySocket *notify = static_cast<MSNAccount *>( account() )->notifySocket(); - if ( d->ui->m_displayName->text() != myself->property( Kopete::Global::Properties::self()->nickName()).value().toString() ) - static_cast<MSNAccount *>( account() )->setPublicName( d->ui->m_displayName->text() ); - - if ( notify ) - { - if ( d->ui->m_phw->text() != myself->phoneWork() && ( !d->ui->m_phw->text().isEmpty() || !myself->phoneWork().isEmpty() ) ) - notify->changePhoneNumber( "PHW", d->ui->m_phw->text() ); - if( d->ui->m_phh->text() != myself->phoneHome() && ( !d->ui->m_phh->text().isEmpty() || !myself->phoneHome().isEmpty() ) ) - notify->changePhoneNumber( "PHH", d->ui->m_phh->text() ); - if( d->ui->m_phm->text() != myself->phoneMobile() && ( !d->ui->m_phm->text().isEmpty() || !myself->phoneMobile().isEmpty() ) ) - notify->changePhoneNumber( "PHM", d->ui->m_phm->text() ); - // (the && .isEmpty is because one can be null and the other empty) - - if ( ( config->readEntry("BLP") == "BL" ) != d->ui->m_blp->isChecked() ) - { - // Yes, I know, calling sendCommand here is not very clean - Olivier - notify->sendCommand( "BLP", d->ui->m_blp->isChecked() ? "BL" : "AL" ); - } - } - } - return account(); -} - -bool MSNEditAccountWidget::validateData() -{ - TQString userid = d->ui->m_login->text(); - if ( MSNProtocol::validContactId( userid ) ) - return true; - - KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, - i18n( "<qt>You must enter a valid email address.</qt>" ), i18n( "MSN Plugin" ) ); - return false; -} - -void MSNEditAccountWidget::slotAllow() -{ - //TODO: play with multiple selection - TQListBoxItem *item = d->ui->m_BL->selectedItem(); - if ( !item ) - return; - - TQString handle = item->text(); - - MSNNotifySocket *notify = static_cast<MSNAccount *>( account() )->notifySocket(); - if ( !notify ) - return; - notify->removeContact( handle, MSNProtocol::BL, TQString(), TQString() ); - - d->ui->m_BL->takeItem( item ); - d->ui->m_AL->insertItem( item ); -} - -void MSNEditAccountWidget::slotBlock() -{ - //TODO: play with multiple selection - TQListBoxItem *item = d->ui->m_AL->selectedItem(); - if ( !item ) - return; - - TQString handle = item->text(); - - MSNNotifySocket *notify = static_cast<MSNAccount *>( account() )->notifySocket(); - if ( !notify ) - return; - - notify->removeContact( handle, MSNProtocol::AL, TQString(), TQString() ); - - d->ui->m_AL->takeItem( item ); - d->ui->m_BL->insertItem( item ); -} - -void MSNEditAccountWidget::slotShowReverseList() -{ - TQStringList reverseList = account()->configGroup()->readListEntry( "reverseList" ); - KMessageBox::informationList( this, i18n( "Here you can see a list of contacts who added you to their contact list" ), reverseList, - i18n( "Reverse List - MSN Plugin" ) ); -} - -void MSNEditAccountWidget::slotSelectImage() -{ - TQString path = 0; - bool remoteFile = false; - KURL filePath = KFileDialog::getImageOpenURL( TQString(), this, i18n( "MSN Display Picture" ) ); - if( filePath.isEmpty() ) - return; - - if( !filePath.isLocalFile() ) { - if(!TDEIO::NetAccess::download( filePath, path, this )) { - KMessageBox::sorry( this, i18n( "Downloading of display image failed" ), i18n( "MSN Plugin" ) ); - return; - } - remoteFile = true; - } - else path = filePath.path(); - - TQImage img( path ); - img = KPixmapRegionSelectorDialog::getSelectedImage( TQPixmap(img), 96, 96, this ); - - if(!img.isNull()) - { - img = MSNProtocol::protocol()->scalePicture(img); - - d->ui->m_displayPicture->setPixmap( TQPixmap(img) ); - d->pictureData = img; - } - else - { - KMessageBox::sorry( this, i18n( "<qt>An error occurred when trying to change the display picture.<br>" - "Make sure that you have selected a correct image file</qt>" ), i18n( "MSN Plugin" ) ); - } - if( remoteFile ) TDEIO::NetAccess::removeTempFile( path ); -} - -void MSNEditAccountWidget::slotOpenRegister() -{ - KRun::runURL( "http://register.passport.net/", "text/html" ); -} - -#include "msneditaccountwidget.moc" - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/ui/msneditaccountwidget.h b/kopete/protocols/msn/ui/msneditaccountwidget.h deleted file mode 100644 index 730eea3f..00000000 --- a/kopete/protocols/msn/ui/msneditaccountwidget.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - msneditaccountwidget.h - MSN Account Widget - - Copyright (c) 2003 by Olivier Goffart <ogoffart @ kde.org> - Copyright (c) 2003 by Martijn Klingens <[email protected]> - - Kopete (c) 2002-2003 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MSNEDITACCOUNTWIDEGET_H -#define MSNEDITACCOUNTWIDEGET_H - -#include <tqwidget.h> - -#include "editaccountwidget.h" - -namespace Kopete { class Account; } - -class MSNProtocol; - -class MSNEditAccountWidgetPrivate; - -/** - * @author Olivier Goffart <ogoffart @ kde.org> - */ -class MSNEditAccountWidget : public TQWidget, public KopeteEditAccountWidget -{ - Q_OBJECT - - -public: - MSNEditAccountWidget( MSNProtocol *proto, Kopete::Account *account, TQWidget *parent = 0, const char *name = 0 ); - ~MSNEditAccountWidget(); - virtual bool validateData(); - virtual Kopete::Account * apply(); - -private slots: - void slotAllow(); - void slotBlock(); - void slotShowReverseList(); - void slotSelectImage(); - void slotOpenRegister(); - -private: - MSNEditAccountWidgetPrivate *d; -}; - -#endif - -// vim: set noet ts=4 sts=4 sw=4: - diff --git a/kopete/protocols/msn/ui/msninfo.ui b/kopete/protocols/msn/ui/msninfo.ui deleted file mode 100644 index 59d50be6..00000000 --- a/kopete/protocols/msn/ui/msninfo.ui +++ /dev/null @@ -1,221 +0,0 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>MSNInfo</class> -<widget class="TQWidget"> - <property name="name"> - <cstring>MSNInfo</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>457</width> - <height>360</height> - </rect> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>Layout22</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel2_2</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>4</hsizetype> - <vsizetype>4</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Email address:</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_id</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>Layout22_2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>TextLabel2_2_2</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>4</hsizetype> - <vsizetype>4</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Display name:</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_displayName</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="text"> - <string>Personal message:</string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>m_personalMessage</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </hbox> - </widget> - <widget class="TQGroupBox"> - <property name="name"> - <cstring>GroupBox2</cstring> - </property> - <property name="title"> - <string>Phones</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel" row="1" column="0"> - <property name="name"> - <cstring>TextLabel5</cstring> - </property> - <property name="text"> - <string>Home:</string> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel6</cstring> - </property> - <property name="text"> - <string>Work:</string> - </property> - </widget> - <widget class="TQLineEdit" row="0" column="1"> - <property name="name"> - <cstring>m_phw</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLineEdit" row="1" column="1"> - <property name="name"> - <cstring>m_phh</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLabel" row="2" column="0"> - <property name="name"> - <cstring>TextLabel7</cstring> - </property> - <property name="text"> - <string>Mobile:</string> - </property> - </widget> - <widget class="TQLineEdit" row="2" column="1"> - <property name="name"> - <cstring>m_phm</cstring> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </grid> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>m_reversed</cstring> - </property> - <property name="text"> - <string>I am on &the contact list of this contact</string> - </property> - <property name="toolTip" stdset="0"> - <string>Show whether you are on the contact list of this user</string> - </property> - <property name="whatsThis" stdset="0"> - <string>If this box is checked, you are on this user's contact list. -If not, the user has not added you to their list, or has removed you.</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer10</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </vbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> diff --git a/kopete/protocols/msn/webcam.cpp b/kopete/protocols/msn/webcam.cpp deleted file mode 100644 index 60046d17..00000000 --- a/kopete/protocols/msn/webcam.cpp +++ /dev/null @@ -1,891 +0,0 @@ -/* - Copyright (c) 2005 by Olivier Goffart <ogoffart@ kde.org> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - - -#include "webcam.h" - -#if MSN_WEBCAM - -#include <stdlib.h> -#include <kdebug.h> -#include <tqregexp.h> -#include <kbufferedsocket.h> -#include <tdelocale.h> -#include <kserversocket.h> -#include <tdemessagebox.h> -#include <tqlabel.h> -#include <tqguardedptr.h> -#include <tqtimer.h> -#include <tqevent.h> -#include <tqdatetime.h> -#include <tdeconfig.h> - -#include "dispatcher.h" - -#include "mimicwrapper.h" -#include "msnwebcamdialog.h" - - -#include "avdevice/videodevicepool.h" - -using namespace KNetwork; - -namespace P2P { - -Webcam::Webcam(Who who, const TQString& to, Dispatcher *parent, TQ_UINT32 sessionId) - : TransferContext(to,parent,sessionId) , m_who(who) , m_timerId(0) -{ - setType(P2P::WebcamType); - m_direction = Incoming; - m_listener = 0l; - m_webcamSocket=0L; -// m_webcamState=wsNegotiating; - - m_mimic=0L; - m_widget=0L; - - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - - // Read the configuration to get the number of frame per second to send - int webCamFps=config->readNumEntry("WebcamFPS", 25); - m_timerFps = 1000 / webCamFps; -} - -Webcam::~Webcam() -{ - kdDebug(14140) << k_funcinfo<< "################################################" << endl; - m_dispatcher=0l; - delete m_mimic; - delete m_webcamSocket; - delete m_widget; - - if(m_timerId != 0) //if we were sending - { - Kopete::AV::VideoDevicePool *videoDevice = Kopete::AV::VideoDevicePool::self(); - videoDevice->stopCapturing(); - videoDevice->close(); - } - -} - -void Webcam::askIncommingInvitation() -{ - m_direction = Incoming; - //protect, in case this is deleted when the messagebox is active - TQGuardedPtr<Webcam> _this = this; - TQString message= (m_who==wProducer) ? - i18n("<qt>The contact %1 wants to see <b>your</b> webcam, do you want them to see it?</qt>") : - i18n("The contact %1 wants to show you his/her webcam, do you want to see it?") ; - int result=KMessageBox::questionYesNo( 0L , message.arg(m_recipient), - i18n("Webcam invitation - Kopete MSN Plugin") , i18n("Accept") , i18n("Decline")); - if(!_this) - return; - - TQString content = TQString("SessionID: %1\r\n\r\n").arg(m_sessionId); - if(result==KMessageBox::Yes) - { - //Send two message, an OK, and an invite. - //Normaly, the user should decline the invite (i hope) - - // Send a 200 OK message to the recipient. - sendMessage(OK, content); - - - //send an INVITE message we want the user decline - //need to change the branch of the second message - m_branch=Uid::createUid(); - m_state = Negotiation; //set type to application/x-msnmsgr-transreqbody - - content=TQString("Bridges: TRUDPv1 TCPv1\r\n" - "NetID: -1280904111\r\n" - "Conn-Type: Firewall\r\n" - "UPnPNat: false\r\n" - "ICF: false\r\n\r\n"); - - sendMessage(INVITE, content); - - } - else - { - //Decline the invitation - sendMessage(DECLINE, content); - m_state=Finished; - } -} - -void Webcam::sendBYEMessage() -{ - m_state=Finished; - TQString content="Context: dAMAgQ==\r\n"; - sendMessage(BYE,content); - - //If ever the opposite client was dead or something, we'll ack anyway, so everything get cleaned - TQTimer::singleShot(60*1000 , this, TQT_SLOT(acknowledged())); -} - - - -void Webcam::acknowledged() -{ - kdDebug(14140) << k_funcinfo << endl; - - switch(m_state) - { - case Invitation: - { -// m_state=Negotiation; - break; - } - - /* - case Negotiation: - { - if(m_type == UserDisplayIcon) - { - <<< Data preparation acknowledge message. - m_state = DataTransfer; - m_identifier++; - Start sending data. - slotSendData(); - } - break; - } - - case DataTransfer: - NOTE <<< Data acknowledged message. - <<< Bye message should follow. - if(m_type == File) - { - if(m_handshake == 0x01) - { - Data handshake acknowledge message. - Start sending data. - slotSendData(); - } - else if(m_handshake == 0x02) - { - Data acknowledge message. - Send the recipient a BYE message. - m_state = Finished; - sendMessage(BYE, "\r\n"); - } - } - - break; - */ - case Finished: - //BYE or DECLINE acknowledge message. - m_dispatcher->detach(this); - break; - default: - break; - } -} - - - - -void Webcam::processMessage(const Message& message) -{ - if(message.header.dataOffset+message.header.dataSize >= message.header.totalDataSize) - acknowledge( message ); //aknowledge if needed - - if(message.applicationIdentifier != 4l) - { - TQString body = TQCString(message.body.data(), message.header.dataSize); - kdDebug(14141) << k_funcinfo << "received, " << body << endl; - - if(body.startsWith("MSNSLP/1.0 200 OK")) - { - m_direction = Outgoing; - } - if(body.startsWith("INVITE")) - { - if(m_direction == Outgoing) - { - TQRegExp regex(";branch=\\{([0-9A-F\\-]*)\\}\r\n"); - regex.search(body); - m_branch=regex.cap(1); - //decline - sendMessage(DECLINE); - makeSIPMessage("syn",0x17,0x2a,0x01); - } - } - else if(body.startsWith("MSNSLP/1.0 603 DECLINE")) - { - //if it is the declinaison of the second invite message, we have to don't care - //TODO anyway, if it's the declinaison of our invitation, we have to something - } - else if(body.startsWith("BYE")) - { - m_state = Finished; - - // Dispose of this transfer context. - m_dispatcher->detach(this); - } - return; - } - - - - //Let's take the fun, we entering into the delicious webcam negotiation binary protocol - - //well, there is maybe better to take utf16, but it's ascii, so no problem. - TQByteArray dataMessage=message.body; - -#if 0 - TQString echoS=""; - unsigned int f=0; - while(f<dataMessage.size()) - { - echoS+="\n"; - for(unsigned int q=0; q<16 ; q++) - { - if(q+f<dataMessage.size()) - { - unsigned int N=(unsigned int) (dataMessage[q+f]); - if(N<16) - echoS+="0"; - echoS+=TQString::number( N ,16)+" "; - } - else - echoS+=" "; - } - echoS+=" "; - - for(unsigned int q=0; (q<16 && (q+f)<dataMessage.size()) ; q++) - { - unsigned char X=dataMessage[q+f]; - char C=((char)(( X<128 && X>31 ) ? X : '.')); - echoS+=TQString::fromLatin1(&C,1); - } - f+=16; - } - kdDebug(14141) << k_funcinfo << dataMessage.size() << echoS << endl; -#endif - - - - - - for(uint pos=m_content.isNull() ? 10 : 0; pos<dataMessage.size(); pos+=2) - { - if(dataMessage[pos] !=0 ) - m_content+=dataMessage[pos]; - } - - if(message.header.dataOffset+message.header.dataSize < message.header.totalDataSize) - return; - - kdDebug(14141) << k_funcinfo << "Message contents: " << m_content << "\n" << endl; - if(m_content.startsWith("syn")) - { - if(m_direction == Incoming) - makeSIPMessage("syn",0x17,0x2a,0x01); - else - makeSIPMessage("ack",0xea,0x00,0x00); - } - else if(m_content.startsWith("ack")) - { - if(m_direction == Incoming) - makeSIPMessage("ack",0xea,0x00,0x00); - - if(m_who==wProducer) - { - uint sess=rand()%1000+5000; - uint rid=rand()%100+50; - m_myAuth=TQString("recipientid=%1&sessionid=%2\r\n\r\n").arg(rid).arg(sess); - kdDebug(14140) << k_funcinfo << "m_myAuth= " << m_myAuth << endl; - TQString producerxml=xml(sess , rid); - kdDebug(14140) << k_funcinfo << "producerxml= " << producerxml << endl; - makeSIPMessage(producerxml); - } - } - else if(m_content.contains("<producer>") || m_content.contains("<viewer>")) - { - TQRegExp rx("<rid>([0-9]*)</rid>.*<session>([0-9]*)</session>"); - rx.search(m_content); - TQString rid=rx.cap(1); - TQString sess=rx.cap(2); - if(m_content.contains("<producer>")) - { - - TQString viewerxml=xml(sess.toUInt() , rid.toUInt()); - kdDebug(14140) << k_funcinfo << "vewerxml= " << viewerxml << endl; - makeSIPMessage( viewerxml ,0x00,0x09,0x00 ); - m_peerAuth=m_myAuth=TQString("recipientid=%1&sessionid=%2\r\n\r\n").arg(rid,sess); - kdDebug(14140) << k_funcinfo << "m_auth= " << m_myAuth << endl; - } - else - { - m_peerAuth=TQString("recipientid=%1&sessionid=%2\r\n\r\n").arg(rid,sess); - - makeSIPMessage("receivedViewerData", 0xec , 0xda , 0x03); - } - - if(!m_listener) - { - //it should have been creed in xml - sendBYEMessage(); - return; - } - //m_listener->setResolutionEnabled(true); - // Create the callback that will try to accept incoming connections. - TQObject::connect(m_listener, TQT_SIGNAL(readyAccept()), this, TQT_SLOT(slotAccept())); - TQObject::connect(m_listener, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotListenError(int))); - // Listen for incoming connections. - bool isListening = m_listener->listen(); - kdDebug(14140) << k_funcinfo << (isListening ? TQString("listening %1").arg(m_listener->localAddress().toString()) : TQString("not listening")) << endl; - - rx=TQRegExp("<tcpport>([^<]*)</tcpport>"); - rx.search(m_content); - TQString port1=rx.cap(1); - if(port1=="0") - port1=TQString(); - - rx=TQRegExp("<tcplocalport>([^<]*)</tcplocalport>"); - rx.search(m_content); - TQString port2=rx.cap(1); - if(port2==port1 || port2=="0") - port2=TQString(); - - rx=TQRegExp("<tcpexternalport>([^<]*)</tcpexternalport>"); - rx.search(m_content); - TQString port3=rx.cap(1); - if(port3==port1 || port3==port2 || port3=="0") - port3=TQString(); - - int an=0; - while(true) - { - an++; - if(!m_content.contains( TQString("<tcpipaddress%1>").arg(an) )) - break; - rx=TQRegExp(TQString("<tcpipaddress%1>([^<]*)</tcpipaddress%2>").arg(an).arg(an)); - rx.search(m_content); - TQString ip=rx.cap(1); - if(ip.isNull()) - continue; - - if(!port1.isNull()) - { - kdDebug(14140) << k_funcinfo << "trying to connect on " << ip <<":" << port1 << endl; - TDEBufferedSocket *sock=new TDEBufferedSocket( ip, port1, this ); - m_allSockets.append(sock); - TQObject::connect( sock, TQT_SIGNAL( connected( const KResolverEntry&) ), this, TQT_SLOT( slotSocketConnected() ) ); - TQObject::connect( sock, TQT_SIGNAL( gotError(int)), this, TQT_SLOT(slotSocketError(int))); - sock->connect(ip, port1); - kdDebug(14140) << k_funcinfo << "okok " << sock << " - " << sock->peerAddress().toString() << " ; " << sock->localAddress().toString() << endl; - } - if(!port2.isNull()) - { - kdDebug(14140) << k_funcinfo << "trying to connect on " << ip <<":" << port2 << endl; - TDEBufferedSocket *sock=new TDEBufferedSocket( ip, port2, this ); - m_allSockets.append(sock); - TQObject::connect( sock, TQT_SIGNAL( connected( const KResolverEntry&) ), this, TQT_SLOT( slotSocketConnected() ) ); - TQObject::connect( sock, TQT_SIGNAL( gotError(int)), this, TQT_SLOT(slotSocketError(int))); - sock->connect(ip, port2); - } - if(!port3.isNull()) - { - kdDebug(14140) << k_funcinfo << "trying to connect on " << ip <<":" << port3 << endl; - TDEBufferedSocket *sock=new TDEBufferedSocket( ip, port3, this ); - m_allSockets.append(sock); - TQObject::connect( sock, TQT_SIGNAL( connected( const KResolverEntry&) ), this, TQT_SLOT( slotSocketConnected() ) ); - TQObject::connect( sock, TQT_SIGNAL( gotError(int)), this, TQT_SLOT(slotSocketError(int))); - sock->connect(ip, port3); - } - } - TQValueList<TDEBufferedSocket*>::iterator it; - for ( it = m_allSockets.begin(); it != m_allSockets.end(); ++it ) - { - TDEBufferedSocket *sock=(*it); - - //sock->enableRead( false ); - kdDebug(14140) << k_funcinfo << "connect to " << sock << " - "<< sock->peerAddress().toString() << " ; " << sock->localAddress().toString() << endl; - } - } - else if(m_content.contains("receivedViewerData")) - { - //I'm happy you received the xml i sent, really. - } - else - error(); - m_content=TQString(); -} - -void Webcam::makeSIPMessage(const TQString &message, TQ_UINT8 XX, TQ_UINT8 YY , TQ_UINT8 ZZ) -{ - TQByteArray dataMessage; //(12+message.length()*2); - TQDataStream writer(dataMessage, IO_WriteOnly); - writer.setByteOrder(TQDataStream::LittleEndian); - writer << (TQ_UINT8)0x80; - writer << (TQ_UINT8)XX; - writer << (TQ_UINT8)YY; - writer << (TQ_UINT8)ZZ; - writer << (TQ_UINT8)0x08; - writer << (TQ_UINT8)0x00; - writer << message+'\0'; - //writer << (TQ_UINT16)0x0000; - - /*TQString echoS=""; - unsigned int f=0; - while(f<dataMessage.size()) - { - echoS+="\n"; - for(unsigned int q=0; q<16 ; q++) - { - if(q+f<dataMessage.size()) - { - unsigned int N=(unsigned int) (dataMessage[q+f]); - if(N<16) - echoS+="0"; - echoS+=TQString::number( N ,16)+" "; - } - else - echoS+=" "; - } - echoS+=" "; - - for(unsigned int q=0; (q<16 && (q+f)<dataMessage.size()) ; q++) - { - unsigned char X=dataMessage[q+f]; - char C=((char)(( X<128 && X>31 ) ? X : '.')); - echoS+=TQString::fromLatin1(&C,1); - } - f+=16; - } - kdDebug(14141) << k_funcinfo << dataMessage.size() << echoS << endl;*/ - - - sendBigP2PMessage(dataMessage); -} - -void Webcam::sendBigP2PMessage( const TQByteArray & dataMessage) -{ - unsigned int size=m_totalDataSize=dataMessage.size(); - m_offset=0; - ++m_identifier; - - for(unsigned int f=0;f<size;f+=1200) - { - m_offset=f; - TQByteArray dm2; - dm2.duplicate(dataMessage.data()+m_offset, TQMIN(1200,m_totalDataSize-m_offset)); - sendData( dm2 ); - m_offset+=dm2.size(); - } - m_offset=0; - m_totalDataSize=0; -} - - - -TQString Webcam::xml(uint session , uint rid) -{ - TQString who= ( m_who == wProducer ) ? TQString("producer") : TQString("viewer"); - - TQString ip; - - uint ip_number=1; - TQStringList::iterator it; - TQStringList ips=m_dispatcher->localIp(); - for ( it = ips.begin(); it != ips.end(); ++it ) - { - ip+=TQString("<tcpipaddress%1>%2</tcpipaddress%3>").arg(ip_number).arg(*it).arg(ip_number); - ++ip_number; - } - - TQString port = TQString::number(getAvailablePort()); - - m_listener = new TDEServerSocket(port, this) ; - - return "<" + who + "><version>2.0</version><rid>"+TQString::number(rid)+"</rid><udprid>"+TQString::number(rid+1)+"</udprid><session>"+TQString::number(session)+"</session><ctypes>0</ctypes><cpu>2931</cpu>" + - "<tcp><tcpport>"+port+"</tcpport>\t\t\t\t\t\t\t\t <tcplocalport>"+port+"</tcplocalport>\t\t\t\t\t\t\t\t <tcpexternalport>"+port+"</tcpexternalport>"+ip+"</tcp>"+ - "<udp><udplocalport>7786</udplocalport><udpexternalport>31863</udpexternalport><udpexternalip>"+ ip +"</udpexternalip><a1_port>31859</a1_port><b1_port>31860</b1_port><b2_port>31861</b2_port><b3_port>31862</b3_port><symmetricallocation>1</symmetricallocation><symmetricallocationincrement>1</symmetricallocationincrement><udpversion>1</udpversion><udpinternalipaddress1>127.0.0.1</udpinternalipaddress1></udp>"+ - "<codec></codec><channelmode>1</channelmode></"+who+">\r\n\r\n"; -} - -int Webcam::getAvailablePort() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "MSN" ); - TQString basePort=config->readEntry("WebcamPort"); - if(basePort.isEmpty() || basePort == "0" ) - basePort="6891"; - - uint firstport = basePort.toInt(); - uint maxOffset=config->readUnsignedNumEntry("WebcamMaxPortOffset", 10); - uint lastport = firstport + maxOffset; - - // try to find an available port - // - TDEServerSocket *ss = new TDEServerSocket(); - ss->setFamily(KResolver::InetFamily); - bool found = false; - unsigned int port = firstport; - for( ; port <= lastport; ++port) { - ss->setAddress( TQString::number( port ) ); - bool success = ss->listen(); - if( found = ( success && ss->error() == TDESocketBase::NoError ) ) - break; - ss->close(); - } - delete ss; - - - kdDebug(14140) << k_funcinfo<< "found available port : " << port << endl; - - return port; -} - - -/* ---------- Now functions about the dirrect connection --------- */ - -void Webcam::slotSocketConnected() -{ - kdDebug(14140) << k_funcinfo <<"##########################" << endl; - - m_webcamSocket=const_cast<TDEBufferedSocket*>(static_cast<const TDEBufferedSocket*>(sender())); - if(!m_webcamSocket) - return; - - kdDebug(14140) << k_funcinfo << "Connection established on " << m_webcamSocket->peerAddress().toString() << " ; " << m_webcamSocket->localAddress().toString() << endl; - - m_webcamSocket->setBlocking(false); - m_webcamSocket->enableRead(true); - m_webcamSocket->enableWrite(false); - - // Create the callback that will try to read bytes from the accepted socket. - TQObject::connect(m_webcamSocket, TQT_SIGNAL(readyRead()), this, TQT_SLOT(slotSocketRead())); - // Create the callback that will try to handle the socket close event. - TQObject::connect(m_webcamSocket, TQT_SIGNAL(closed()), this, TQT_SLOT(slotSocketClosed())); - // Create the callback that will try to handle the socket error event. -// TQObject::connect(m_webcamSocket, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotSocketError(int))); - - m_webcamStates[m_webcamSocket]=wsConnected; - TQCString to_send=m_peerAuth.utf8(); - m_webcamSocket->writeBlock(to_send.data(), to_send.length()); - kdDebug(14140) << k_funcinfo << "sending "<< m_peerAuth << endl; - -} - - -void Webcam::slotAccept() -{ - // Try to accept an incoming connection from the sending client. - m_webcamSocket = static_cast<TDEBufferedSocket*>(m_listener->accept()); - if(!m_webcamSocket) - { - // NOTE If direct connection fails, the sending - // client wil transfer the file data through the - // existing session. - kdDebug(14140) << k_funcinfo << "Direct connection failed." << endl; - // Close the listening endpoint. -// m_listener->close(); - return; - } - - kdDebug(14140) << k_funcinfo << "################################ Direct connection established." << endl; - - // Set the socket to non blocking, - // enable the ready read signal and disable - // ready write signal. - // NOTE readyWrite consumes too much cpu usage. - m_webcamSocket->setBlocking(false); - m_webcamSocket->enableRead(true); - m_webcamSocket->enableWrite(false); - - // Create the callback that will try to read bytes from the accepted socket. - TQObject::connect(m_webcamSocket, TQT_SIGNAL(readyRead()), this, TQT_SLOT(slotSocketRead())); - // Create the callback that will try to handle the socket close event. - TQObject::connect(m_webcamSocket, TQT_SIGNAL(closed()), this, TQT_SLOT(slotSocketClosed())); - // Create the callback that will try to handle the socket error event. - TQObject::connect(m_webcamSocket, TQT_SIGNAL(gotError(int)), this, TQT_SLOT(slotSocketError(int))); - - m_allSockets.append(m_webcamSocket); - m_webcamStates[m_webcamSocket]=wsNegotiating; -} - -void Webcam::slotSocketRead() -{ - m_webcamSocket=const_cast<TDEBufferedSocket*>(static_cast<const TDEBufferedSocket*>(sender())); - - uint available = m_webcamSocket->bytesAvailable(); - kdDebug(14140) << k_funcinfo << m_webcamSocket << "############# " << available << " bytes available." << endl; - - TQByteArray avail_buff(available); - m_webcamSocket->peekBlock(avail_buff.data(), avail_buff.size()); - - kdDebug(14140) << k_funcinfo << m_webcamSocket << avail_buff << endl; - - - - const TQString connected_str("connected\r\n\r\n"); - switch(m_webcamStates[m_webcamSocket]) - { - case wsNegotiating: - { - if(available < m_myAuth.length()) - { - kdDebug(14140) << k_funcinfo << "waiting more data ( " << available << " of " <<m_myAuth.length()<< " )"<< endl; - break; - } - TQByteArray buffer(available); - m_webcamSocket->readBlock(buffer.data(), buffer.size()); - - kdDebug(14140) << k_funcinfo << buffer.data() << endl; - - if(TQString(buffer) == m_myAuth ) - { - closeAllOtherSockets(); - kdDebug(14140) << k_funcinfo << "Sending " << connected_str << endl; - TQCString conne=connected_str.utf8(); - m_webcamSocket->writeBlock(conne.data(), conne.length()); - m_webcamStates[m_webcamSocket]=wsConnecting; - - //SHOULD NOT BE THERE - m_mimic=new MimicWrapper(); - if(m_who==wProducer) - { - Kopete::AV::VideoDevicePool *videoDevice = Kopete::AV::VideoDevicePool::self(); - videoDevice->open(); - videoDevice->setSize(320, 240); - videoDevice->startCapturing(); - - m_timerId=startTimer(m_timerFps); - kdDebug(14140) << k_funcinfo << "new timer" << m_timerId << endl; - } - m_widget=new MSNWebcamDialog(m_recipient); - connect(m_widget, TQT_SIGNAL( closingWebcamDialog() ) , this , TQT_SLOT(sendBYEMessage())); - - } - else - { - kdWarning(14140) << k_funcinfo << "Auth failed" << endl; - m_webcamSocket->disconnect(); - m_webcamSocket->deleteLater(); - m_allSockets.remove(m_webcamSocket); - m_webcamSocket=0l; - //sendBYEMessage(); - } - break; - } - case wsConnecting: - case wsConnected: - { - if(available < connected_str.length()) - { - kdDebug(14140) << k_funcinfo << "waiting more data ( " << available << " of " <<connected_str.length()<< " )"<< endl; - break; - } - TQByteArray buffer(connected_str.length()); - m_webcamSocket->readBlock(buffer.data(), buffer.size()); - -// kdDebug(14140) << k_funcinfo << "state " << m_webcamState << " received :" << TQCString(buffer) << endl; - - - if(TQString(buffer) == connected_str) - { - if(m_webcamStates[m_webcamSocket]==wsConnected) - { - closeAllOtherSockets(); - kdDebug(14140) << k_funcinfo << "Sending " << connected_str << endl; - TQCString conne=connected_str.utf8(); - m_webcamSocket->writeBlock(conne.data(), conne.length()); - - //SHOULD BE DONE IN ALL CASE - m_mimic=new MimicWrapper(); - if(m_who==wProducer) - { - Kopete::AV::VideoDevicePool *videoDevice = Kopete::AV::VideoDevicePool::self(); - videoDevice->open(); - videoDevice->setSize(320, 240); - videoDevice->startCapturing(); - - m_timerId=startTimer(m_timerFps); - kdDebug(14140) << k_funcinfo << "new timer" << m_timerId << endl; - } - m_widget=new MSNWebcamDialog(m_recipient); - connect(m_widget, TQT_SIGNAL( closingWebcamDialog() ) , this , TQT_SLOT(sendBYEMessage())); - - } - m_webcamStates[m_webcamSocket]=wsTransfer; - - } - else - { - kdWarning(14140) << k_funcinfo << "Connecting failed" << endl; - m_webcamSocket->disconnect(); - m_webcamSocket->deleteLater(); - m_allSockets.remove(m_webcamSocket); - m_webcamSocket=0l; - } - break; - } - case wsTransfer: - { - if(m_who==wProducer) - { - kdWarning(14140) << k_funcinfo << "data received when we are producer"<< endl; - break; - } - if(available < 24) - { - kdDebug(14140) << k_funcinfo << "waiting more data ( " << available << " of " <<24<< " )"<< endl; - break; - } - TQByteArray buffer(24); - m_webcamSocket->peekBlock(buffer.data(), buffer.size()); - - TQ_UINT32 paysize=(uchar)buffer[8] + ((uchar)buffer[9]<<8) + ((uchar)buffer[10]<<16) + ((uchar)buffer[11]<<24); - - if(available < (paysize+24)) - { - kdDebug(14140) << k_funcinfo << "waiting more data ( " << available << " of " <<paysize<< " )"<< endl; - break; - } - m_webcamSocket->readBlock(buffer.data(), 24); //flush - buffer.resize(paysize); - m_webcamSocket->readBlock(buffer.data(), buffer.size()); - - TQPixmap pix=m_mimic->decode(buffer); - if(pix.isNull()) - { - kdWarning(14140) << k_funcinfo << "incorrect pixmap returned, better to stop everything"<< endl; - m_webcamSocket->disconnect(); - sendBYEMessage(); - } - m_widget->newImage(pix); - break; - } - default: - break; - } - -} - -void Webcam::slotListenError(int errorCode) -{ - kdWarning(14140) << k_funcinfo << "Error " << errorCode << " : " << m_listener->errorString() << endl; -} - -void Webcam::slotSocketClosed() -{ - if(!m_dispatcher) //we are in this destructor - return; - - TDEBufferedSocket *m_webcamSocket=const_cast<TDEBufferedSocket*>(static_cast<const TDEBufferedSocket*>(sender())); - - kdDebug(14140) << k_funcinfo << m_webcamSocket << endl; - - if(m_listener) - { //if we are still waiting for other socket to connect, just remove this socket from the socket list - m_webcamSocket->disconnect(); - m_webcamSocket->deleteLater(); - m_allSockets.remove(m_webcamSocket); - m_webcamSocket=0l; - } - else // else, close the session - sendBYEMessage(); - -} - -void Webcam::slotSocketError(int errorCode) -{ - TDEBufferedSocket *socket=const_cast<TDEBufferedSocket*>(static_cast<const TDEBufferedSocket*>(sender())); - kdDebug(14140) << k_funcinfo << socket << " - " << errorCode << " : " << socket->TDESocketBase::errorString() << endl; - //sendBYEMessage(); -} - -void Webcam::closeAllOtherSockets() -{ - //m_lisener->close(); - delete m_listener; - m_listener=0l; - - TQValueList<TDEBufferedSocket*>::iterator it; - for ( it = m_allSockets.begin(); it != m_allSockets.end(); ++it ) - { - TDEBufferedSocket *sock=(*it); - if(sock != m_webcamSocket) - delete sock; - } - m_allSockets.clear(); -} - - -void Webcam::timerEvent( TQTimerEvent *e ) -{ - if(e->timerId() != m_timerId) - return TransferContext::timerEvent(e); - -// kdDebug(14140) << k_funcinfo << endl; - - Kopete::AV::VideoDevicePool *videoDevice = Kopete::AV::VideoDevicePool::self(); - videoDevice->getFrame(); - TQImage img; - videoDevice->getImage(&img); - - if(m_widget) - m_widget->newImage(img); - - if(img.width()!=320 || img.height()!=240) - { - kdWarning(14140) << k_funcinfo << "Bad image size " <<img.width() << "x" << img.height() << endl; - return; - } - - uchar *bits=img.bits(); - TQByteArray image_data(img.width()*img.height()*3); - uint b2=0; - uint imgsize=img.width()*img.height()*4; - for(uint f=0; f< imgsize; f+=4) - { - image_data[b2+0]=bits[f+2]; - image_data[b2+1]=bits[f+1]; - image_data[b2+2]=bits[f+0]; - b2+=3; - } - - TQByteArray frame=m_mimic->encode(image_data); - - - kdDebug(14140) << k_funcinfo << "Sendinf frame of size " << frame.size() << endl; - //build the header. - TQByteArray header; - - TQDataStream writer(header, IO_WriteOnly); - writer.setByteOrder(TQDataStream::LittleEndian); - writer << (TQ_UINT16)24; // header size - writer << (TQ_UINT16)img.width(); - writer << (TQ_UINT16)img.height(); - writer << (TQ_UINT16)0x0000; //wtf .? - writer << (TQ_UINT32)frame.size(); - writer << (TQ_UINT8)('M') << (TQ_UINT8)('L') << (TQ_UINT8)('2') << (TQ_UINT8)('0'); - writer << (TQ_UINT32)0x00000000; //wtf .? - writer << TQTime::currentTime(); //FIXME: possible midnight bug ? - - m_webcamSocket->writeBlock(header.data(), header.size()); - m_webcamSocket->writeBlock(frame.data(), frame.size()); -} - - -} - - -#include "webcam.moc" - -#endif - diff --git a/kopete/protocols/msn/webcam.h b/kopete/protocols/msn/webcam.h deleted file mode 100644 index a056fe24..00000000 --- a/kopete/protocols/msn/webcam.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - Copyright (c) 2005 by Olivier Goffart <ogoffart@ kde.org> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef P2PWEBCAM_H -#define P2PWEBCAM_H - -#include "p2p.h" - -#if MSN_WEBCAM - -namespace KNetwork{ class TDEServerSocket; class TDEBufferedSocket; } - -class MimicWrapper; -class TQLabel; -class MSNWebcamDialog; -class TQTimerEvent; - -namespace P2P { - - -class Webcam : public TransferContext -{ Q_OBJECT - - public: - enum Who { wProducer , wViewer }; - - Webcam( Who who , const TQString& to, Dispatcher *parent, TQ_UINT32 sessionID); - ~Webcam( ); - - virtual void processMessage(const Message& message); - - public slots: - void askIncommingInvitation(); - virtual void acknowledged(); - void sendBYEMessage(); - - private: - void makeSIPMessage(const TQString &message, TQ_UINT8 XX=0, TQ_UINT8 YY=9 , TQ_UINT8 ZZ=0); - void sendBigP2PMessage( const TQByteArray& dataMessage ); - void closeAllOtherSockets(); - TQString m_content; - - TQString xml(uint session , uint rid); - int getAvailablePort(); - - - KNetwork::TDEServerSocket *m_listener; - KNetwork::TDEBufferedSocket *m_webcamSocket; - - enum WebcamStatus { wsNegotiating , wsConnecting, wsConnected, wsTransfer } ; - - Who m_who; - - TQString m_myAuth; - TQString m_peerAuth; - - MimicWrapper *m_mimic; - MSNWebcamDialog *m_widget; - - TQValueList<KNetwork::TDEBufferedSocket* > m_allSockets; - TQMap<KNetwork::TDEBufferedSocket*, WebcamStatus> m_webcamStates; - - int m_timerId; - int m_timerFps; - - private slots: - void slotListenError(int errorCode); - void slotAccept(); - void slotSocketRead(); - void slotSocketClosed(); - void slotSocketError(int errorCode); - void slotSocketConnected(); -// void slotReadyWrite(); - protected: - virtual void timerEvent( TQTimerEvent * ); -}; - -} - -#endif - -#endif diff --git a/kopete/protocols/msn/webcam/CMakeLists.txt b/kopete/protocols/msn/webcam/CMakeLists.txt deleted file mode 100644 index aafa2d94..00000000 --- a/kopete/protocols/msn/webcam/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -add_subdirectory( libmimic ) - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/kopete/libkopete - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} - ${GLIB2_INCLUDE_DIRS} -) - - -##### mimicwrapper (static) ##################### - -tde_add_library( mimicwrapper STATIC_PIC AUTOMOC - SOURCES mimicwrapper.cpp msnwebcamdialog.cpp - LINK mimic-static -) diff --git a/kopete/protocols/msn/webcam/Makefile.am b/kopete/protocols/msn/webcam/Makefile.am deleted file mode 100644 index 27d37fe0..00000000 --- a/kopete/protocols/msn/webcam/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -METASOURCES = AUTO -SUBDIRS = libmimic -AM_CPPFLAGS = -I$(srcdir)/libmimic \ - $(KOPETE_INCLUDES) \ - $(all_includes) \ - $(GLIB_CFLAGS) - -noinst_LTLIBRARIES = libmimicwrapper.la - -libmimicwrapper_la_SOURCES = mimicwrapper.cpp msnwebcamdialog.cpp -libmimicwrapper_la_LIBADD = ./libmimic/libmimic.la -libmimicwrapper_la_LDFLAGS = -no-undefined $(GLIB_LIBS) $(all_libraries) - - diff --git a/kopete/protocols/msn/webcam/libmimic/AUTHORS b/kopete/protocols/msn/webcam/libmimic/AUTHORS deleted file mode 100644 index 8dd0671d..00000000 --- a/kopete/protocols/msn/webcam/libmimic/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -Ole André Vadla Ravnås <[email protected]> - diff --git a/kopete/protocols/msn/webcam/libmimic/CMakeLists.txt b/kopete/protocols/msn/webcam/libmimic/CMakeLists.txt deleted file mode 100644 index 5a340661..00000000 --- a/kopete/protocols/msn/webcam/libmimic/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -################################################# -# -# (C) 2010-2011 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${GLIB2_INCLUDE_DIRS} -) - - -##### mimic (static) ############################ - -tde_add_library( mimic STATIC_PIC - SOURCES - mimic.c encode.c decode.c bitstring.c vlc_common.c vlc_encode.c - vlc_decode.c fdct_quant.c idct_dequant.c colorspace.c deblock.c - LINK ${GLIB2_LIBRARIES} -) diff --git a/kopete/protocols/msn/webcam/libmimic/COPYING b/kopete/protocols/msn/webcam/libmimic/COPYING deleted file mode 100644 index ae23fcfd..00000000 --- a/kopete/protocols/msn/webcam/libmimic/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/kopete/protocols/msn/webcam/libmimic/Makefile.am b/kopete/protocols/msn/webcam/libmimic/Makefile.am deleted file mode 100644 index 1a2c99d3..00000000 --- a/kopete/protocols/msn/webcam/libmimic/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# INCLUDES = @GLIB_CFLAGS@ -AM_CPPFLAGS = $(all_includes) $(GLIB_CFLAGS) - -# libmimicincludedir = $(includedir) -# libmimicinclude_HEADERS = mimic.h - -noinst_LTLIBRARIES = libmimic.la -libmimic_la_SOURCES = \ - mimic.c \ - encode.c \ - decode.c \ - bitstring.c \ - vlc_common.c \ - vlc_encode.c \ - vlc_decode.c \ - fdct_quant.c \ - idct_dequant.c \ - colorspace.c \ - deblock.c \ - mimic-private.h -# libmimic_la_LDFLAGS = \ -# -version-info $(MIMIC_CURRENT):$(MIMIC_REVISION):$(MIMIC_AGE) \ -# -export-symbols-regex "^[^_].*" - diff --git a/kopete/protocols/msn/webcam/libmimic/README b/kopete/protocols/msn/webcam/libmimic/README deleted file mode 100644 index c60336ec..00000000 --- a/kopete/protocols/msn/webcam/libmimic/README +++ /dev/null @@ -1,40 +0,0 @@ -ABOUT ------ - -libmimic is an open source video encoding/decoding library for Mimic V2.x- -encoded content (fourCC: ML20), which is the encoding used by MSN Messenger -for webcam conversations. - -It was written because there was no third-party MSN-client that supported -this feature due to this proprietary/unknown codec involved. I didn't like -this lack of interoperability, so I decided to do something about it. After -studying the official MSN-client a little closer, it became clear that the -codec involved was statically linked into the executable, so there was no -easy way to use the codec code through Wine. So for fun, and challenge, I -reverse-engineered the original implementation by studying the massive -amount of assembly code involved, and after a lot of hard work I ended -up with this implementation in C. - -It should be noted that reverse-engineering for interoperability is 100% -legal here in Norway (and in most European countries). - - -THANKS ------- - -Special thanks to Rob Taylor and the rest of the Farsight-team for all -the feedback and inspiration during development, you guys rock! :-) - - -BOTTOM LINE ------------ - -If you like my work and decide to use it in your project, please feel free -to credit me. I put a lot of time and hard work into this, so I hope others -will find it useful. - -Well, enough chit chat, enjoy! :-) - -Ole André Vadla Ravnås -oleavr at gmail dot com - diff --git a/kopete/protocols/msn/webcam/libmimic/bitstring.c b/kopete/protocols/msn/webcam/libmimic/bitstring.c deleted file mode 100644 index 7caf9fd8..00000000 --- a/kopete/protocols/msn/webcam/libmimic/bitstring.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 "mimic-private.h" - -/* - * _read_bits - * - * Internal helper-function used to read num_bits - * from stream. - */ -guint32 _read_bits(MimCtx *ctx, gint num_bits) -{ - guint32 bits; - - if (ctx->cur_chunk_len >= 16) { - guchar *input_buf = (guchar *) ctx->data_buffer + ctx->data_index; - - if (!ctx->read_odd) { - ctx->read_odd = TRUE; - - ctx->cur_chunk = (input_buf[3] << 24) | - (input_buf[2] << 16) | - (input_buf[1] << 8) | - input_buf[0]; - - } else { - ctx->read_odd = FALSE; - - ctx->cur_chunk = (input_buf[1] << 24) | - (input_buf[0] << 16) | - (input_buf[7] << 8) | - input_buf[6]; - - ctx->data_index += 4; - } - - ctx->cur_chunk_len -= 16; - } - - bits = (ctx->cur_chunk << ctx->cur_chunk_len) >> (32 - num_bits); - ctx->cur_chunk_len += num_bits; - - return bits; -} - -/* - * _write_bits - * - * Internal helper-function used to write "length" - * bits of "bits" to stream. - */ -void _write_bits(MimCtx *ctx, guint32 bits, gint length) -{ - /* Left-align the bit string within its 32-bit container. */ - bits <<= (32 - length); - - /* Append the bit string (one or more of the trailing bits might not fit, but that's ok). */ - ctx->cur_chunk |= bits >> ctx->cur_chunk_len; - ctx->cur_chunk_len += length; - - /* Is it full? */ - if (ctx->cur_chunk_len >= 32) { - - /* Add the full 32-bit chunk to the stream and update counter. */ - ctx->chunk_ptr[0] = GUINT32_TO_LE(ctx->cur_chunk); - ctx->chunk_ptr++; - ctx->cur_chunk_len -= 32; - - /* Add any trailing bits that didn't fit. */ - ctx->cur_chunk = bits << (length - ctx->cur_chunk_len); - } -} - diff --git a/kopete/protocols/msn/webcam/libmimic/colorspace.c b/kopete/protocols/msn/webcam/libmimic/colorspace.c deleted file mode 100644 index 27de4a09..00000000 --- a/kopete/protocols/msn/webcam/libmimic/colorspace.c +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 "mimic-private.h" - -#define RED_INDEX_1 0 -#define GREEN_INDEX_1 1 -#define BLUE_INDEX_1 2 - -#define RED_INDEX_2 3 -#define GREEN_INDEX_2 4 -#define BLUE_INDEX_2 5 - -/* - * _rgb_to_yuv - * - * Internal helper-function used to convert an image - * from RGB 24-bpp packed-pixel to YUV420 planar. - */ -void _rgb_to_yuv(const guchar *input_rgb, - guchar *output_y, - guchar *output_cb, - guchar *output_cr, - gint width, - gint height) -{ - gint y, x; - - for (y = 0; y < height; y += 2) { - - const guchar *src1, *src2; - guchar *dst1, *dst2, *dst3, *dst4; - gint num_cols; - - src1 = input_rgb + ((height - 1 - y) * width * 3); - src2 = input_rgb + ((height - 2 - y) * width * 3); - - dst1 = output_y + (y * width); - dst2 = output_y + ((y + 1) * width); - dst3 = output_cb + ((y / 2) * (width / 2)); - dst4 = output_cr + ((y / 2) * (width / 2)); - - num_cols = width / 2; - - for (x = 0; x < num_cols; x++) { - - gint expr1, expr2, expr3, expr4, expr5, v; - - expr1 = (src1[BLUE_INDEX_1] * 19595) + (src1[GREEN_INDEX_1] * 38470) + (src1[RED_INDEX_1] * 7471); - expr2 = (src1[BLUE_INDEX_2] * 19595) + (src1[GREEN_INDEX_2] * 38470) + (src1[RED_INDEX_2] * 7471); - expr3 = (src2[BLUE_INDEX_1] * 19595) + (src2[GREEN_INDEX_1] * 38470) + (src2[RED_INDEX_1] * 7471); - expr4 = (src2[BLUE_INDEX_2] * 19595) + (src2[GREEN_INDEX_2] * 38470) + (src2[RED_INDEX_2] * 7471); - - expr5 = expr1 + expr2 + expr3 + expr4; - - dst1[0] = expr1 >> 16; - dst1[1] = expr2 >> 16; - dst2[0] = expr3 >> 16; - dst2[1] = expr4 >> 16; - - v = (((src1[BLUE_INDEX_1] + src1[BLUE_INDEX_2] + src2[BLUE_INDEX_1] + src2[BLUE_INDEX_2]) << 16) - expr5 + 131071) >> 16; - dst3[0] = _clamp_value(((v * 57475) >> 18) + 128); - - v = (((src1[RED_INDEX_1] + src1[RED_INDEX_2] + src2[RED_INDEX_1] + src2[RED_INDEX_2]) << 16) - expr5 + 131071) >> 16; - dst4[0] = ((v * 32244) >> 18) + 128; - - src1 += 6; - src2 += 6; - - dst1 += 2; - dst2 += 2; - dst3++; - dst4++; - - } - - } - -} - -/* - * _yuv_to_rgb - * - * Internal helper-function used to convert an image - * from YUV420 planar to RGB 24-bpp packed-pixel. - */ -void _yuv_to_rgb(const guchar *input_y, - const guchar *input_cb, - const guchar *input_cr, - guchar *output_rgb, - guint width, - guint height) -{ - const guchar *src_y, *src_cb, *src_cr; - guchar *dst_rgb; - guint i, j, rgb_stride; - - src_y = input_y; - src_cb = input_cb; - src_cr = input_cr; - - rgb_stride = width * 3; - dst_rgb = output_rgb + (rgb_stride * (height - 1)); - - for (i = 0; i < height; i++) { - const guchar *p_y, *p_cb, *p_cr; - guchar *p_rgb; - - p_y = src_y; - p_cb = src_cb; - p_cr = src_cr; - - p_rgb = dst_rgb; - - for (j = 0; j < width; j++) { - gint v; - - v = ((p_y[0] * 65536) + ((p_cr[0] - 128) * 133169)) / 65536; - p_rgb[0] = _clamp_value(v); - - v = ((p_y[0] * 65536) - ((p_cr[0] - 128) * 25821) - ((p_cb[0] - 128) * 38076)) / 65536; - p_rgb[1] = _clamp_value(v); - - v = ((p_y[0] * 65536) + ((p_cb[0] - 128) * 74711)) / 65536; - p_rgb[2] = _clamp_value(v); - - p_y++; - if ((j + 1) % 2 == 0) { - p_cb++; - p_cr++; - } - - p_rgb += 3; - } - - src_y += width; - if ((i + 1) % 2 == 0) { - src_cb += (width + 1) / 2; - src_cr += (width + 1) / 2; - } - - dst_rgb -= rgb_stride; - - } - -} - diff --git a/kopete/protocols/msn/webcam/libmimic/deblock.c b/kopete/protocols/msn/webcam/libmimic/deblock.c deleted file mode 100644 index 02218d36..00000000 --- a/kopete/protocols/msn/webcam/libmimic/deblock.c +++ /dev/null @@ -1,450 +0,0 @@ -/* Copyright (C) 2005 Ole Andr� Vadla Ravn�s <[email protected]> - * - * 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 <stdlib.h> -#include <string.h> -#include "mimic-private.h" - -static void deblock_horizontal(guchar *blocks, guint stride, guint row_count); -static void deblock_vertical(guchar *blocks, guint stride, guint row_count); - -static gboolean deblock_h_consider_entire(guchar *blocks, guint stride); -static void deblock_h_do_entire(guchar *blocks, guint stride); -static void deblock_h_do_boundaries(guchar *blocks, guint stride); - -static gboolean deblock_v_consider_entire(guchar *blocks, guint stride); -static void deblock_v_do_entire(guchar *blocks, guint stride); -static void deblock_v_do_boundaries(guchar *blocks, guint stride); - -/* - * _deblock - * - * Internal helper-function used for de-blocking. - */ -void _deblock(guchar *blocks, guint stride, guint row_count) -{ - deblock_horizontal(blocks, stride, row_count); - deblock_vertical(blocks, stride, row_count); -} - -static void deblock_horizontal(guchar *blocks, guint stride, guint row_count) -{ - guchar *p1; - gint i, j, n1, n2; - - if (stride <= 8 || row_count == 0) - return; - - p1 = blocks + 4; - n1 = ((row_count - 1) >> 2) + 1; - n2 = ((stride - 9) >> 3) + 1; - - for (i = 0; i < n1; i++) { - guchar *p; - - p = p1; - - for (j = 0; j < n2; j++) { - - if (deblock_h_consider_entire(p - 1, stride) == TRUE) { - - gint v1, v2, v; - - v1 = p[0]; - v2 = p[7]; - - v = v1 - v2; - if (v <= 0) - v = v2 - v1; - - if (v < 20) - deblock_h_do_entire(p - 1, stride); - - } else { - deblock_h_do_boundaries(p - 1, stride); - } - - p += 8; - } - - p1 += stride * 4; - } -} - -static void deblock_vertical(guchar *blocks, guint stride, guint row_count) -{ - gint i, j, k, n1, n2; - guchar *p1, *p2; - - if (stride == 0 || row_count <= 8) - return; - - p1 = blocks + (stride * 3); - p2 = blocks + (stride * 4); - - n1 = ((row_count - 9) >> 3) + 1; - n2 = ((stride - 1) >> 3) + 1; - - for (i = 0; i < n1; i++) { - guchar *p3, *p4; - - p3 = p1; - p4 = p2; - - for (j = 0; j < n2; j++) { - - if (deblock_v_consider_entire(p3, stride) == TRUE) { - guchar *p5; - gboolean do_entire; - - p5 = p3 + (stride * 8); - do_entire = TRUE; - - for (k = 0; k < 8; k++) { - gint v1, v2, v; - - v1 = p4[k]; - v2 = p5[k]; - - v = v1 - v2; - if (v <= 0) - v = v2 - v1; - - if (v > 20) { - do_entire = FALSE; - break; - } - } - - if (do_entire) - deblock_v_do_entire(p3, stride); - } else { - deblock_v_do_boundaries(p3, stride); - } - - p3 += 8; - p4 += 8; - } - - p1 += stride * 8; - p2 += stride * 8; - } -} - -static gboolean deblock_h_consider_entire(guchar *blocks, guint stride) -{ - guchar *p; - gint i, j, count; - - count = 0; - p = blocks; - - for (i = 0; i < 4; i++) { - - for (j = 1; j <= 7; j++) { - gint v1, v2, v; - - v1 = p[j]; - v2 = p[j+1]; - - v = v1 - v2; - if (v <= 0) - v = v2 - v1; - - if (v <= 1) - count--; - } - - p += stride; - } - - return (count <= -20); -} - -static void deblock_h_do_entire(guchar *blocks, guint stride) -{ - guchar buf[8], *p; - gint i; - - p = blocks; - - for (i = 0; i < 4; i++) { - gint v, low, high; - - v = p[0] - p[1]; - if (v <= 0) - v = p[1] - p[0]; - - if (v < 10) - low = p[0]; - else - low = p[1]; - - v = p[8] - p[9]; - if (v <= 0) - v = p[9] - p[8]; - - if (v >= 10) - high = p[8]; - else - high = p[9]; - - v = (low * 3) + p[1] + p[2] + p[3] + p[4] + 4; - buf[0] = (((p[1] + v) << 1) - p[4] + p[5]) >> 4; - - v += p[5] - low; - buf[1] = (((p[2] + v) << 1) - p[5] + p[6]) >> 4; - - v += p[6] - low; - buf[2] = (((p[3] + v) << 1) - p[6] + p[7]) >> 4; - - v += p[7] - low; - buf[3] = (((p[4] + v) << 1) - p[1] - p[7] + p[8] + low) >> 4; - - v += p[8] - p[1]; - buf[4] = (((p[5] + v) << 1) + p[1] - p[2] - p[8] + high) >> 4; - - v += high - p[2]; - buf[5] = (((p[6] + v) << 1) + p[2] - p[3]) >> 4; - - v += high - p[3]; - buf[6] = (((p[7] + v) << 1) + p[3] - p[4]) >> 4; - - v += high; - buf[7] = (((p[8] + v) << 1) - p[4] - p[5]) >> 4; - - memcpy(p + 1, buf, 8); - - p += stride; - } -} - -static void deblock_h_do_boundaries(guchar *blocks, guint stride) -{ - guchar *p; - gint i; - - p = blocks; - - for (i = 0; i < 4; i++) { - gint v, v1, v2, v3; - - v = p[4] - p[5]; - - if ((v / 2) != 0) { - - v1 = ((p[3] - p[6]) * 2) - (v * 5); - - if (abs(v1) < 80) { - - v2 = ((p[3] - p[2]) * 5) + ((p[1] - p[4]) * 2); - v3 = (p[5] * 2) + (p[7] * 5) - (p[8] * 7); - - v = abs(v1) - MIN(abs(v2), abs(v3)); - - if (v > 0) { - - v = ((v * 5) + 32) >> 6; - if (v > 0) { - - v2 = (p[4] - p[5]) / 2; - v3 = (((v1 < 0) * 2) - 1) * v; - - if (v2 > 0) - v = MIN(v2, ((v3 < 0) - 1) & v3); - else - v = MAX(v2, ((v3 > 0) - 1) & v3); - - p[4] -= v; - p[5] += v; - } - } - } - } - - p += stride; - } -} - -static gboolean deblock_v_consider_entire(guchar *blocks, guint stride) -{ - gint count, i, j; - guchar *p1, *p2; - - count = 0; - - p1 = blocks + stride; - p2 = blocks + (stride * 2); - - for (i = 0; i < 7; i++) { - - for (j = 0; j < 8; j++) { - gint v1, v2, v; - - v1 = p1[j]; - v2 = p2[j]; - - v = v1 - v2; - if (v <= 0) - v = v2 - v1; - - if (v <= 1) - count++; - } - - p1 += stride; - p2 += stride; - } - - return (count > 40); -} - -static void deblock_v_do_entire(guchar *blocks, guint stride) -{ - gint offset0, offset1, offset2, offset3; - gint offset4, offset5, offset6, offset7; - gint offset8, i; - guchar *p, buf[8]; - - offset0 = stride - (stride * 6); - offset1 = (stride * 2) - (stride * 6); - offset2 = (stride * 3) - (stride * 6); - offset3 = (stride * 4) - (stride * 6); - offset4 = (stride * 5) - (stride * 6); - offset5 = 0; - offset6 = (stride * 7) - (stride * 6); - offset7 = (stride * 8) - (stride * 6); - offset8 = (stride * 9) - (stride * 6); - - p = blocks + (stride * 6); - - for (i = 0; i < 8; i++) { - gint v, low, high; - - v = blocks[i] - p[offset0]; - if (v <= 0) - v = p[offset0] - blocks[i]; - - if (v < 10) - low = blocks[i]; - else - low = p[offset0]; - - v = p[offset7] - p[offset8]; - if (v <= 0) - v = p[offset8] - p[offset7]; - - if (v < 10) - high = p[offset8]; - else - high = p[offset7]; - - v = p[offset0] + (low * 3) + p[offset1] + p[offset2] + p[offset3] + 4; - - buf[0] = (((p[offset0] + v) << 1) - p[offset3] + p[offset4]) >> 4; - - v += p[offset4] - low; - - buf[1] = (((p[offset1] + v) << 1) - p[offset4] + p[0]) >> 4; - - v += p[0] - low; - - buf[2] = (((p[offset2] + v) << 1) - p[0] + p[offset6]) >> 4; - - v += p[offset6] - low; - - buf[3] = (((p[offset3] + v) << 1) - p[offset0] - p[offset6] + p[offset7] + low) >> 4; - - v += p[offset7] - p[offset0]; - - buf[4] = (((p[offset4] + v) << 1) - p[offset7] - p[offset1] + p[offset0] + high) >> 4; - - v += high - p[offset1]; - - buf[5] = (((p[0] + v) << 1) - p[offset2] + p[offset1]) >> 4; - - v += high - p[offset2]; - - buf[6] = (((p[offset6] + v) << 1) - p[offset3] + p[offset2]) >> 4; - - v += high; - - buf[7] = (((p[offset7] + v) << 1) - p[offset4] - p[offset3]) >> 4; - - p[offset0] = buf[0]; - p[offset1] = buf[1]; - p[offset2] = buf[2]; - p[offset3] = buf[3]; - p[offset4] = buf[4]; - p[offset5] = buf[5]; - p[offset6] = buf[6]; - p[offset7] = buf[7]; - - p++; - } -} - -static void deblock_v_do_boundaries(guchar *blocks, guint stride) -{ - guchar *p; - gint offset0, offset1, offset2, offset3; - gint offset4, offset5, offset6, offset7; - gint i; - - p = blocks + (stride * 3); - - offset0 = stride - (stride * 3); - offset1 = (stride * 2) - (stride * 3); - offset2 = 0; - offset3 = (stride * 4) - (stride * 3); - offset4 = (stride * 5) - (stride * 3); - offset5 = (stride * 6) - (stride * 3); - offset6 = (stride * 7) - (stride * 3); - offset7 = (stride * 8) - (stride * 3); - - for (i = 0; i < 8; i++) { - gint v1, v2, v3, v; - - v1 = ((p[offset4] - p[offset3]) * 5) + ((p[offset2] - p[offset5]) * 2); - - if (abs(v1) < 80) { - - v2 = ((p[offset2] - p[offset1]) * 5) + ((p[offset0] - p[offset3]) * 2); - v3 = ((p[offset6] - p[offset5]) * 5) + ((p[offset4] - p[offset7]) * 2); - - v = abs(v1) - MIN(abs(v2), abs(v3)); - if (v < 0) - v = 0; - - v2 = (p[offset3] - p[offset4]) / 2; - v3 = (((v * 5) + 32) >> 6) * (((v1 < 0) * 2) - 1); - - if (v2 > 0) - v = MIN(v2, ((v3 < 0) - 1) & v3); - else - v = MAX(v2, ((v3 > 0) - 1) & v3); - } else { - v = 0; - } - - p[offset3] -= v; - p[offset4] += v; - - p++; - } -} - diff --git a/kopete/protocols/msn/webcam/libmimic/decode.c b/kopete/protocols/msn/webcam/libmimic/decode.c deleted file mode 100644 index 83067562..00000000 --- a/kopete/protocols/msn/webcam/libmimic/decode.c +++ /dev/null @@ -1,311 +0,0 @@ -/* Copyright (C) 2005 Ole Andr� Vadla Ravn�s <[email protected]> - * - * 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 <string.h> -#include "mimic-private.h" - - -static gboolean decode(MimCtx *ctx, gboolean is_pframe); - -/** - * Decode a MIMIC-encoded frame into RGB data. - * - * @param ctx the mimic context - * @param input_buffer buffer containing the MIMIC-encoded frame to decode - * @param output_buffer buffer that will receive the decoded frame in RGB 24-bpp packed pixel top-down format - * (use #mimic_get_property to determine the required buffer size, as well as frame width and height) - * @returns #TRUE on success - */ -gboolean mimic_decode_frame(MimCtx *ctx, - const guchar *input_buffer, - guchar *output_buffer) -{ - gboolean result, is_pframe; - guchar *input_y, *input_cr, *input_cb; - gint width, height; - - /* - * Some sanity checks. - */ - if (ctx == NULL || input_buffer == NULL || output_buffer == NULL) - { - return FALSE; - } - - if (!ctx->decoder_initialized) - { - return FALSE; - } - - /* - * Get frame dimensions. - */ - width = GUINT16_FROM_LE(*((guint16 *) (input_buffer + 4))); - height = GUINT16_FROM_LE(*((guint16 *) (input_buffer + 6))); - - /* - * Resolution changing is not supported. - */ - if (width != ctx->frame_width || - height != ctx->frame_height) - { - return FALSE; - } - - /* - * Increment frame counter. - */ - ctx->frame_num++; - - /* - * Initialize state. - */ - ctx->quality = GUINT16_FROM_LE(*((guint16 *) (input_buffer + 2))); - is_pframe = GUINT32_FROM_LE(*((guint32 *) (input_buffer + 12))); - ctx->num_coeffs = input_buffer[16]; - - ctx->data_buffer = (gchar *) (input_buffer + 20); - ctx->data_index = 0; - ctx->cur_chunk_len = 16; - ctx->read_odd = FALSE; - - /* - * Decode frame. - */ - if (!(is_pframe && ctx->prev_frame_buf == NULL)) - result = decode(ctx, is_pframe); - else - { - result = FALSE; - } - - /* - * Perform YUV 420 to RGB conversion. - */ - input_y = ctx->cur_frame_buf; - input_cr = ctx->cur_frame_buf + ctx->y_size; - input_cb = ctx->cur_frame_buf + ctx->y_size + ctx->crcb_size; - - _yuv_to_rgb(input_y, - input_cb, - input_cr, - output_buffer, - ctx->frame_width, - ctx->frame_height); - - return result; -} - -/* - * decode_main - * - * Main decoding loop. - */ -static gboolean decode(MimCtx *ctx, gboolean is_pframe) -{ - gint y, x, i, j, chrom_ch, *bptr, base_offset, offset; - gint dct_block[64]; - guchar *src, *dst, *p; - guint32 bit; - - /* - * Clear Cr and Cb planes. - */ - p = ctx->cur_frame_buf + ctx->y_size; - memset(p, 128, 2 * ctx->crcb_size); - - /* - * Decode Y plane. - */ - for (y = 0; y < ctx->num_vblocks_y; y++) { - - base_offset = ctx->y_stride * 8 * y; - - src = ctx->prev_frame_buf + base_offset; - dst = ctx->cur_frame_buf + base_offset; - - for (x = 0; x < ctx->num_hblocks_y; x++) { - - /* Check for a change condition in the current block. */ - - if (is_pframe) - bit = _read_bits(ctx, 1); - else - bit = 0; - - if (bit == 0) { - - /* Yes: Is the new content the same as it was in one of - * the 15 last frames preceding the previous? */ - - if (is_pframe) - bit = _read_bits(ctx, 1); - - if (bit == 0) { - - /* No: decode it. */ - - if (_vlc_decode_block(ctx, dct_block, ctx->num_coeffs) == FALSE) { - - return FALSE; - } - - _idct_dequant_block(ctx, dct_block, 0); - - bptr = dct_block; - for (i = 0; i < 8; i++) { - offset = ctx->y_stride * i; - - for (j = 0; j < 8; j++) { - guint v; - - if (bptr[j] <= 255) - v = (bptr[j] >= 0) ? bptr[j] : 0; - else - v = 255; - - *(dst + offset + j) = v; - } - - bptr += 8; - } - } else { - guint32 backref; - - /* Yes: read the backreference (4 bits) and copy. */ - - backref = _read_bits(ctx, 4); - - p = ctx->buf_ptrs[(ctx->ptr_index + backref) % 16]; - p += base_offset + (x * 8); - - for (i = 0; i < 8; i++) { - offset = ctx->y_stride * i; - - memcpy(dst + offset, p + offset, 8); - } - } - } else { - - /* No change no worries: just copy from the previous frame. */ - - for (i = 0; i < 8; i++) { - offset = ctx->y_stride * i; - - memcpy(dst + offset, src + offset, 8); - } - } - - src += 8; - dst += 8; - } - } - - /* - * Decode Cr and Cb planes. - */ - for (chrom_ch = 0; chrom_ch < 2; chrom_ch++) { - - base_offset = ctx->y_size + (ctx->crcb_size * chrom_ch); - - for (y = 0; y < ctx->num_vblocks_cbcr; y++) { - guint num_rows = 8; - - /* The last row of blocks in chrominance for 160x120 resolution - * is half the normal height and must be accounted for. */ - if (y + 1 == ctx->num_vblocks_cbcr && ctx->frame_height % 16 != 0) - num_rows = 4; - - offset = base_offset + (ctx->crcb_stride * 8 * y); - - src = ctx->prev_frame_buf + offset; - dst = ctx->cur_frame_buf + offset; - - for (x = 0; x < ctx->num_hblocks_cbcr; x++) { - - /* Check for a change condition in the current block. */ - - if (is_pframe) - bit = _read_bits(ctx, 1); - else - bit = 1; - - if (bit == 1) { - - /* Yes: decode it. */ - - if (_vlc_decode_block(ctx, dct_block, ctx->num_coeffs) == FALSE) { - - /* Corrupted frame: clear Cr and Cb planes and return. */ - p = ctx->cur_frame_buf + ctx->y_size; - memset(p, 128, ctx->crcb_size * 2); - - return FALSE; - } - - _idct_dequant_block(ctx, dct_block, 1); - - for (i = 0; i < num_rows; i++) { - p = dst + (ctx->crcb_stride * i); - - for (j = 0; j < 8; j++) - p[j] = dct_block[(i * 8) + j]; - } - - } else { - - /* No change no worries: just copy from the previous frame. */ - - for (i = 0; i < num_rows; i++) { - offset = ctx->crcb_stride * i; - - memcpy(dst + offset, src + offset, 8); - } - } - - src += 8; - dst += 8; - } - } - } - - /* - * Make a copy of the current frame and store in - * the circular pointer list of 16 entries. - */ - ctx->prev_frame_buf = ctx->buf_ptrs[ctx->ptr_index]; - memcpy(ctx->prev_frame_buf, ctx->cur_frame_buf, - ctx->y_size + (ctx->crcb_size * 2)); - - if (--ctx->ptr_index < 0) - ctx->ptr_index = 15; - - /* - * Perform deblocking on all planes. - */ - _deblock(ctx->cur_frame_buf, - ctx->y_stride, ctx->y_row_count); - - _deblock(ctx->cur_frame_buf + ctx->y_size, - ctx->crcb_stride, ctx->crcb_row_count); - - _deblock(ctx->cur_frame_buf + ctx->y_size + ctx->crcb_size, - ctx->crcb_stride, ctx->crcb_row_count); - - return TRUE; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/encode.c b/kopete/protocols/msn/webcam/libmimic/encode.c deleted file mode 100644 index 6c8a9de8..00000000 --- a/kopete/protocols/msn/webcam/libmimic/encode.c +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 <stdlib.h> -#include <string.h> -#include <math.h> -#include "mimic-private.h" - -#define LUMINANCE_THRESHOLD 32.0f -#define CHROMINANCE_THRESHOLD 36.0f - -static void encode_main(MimCtx *ctx, guchar *out_buf, gboolean is_pframe); - -/** - * Encode a MIMIC-encoded frame from RGB data. - * - * @param ctx the mimic context - * @param input_buffer buffer containing pixeldata in RGB 24-bpp packed pixel top-down format - * @param output_buffer buffer that will receive the MIMIC-encoded frame - * (use #mimic_get_property to determine the required buffer size) - * @param output_length pointer to an integer that receives the length of the encoded data - * written to output_buffer - * @param make_keyframe whether the encoder should make this frame a keyframe - * @returns #TRUE on success - */ -gboolean mimic_encode_frame(MimCtx *ctx, - const guchar *input_buffer, - guchar *output_buffer, - gint *output_length, - gboolean make_keyframe) -{ - guchar *output_y, *output_cb, *output_cr; - - /* - * Some sanity checks. - */ - if (ctx == NULL || input_buffer == NULL || - output_buffer == NULL || output_length == NULL) - { - return FALSE; - } - - if (!ctx->encoder_initialized) - return FALSE; - - /* - * Initialize state. - */ - ctx->chunk_ptr = (guint32 *) (output_buffer + 20); - ctx->cur_chunk = 0; - ctx->cur_chunk_len = 0; - - if (ctx->frame_num == 0) - make_keyframe = TRUE; - - /* - * Write header. - */ - memset(output_buffer, 0, 20); - *((guint16 *) (output_buffer + 0)) = GUINT16_TO_LE(256); - *((guint16 *) (output_buffer + 2)) = GUINT16_TO_LE(ctx->quality); - *((guint16 *) (output_buffer + 4)) = GUINT16_TO_LE(ctx->frame_width); - *((guint16 *) (output_buffer + 6)) = GUINT16_TO_LE(ctx->frame_height); - *((guint32 *) (output_buffer + 12)) = GUINT32_TO_LE((make_keyframe == 0)); - *(output_buffer + 16) = ctx->num_coeffs; - *(output_buffer + 17) = 0; - - /* - * Perform RGB to YUV 420 conversion. - */ - output_y = ctx->cur_frame_buf; - output_cr = ctx->cur_frame_buf + ctx->y_size; - output_cb = ctx->cur_frame_buf + ctx->y_size + ctx->crcb_size; - - _rgb_to_yuv(input_buffer, - output_y, - output_cb, - output_cr, - ctx->frame_width, - ctx->frame_height); - - /* - * Encode frame. - */ - encode_main(ctx, output_buffer, (make_keyframe == FALSE)); - - /* - * Write out any pending bits to stream by zero-padding with 32 bits. - */ - _write_bits(ctx, 0, 32); - - /* - * Calculate bytes written. - */ - *output_length = (guchar *) ctx->chunk_ptr - output_buffer; - - /* - * Increment frame counter. - */ - ctx->frame_num++; - - return TRUE; -} - -static gdouble compare_blocks(const guchar *p1, - const guchar *p2, - gint stride, - gint row_count, - gboolean is_chrom); - -/* - * encode_main - * - * Main encoding loop. - */ -static void encode_main(MimCtx *ctx, guchar *out_buf, gboolean is_pframe) -{ - gint x, y, i, offset, chrom_ch; - gint dct_block[64]; - guchar *src, *dst, *p1, *p2; - gdouble match; - gboolean encoded; - - /* - * Round down small differences in luminance channel. - */ - if (is_pframe) { - - p1 = ctx->cur_frame_buf; - p2 = ctx->prev_frame_buf; - - for (i = 0; i < ctx->y_size; i++) { - - if (abs(p2[0] - p1[0]) < 7) - p1[0] = p2[0]; - - p1++; - p2++; - } - } - - /* - * Encode Y plane. - */ - for (y = 0; y < ctx->num_vblocks_y; y++) { - - for (x = 0; x < ctx->num_hblocks_y; x++) { - - /* Calculate final offset into buffer. */ - offset = (ctx->y_stride * 8 * y) + (x * 8); - - src = NULL; - encoded = FALSE; - - if (is_pframe) { - - /* Is the current block similar enough to what it was in the previous frame? */ - - match = compare_blocks(ctx->cur_frame_buf + offset, - ctx->prev_frame_buf + offset, - ctx->y_stride, 8, - FALSE); - - if (match > LUMINANCE_THRESHOLD) { - - /* Yes: write out '1' to indicate a no-change condition. */ - - _write_bits(ctx, 1, 1); - - src = ctx->prev_frame_buf + offset; - encoded = TRUE; - - } else { - - /* No: Is the current block similar enough to what it was in one - * of the (up to) 15 last frames preceding the previous? */ - - gint best_index = 0; - gdouble best_match = 0.0; - - gint num_backrefs = ctx->frame_num - 1; - if (num_backrefs > 15) - num_backrefs = 15; - - for (i = 1; i <= num_backrefs; i++) { - - match = compare_blocks(ctx->buf_ptrs[(ctx->ptr_index + i) % 16] + offset, - ctx->cur_frame_buf + offset, - ctx->y_stride, 8, - FALSE); - - if (match > LUMINANCE_THRESHOLD && match > best_match) { - best_index = i; - best_match = match; - } - - } - - if (best_index != 0) { - - /* Yes: write out '01' to indicate a "change but like previous"-condition, - * followed by 4 bits containing the back-reference. */ - _write_bits(ctx, 0, 1); - _write_bits(ctx, 1, 1); - _write_bits(ctx, best_index, 4); - - src = ctx->buf_ptrs[(ctx->ptr_index + best_index) % 16] + offset; - encoded = TRUE; - - } - } - } - - if (!encoded) { - - /* Keyframe or in any case no? ;-) Well, encode it then. */ - - if (is_pframe) { - _write_bits(ctx, 0, 1); - _write_bits(ctx, 0, 1); - } - - _fdct_quant_block(ctx, - dct_block, - ctx->cur_frame_buf + offset, - ctx->y_stride, - FALSE, - ctx->num_coeffs); - - _vlc_encode_block(ctx, - dct_block, - ctx->num_coeffs); - - } - - /* And if there was some kind of no-change condition, - * we want to copy the previous block. */ - if (src != NULL) { - - dst = ctx->cur_frame_buf + offset; - for (i = 0; i < 8; i++) { - - memcpy(dst, src, 8); - - src += ctx->y_stride; - dst += ctx->y_stride; - } - - } - - } - - } - - /* - * Encode Cr and Cb planes. - */ - for (chrom_ch = 0; chrom_ch < 2; chrom_ch++) { - - /* Calculate base offset into buffer. */ - gint base_offset = ctx->y_size + (ctx->crcb_size * chrom_ch); - - for (y = 0; y < ctx->num_vblocks_cbcr; y++) { - guchar tmp_block[64]; - guint num_rows = 8; - - /* The last row of blocks in chrominance for 160x120 resolution - * is half the normal height and must be accounted for. */ - if (y + 1 == ctx->num_vblocks_cbcr && ctx->frame_height % 16 != 0) - num_rows = 4; - - for (x = 0; x < ctx->num_hblocks_cbcr; x++) { - - /* Calculate final offset into buffer. */ - offset = base_offset + (ctx->crcb_stride * 8 * y) + (x * 8); - - src = NULL; - encoded = FALSE; - - if (is_pframe) { - - /* Is the current block similar enough to what it was in the previous frame? */ - - match = compare_blocks(ctx->prev_frame_buf + offset, - ctx->cur_frame_buf + offset, - ctx->crcb_stride, num_rows, - TRUE); - - if (match > CHROMINANCE_THRESHOLD) { - - /* Yes: write out '0' to indicate a no-change condition. */ - - _write_bits(ctx, 0, 1); - - encoded = TRUE; - - src = ctx->prev_frame_buf + offset; - dst = ctx->cur_frame_buf + offset; - for (i = 0; i < num_rows; i++) { - - memcpy(dst, src, 8); - - src += ctx->crcb_stride; - dst += ctx->crcb_stride; - } - } - - } - - if (!encoded) { - - /* Keyframe or just not similar enough? ;-) Well, encode it then. */ - - if (is_pframe) - _write_bits(ctx, 1, 1); - - /* Use a temporary array to handle cases where the - * current block is not of normal height (see above). */ - src = ctx->cur_frame_buf + offset; - dst = tmp_block; - for (i = 0; i < 8; i++) { - - memcpy(dst, src, 8); - - if (i < (num_rows - 1)) - src += ctx->crcb_stride; - dst += 8; - } - - _fdct_quant_block(ctx, - dct_block, - tmp_block, - 8, - TRUE, - ctx->num_coeffs); - - _vlc_encode_block(ctx, - dct_block, - ctx->num_coeffs); - - } - - } - - } - - } - - /* - * Make a copy of the current frame and store in - * the circular pointer list of 16 entries. - */ - ctx->prev_frame_buf = ctx->buf_ptrs[ctx->ptr_index]; - memcpy(ctx->prev_frame_buf, ctx->cur_frame_buf, - ctx->y_size + (ctx->crcb_size * 2)); - - if (--ctx->ptr_index < 0) - ctx->ptr_index = 15; -} - -/* - * compare_blocks - * - * Helper-function used to compare two blocks and - * determine how similar they are. - */ -static gdouble compare_blocks(const guchar *p1, - const guchar *p2, - gint stride, - gint row_count, - gboolean is_chrom) -{ - gint i, j, sum; - gdouble d; - - sum = 0; - - for (i = 0; i < row_count; i++) { - - for (j = 0; j < 8; j++) { - - gint d = p2[j] - p1[j]; - - sum += d * d; - } - - p1 += stride; - p2 += stride; - } - - if (is_chrom) { - if (row_count == 8) - d = sum * 0.015625; - else - d = sum * 0.03125; - } else { - d = sum / 64; - } - - if (d == 0.0f) - return 100.0f; - else - return (10.0f * log(65025.0f / d)) / G_LN10; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/fdct_quant.c b/kopete/protocols/msn/webcam/libmimic/fdct_quant.c deleted file mode 100644 index f32adc80..00000000 --- a/kopete/protocols/msn/webcam/libmimic/fdct_quant.c +++ /dev/null @@ -1,181 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 "mimic-private.h" - -extern guchar _col_zag[64]; - -void _fdct_quant_block(MimCtx *ctx, gint *block, const guchar *src, - gint stride, gboolean is_chrom, gint num_coeffs) -{ - gint sum1, sum2, sum3, sum4; - gint diff1, diff2, diff3, diff4; - gint ex1, ex2, ex3, ex4, ex5; - gint i, j; - const guchar *p1; - gint *iptr; - - /* - * Forward DCT, first pass (horizontal). - */ - p1 = src; - iptr = block; - - for (i = 0; i < 8; i++) { - sum1 = p1[0] + p1[7]; - sum2 = p1[1] + p1[6]; - sum3 = p1[2] + p1[5]; - sum4 = p1[3] + p1[4]; - - diff1 = p1[0] - p1[7]; - diff2 = p1[1] - p1[6]; - diff3 = p1[2] - p1[5]; - diff4 = p1[3] - p1[4]; - - ex1 = ((diff1 + diff4) * 851) - (diff1 * 282); - ex2 = ((diff2 + diff3) * 1004) - (diff2 * 804); - ex3 = ((diff2 + diff3) * 1004) - (diff3 * 1204); - ex4 = ((diff1 + diff4) * 851) - (diff4 * 1420); - - iptr[0] = sum1 + sum2 + sum3 + sum4; - iptr[2] = (((sum1 - sum4) * 1337) + ((sum2 - sum3) * 554)) >> 10; - iptr[4] = sum1 - sum2 - sum3 + sum4; - - iptr[1] = (ex1 + ex2 + ex3 + ex4) >> 10; - iptr[3] = ((ex4 - ex2) * 181) >> 17; - iptr[5] = ((ex1 - ex3) * 181) >> 17; - - p1 += stride; - iptr += 8; - } - - p1 = src; - iptr = block; - - /* - * Forward DCT, first pass (vertical). - * - * This is only known to be correct for i == 0, though it seems to be ... - */ - for (i = 0; i < 6; i++) { - sum1 = iptr[ 0 + i] + iptr[56 + i]; - sum2 = iptr[ 8 + i] + iptr[48 + i]; - sum3 = iptr[16 + i] + iptr[40 + i]; - sum4 = iptr[24 + i] + iptr[32 + i]; - - diff1 = iptr[ 0 + i] - iptr[56 + i]; - diff2 = iptr[ 8 + i] - iptr[48 + i]; - diff3 = iptr[16 + i] - iptr[40 + i]; - diff4 = iptr[24 + i] - iptr[32 + i]; - - ex1 = ((diff1 + diff4) * 851) - (diff1 * 282); - ex2 = ((diff2 + diff3) * 1004) - (diff2 * 804); - ex3 = ((diff2 + diff3) * 1004) - (diff3 * 1204); - ex4 = ((diff1 + diff4) * 851) - (diff4 * 1420); - - ex5 = (sum1 + sum2 - sum3 - sum4) * 554; - - for (j = 0; j < 7 - i; j++) { - switch (j) { - - case 0: - iptr[ 0 + i] = (16 + sum1 + sum2 + sum3 + sum4) >> 5; - break; - - case 1: - iptr[ 8 + i] = (16384 + ex1 + ex2 + ex3 + ex4) >> 15; - break; - - case 2: - iptr[16 + i] = (16384 + ((sum1 - sum4) * 783) + ex5) >> 15; - break; - - case 3: - iptr[24 + i] = (8192 + (((ex4 - ex2) >> 8) * 181)) >> 14; - break; - - case 4: - iptr[32 + i] = (16 + sum1 - sum2 - sum3 + sum4) >> 5; - break; - - case 5: - iptr[40 + i] = (8192 + (((ex1 - ex3) >> 8) * 181)) >> 14; - break; - - case 6: - iptr[48 + i] = (16384 - ((sum2 - sum3) * 1891) + ex5) >> 15; - break; - } - } - } - - /* - * Quantize. - */ - block[0] /= 2; - block[8] /= 4; - block[1] /= 4; - block[6] = 0; - - if (num_coeffs > 3) { - - gdouble s = (10000 - ctx->quality) * 10.0 * (gfloat) 9.9999997e-5; - - if (s > 10.0) - s = 10.0; - else if (is_chrom != 0 && s < 1.0) - s = 1.0; - else if (s < 2.0) - s = 2.0; - - s = 1.0 / s; - - for (i = 3; i < num_coeffs; i++) { - - gdouble coeff, r; - - coeff = block[_col_zag[i]] * s; - r = coeff - (gint) coeff; - - if (r >= 0.6) - block[_col_zag[i]] = (gint) (coeff + 1.0); - else if (r <= -0.6) - block[_col_zag[i]] = (gint) (coeff - 1.0); - else - block[_col_zag[i]] = (gint) coeff; - - if (block[_col_zag[i]] > 120) - block[_col_zag[i]] = 120; - else if (block[_col_zag[i]] < -120) - block[_col_zag[i]] = -120; - } - } - - if (block[8] > 120) - block[8] = 120; - else if (block[8] < -120) - block[8] = -120; - - if (block[1] > 120) - block[1] = 120; - else if (block[1] < -120) - block[1] = -120; - - for (i = num_coeffs; i < 64; i++) - block[_col_zag[i]] = 0; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/idct_dequant.c b/kopete/protocols/msn/webcam/libmimic/idct_dequant.c deleted file mode 100644 index 3512247e..00000000 --- a/kopete/protocols/msn/webcam/libmimic/idct_dequant.c +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (C) 2005 Ole Andr� Vadla Ravn�s <[email protected]> - * - * 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 "mimic-private.h" - -void _idct_dequant_block(MimCtx *ctx, gint *block, gboolean is_chrom) -{ - gdouble f; - gint i, *p; - - /* - * De-quantize. - */ - f = (10000 - ctx->quality) * 10.0 * (gfloat) 9.9999997e-5; - - if (f > 10.0) - f = 10.0; - - if (!is_chrom) { - if (f < 2.0) - f = 2.0; - } else { - if (f < 1.0) - f = 1.0; - } - - block[0] <<= 1; - block[1] <<= 2; - block[8] <<= 2; - - for (i = 2; i < 64; i++) { - if (i == 8) - continue; - - block[i] *= f; - } - - /* - * Inverse DCT, first pass (horizontal). - */ - p = block; - - for (i = 0; i < 8; i++) { - gint v1, v2, v3, v4, v5, v6, v7, v8; - gint va, vb; - - va = (p[0] << 11) + (p[4] << 11); - vb = ((p[2] << 2) * 392) + (((p[2] << 2) + (p[6] << 2)) * 277); - v1 = va + vb + 512; - v2 = va - vb + 512; - - va = (p[0] << 11) - (p[4] << 11); - vb = (((p[2] << 2) + (p[6] << 2)) * 277) - ((p[6] << 2) * 946); - v3 = va + vb + 512; - v4 = va - vb + 512; - - va = (p[1] << 9) + (p[3] * 724) + (p[7] << 9); - vb = (p[1] << 9) + (p[5] * 724) - (p[7] << 9); - v5 = (((va + vb) * 213) - (vb * 71)) >> 6; - v6 = (((va + vb) * 213) - (va * 355)) >> 6; - - va = (p[1] << 9) - (p[3] * 724) + (p[7] << 9); - vb = (p[1] << 9) - (p[5] * 724) - (p[7] << 9); - v7 = (((va + vb) * 251) - (va * 201)) >> 6; - v8 = (((va + vb) * 251) - (vb * 301)) >> 6; - - p[0] = (v1 + v5) >> 10; - p[1] = (v3 + v7) >> 10; - p[2] = (v4 + v8) >> 10; - p[3] = (v2 + v6) >> 10; - p[4] = (v2 - v6) >> 10; - p[5] = (v4 - v8) >> 10; - p[6] = (v3 - v7) >> 10; - p[7] = (v1 - v5) >> 10; - - p += 8; - } - - /* - * Inverse dct, second pass (vertical). - */ - p = block; - - for (i = 0; i < 8; i++) { - gint v1, v2, v3, v4, v5, v6, v7, v8; - gint va, vb; - - va = (p[0] << 9) + (p[32] << 9); - vb = ((p[16] + p[48]) * 277) + (p[16] * 392); - v1 = va + vb + 1024; - v2 = va - vb + 1024; - - va = (p[0] << 9) - (p[32] << 9); - vb = ((p[16] + p[48]) * 277) - (p[48] * 946); - v3 = va + vb + 1024; - v4 = va - vb + 1024; - - va = ((p[8] << 7) + (p[24] * 181) + (p[56] << 7)) >> 6; - vb = ((p[8] << 7) + (p[40] * 181) - (p[56] << 7)) >> 6; - v5 = ((va + vb) * 213) - (vb * 71); - v6 = ((va + vb) * 213) - (va * 355); - - va = ((p[8] << 7) - (p[24] * 181) + (p[56] << 7)) >> 6; - vb = ((p[8] << 7) - (p[40] * 181) - (p[56] << 7)) >> 6; - v7 = ((va + vb) * 251) - (va * 201); - v8 = ((va + vb) * 251) - (vb * 301); - - p[0] = (v1 + v5) >> 11; - p[8] = (v3 + v7) >> 11; - p[16] = (v4 + v8) >> 11; - p[24] = (v2 + v6) >> 11; - p[32] = (v2 - v6) >> 11; - p[40] = (v4 - v8) >> 11; - p[48] = (v3 - v7) >> 11; - p[56] = (v1 - v5) >> 11; - - p++; - } -} - diff --git a/kopete/protocols/msn/webcam/libmimic/mimic-private.h b/kopete/protocols/msn/webcam/libmimic/mimic-private.h deleted file mode 100644 index adf59291..00000000 --- a/kopete/protocols/msn/webcam/libmimic/mimic-private.h +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 MIMIC_PRIVATE_H -#define MIMIC_PRIVATE_H - -#include "mimic.h" - -#define ENCODER_BUFFER_SIZE 16384 -#define ENCODER_QUALITY_DEFAULT 0 -#define ENCODER_QUALITY_MIN 0 -#define ENCODER_QUALITY_MAX 10000 - -struct _MimCtx { - gboolean encoder_initialized; - gboolean decoder_initialized; - - gint frame_width; - gint frame_height; - gint quality; - gint num_coeffs; - - gint y_stride; - gint y_row_count; - gint y_size; - - gint crcb_stride; - gint crcb_row_count; - gint crcb_size; - - gint num_vblocks_y; - gint num_hblocks_y; - - gint num_vblocks_cbcr; - gint num_hblocks_cbcr; - - guchar *cur_frame_buf; - guchar *prev_frame_buf; - - gint8 vlcdec_lookup[2296]; - - gchar *data_buffer; - guint data_index; - - guint32 cur_chunk; - gint cur_chunk_len; - - guint32 *chunk_ptr; - gboolean read_odd; - - gint frame_num; - - gint ptr_index; - guchar *buf_ptrs[16]; -}; - -typedef struct { - guchar length1; - guint32 part1; - - guchar length2; - guint32 part2; -} VlcSymbol; - -typedef struct { - guint32 magic; - guchar pos_add; - guchar num_bits; -} VlcMagic; - -void _mimic_init(MimCtx *ctx, gint width, gint height); -guchar _clamp_value(gint value); - -guint32 _read_bits(MimCtx *ctx, gint num_bits); -void _write_bits(MimCtx *ctx, guint32 bits, gint length); - -void _vlc_encode_block(MimCtx *ctx, const gint *block, gint num_coeffs); -gboolean _vlc_decode_block(MimCtx *ctx, gint *block, gint num_coeffs); - -void _fdct_quant_block(MimCtx *ctx, gint *block, const guchar *src, - gint stride, gboolean is_chrom, gint num_coeffs); -void _idct_dequant_block(MimCtx *ctx, gint *block, gboolean is_chrom); - -VlcMagic *_find_magic(guint magic); -void _initialize_vlcdec_lookup(gint8 *lookup_tbl); - -void _rgb_to_yuv(const guchar *input_rgb, - guchar *output_y, - guchar *output_cb, - guchar *output_cr, - gint width, - gint height); -void _yuv_to_rgb(const guchar *input_y, - const guchar *input_cb, - const guchar *input_cr, - guchar *output_rgb, - guint width, - guint height); - -void _deblock(guchar *blocks, guint stride, guint row_count); - -#endif - diff --git a/kopete/protocols/msn/webcam/libmimic/mimic.c b/kopete/protocols/msn/webcam/libmimic/mimic.c deleted file mode 100644 index 61abf9e8..00000000 --- a/kopete/protocols/msn/webcam/libmimic/mimic.c +++ /dev/null @@ -1,334 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 <string.h> -#include "mimic-private.h" - -/** - * Creates a new instance and returns a pointer to the new context - * that can be used for either encoding or decoding by calling - * #mimic_encoder_init or #mimic_decoder_init. - * - * #mimic_close is called to free any resources associated with - * the context once done. - * - * @returns a new mimic context - */ -MimCtx *mimic_open() -{ - MimCtx *ctx; - - ctx = g_new0(MimCtx, 1); - - ctx->encoder_initialized = FALSE; - ctx->decoder_initialized = FALSE; - - return ctx; -} - -/** - * Frees any resources associated with the given context. - * - * @param ctx the mimic context to free - */ -void mimic_close(MimCtx *ctx) -{ - if (ctx->encoder_initialized || ctx->decoder_initialized) { - gint i; - - g_free(ctx->cur_frame_buf); - - for (i = 0; i < 16; i++) - g_free(ctx->buf_ptrs[i]); - } - - g_free(ctx); -} - -/* - * mimic_init - * - * Internal helper-function used to initialize - * a given context. - */ -static void mimic_init(MimCtx *ctx, gint width, gint height) -{ - gint bufsize, i; - - /* - * Dimensions-related. - */ - ctx->frame_width = width; - ctx->frame_height = height; - - ctx->y_stride = ctx->frame_width; - ctx->y_row_count = ctx->frame_height; - ctx->y_size = ctx->y_stride * ctx->y_row_count; - - ctx->crcb_stride = ctx->y_stride / 2; - ctx->crcb_row_count = ctx->y_row_count / 2; - ctx->crcb_size = ctx->crcb_stride * ctx->crcb_row_count; - - ctx->num_vblocks_y = ctx->frame_height / 8; - ctx->num_hblocks_y = ctx->frame_width / 8; - - ctx->num_vblocks_cbcr = ctx->frame_height / 16; - ctx->num_hblocks_cbcr = ctx->frame_width / 16; - - if (ctx->frame_height % 16 != 0) - ctx->num_vblocks_cbcr++; - - /* - * Initialize state. - */ - ctx->frame_num = 0; - ctx->ptr_index = 15; - ctx->num_coeffs = 28; - - /* - * Allocate memory for buffers. - */ - ctx->cur_frame_buf = g_new(guchar, (320 * 240 * 3) / 2); - - bufsize = ctx->y_size + (ctx->crcb_size * 2); - for (i = 0; i < 16; i++) - ctx->buf_ptrs[i] = g_new(guchar, bufsize); - - /* - * Initialize vlc lookup used by decoder. - */ - _initialize_vlcdec_lookup(ctx->vlcdec_lookup); -} - -/** - * Initialize the mimic encoder and prepare for encoding by - * initializing internal state and allocating resources as - * needed. - * - * After initializing use #mimic_get_property to determine - * the size of the output buffer needed for calls to - * #mimic_encode_frame. Use #mimic_set_property to set - * encoding quality. - * - * Note that once a given context has been initialized - * for either encoding or decoding it is not possible - * to initialize it again. - * - * @param ctx the mimic context to initialize - * @param resolution a #MimicResEnum used to specify the resolution - * @returns #TRUE on success - */ -gboolean mimic_encoder_init(MimCtx *ctx, const MimicResEnum resolution) -{ - gint width, height; - - /* Check if we've been initialized before. */ - if (ctx->encoder_initialized || ctx->decoder_initialized) - return FALSE; - - /* Check resolution. */ - if (resolution == MIMIC_RES_LOW) { - width = 160; - height = 120; - } else if (resolution == MIMIC_RES_HIGH) { - width = 320; - height = 240; - } else { - return FALSE; - } - - /* Initialize! */ - mimic_init(ctx, width, height); - - /* Set a default quality setting. */ - ctx->quality = ENCODER_QUALITY_DEFAULT; - - ctx->encoder_initialized = TRUE; - - return TRUE; -} - -/** - * Initialize the mimic decoder. The frame passed in frame_buffer - * is used to determine the resolution so that the internal state - * can be prepared and resources allocated accordingly. Note that - * the frame passed has to be a keyframe. - * - * After initializing use #mimic_get_property to determine required - * buffer-size, resolution, quality, etc. - * - * Note that once a given context has been initialized - * for either encoding or decoding it is not possible - * to initialize it again. - * - * @param ctx the mimic context to initialize - * @param frame_buffer buffer containing the first frame to decode - * @returns #TRUE on success - */ -gboolean mimic_decoder_init(MimCtx *ctx, const guchar *frame_buffer) -{ - gint width, height; - gboolean is_keyframe; - - /* Check if we've been initialized before and that - * frame_buffer is not NULL. */ - if (ctx->encoder_initialized || ctx->decoder_initialized || - frame_buffer == NULL) - { - return FALSE; - } - - /* Check resolution. */ - width = GUINT16_FROM_LE(*((guint16 *) (frame_buffer + 4))); - height = GUINT16_FROM_LE(*((guint16 *) (frame_buffer + 6))); - - if (!(width == 160 && height == 120) && !(width == 320 && height == 240)) - return FALSE; - - /* Check that we're initialized with a keyframe. */ - is_keyframe = (GUINT32_FROM_LE(*((guint32 *) (frame_buffer + 12))) == 0); - - if (!is_keyframe) - return FALSE; - - /* Get quality setting (in case we get queried for it before decoding). */ - ctx->quality = GUINT16_FROM_LE(*((guint16 *) (frame_buffer + 2))); - - /* Initialize! */ - mimic_init(ctx, width, height); - - ctx->decoder_initialized = TRUE; - - return TRUE; -} - -/** - * Get a property from a given mimic context. The context - * has to be initialized. - * - * Currently the following properties are defined: - * - "buffer_size" - * - Required output buffer size - * - "width" - * - Frame width - * - "height" - * - Frame height - * - "quality" - * - Encoder: Encoding quality used - * - Decoder: Decoding quality of the last known frame - * - * @param ctx the mimic context to retrieve the property from - * @param name of the property to retrieve the current value of - * @param data pointer to the data that will receive the retrieved value - * @returns #TRUE on success - */ -gboolean mimic_get_property(MimCtx *ctx, const gchar *name, gpointer data) -{ - /* Either the encoder or the decoder has to be initialized. */ - if (!ctx->encoder_initialized && !ctx->decoder_initialized) - return FALSE; - - if (ctx->encoder_initialized) { - - if (strcmp(name, "buffer_size") == 0) { - *((gint *) data) = ENCODER_BUFFER_SIZE; - - return TRUE; - } - - } else { /* decoder_initialized */ - - if (strcmp(name, "buffer_size") == 0) { - *((gint *) data) = ctx->frame_width * ctx->frame_height * 3; - - return TRUE; - } - } - - if (strcmp(name, "width") == 0) { - *((gint *) data) = ctx->frame_width; - - return TRUE; - } else if (strcmp(name, "height") == 0) { - *((gint *) data) = ctx->frame_height; - - return TRUE; - } else if (strcmp(name, "quality") == 0) { - *((gint *) data) = ctx->quality; - - return TRUE; - } - - return FALSE; -} - -/** - * Set a property in a given mimic context. The context - * has to be initialized. - * - * Currently the following properties are defined: - * - "quality" - * - Encoding quality used by encoder. - * - * @param ctx the mimic context to set a property in - * @param name of the property to set to a new value - * @param data pointer to the data that contains the new value - * @returns #TRUE on success - */ -gboolean mimic_set_property(MimCtx *ctx, const gchar *name, gpointer data) -{ - /* Either the encoder or the decoder has to be initialized. */ - if (!ctx->encoder_initialized && !ctx->decoder_initialized) - return FALSE; - - if (ctx->encoder_initialized) { - - if (strcmp(name, "quality") == 0) { - gint new_quality = *((gint *) data); - - if (new_quality < ENCODER_QUALITY_MIN || - new_quality > ENCODER_QUALITY_MAX) - { - return FALSE; - } - - ctx->quality = new_quality; - - return TRUE; - } - - } else { /* decoder_initialized */ } - - return FALSE; -} - -/* - * _clamp_value - * - * Internal helper-function used to clamp a given - * value to the range [ 0, 255 ]. - */ -guchar _clamp_value(gint value) -{ - if (value < 0) - return 0; - else if (value > 255) - return 255; - else - return value; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/mimic.h b/kopete/protocols/msn/webcam/libmimic/mimic.h deleted file mode 100644 index 9660e674..00000000 --- a/kopete/protocols/msn/webcam/libmimic/mimic.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 MIMIC_H -#define MIMIC_H - -#include <glib.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup libmimic libmimic public API - * @brief The public API of the libmimic library - * - * libmimic provides the API required for encoding and decoding - * MIMIC v2.x-encoded content. - * - * @{ - */ - -/** - * The mimic encoding/decoding context returned by #mimic_open - * and used for all further API calls until #mimic_close. - */ -typedef struct _MimCtx MimCtx; - -typedef enum { - MIMIC_RES_LOW, /**< 160x120 resolution */ - MIMIC_RES_HIGH /**< 320x240 resolution */ -} MimicResEnum; - -MimCtx *mimic_open(); -void mimic_close(MimCtx *ctx); - -gboolean mimic_encoder_init(MimCtx *ctx, const MimicResEnum resolution); -gboolean mimic_decoder_init(MimCtx *ctx, const guchar *frame_buffer); - -gboolean mimic_get_property(MimCtx *ctx, const gchar *name, gpointer data); -gboolean mimic_set_property(MimCtx *ctx, const gchar *name, gpointer data); - -gboolean mimic_encode_frame(MimCtx *ctx, - const guchar *input_buffer, - guchar *output_buffer, - gint *output_length, - gboolean make_keyframe); -gboolean mimic_decode_frame(MimCtx *ctx, - const guchar *input_buffer, - guchar *output_buffer); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/kopete/protocols/msn/webcam/libmimic/query.c b/kopete/protocols/msn/webcam/libmimic/query.c deleted file mode 100644 index 8b137891..00000000 --- a/kopete/protocols/msn/webcam/libmimic/query.c +++ /dev/null @@ -1 +0,0 @@ - diff --git a/kopete/protocols/msn/webcam/libmimic/vlc_common.c b/kopete/protocols/msn/webcam/libmimic/vlc_common.c deleted file mode 100644 index 16a4859f..00000000 --- a/kopete/protocols/msn/webcam/libmimic/vlc_common.c +++ /dev/null @@ -1,1364 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 <stdlib.h> -#include "mimic-private.h" - -guchar _col_zag[64] = { - 0, 8, 1, 2, 9, 16, 24, 17, - 10, 3, 4, 11, 18, 25, 32, 40, - 33, 26, 19, 12, 5, 6, 13, 20, - 27, 34, 41, 48, 56, 49, 42, 35, - 28, 21, 14, 7, 15, 22, 29, 36, - 43, 50, 57, 58, 51, 44, 37, 30, - 23, 31, 38, 45, 52, 59, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -}; - -VlcSymbol _vlc_alphabet[16][128] = { - - /* - * base alphabet - no zeroes prefixed - */ - { - { 3, 0x1, 0, 0 }, { 4, 0x7, 0, 0 }, - { 4, 0x5, 0, 0 }, { 6, 0x27, 0, 0 }, - { 6, 0x25, 0, 0 }, { 6, 0x23, 0, 0 }, - { 6, 0x21, 0, 0 }, { 8, 0xcf, 0, 0 }, - { 8, 0xcd, 0, 0 }, { 8, 0xcb, 0, 0 }, - { 8, 0xc9, 0, 0 }, { 8, 0xc7, 0, 0 }, - { 8, 0xc5, 0, 0 }, { 8, 0xc3, 0, 0 }, - { 8, 0xc1, 0, 0 }, { 10, 0x35f, 0, 0 }, - { 10, 0x35d, 0, 0 }, { 10, 0x35b, 0, 0 }, - { 10, 0x359, 0, 0 }, { 10, 0x357, 0, 0 }, - { 10, 0x355, 0, 0 }, { 10, 0x353, 0, 0 }, - { 10, 0x351, 0, 0 }, { 10, 0x34f, 0, 0 }, - { 10, 0x34d, 0, 0 }, { 10, 0x34b, 0, 0 }, - { 10, 0x349, 0, 0 }, { 10, 0x347, 0, 0 }, - { 10, 0x345, 0, 0 }, { 10, 0x343, 0, 0 }, - { 10, 0x341, 0, 0 }, { 12, 0xeff, 0, 0 }, - { 12, 0xefd, 0, 0 }, { 12, 0xefb, 0, 0 }, - { 12, 0xef9, 0, 0 }, { 12, 0xef7, 0, 0 }, - { 12, 0xef5, 0, 0 }, { 12, 0xef3, 0, 0 }, - { 12, 0xef1, 0, 0 }, { 12, 0xeef, 0, 0 }, - { 12, 0xeed, 0, 0 }, { 12, 0xeeb, 0, 0 }, - { 12, 0xee9, 0, 0 }, { 12, 0xee7, 0, 0 }, - { 12, 0xee5, 0, 0 }, { 12, 0xee3, 0, 0 }, - { 12, 0xee1, 0, 0 }, { 12, 0xedf, 0, 0 }, - { 12, 0xedd, 0, 0 }, { 12, 0xedb, 0, 0 }, - { 12, 0xed9, 0, 0 }, { 12, 0xed7, 0, 0 }, - { 12, 0xed5, 0, 0 }, { 12, 0xed3, 0, 0 }, - { 12, 0xed1, 0, 0 }, { 12, 0xecf, 0, 0 }, - { 12, 0xecd, 0, 0 }, { 12, 0xecb, 0, 0 }, - { 12, 0xec9, 0, 0 }, { 12, 0xec7, 0, 0 }, - { 12, 0xec5, 0, 0 }, { 12, 0xec3, 0, 0 }, - { 12, 0xec1, 0, 0 }, { 17, 0x1fd7f, 0, 0 }, - { 17, 0x1fd7d, 0, 0 }, { 17, 0x1fd7b, 0, 0 }, - { 17, 0x1fd79, 0, 0 }, { 17, 0x1fd77, 0, 0 }, - { 17, 0x1fd75, 0, 0 }, { 17, 0x1fd73, 0, 0 }, - { 17, 0x1fd71, 0, 0 }, { 17, 0x1fd6f, 0, 0 }, - { 17, 0x1fd6d, 0, 0 }, { 17, 0x1fd6b, 0, 0 }, - { 17, 0x1fd69, 0, 0 }, { 17, 0x1fd67, 0, 0 }, - { 17, 0x1fd65, 0, 0 }, { 17, 0x1fd63, 0, 0 }, - { 17, 0x1fd61, 0, 0 }, { 17, 0x1fd5f, 0, 0 }, - { 17, 0x1fd5d, 0, 0 }, { 17, 0x1fd5b, 0, 0 }, - { 17, 0x1fd59, 0, 0 }, { 17, 0x1fd57, 0, 0 }, - { 17, 0x1fd55, 0, 0 }, { 17, 0x1fd53, 0, 0 }, - { 17, 0x1fd51, 0, 0 }, { 17, 0x1fd4f, 0, 0 }, - { 17, 0x1fd4d, 0, 0 }, { 17, 0x1fd4b, 0, 0 }, - { 17, 0x1fd49, 0, 0 }, { 17, 0x1fd47, 0, 0 }, - { 17, 0x1fd45, 0, 0 }, { 17, 0x1fd43, 0, 0 }, - { 17, 0x1fd41, 0, 0 }, { 17, 0x1fd3f, 0, 0 }, - { 17, 0x1fd3d, 0, 0 }, { 17, 0x1fd3b, 0, 0 }, - { 17, 0x1fd39, 0, 0 }, { 17, 0x1fd37, 0, 0 }, - { 17, 0x1fd35, 0, 0 }, { 17, 0x1fd33, 0, 0 }, - { 17, 0x1fd31, 0, 0 }, { 17, 0x1fd2f, 0, 0 }, - { 17, 0x1fd2d, 0, 0 }, { 17, 0x1fd2b, 0, 0 }, - { 17, 0x1fd29, 0, 0 }, { 17, 0x1fd27, 0, 0 }, - { 17, 0x1fd25, 0, 0 }, { 17, 0x1fd23, 0, 0 }, - { 17, 0x1fd21, 0, 0 }, { 17, 0x1fd1f, 0, 0 }, - { 17, 0x1fd1d, 0, 0 }, { 17, 0x1fd1b, 0, 0 }, - { 17, 0x1fd19, 0, 0 }, { 17, 0x1fd17, 0, 0 }, - { 17, 0x1fd15, 0, 0 }, { 17, 0x1fd13, 0, 0 }, - { 17, 0x1fd11, 0, 0 }, { 17, 0x1fd0f, 0, 0 }, - { 17, 0x1fd0d, 0, 0 }, { 17, 0x1fd0b, 0, 0 }, - { 17, 0x1fd09, 0, 0 }, { 17, 0x1fd07, 0, 0 }, - { 17, 0x1fd05, 0, 0 }, { 17, 0x1fd03, 0, 0 }, - { 17, 0x1fd01, 0, 0 }, { 17, 0x1fd01, 0, 0 } - }, - - /* - * prefixed with 1 zero - */ - { - { 5, 0x17, 0, 0 }, { 8, 0xe7, 0, 0 }, - { 8, 0xe5, 0, 0 }, { 9, 0x1d7, 0, 0 }, - { 9, 0x1d5, 0, 0 }, { 9, 0x1d3, 0, 0 }, - { 9, 0x1d1, 0, 0 }, { 12, 0xf8f, 0, 0 }, - { 12, 0xf8d, 0, 0 }, { 12, 0xf8b, 0, 0 }, - { 12, 0xf89, 0, 0 }, { 12, 0xf87, 0, 0 }, - { 12, 0xf85, 0, 0 }, { 12, 0xf83, 0, 0 }, - { 12, 0xf81, 0, 0 }, { 15, 0x7f1f, 0, 0 }, - { 15, 0x7f1d, 0, 0 }, { 15, 0x7f1b, 0, 0 }, - { 15, 0x7f19, 0, 0 }, { 15, 0x7f17, 0, 0 }, - { 15, 0x7f15, 0, 0 }, { 15, 0x7f13, 0, 0 }, - { 15, 0x7f11, 0, 0 }, { 15, 0x7f0f, 0, 0 }, - { 15, 0x7f0d, 0, 0 }, { 15, 0x7f0b, 0, 0 }, - { 15, 0x7f09, 0, 0 }, { 15, 0x7f07, 0, 0 }, - { 15, 0x7f05, 0, 0 }, { 15, 0x7f03, 0, 0 }, - { 15, 0x7f01, 0, 0 }, { 16, 0xfe7f, 0, 0 }, - { 16, 0xfe7d, 0, 0 }, { 16, 0xfe7b, 0, 0 }, - { 16, 0xfe79, 0, 0 }, { 16, 0xfe77, 0, 0 }, - { 16, 0xfe75, 0, 0 }, { 16, 0xfe73, 0, 0 }, - { 16, 0xfe71, 0, 0 }, { 16, 0xfe6f, 0, 0 }, - { 16, 0xfe6d, 0, 0 }, { 16, 0xfe6b, 0, 0 }, - { 16, 0xfe69, 0, 0 }, { 16, 0xfe67, 0, 0 }, - { 16, 0xfe65, 0, 0 }, { 16, 0xfe63, 0, 0 }, - { 16, 0xfe61, 0, 0 }, { 16, 0xfe5f, 0, 0 }, - { 16, 0xfe5d, 0, 0 }, { 16, 0xfe5b, 0, 0 }, - { 16, 0xfe59, 0, 0 }, { 16, 0xfe57, 0, 0 }, - { 16, 0xfe55, 0, 0 }, { 16, 0xfe53, 0, 0 }, - { 16, 0xfe51, 0, 0 }, { 16, 0xfe4f, 0, 0 }, - { 16, 0xfe4d, 0, 0 }, { 16, 0xfe4b, 0, 0 }, - { 16, 0xfe49, 0, 0 }, { 16, 0xfe47, 0, 0 }, - { 16, 0xfe45, 0, 0 }, { 16, 0xfe43, 0, 0 }, - { 16, 0xfe41, 0, 0 }, { 27, 0x7fffff9, 7, 0x7f }, - { 27, 0x7fffff9, 7, 0x7d }, { 27, 0x7fffff9, 7, 0x7b }, - { 27, 0x7fffff9, 7, 0x79 }, { 27, 0x7fffff9, 7, 0x77 }, - { 27, 0x7fffff9, 7, 0x75 }, { 27, 0x7fffff9, 7, 0x73 }, - { 27, 0x7fffff9, 7, 0x71 }, { 27, 0x7fffff9, 7, 0x6f }, - { 27, 0x7fffff9, 7, 0x6d }, { 27, 0x7fffff9, 7, 0x6b }, - { 27, 0x7fffff9, 7, 0x69 }, { 27, 0x7fffff9, 7, 0x67 }, - { 27, 0x7fffff9, 7, 0x65 }, { 27, 0x7fffff9, 7, 0x63 }, - { 27, 0x7fffff9, 7, 0x61 }, { 27, 0x7fffff9, 7, 0x5f }, - { 27, 0x7fffff9, 7, 0x5d }, { 27, 0x7fffff9, 7, 0x5b }, - { 27, 0x7fffff9, 7, 0x59 }, { 27, 0x7fffff9, 7, 0x57 }, - { 27, 0x7fffff9, 7, 0x55 }, { 27, 0x7fffff9, 7, 0x53 }, - { 27, 0x7fffff9, 7, 0x51 }, { 27, 0x7fffff9, 7, 0x4f }, - { 27, 0x7fffff9, 7, 0x4d }, { 27, 0x7fffff9, 7, 0x4b }, - { 27, 0x7fffff9, 7, 0x49 }, { 27, 0x7fffff9, 7, 0x47 }, - { 27, 0x7fffff9, 7, 0x45 }, { 27, 0x7fffff9, 7, 0x43 }, - { 27, 0x7fffff9, 7, 0x41 }, { 27, 0x7fffff9, 7, 0x3f }, - { 27, 0x7fffff9, 7, 0x3d }, { 27, 0x7fffff9, 7, 0x3b }, - { 27, 0x7fffff9, 7, 0x39 }, { 27, 0x7fffff9, 7, 0x37 }, - { 27, 0x7fffff9, 7, 0x35 }, { 27, 0x7fffff9, 7, 0x33 }, - { 27, 0x7fffff9, 7, 0x31 }, { 27, 0x7fffff9, 7, 0x2f }, - { 27, 0x7fffff9, 7, 0x2d }, { 27, 0x7fffff9, 7, 0x2b }, - { 27, 0x7fffff9, 7, 0x29 }, { 27, 0x7fffff9, 7, 0x27 }, - { 27, 0x7fffff9, 7, 0x25 }, { 27, 0x7fffff9, 7, 0x23 }, - { 27, 0x7fffff9, 7, 0x21 }, { 27, 0x7fffff9, 7, 0x1f }, - { 27, 0x7fffff9, 7, 0x1d }, { 27, 0x7fffff9, 7, 0x1b }, - { 27, 0x7fffff9, 7, 0x19 }, { 27, 0x7fffff9, 7, 0x17 }, - { 27, 0x7fffff9, 7, 0x15 }, { 27, 0x7fffff9, 7, 0x13 }, - { 27, 0x7fffff9, 7, 0x11 }, { 27, 0x7fffff9, 7, 0xf }, - { 27, 0x7fffff9, 7, 0xd }, { 27, 0x7fffff9, 7, 0xb }, - { 27, 0x7fffff9, 7, 0x9 }, { 27, 0x7fffff9, 7, 0x7 }, - { 27, 0x7fffff9, 7, 0x5 }, { 27, 0x7fffff9, 7, 0x3 }, - { 27, 0x7fffff9, 7, 0x1 }, { 27, 0x7fffff9, 7, 0x1 } - }, - - /* - * prefixed with 2 zeroes - */ - { - { 6, 0x37, 0, 0 }, { 9, 0x1ef, 0, 0 }, - { 9, 0x1ed, 0, 0 }, { 12, 0xfd7, 0, 0 }, - { 12, 0xfd5, 0, 0 }, { 12, 0xfd3, 0, 0 }, - { 12, 0xfd1, 0, 0 }, { 13, 0x1fbf, 0, 0 }, - { 13, 0x1fbd, 0, 0 }, { 13, 0x1fbb, 0, 0 }, - { 13, 0x1fb9, 0, 0 }, { 13, 0x1fb7, 0, 0 }, - { 13, 0x1fb5, 0, 0 }, { 13, 0x1fb3, 0, 0 }, - { 13, 0x1fb1, 0, 0 }, { 25, 0x1ffff7f, 0, 0 }, - { 25, 0x1ffff7d, 0, 0 }, { 25, 0x1ffff7b, 0, 0 }, - { 25, 0x1ffff79, 0, 0 }, { 25, 0x1ffff77, 0, 0 }, - { 25, 0x1ffff75, 0, 0 }, { 25, 0x1ffff73, 0, 0 }, - { 25, 0x1ffff71, 0, 0 }, { 25, 0x1ffff6f, 0, 0 }, - { 25, 0x1ffff6d, 0, 0 }, { 25, 0x1ffff6b, 0, 0 }, - { 25, 0x1ffff69, 0, 0 }, { 25, 0x1ffff67, 0, 0 }, - { 25, 0x1ffff65, 0, 0 }, { 25, 0x1ffff63, 0, 0 }, - { 25, 0x1ffff61, 0, 0 }, { 30, 0x3ffffe3f, 0, 0 }, - { 30, 0x3ffffe3d, 0, 0 }, { 30, 0x3ffffe3b, 0, 0 }, - { 30, 0x3ffffe39, 0, 0 }, { 30, 0x3ffffe37, 0, 0 }, - { 30, 0x3ffffe35, 0, 0 }, { 30, 0x3ffffe33, 0, 0 }, - { 30, 0x3ffffe31, 0, 0 }, { 30, 0x3ffffe2f, 0, 0 }, - { 30, 0x3ffffe2d, 0, 0 }, { 30, 0x3ffffe2b, 0, 0 }, - { 30, 0x3ffffe29, 0, 0 }, { 30, 0x3ffffe27, 0, 0 }, - { 30, 0x3ffffe25, 0, 0 }, { 30, 0x3ffffe23, 0, 0 }, - { 30, 0x3ffffe21, 0, 0 }, { 30, 0x3ffffe1f, 0, 0 }, - { 30, 0x3ffffe1d, 0, 0 }, { 30, 0x3ffffe1b, 0, 0 }, - { 30, 0x3ffffe19, 0, 0 }, { 30, 0x3ffffe17, 0, 0 }, - { 30, 0x3ffffe15, 0, 0 }, { 30, 0x3ffffe13, 0, 0 }, - { 30, 0x3ffffe11, 0, 0 }, { 30, 0x3ffffe0f, 0, 0 }, - { 30, 0x3ffffe0d, 0, 0 }, { 30, 0x3ffffe0b, 0, 0 }, - { 30, 0x3ffffe09, 0, 0 }, { 30, 0x3ffffe07, 0, 0 }, - { 30, 0x3ffffe05, 0, 0 }, { 30, 0x3ffffe03, 0, 0 }, - { 30, 0x3ffffe01, 0, 0 }, { 27, 0x7fffffa, 7, 0x7f }, - { 27, 0x7fffffa, 7, 0x7d }, { 27, 0x7fffffa, 7, 0x7b }, - { 27, 0x7fffffa, 7, 0x79 }, { 27, 0x7fffffa, 7, 0x77 }, - { 27, 0x7fffffa, 7, 0x75 }, { 27, 0x7fffffa, 7, 0x73 }, - { 27, 0x7fffffa, 7, 0x71 }, { 27, 0x7fffffa, 7, 0x6f }, - { 27, 0x7fffffa, 7, 0x6d }, { 27, 0x7fffffa, 7, 0x6b }, - { 27, 0x7fffffa, 7, 0x69 }, { 27, 0x7fffffa, 7, 0x67 }, - { 27, 0x7fffffa, 7, 0x65 }, { 27, 0x7fffffa, 7, 0x63 }, - { 27, 0x7fffffa, 7, 0x61 }, { 27, 0x7fffffa, 7, 0x5f }, - { 27, 0x7fffffa, 7, 0x5d }, { 27, 0x7fffffa, 7, 0x5b }, - { 27, 0x7fffffa, 7, 0x59 }, { 27, 0x7fffffa, 7, 0x57 }, - { 27, 0x7fffffa, 7, 0x55 }, { 27, 0x7fffffa, 7, 0x53 }, - { 27, 0x7fffffa, 7, 0x51 }, { 27, 0x7fffffa, 7, 0x4f }, - { 27, 0x7fffffa, 7, 0x4d }, { 27, 0x7fffffa, 7, 0x4b }, - { 27, 0x7fffffa, 7, 0x49 }, { 27, 0x7fffffa, 7, 0x47 }, - { 27, 0x7fffffa, 7, 0x45 }, { 27, 0x7fffffa, 7, 0x43 }, - { 27, 0x7fffffa, 7, 0x41 }, { 27, 0x7fffffa, 7, 0x3f }, - { 27, 0x7fffffa, 7, 0x3d }, { 27, 0x7fffffa, 7, 0x3b }, - { 27, 0x7fffffa, 7, 0x39 }, { 27, 0x7fffffa, 7, 0x37 }, - { 27, 0x7fffffa, 7, 0x35 }, { 27, 0x7fffffa, 7, 0x33 }, - { 27, 0x7fffffa, 7, 0x31 }, { 27, 0x7fffffa, 7, 0x2f }, - { 27, 0x7fffffa, 7, 0x2d }, { 27, 0x7fffffa, 7, 0x2b }, - { 27, 0x7fffffa, 7, 0x29 }, { 27, 0x7fffffa, 7, 0x27 }, - { 27, 0x7fffffa, 7, 0x25 }, { 27, 0x7fffffa, 7, 0x23 }, - { 27, 0x7fffffa, 7, 0x21 }, { 27, 0x7fffffa, 7, 0x1f }, - { 27, 0x7fffffa, 7, 0x1d }, { 27, 0x7fffffa, 7, 0x1b }, - { 27, 0x7fffffa, 7, 0x19 }, { 27, 0x7fffffa, 7, 0x17 }, - { 27, 0x7fffffa, 7, 0x15 }, { 27, 0x7fffffa, 7, 0x13 }, - { 27, 0x7fffffa, 7, 0x11 }, { 27, 0x7fffffa, 7, 0xf }, - { 27, 0x7fffffa, 7, 0xd }, { 27, 0x7fffffa, 7, 0xb }, - { 27, 0x7fffffa, 7, 0x9 }, { 27, 0x7fffffa, 7, 0x7 }, - { 27, 0x7fffffa, 7, 0x5 }, { 27, 0x7fffffa, 7, 0x3 }, - { 27, 0x7fffffa, 7, 0x1 }, { 27, 0x7fffffa, 7, 0x1 } - }, - - /* - * prefixed with 3 zeroes - */ - { - { 7, 0x71, 0, 0 }, { 10, 0x3ef, 0, 0 }, - { 10, 0x3ed, 0, 0 }, { 17, 0x1ffdf, 0, 0 }, - { 17, 0x1ffdd, 0, 0 }, { 17, 0x1ffdb, 0, 0 }, - { 17, 0x1ffd9, 0, 0 }, { 21, 0x1fffbf, 0, 0 }, - { 21, 0x1fffbd, 0, 0 }, { 21, 0x1fffbb, 0, 0 }, - { 21, 0x1fffb9, 0, 0 }, { 21, 0x1fffb7, 0, 0 }, - { 21, 0x1fffb5, 0, 0 }, { 21, 0x1fffb3, 0, 0 }, - { 21, 0x1fffb1, 0, 0 }, { 26, 0x3ffff1f, 0, 0 }, - { 26, 0x3ffff1d, 0, 0 }, { 26, 0x3ffff1b, 0, 0 }, - { 26, 0x3ffff19, 0, 0 }, { 26, 0x3ffff17, 0, 0 }, - { 26, 0x3ffff15, 0, 0 }, { 26, 0x3ffff13, 0, 0 }, - { 26, 0x3ffff11, 0, 0 }, { 26, 0x3ffff0f, 0, 0 }, - { 26, 0x3ffff0d, 0, 0 }, { 26, 0x3ffff0b, 0, 0 }, - { 26, 0x3ffff09, 0, 0 }, { 26, 0x3ffff07, 0, 0 }, - { 26, 0x3ffff05, 0, 0 }, { 26, 0x3ffff03, 0, 0 }, - { 26, 0x3ffff01, 0, 0 }, { 30, 0x3ffffe7f, 0, 0 }, - { 30, 0x3ffffe7d, 0, 0 }, { 30, 0x3ffffe7b, 0, 0 }, - { 30, 0x3ffffe79, 0, 0 }, { 30, 0x3ffffe77, 0, 0 }, - { 30, 0x3ffffe75, 0, 0 }, { 30, 0x3ffffe73, 0, 0 }, - { 30, 0x3ffffe71, 0, 0 }, { 30, 0x3ffffe6f, 0, 0 }, - { 30, 0x3ffffe6d, 0, 0 }, { 30, 0x3ffffe6b, 0, 0 }, - { 30, 0x3ffffe69, 0, 0 }, { 30, 0x3ffffe67, 0, 0 }, - { 30, 0x3ffffe65, 0, 0 }, { 30, 0x3ffffe63, 0, 0 }, - { 30, 0x3ffffe61, 0, 0 }, { 30, 0x3ffffe5f, 0, 0 }, - { 30, 0x3ffffe5d, 0, 0 }, { 30, 0x3ffffe5b, 0, 0 }, - { 30, 0x3ffffe59, 0, 0 }, { 30, 0x3ffffe57, 0, 0 }, - { 30, 0x3ffffe55, 0, 0 }, { 30, 0x3ffffe53, 0, 0 }, - { 30, 0x3ffffe51, 0, 0 }, { 30, 0x3ffffe4f, 0, 0 }, - { 30, 0x3ffffe4d, 0, 0 }, { 30, 0x3ffffe4b, 0, 0 }, - { 30, 0x3ffffe49, 0, 0 }, { 30, 0x3ffffe47, 0, 0 }, - { 30, 0x3ffffe45, 0, 0 }, { 30, 0x3ffffe43, 0, 0 }, - { 30, 0x3ffffe41, 0, 0 }, { 27, 0x7fffffb, 7, 0x7f }, - { 27, 0x7fffffb, 7, 0x7d }, { 27, 0x7fffffb, 7, 0x7b }, - { 27, 0x7fffffb, 7, 0x79 }, { 27, 0x7fffffb, 7, 0x77 }, - { 27, 0x7fffffb, 7, 0x75 }, { 27, 0x7fffffb, 7, 0x73 }, - { 27, 0x7fffffb, 7, 0x71 }, { 27, 0x7fffffb, 7, 0x6f }, - { 27, 0x7fffffb, 7, 0x6d }, { 27, 0x7fffffb, 7, 0x6b }, - { 27, 0x7fffffb, 7, 0x69 }, { 27, 0x7fffffb, 7, 0x67 }, - { 27, 0x7fffffb, 7, 0x65 }, { 27, 0x7fffffb, 7, 0x63 }, - { 27, 0x7fffffb, 7, 0x61 }, { 27, 0x7fffffb, 7, 0x5f }, - { 27, 0x7fffffb, 7, 0x5d }, { 27, 0x7fffffb, 7, 0x5b }, - { 27, 0x7fffffb, 7, 0x59 }, { 27, 0x7fffffb, 7, 0x57 }, - { 27, 0x7fffffb, 7, 0x55 }, { 27, 0x7fffffb, 7, 0x53 }, - { 27, 0x7fffffb, 7, 0x51 }, { 27, 0x7fffffb, 7, 0x4f }, - { 27, 0x7fffffb, 7, 0x4d }, { 27, 0x7fffffb, 7, 0x4b }, - { 27, 0x7fffffb, 7, 0x49 }, { 27, 0x7fffffb, 7, 0x47 }, - { 27, 0x7fffffb, 7, 0x45 }, { 27, 0x7fffffb, 7, 0x43 }, - { 27, 0x7fffffb, 7, 0x41 }, { 27, 0x7fffffb, 7, 0x3f }, - { 27, 0x7fffffb, 7, 0x3d }, { 27, 0x7fffffb, 7, 0x3b }, - { 27, 0x7fffffb, 7, 0x39 }, { 27, 0x7fffffb, 7, 0x37 }, - { 27, 0x7fffffb, 7, 0x35 }, { 27, 0x7fffffb, 7, 0x33 }, - { 27, 0x7fffffb, 7, 0x31 }, { 27, 0x7fffffb, 7, 0x2f }, - { 27, 0x7fffffb, 7, 0x2d }, { 27, 0x7fffffb, 7, 0x2b }, - { 27, 0x7fffffb, 7, 0x29 }, { 27, 0x7fffffb, 7, 0x27 }, - { 27, 0x7fffffb, 7, 0x25 }, { 27, 0x7fffffb, 7, 0x23 }, - { 27, 0x7fffffb, 7, 0x21 }, { 27, 0x7fffffb, 7, 0x1f }, - { 27, 0x7fffffb, 7, 0x1d }, { 27, 0x7fffffb, 7, 0x1b }, - { 27, 0x7fffffb, 7, 0x19 }, { 27, 0x7fffffb, 7, 0x17 }, - { 27, 0x7fffffb, 7, 0x15 }, { 27, 0x7fffffb, 7, 0x13 }, - { 27, 0x7fffffb, 7, 0x11 }, { 27, 0x7fffffb, 7, 0xf }, - { 27, 0x7fffffb, 7, 0xd }, { 27, 0x7fffffb, 7, 0xb }, - { 27, 0x7fffffb, 7, 0x9 }, { 27, 0x7fffffb, 7, 0x7 }, - { 27, 0x7fffffb, 7, 0x5 }, { 27, 0x7fffffb, 7, 0x3 }, - { 27, 0x7fffffb, 7, 0x1 }, { 27, 0x7fffffb, 7, 0x1 } - }, - - /* - * prefixed with 4 zeroes - */ - { - { 8, 0xf1, 0, 0 }, { 11, 0x7e3, 0, 0 }, - { 11, 0x7e1, 0, 0 }, { 18, 0x3ffc7, 0, 0 }, - { 18, 0x3ffc5, 0, 0 }, { 18, 0x3ffc3, 0, 0 }, - { 18, 0x3ffc1, 0, 0 }, { 22, 0x3fff8f, 0, 0 }, - { 22, 0x3fff8d, 0, 0 }, { 22, 0x3fff8b, 0, 0 }, - { 22, 0x3fff89, 0, 0 }, { 22, 0x3fff87, 0, 0 }, - { 22, 0x3fff85, 0, 0 }, { 22, 0x3fff83, 0, 0 }, - { 22, 0x3fff81, 0, 0 }, { 26, 0x3ffff3f, 0, 0 }, - { 26, 0x3ffff3d, 0, 0 }, { 26, 0x3ffff3b, 0, 0 }, - { 26, 0x3ffff39, 0, 0 }, { 26, 0x3ffff37, 0, 0 }, - { 26, 0x3ffff35, 0, 0 }, { 26, 0x3ffff33, 0, 0 }, - { 26, 0x3ffff31, 0, 0 }, { 26, 0x3ffff2f, 0, 0 }, - { 26, 0x3ffff2d, 0, 0 }, { 26, 0x3ffff2b, 0, 0 }, - { 26, 0x3ffff29, 0, 0 }, { 26, 0x3ffff27, 0, 0 }, - { 26, 0x3ffff25, 0, 0 }, { 26, 0x3ffff23, 0, 0 }, - { 26, 0x3ffff21, 0, 0 }, { 30, 0x3ffffebf, 0, 0 }, - { 30, 0x3ffffebd, 0, 0 }, { 30, 0x3ffffebb, 0, 0 }, - { 30, 0x3ffffeb9, 0, 0 }, { 30, 0x3ffffeb7, 0, 0 }, - { 30, 0x3ffffeb5, 0, 0 }, { 30, 0x3ffffeb3, 0, 0 }, - { 30, 0x3ffffeb1, 0, 0 }, { 30, 0x3ffffeaf, 0, 0 }, - { 30, 0x3ffffead, 0, 0 }, { 30, 0x3ffffeab, 0, 0 }, - { 30, 0x3ffffea9, 0, 0 }, { 30, 0x3ffffea7, 0, 0 }, - { 30, 0x3ffffea5, 0, 0 }, { 30, 0x3ffffea3, 0, 0 }, - { 30, 0x3ffffea1, 0, 0 }, { 30, 0x3ffffe9f, 0, 0 }, - { 30, 0x3ffffe9d, 0, 0 }, { 30, 0x3ffffe9b, 0, 0 }, - { 30, 0x3ffffe99, 0, 0 }, { 30, 0x3ffffe97, 0, 0 }, - { 30, 0x3ffffe95, 0, 0 }, { 30, 0x3ffffe93, 0, 0 }, - { 30, 0x3ffffe91, 0, 0 }, { 30, 0x3ffffe8f, 0, 0 }, - { 30, 0x3ffffe8d, 0, 0 }, { 30, 0x3ffffe8b, 0, 0 }, - { 30, 0x3ffffe89, 0, 0 }, { 30, 0x3ffffe87, 0, 0 }, - { 30, 0x3ffffe85, 0, 0 }, { 30, 0x3ffffe83, 0, 0 }, - { 30, 0x3ffffe81, 0, 0 }, { 28, 0xffffff8, 7, 0x7f }, - { 28, 0xffffff8, 7, 0x7d }, { 28, 0xffffff8, 7, 0x7b }, - { 28, 0xffffff8, 7, 0x79 }, { 28, 0xffffff8, 7, 0x77 }, - { 28, 0xffffff8, 7, 0x75 }, { 28, 0xffffff8, 7, 0x73 }, - { 28, 0xffffff8, 7, 0x71 }, { 28, 0xffffff8, 7, 0x6f }, - { 28, 0xffffff8, 7, 0x6d }, { 28, 0xffffff8, 7, 0x6b }, - { 28, 0xffffff8, 7, 0x69 }, { 28, 0xffffff8, 7, 0x67 }, - { 28, 0xffffff8, 7, 0x65 }, { 28, 0xffffff8, 7, 0x63 }, - { 28, 0xffffff8, 7, 0x61 }, { 28, 0xffffff8, 7, 0x5f }, - { 28, 0xffffff8, 7, 0x5d }, { 28, 0xffffff8, 7, 0x5b }, - { 28, 0xffffff8, 7, 0x59 }, { 28, 0xffffff8, 7, 0x57 }, - { 28, 0xffffff8, 7, 0x55 }, { 28, 0xffffff8, 7, 0x53 }, - { 28, 0xffffff8, 7, 0x51 }, { 28, 0xffffff8, 7, 0x4f }, - { 28, 0xffffff8, 7, 0x4d }, { 28, 0xffffff8, 7, 0x4b }, - { 28, 0xffffff8, 7, 0x49 }, { 28, 0xffffff8, 7, 0x47 }, - { 28, 0xffffff8, 7, 0x45 }, { 28, 0xffffff8, 7, 0x43 }, - { 28, 0xffffff8, 7, 0x41 }, { 28, 0xffffff8, 7, 0x3f }, - { 28, 0xffffff8, 7, 0x3d }, { 28, 0xffffff8, 7, 0x3b }, - { 28, 0xffffff8, 7, 0x39 }, { 28, 0xffffff8, 7, 0x37 }, - { 28, 0xffffff8, 7, 0x35 }, { 28, 0xffffff8, 7, 0x33 }, - { 28, 0xffffff8, 7, 0x31 }, { 28, 0xffffff8, 7, 0x2f }, - { 28, 0xffffff8, 7, 0x2d }, { 28, 0xffffff8, 7, 0x2b }, - { 28, 0xffffff8, 7, 0x29 }, { 28, 0xffffff8, 7, 0x27 }, - { 28, 0xffffff8, 7, 0x25 }, { 28, 0xffffff8, 7, 0x23 }, - { 28, 0xffffff8, 7, 0x21 }, { 28, 0xffffff8, 7, 0x1f }, - { 28, 0xffffff8, 7, 0x1d }, { 28, 0xffffff8, 7, 0x1b }, - { 28, 0xffffff8, 7, 0x19 }, { 28, 0xffffff8, 7, 0x17 }, - { 28, 0xffffff8, 7, 0x15 }, { 28, 0xffffff8, 7, 0x13 }, - { 28, 0xffffff8, 7, 0x11 }, { 28, 0xffffff8, 7, 0xf }, - { 28, 0xffffff8, 7, 0xd }, { 28, 0xffffff8, 7, 0xb }, - { 28, 0xffffff8, 7, 0x9 }, { 28, 0xffffff8, 7, 0x7 }, - { 28, 0xffffff8, 7, 0x5 }, { 28, 0xffffff8, 7, 0x3 }, - { 28, 0xffffff8, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 5 zeroes - */ - { - { 8, 0xf3, 0, 0 }, { 11, 0x7e7, 0, 0 }, - { 11, 0x7e5, 0, 0 }, { 18, 0x3ffcf, 0, 0 }, - { 18, 0x3ffcd, 0, 0 }, { 18, 0x3ffcb, 0, 0 }, - { 18, 0x3ffc9, 0, 0 }, { 22, 0x3fff9f, 0, 0 }, - { 22, 0x3fff9d, 0, 0 }, { 22, 0x3fff9b, 0, 0 }, - { 22, 0x3fff99, 0, 0 }, { 22, 0x3fff97, 0, 0 }, - { 22, 0x3fff95, 0, 0 }, { 22, 0x3fff93, 0, 0 }, - { 22, 0x3fff91, 0, 0 }, { 26, 0x3ffff5f, 0, 0 }, - { 26, 0x3ffff5d, 0, 0 }, { 26, 0x3ffff5b, 0, 0 }, - { 26, 0x3ffff59, 0, 0 }, { 26, 0x3ffff57, 0, 0 }, - { 26, 0x3ffff55, 0, 0 }, { 26, 0x3ffff53, 0, 0 }, - { 26, 0x3ffff51, 0, 0 }, { 26, 0x3ffff4f, 0, 0 }, - { 26, 0x3ffff4d, 0, 0 }, { 26, 0x3ffff4b, 0, 0 }, - { 26, 0x3ffff49, 0, 0 }, { 26, 0x3ffff47, 0, 0 }, - { 26, 0x3ffff45, 0, 0 }, { 26, 0x3ffff43, 0, 0 }, - { 26, 0x3ffff41, 0, 0 }, { 30, 0x3ffffeff, 0, 0 }, - { 30, 0x3ffffefd, 0, 0 }, { 30, 0x3ffffefb, 0, 0 }, - { 30, 0x3ffffef9, 0, 0 }, { 30, 0x3ffffef7, 0, 0 }, - { 30, 0x3ffffef5, 0, 0 }, { 30, 0x3ffffef3, 0, 0 }, - { 30, 0x3ffffef1, 0, 0 }, { 30, 0x3ffffeef, 0, 0 }, - { 30, 0x3ffffeed, 0, 0 }, { 30, 0x3ffffeeb, 0, 0 }, - { 30, 0x3ffffee9, 0, 0 }, { 30, 0x3ffffee7, 0, 0 }, - { 30, 0x3ffffee5, 0, 0 }, { 30, 0x3ffffee3, 0, 0 }, - { 30, 0x3ffffee1, 0, 0 }, { 30, 0x3ffffedf, 0, 0 }, - { 30, 0x3ffffedd, 0, 0 }, { 30, 0x3ffffedb, 0, 0 }, - { 30, 0x3ffffed9, 0, 0 }, { 30, 0x3ffffed7, 0, 0 }, - { 30, 0x3ffffed5, 0, 0 }, { 30, 0x3ffffed3, 0, 0 }, - { 30, 0x3ffffed1, 0, 0 }, { 30, 0x3ffffecf, 0, 0 }, - { 30, 0x3ffffecd, 0, 0 }, { 30, 0x3ffffecb, 0, 0 }, - { 30, 0x3ffffec9, 0, 0 }, { 30, 0x3ffffec7, 0, 0 }, - { 30, 0x3ffffec5, 0, 0 }, { 30, 0x3ffffec3, 0, 0 }, - { 30, 0x3ffffec1, 0, 0 }, { 28, 0xffffff9, 7, 0x7f }, - { 28, 0xffffff9, 7, 0x7d }, { 28, 0xffffff9, 7, 0x7b }, - { 28, 0xffffff9, 7, 0x79 }, { 28, 0xffffff9, 7, 0x77 }, - { 28, 0xffffff9, 7, 0x75 }, { 28, 0xffffff9, 7, 0x73 }, - { 28, 0xffffff9, 7, 0x71 }, { 28, 0xffffff9, 7, 0x6f }, - { 28, 0xffffff9, 7, 0x6d }, { 28, 0xffffff9, 7, 0x6b }, - { 28, 0xffffff9, 7, 0x69 }, { 28, 0xffffff9, 7, 0x67 }, - { 28, 0xffffff9, 7, 0x65 }, { 28, 0xffffff9, 7, 0x63 }, - { 28, 0xffffff9, 7, 0x61 }, { 28, 0xffffff9, 7, 0x5f }, - { 28, 0xffffff9, 7, 0x5d }, { 28, 0xffffff9, 7, 0x5b }, - { 28, 0xffffff9, 7, 0x59 }, { 28, 0xffffff9, 7, 0x57 }, - { 28, 0xffffff9, 7, 0x55 }, { 28, 0xffffff9, 7, 0x53 }, - { 28, 0xffffff9, 7, 0x51 }, { 28, 0xffffff9, 7, 0x4f }, - { 28, 0xffffff9, 7, 0x4d }, { 28, 0xffffff9, 7, 0x4b }, - { 28, 0xffffff9, 7, 0x49 }, { 28, 0xffffff9, 7, 0x47 }, - { 28, 0xffffff9, 7, 0x45 }, { 28, 0xffffff9, 7, 0x43 }, - { 28, 0xffffff9, 7, 0x41 }, { 28, 0xffffff9, 7, 0x3f }, - { 28, 0xffffff9, 7, 0x3d }, { 28, 0xffffff9, 7, 0x3b }, - { 28, 0xffffff9, 7, 0x39 }, { 28, 0xffffff9, 7, 0x37 }, - { 28, 0xffffff9, 7, 0x35 }, { 28, 0xffffff9, 7, 0x33 }, - { 28, 0xffffff9, 7, 0x31 }, { 28, 0xffffff9, 7, 0x2f }, - { 28, 0xffffff9, 7, 0x2d }, { 28, 0xffffff9, 7, 0x2b }, - { 28, 0xffffff9, 7, 0x29 }, { 28, 0xffffff9, 7, 0x27 }, - { 28, 0xffffff9, 7, 0x25 }, { 28, 0xffffff9, 7, 0x23 }, - { 28, 0xffffff9, 7, 0x21 }, { 28, 0xffffff9, 7, 0x1f }, - { 28, 0xffffff9, 7, 0x1d }, { 28, 0xffffff9, 7, 0x1b }, - { 28, 0xffffff9, 7, 0x19 }, { 28, 0xffffff9, 7, 0x17 }, - { 28, 0xffffff9, 7, 0x15 }, { 28, 0xffffff9, 7, 0x13 }, - { 28, 0xffffff9, 7, 0x11 }, { 28, 0xffffff9, 7, 0xf }, - { 28, 0xffffff9, 7, 0xd }, { 28, 0xffffff9, 7, 0xb }, - { 28, 0xffffff9, 7, 0x9 }, { 28, 0xffffff9, 7, 0x7 }, - { 28, 0xffffff9, 7, 0x5 }, { 28, 0xffffff9, 7, 0x3 }, - { 28, 0xffffff9, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 6 zeroes - */ - { - { 8, 0xf5, 0, 0 }, { 14, 0x3feb, 0, 0 }, - { 14, 0x3fe9, 0, 0 }, { 18, 0x3ffd7, 0, 0 }, - { 18, 0x3ffd5, 0, 0 }, { 18, 0x3ffd3, 0, 0 }, - { 18, 0x3ffd1, 0, 0 }, { 22, 0x3fffaf, 0, 0 }, - { 22, 0x3fffad, 0, 0 }, { 22, 0x3fffab, 0, 0 }, - { 22, 0x3fffa9, 0, 0 }, { 22, 0x3fffa7, 0, 0 }, - { 22, 0x3fffa5, 0, 0 }, { 22, 0x3fffa3, 0, 0 }, - { 22, 0x3fffa1, 0, 0 }, { 26, 0x3ffff7f, 0, 0 }, - { 26, 0x3ffff7d, 0, 0 }, { 26, 0x3ffff7b, 0, 0 }, - { 26, 0x3ffff79, 0, 0 }, { 26, 0x3ffff77, 0, 0 }, - { 26, 0x3ffff75, 0, 0 }, { 26, 0x3ffff73, 0, 0 }, - { 26, 0x3ffff71, 0, 0 }, { 26, 0x3ffff6f, 0, 0 }, - { 26, 0x3ffff6d, 0, 0 }, { 26, 0x3ffff6b, 0, 0 }, - { 26, 0x3ffff69, 0, 0 }, { 26, 0x3ffff67, 0, 0 }, - { 26, 0x3ffff65, 0, 0 }, { 26, 0x3ffff63, 0, 0 }, - { 26, 0x3ffff61, 0, 0 }, { 31, 0x7ffffe3f, 0, 0 }, - { 31, 0x7ffffe3d, 0, 0 }, { 31, 0x7ffffe3b, 0, 0 }, - { 31, 0x7ffffe39, 0, 0 }, { 31, 0x7ffffe37, 0, 0 }, - { 31, 0x7ffffe35, 0, 0 }, { 31, 0x7ffffe33, 0, 0 }, - { 31, 0x7ffffe31, 0, 0 }, { 31, 0x7ffffe2f, 0, 0 }, - { 31, 0x7ffffe2d, 0, 0 }, { 31, 0x7ffffe2b, 0, 0 }, - { 31, 0x7ffffe29, 0, 0 }, { 31, 0x7ffffe27, 0, 0 }, - { 31, 0x7ffffe25, 0, 0 }, { 31, 0x7ffffe23, 0, 0 }, - { 31, 0x7ffffe21, 0, 0 }, { 31, 0x7ffffe1f, 0, 0 }, - { 31, 0x7ffffe1d, 0, 0 }, { 31, 0x7ffffe1b, 0, 0 }, - { 31, 0x7ffffe19, 0, 0 }, { 31, 0x7ffffe17, 0, 0 }, - { 31, 0x7ffffe15, 0, 0 }, { 31, 0x7ffffe13, 0, 0 }, - { 31, 0x7ffffe11, 0, 0 }, { 31, 0x7ffffe0f, 0, 0 }, - { 31, 0x7ffffe0d, 0, 0 }, { 31, 0x7ffffe0b, 0, 0 }, - { 31, 0x7ffffe09, 0, 0 }, { 31, 0x7ffffe07, 0, 0 }, - { 31, 0x7ffffe05, 0, 0 }, { 31, 0x7ffffe03, 0, 0 }, - { 31, 0x7ffffe01, 0, 0 }, { 28, 0xffffffa, 7, 0x7f }, - { 28, 0xffffffa, 7, 0x7d }, { 28, 0xffffffa, 7, 0x7b }, - { 28, 0xffffffa, 7, 0x79 }, { 28, 0xffffffa, 7, 0x77 }, - { 28, 0xffffffa, 7, 0x75 }, { 28, 0xffffffa, 7, 0x73 }, - { 28, 0xffffffa, 7, 0x71 }, { 28, 0xffffffa, 7, 0x6f }, - { 28, 0xffffffa, 7, 0x6d }, { 28, 0xffffffa, 7, 0x6b }, - { 28, 0xffffffa, 7, 0x69 }, { 28, 0xffffffa, 7, 0x67 }, - { 28, 0xffffffa, 7, 0x65 }, { 28, 0xffffffa, 7, 0x63 }, - { 28, 0xffffffa, 7, 0x61 }, { 28, 0xffffffa, 7, 0x5f }, - { 28, 0xffffffa, 7, 0x5d }, { 28, 0xffffffa, 7, 0x5b }, - { 28, 0xffffffa, 7, 0x59 }, { 28, 0xffffffa, 7, 0x57 }, - { 28, 0xffffffa, 7, 0x55 }, { 28, 0xffffffa, 7, 0x53 }, - { 28, 0xffffffa, 7, 0x51 }, { 28, 0xffffffa, 7, 0x4f }, - { 28, 0xffffffa, 7, 0x4d }, { 28, 0xffffffa, 7, 0x4b }, - { 28, 0xffffffa, 7, 0x49 }, { 28, 0xffffffa, 7, 0x47 }, - { 28, 0xffffffa, 7, 0x45 }, { 28, 0xffffffa, 7, 0x43 }, - { 28, 0xffffffa, 7, 0x41 }, { 28, 0xffffffa, 7, 0x3f }, - { 28, 0xffffffa, 7, 0x3d }, { 28, 0xffffffa, 7, 0x3b }, - { 28, 0xffffffa, 7, 0x39 }, { 28, 0xffffffa, 7, 0x37 }, - { 28, 0xffffffa, 7, 0x35 }, { 28, 0xffffffa, 7, 0x33 }, - { 28, 0xffffffa, 7, 0x31 }, { 28, 0xffffffa, 7, 0x2f }, - { 28, 0xffffffa, 7, 0x2d }, { 28, 0xffffffa, 7, 0x2b }, - { 28, 0xffffffa, 7, 0x29 }, { 28, 0xffffffa, 7, 0x27 }, - { 28, 0xffffffa, 7, 0x25 }, { 28, 0xffffffa, 7, 0x23 }, - { 28, 0xffffffa, 7, 0x21 }, { 28, 0xffffffa, 7, 0x1f }, - { 28, 0xffffffa, 7, 0x1d }, { 28, 0xffffffa, 7, 0x1b }, - { 28, 0xffffffa, 7, 0x19 }, { 28, 0xffffffa, 7, 0x17 }, - { 28, 0xffffffa, 7, 0x15 }, { 28, 0xffffffa, 7, 0x13 }, - { 28, 0xffffffa, 7, 0x11 }, { 28, 0xffffffa, 7, 0xf }, - { 28, 0xffffffa, 7, 0xd }, { 28, 0xffffffa, 7, 0xb }, - { 28, 0xffffffa, 7, 0x9 }, { 28, 0xffffffa, 7, 0x7 }, - { 28, 0xffffffa, 7, 0x5 }, { 28, 0xffffffa, 7, 0x3 }, - { 28, 0xffffffa, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 7 zeroes - */ - { - { 9, 0x1f3, 0, 0 }, { 14, 0x3fef, 0, 0 }, - { 14, 0x3fed, 0, 0 }, { 18, 0x3ffdf, 0, 0 }, - { 18, 0x3ffdd, 0, 0 }, { 18, 0x3ffdb, 0, 0 }, - { 18, 0x3ffd9, 0, 0 }, { 22, 0x3fffbf, 0, 0 }, - { 22, 0x3fffbd, 0, 0 }, { 22, 0x3fffbb, 0, 0 }, - { 22, 0x3fffb9, 0, 0 }, { 22, 0x3fffb7, 0, 0 }, - { 22, 0x3fffb5, 0, 0 }, { 22, 0x3fffb3, 0, 0 }, - { 22, 0x3fffb1, 0, 0 }, { 27, 0x7ffff1f, 0, 0 }, - { 27, 0x7ffff1d, 0, 0 }, { 27, 0x7ffff1b, 0, 0 }, - { 27, 0x7ffff19, 0, 0 }, { 27, 0x7ffff17, 0, 0 }, - { 27, 0x7ffff15, 0, 0 }, { 27, 0x7ffff13, 0, 0 }, - { 27, 0x7ffff11, 0, 0 }, { 27, 0x7ffff0f, 0, 0 }, - { 27, 0x7ffff0d, 0, 0 }, { 27, 0x7ffff0b, 0, 0 }, - { 27, 0x7ffff09, 0, 0 }, { 27, 0x7ffff07, 0, 0 }, - { 27, 0x7ffff05, 0, 0 }, { 27, 0x7ffff03, 0, 0 }, - { 27, 0x7ffff01, 0, 0 }, { 31, 0x7ffffe7f, 0, 0 }, - { 31, 0x7ffffe7d, 0, 0 }, { 31, 0x7ffffe7b, 0, 0 }, - { 31, 0x7ffffe79, 0, 0 }, { 31, 0x7ffffe77, 0, 0 }, - { 31, 0x7ffffe75, 0, 0 }, { 31, 0x7ffffe73, 0, 0 }, - { 31, 0x7ffffe71, 0, 0 }, { 31, 0x7ffffe6f, 0, 0 }, - { 31, 0x7ffffe6d, 0, 0 }, { 31, 0x7ffffe6b, 0, 0 }, - { 31, 0x7ffffe69, 0, 0 }, { 31, 0x7ffffe67, 0, 0 }, - { 31, 0x7ffffe65, 0, 0 }, { 31, 0x7ffffe63, 0, 0 }, - { 31, 0x7ffffe61, 0, 0 }, { 31, 0x7ffffe5f, 0, 0 }, - { 31, 0x7ffffe5d, 0, 0 }, { 31, 0x7ffffe5b, 0, 0 }, - { 31, 0x7ffffe59, 0, 0 }, { 31, 0x7ffffe57, 0, 0 }, - { 31, 0x7ffffe55, 0, 0 }, { 31, 0x7ffffe53, 0, 0 }, - { 31, 0x7ffffe51, 0, 0 }, { 31, 0x7ffffe4f, 0, 0 }, - { 31, 0x7ffffe4d, 0, 0 }, { 31, 0x7ffffe4b, 0, 0 }, - { 31, 0x7ffffe49, 0, 0 }, { 31, 0x7ffffe47, 0, 0 }, - { 31, 0x7ffffe45, 0, 0 }, { 31, 0x7ffffe43, 0, 0 }, - { 31, 0x7ffffe41, 0, 0 }, { 28, 0xffffffb, 7, 0x7f }, - { 28, 0xffffffb, 7, 0x7d }, { 28, 0xffffffb, 7, 0x7b }, - { 28, 0xffffffb, 7, 0x79 }, { 28, 0xffffffb, 7, 0x77 }, - { 28, 0xffffffb, 7, 0x75 }, { 28, 0xffffffb, 7, 0x73 }, - { 28, 0xffffffb, 7, 0x71 }, { 28, 0xffffffb, 7, 0x6f }, - { 28, 0xffffffb, 7, 0x6d }, { 28, 0xffffffb, 7, 0x6b }, - { 28, 0xffffffb, 7, 0x69 }, { 28, 0xffffffb, 7, 0x67 }, - { 28, 0xffffffb, 7, 0x65 }, { 28, 0xffffffb, 7, 0x63 }, - { 28, 0xffffffb, 7, 0x61 }, { 28, 0xffffffb, 7, 0x5f }, - { 28, 0xffffffb, 7, 0x5d }, { 28, 0xffffffb, 7, 0x5b }, - { 28, 0xffffffb, 7, 0x59 }, { 28, 0xffffffb, 7, 0x57 }, - { 28, 0xffffffb, 7, 0x55 }, { 28, 0xffffffb, 7, 0x53 }, - { 28, 0xffffffb, 7, 0x51 }, { 28, 0xffffffb, 7, 0x4f }, - { 28, 0xffffffb, 7, 0x4d }, { 28, 0xffffffb, 7, 0x4b }, - { 28, 0xffffffb, 7, 0x49 }, { 28, 0xffffffb, 7, 0x47 }, - { 28, 0xffffffb, 7, 0x45 }, { 28, 0xffffffb, 7, 0x43 }, - { 28, 0xffffffb, 7, 0x41 }, { 28, 0xffffffb, 7, 0x3f }, - { 28, 0xffffffb, 7, 0x3d }, { 28, 0xffffffb, 7, 0x3b }, - { 28, 0xffffffb, 7, 0x39 }, { 28, 0xffffffb, 7, 0x37 }, - { 28, 0xffffffb, 7, 0x35 }, { 28, 0xffffffb, 7, 0x33 }, - { 28, 0xffffffb, 7, 0x31 }, { 28, 0xffffffb, 7, 0x2f }, - { 28, 0xffffffb, 7, 0x2d }, { 28, 0xffffffb, 7, 0x2b }, - { 28, 0xffffffb, 7, 0x29 }, { 28, 0xffffffb, 7, 0x27 }, - { 28, 0xffffffb, 7, 0x25 }, { 28, 0xffffffb, 7, 0x23 }, - { 28, 0xffffffb, 7, 0x21 }, { 28, 0xffffffb, 7, 0x1f }, - { 28, 0xffffffb, 7, 0x1d }, { 28, 0xffffffb, 7, 0x1b }, - { 28, 0xffffffb, 7, 0x19 }, { 28, 0xffffffb, 7, 0x17 }, - { 28, 0xffffffb, 7, 0x15 }, { 28, 0xffffffb, 7, 0x13 }, - { 28, 0xffffffb, 7, 0x11 }, { 28, 0xffffffb, 7, 0xf }, - { 28, 0xffffffb, 7, 0xd }, { 28, 0xffffffb, 7, 0xb }, - { 28, 0xffffffb, 7, 0x9 }, { 28, 0xffffffb, 7, 0x7 }, - { 28, 0xffffffb, 7, 0x5 }, { 28, 0xffffffb, 7, 0x3 }, - { 28, 0xffffffb, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 8 zeroes - */ - { - { 9, 0x1f5, 0, 0 }, { 15, 0x7fe3, 0, 0 }, - { 15, 0x7fe1, 0, 0 }, { 19, 0x7ffc7, 0, 0 }, - { 19, 0x7ffc5, 0, 0 }, { 19, 0x7ffc3, 0, 0 }, - { 19, 0x7ffc1, 0, 0 }, { 23, 0x7fff8f, 0, 0 }, - { 23, 0x7fff8d, 0, 0 }, { 23, 0x7fff8b, 0, 0 }, - { 23, 0x7fff89, 0, 0 }, { 23, 0x7fff87, 0, 0 }, - { 23, 0x7fff85, 0, 0 }, { 23, 0x7fff83, 0, 0 }, - { 23, 0x7fff81, 0, 0 }, { 27, 0x7ffff3f, 0, 0 }, - { 27, 0x7ffff3d, 0, 0 }, { 27, 0x7ffff3b, 0, 0 }, - { 27, 0x7ffff39, 0, 0 }, { 27, 0x7ffff37, 0, 0 }, - { 27, 0x7ffff35, 0, 0 }, { 27, 0x7ffff33, 0, 0 }, - { 27, 0x7ffff31, 0, 0 }, { 27, 0x7ffff2f, 0, 0 }, - { 27, 0x7ffff2d, 0, 0 }, { 27, 0x7ffff2b, 0, 0 }, - { 27, 0x7ffff29, 0, 0 }, { 27, 0x7ffff27, 0, 0 }, - { 27, 0x7ffff25, 0, 0 }, { 27, 0x7ffff23, 0, 0 }, - { 27, 0x7ffff21, 0, 0 }, { 31, 0x7ffffebf, 0, 0 }, - { 31, 0x7ffffebd, 0, 0 }, { 31, 0x7ffffebb, 0, 0 }, - { 31, 0x7ffffeb9, 0, 0 }, { 31, 0x7ffffeb7, 0, 0 }, - { 31, 0x7ffffeb5, 0, 0 }, { 31, 0x7ffffeb3, 0, 0 }, - { 31, 0x7ffffeb1, 0, 0 }, { 31, 0x7ffffeaf, 0, 0 }, - { 31, 0x7ffffead, 0, 0 }, { 31, 0x7ffffeab, 0, 0 }, - { 31, 0x7ffffea9, 0, 0 }, { 31, 0x7ffffea7, 0, 0 }, - { 31, 0x7ffffea5, 0, 0 }, { 31, 0x7ffffea3, 0, 0 }, - { 31, 0x7ffffea1, 0, 0 }, { 31, 0x7ffffe9f, 0, 0 }, - { 31, 0x7ffffe9d, 0, 0 }, { 31, 0x7ffffe9b, 0, 0 }, - { 31, 0x7ffffe99, 0, 0 }, { 31, 0x7ffffe97, 0, 0 }, - { 31, 0x7ffffe95, 0, 0 }, { 31, 0x7ffffe93, 0, 0 }, - { 31, 0x7ffffe91, 0, 0 }, { 31, 0x7ffffe8f, 0, 0 }, - { 31, 0x7ffffe8d, 0, 0 }, { 31, 0x7ffffe8b, 0, 0 }, - { 31, 0x7ffffe89, 0, 0 }, { 31, 0x7ffffe87, 0, 0 }, - { 31, 0x7ffffe85, 0, 0 }, { 31, 0x7ffffe83, 0, 0 }, - { 31, 0x7ffffe81, 0, 0 }, { 29, 0x1ffffff8, 7, 0x7f }, - { 29, 0x1ffffff8, 7, 0x7d }, { 29, 0x1ffffff8, 7, 0x7b }, - { 29, 0x1ffffff8, 7, 0x79 }, { 29, 0x1ffffff8, 7, 0x77 }, - { 29, 0x1ffffff8, 7, 0x75 }, { 29, 0x1ffffff8, 7, 0x73 }, - { 29, 0x1ffffff8, 7, 0x71 }, { 29, 0x1ffffff8, 7, 0x6f }, - { 29, 0x1ffffff8, 7, 0x6d }, { 29, 0x1ffffff8, 7, 0x6b }, - { 29, 0x1ffffff8, 7, 0x69 }, { 29, 0x1ffffff8, 7, 0x67 }, - { 29, 0x1ffffff8, 7, 0x65 }, { 29, 0x1ffffff8, 7, 0x63 }, - { 29, 0x1ffffff8, 7, 0x61 }, { 29, 0x1ffffff8, 7, 0x5f }, - { 29, 0x1ffffff8, 7, 0x5d }, { 29, 0x1ffffff8, 7, 0x5b }, - { 29, 0x1ffffff8, 7, 0x59 }, { 29, 0x1ffffff8, 7, 0x57 }, - { 29, 0x1ffffff8, 7, 0x55 }, { 29, 0x1ffffff8, 7, 0x53 }, - { 29, 0x1ffffff8, 7, 0x51 }, { 29, 0x1ffffff8, 7, 0x4f }, - { 29, 0x1ffffff8, 7, 0x4d }, { 29, 0x1ffffff8, 7, 0x4b }, - { 29, 0x1ffffff8, 7, 0x49 }, { 29, 0x1ffffff8, 7, 0x47 }, - { 29, 0x1ffffff8, 7, 0x45 }, { 29, 0x1ffffff8, 7, 0x43 }, - { 29, 0x1ffffff8, 7, 0x41 }, { 29, 0x1ffffff8, 7, 0x3f }, - { 29, 0x1ffffff8, 7, 0x3d }, { 29, 0x1ffffff8, 7, 0x3b }, - { 29, 0x1ffffff8, 7, 0x39 }, { 29, 0x1ffffff8, 7, 0x37 }, - { 29, 0x1ffffff8, 7, 0x35 }, { 29, 0x1ffffff8, 7, 0x33 }, - { 29, 0x1ffffff8, 7, 0x31 }, { 29, 0x1ffffff8, 7, 0x2f }, - { 29, 0x1ffffff8, 7, 0x2d }, { 29, 0x1ffffff8, 7, 0x2b }, - { 29, 0x1ffffff8, 7, 0x29 }, { 29, 0x1ffffff8, 7, 0x27 }, - { 29, 0x1ffffff8, 7, 0x25 }, { 29, 0x1ffffff8, 7, 0x23 }, - { 29, 0x1ffffff8, 7, 0x21 }, { 29, 0x1ffffff8, 7, 0x1f }, - { 29, 0x1ffffff8, 7, 0x1d }, { 29, 0x1ffffff8, 7, 0x1b }, - { 29, 0x1ffffff8, 7, 0x19 }, { 29, 0x1ffffff8, 7, 0x17 }, - { 29, 0x1ffffff8, 7, 0x15 }, { 29, 0x1ffffff8, 7, 0x13 }, - { 29, 0x1ffffff8, 7, 0x11 }, { 29, 0x1ffffff8, 7, 0xf }, - { 29, 0x1ffffff8, 7, 0xd }, { 29, 0x1ffffff8, 7, 0xb }, - { 29, 0x1ffffff8, 7, 0x9 }, { 29, 0x1ffffff8, 7, 0x7 }, - { 29, 0x1ffffff8, 7, 0x5 }, { 29, 0x1ffffff8, 7, 0x3 }, - { 29, 0x1ffffff8, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 9 zeroes - */ - { - { 11, 0x7f7, 0, 0 }, { 15, 0x7fe7, 0, 0 }, - { 15, 0x7fe5, 0, 0 }, { 19, 0x7ffcf, 0, 0 }, - { 19, 0x7ffcd, 0, 0 }, { 19, 0x7ffcb, 0, 0 }, - { 19, 0x7ffc9, 0, 0 }, { 23, 0x7fff9f, 0, 0 }, - { 23, 0x7fff9d, 0, 0 }, { 23, 0x7fff9b, 0, 0 }, - { 23, 0x7fff99, 0, 0 }, { 23, 0x7fff97, 0, 0 }, - { 23, 0x7fff95, 0, 0 }, { 23, 0x7fff93, 0, 0 }, - { 23, 0x7fff91, 0, 0 }, { 27, 0x7ffff5f, 0, 0 }, - { 27, 0x7ffff5d, 0, 0 }, { 27, 0x7ffff5b, 0, 0 }, - { 27, 0x7ffff59, 0, 0 }, { 27, 0x7ffff57, 0, 0 }, - { 27, 0x7ffff55, 0, 0 }, { 27, 0x7ffff53, 0, 0 }, - { 27, 0x7ffff51, 0, 0 }, { 27, 0x7ffff4f, 0, 0 }, - { 27, 0x7ffff4d, 0, 0 }, { 27, 0x7ffff4b, 0, 0 }, - { 27, 0x7ffff49, 0, 0 }, { 27, 0x7ffff47, 0, 0 }, - { 27, 0x7ffff45, 0, 0 }, { 27, 0x7ffff43, 0, 0 }, - { 27, 0x7ffff41, 0, 0 }, { 31, 0x7ffffeff, 0, 0 }, - { 31, 0x7ffffefd, 0, 0 }, { 31, 0x7ffffefb, 0, 0 }, - { 31, 0x7ffffef9, 0, 0 }, { 31, 0x7ffffef7, 0, 0 }, - { 31, 0x7ffffef5, 0, 0 }, { 31, 0x7ffffef3, 0, 0 }, - { 31, 0x7ffffef1, 0, 0 }, { 31, 0x7ffffeef, 0, 0 }, - { 31, 0x7ffffeed, 0, 0 }, { 31, 0x7ffffeeb, 0, 0 }, - { 31, 0x7ffffee9, 0, 0 }, { 31, 0x7ffffee7, 0, 0 }, - { 31, 0x7ffffee5, 0, 0 }, { 31, 0x7ffffee3, 0, 0 }, - { 31, 0x7ffffee1, 0, 0 }, { 31, 0x7ffffedf, 0, 0 }, - { 31, 0x7ffffedd, 0, 0 }, { 31, 0x7ffffedb, 0, 0 }, - { 31, 0x7ffffed9, 0, 0 }, { 31, 0x7ffffed7, 0, 0 }, - { 31, 0x7ffffed5, 0, 0 }, { 31, 0x7ffffed3, 0, 0 }, - { 31, 0x7ffffed1, 0, 0 }, { 31, 0x7ffffecf, 0, 0 }, - { 31, 0x7ffffecd, 0, 0 }, { 31, 0x7ffffecb, 0, 0 }, - { 31, 0x7ffffec9, 0, 0 }, { 31, 0x7ffffec7, 0, 0 }, - { 31, 0x7ffffec5, 0, 0 }, { 31, 0x7ffffec3, 0, 0 }, - { 31, 0x7ffffec1, 0, 0 }, { 29, 0x1ffffff9, 7, 0x7f }, - { 29, 0x1ffffff9, 7, 0x7d }, { 29, 0x1ffffff9, 7, 0x7b }, - { 29, 0x1ffffff9, 7, 0x79 }, { 29, 0x1ffffff9, 7, 0x77 }, - { 29, 0x1ffffff9, 7, 0x75 }, { 29, 0x1ffffff9, 7, 0x73 }, - { 29, 0x1ffffff9, 7, 0x71 }, { 29, 0x1ffffff9, 7, 0x6f }, - { 29, 0x1ffffff9, 7, 0x6d }, { 29, 0x1ffffff9, 7, 0x6b }, - { 29, 0x1ffffff9, 7, 0x69 }, { 29, 0x1ffffff9, 7, 0x67 }, - { 29, 0x1ffffff9, 7, 0x65 }, { 29, 0x1ffffff9, 7, 0x63 }, - { 29, 0x1ffffff9, 7, 0x61 }, { 29, 0x1ffffff9, 7, 0x5f }, - { 29, 0x1ffffff9, 7, 0x5d }, { 29, 0x1ffffff9, 7, 0x5b }, - { 29, 0x1ffffff9, 7, 0x59 }, { 29, 0x1ffffff9, 7, 0x57 }, - { 29, 0x1ffffff9, 7, 0x55 }, { 29, 0x1ffffff9, 7, 0x53 }, - { 29, 0x1ffffff9, 7, 0x51 }, { 29, 0x1ffffff9, 7, 0x4f }, - { 29, 0x1ffffff9, 7, 0x4d }, { 29, 0x1ffffff9, 7, 0x4b }, - { 29, 0x1ffffff9, 7, 0x49 }, { 29, 0x1ffffff9, 7, 0x47 }, - { 29, 0x1ffffff9, 7, 0x45 }, { 29, 0x1ffffff9, 7, 0x43 }, - { 29, 0x1ffffff9, 7, 0x41 }, { 29, 0x1ffffff9, 7, 0x3f }, - { 29, 0x1ffffff9, 7, 0x3d }, { 29, 0x1ffffff9, 7, 0x3b }, - { 29, 0x1ffffff9, 7, 0x39 }, { 29, 0x1ffffff9, 7, 0x37 }, - { 29, 0x1ffffff9, 7, 0x35 }, { 29, 0x1ffffff9, 7, 0x33 }, - { 29, 0x1ffffff9, 7, 0x31 }, { 29, 0x1ffffff9, 7, 0x2f }, - { 29, 0x1ffffff9, 7, 0x2d }, { 29, 0x1ffffff9, 7, 0x2b }, - { 29, 0x1ffffff9, 7, 0x29 }, { 29, 0x1ffffff9, 7, 0x27 }, - { 29, 0x1ffffff9, 7, 0x25 }, { 29, 0x1ffffff9, 7, 0x23 }, - { 29, 0x1ffffff9, 7, 0x21 }, { 29, 0x1ffffff9, 7, 0x1f }, - { 29, 0x1ffffff9, 7, 0x1d }, { 29, 0x1ffffff9, 7, 0x1b }, - { 29, 0x1ffffff9, 7, 0x19 }, { 29, 0x1ffffff9, 7, 0x17 }, - { 29, 0x1ffffff9, 7, 0x15 }, { 29, 0x1ffffff9, 7, 0x13 }, - { 29, 0x1ffffff9, 7, 0x11 }, { 29, 0x1ffffff9, 7, 0xf }, - { 29, 0x1ffffff9, 7, 0xd }, { 29, 0x1ffffff9, 7, 0xb }, - { 29, 0x1ffffff9, 7, 0x9 }, { 29, 0x1ffffff9, 7, 0x7 }, - { 29, 0x1ffffff9, 7, 0x5 }, { 29, 0x1ffffff9, 7, 0x3 }, - { 29, 0x1ffffff9, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 10 zeroes - */ - { - { 12, 0xff1, 0, 0 }, { 15, 0x7feb, 0, 0 }, - { 15, 0x7fe9, 0, 0 }, { 19, 0x7ffd7, 0, 0 }, - { 19, 0x7ffd5, 0, 0 }, { 19, 0x7ffd3, 0, 0 }, - { 19, 0x7ffd1, 0, 0 }, { 23, 0x7fffaf, 0, 0 }, - { 23, 0x7fffad, 0, 0 }, { 23, 0x7fffab, 0, 0 }, - { 23, 0x7fffa9, 0, 0 }, { 23, 0x7fffa7, 0, 0 }, - { 23, 0x7fffa5, 0, 0 }, { 23, 0x7fffa3, 0, 0 }, - { 23, 0x7fffa1, 0, 0 }, { 27, 0x7ffff7f, 0, 0 }, - { 27, 0x7ffff7d, 0, 0 }, { 27, 0x7ffff7b, 0, 0 }, - { 27, 0x7ffff79, 0, 0 }, { 27, 0x7ffff77, 0, 0 }, - { 27, 0x7ffff75, 0, 0 }, { 27, 0x7ffff73, 0, 0 }, - { 27, 0x7ffff71, 0, 0 }, { 27, 0x7ffff6f, 0, 0 }, - { 27, 0x7ffff6d, 0, 0 }, { 27, 0x7ffff6b, 0, 0 }, - { 27, 0x7ffff69, 0, 0 }, { 27, 0x7ffff67, 0, 0 }, - { 27, 0x7ffff65, 0, 0 }, { 27, 0x7ffff63, 0, 0 }, - { 27, 0x7ffff61, 0, 0 }, { 32, 0xfffffe3f, 0, 0 }, - { 32, 0xfffffe3d, 0, 0 }, { 32, 0xfffffe3b, 0, 0 }, - { 32, 0xfffffe39, 0, 0 }, { 32, 0xfffffe37, 0, 0 }, - { 32, 0xfffffe35, 0, 0 }, { 32, 0xfffffe33, 0, 0 }, - { 32, 0xfffffe31, 0, 0 }, { 32, 0xfffffe2f, 0, 0 }, - { 32, 0xfffffe2d, 0, 0 }, { 32, 0xfffffe2b, 0, 0 }, - { 32, 0xfffffe29, 0, 0 }, { 32, 0xfffffe27, 0, 0 }, - { 32, 0xfffffe25, 0, 0 }, { 32, 0xfffffe23, 0, 0 }, - { 32, 0xfffffe21, 0, 0 }, { 32, 0xfffffe1f, 0, 0 }, - { 32, 0xfffffe1d, 0, 0 }, { 32, 0xfffffe1b, 0, 0 }, - { 32, 0xfffffe19, 0, 0 }, { 32, 0xfffffe17, 0, 0 }, - { 32, 0xfffffe15, 0, 0 }, { 32, 0xfffffe13, 0, 0 }, - { 32, 0xfffffe11, 0, 0 }, { 32, 0xfffffe0f, 0, 0 }, - { 32, 0xfffffe0d, 0, 0 }, { 32, 0xfffffe0b, 0, 0 }, - { 32, 0xfffffe09, 0, 0 }, { 32, 0xfffffe07, 0, 0 }, - { 32, 0xfffffe05, 0, 0 }, { 32, 0xfffffe03, 0, 0 }, - { 32, 0xfffffe01, 0, 0 }, { 29, 0x1ffffffa, 7, 0x7f }, - { 29, 0x1ffffffa, 7, 0x7d }, { 29, 0x1ffffffa, 7, 0x7b }, - { 29, 0x1ffffffa, 7, 0x79 }, { 29, 0x1ffffffa, 7, 0x77 }, - { 29, 0x1ffffffa, 7, 0x75 }, { 29, 0x1ffffffa, 7, 0x73 }, - { 29, 0x1ffffffa, 7, 0x71 }, { 29, 0x1ffffffa, 7, 0x6f }, - { 29, 0x1ffffffa, 7, 0x6d }, { 29, 0x1ffffffa, 7, 0x6b }, - { 29, 0x1ffffffa, 7, 0x69 }, { 29, 0x1ffffffa, 7, 0x67 }, - { 29, 0x1ffffffa, 7, 0x65 }, { 29, 0x1ffffffa, 7, 0x63 }, - { 29, 0x1ffffffa, 7, 0x61 }, { 29, 0x1ffffffa, 7, 0x5f }, - { 29, 0x1ffffffa, 7, 0x5d }, { 29, 0x1ffffffa, 7, 0x5b }, - { 29, 0x1ffffffa, 7, 0x59 }, { 29, 0x1ffffffa, 7, 0x57 }, - { 29, 0x1ffffffa, 7, 0x55 }, { 29, 0x1ffffffa, 7, 0x53 }, - { 29, 0x1ffffffa, 7, 0x51 }, { 29, 0x1ffffffa, 7, 0x4f }, - { 29, 0x1ffffffa, 7, 0x4d }, { 29, 0x1ffffffa, 7, 0x4b }, - { 29, 0x1ffffffa, 7, 0x49 }, { 29, 0x1ffffffa, 7, 0x47 }, - { 29, 0x1ffffffa, 7, 0x45 }, { 29, 0x1ffffffa, 7, 0x43 }, - { 29, 0x1ffffffa, 7, 0x41 }, { 29, 0x1ffffffa, 7, 0x3f }, - { 29, 0x1ffffffa, 7, 0x3d }, { 29, 0x1ffffffa, 7, 0x3b }, - { 29, 0x1ffffffa, 7, 0x39 }, { 29, 0x1ffffffa, 7, 0x37 }, - { 29, 0x1ffffffa, 7, 0x35 }, { 29, 0x1ffffffa, 7, 0x33 }, - { 29, 0x1ffffffa, 7, 0x31 }, { 29, 0x1ffffffa, 7, 0x2f }, - { 29, 0x1ffffffa, 7, 0x2d }, { 29, 0x1ffffffa, 7, 0x2b }, - { 29, 0x1ffffffa, 7, 0x29 }, { 29, 0x1ffffffa, 7, 0x27 }, - { 29, 0x1ffffffa, 7, 0x25 }, { 29, 0x1ffffffa, 7, 0x23 }, - { 29, 0x1ffffffa, 7, 0x21 }, { 29, 0x1ffffffa, 7, 0x1f }, - { 29, 0x1ffffffa, 7, 0x1d }, { 29, 0x1ffffffa, 7, 0x1b }, - { 29, 0x1ffffffa, 7, 0x19 }, { 29, 0x1ffffffa, 7, 0x17 }, - { 29, 0x1ffffffa, 7, 0x15 }, { 29, 0x1ffffffa, 7, 0x13 }, - { 29, 0x1ffffffa, 7, 0x11 }, { 29, 0x1ffffffa, 7, 0xf }, - { 29, 0x1ffffffa, 7, 0xd }, { 29, 0x1ffffffa, 7, 0xb }, - { 29, 0x1ffffffa, 7, 0x9 }, { 29, 0x1ffffffa, 7, 0x7 }, - { 29, 0x1ffffffa, 7, 0x5 }, { 29, 0x1ffffffa, 7, 0x3 }, - { 29, 0x1ffffffa, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 11 zeroes - */ - { - { 12, 0xff3, 0, 0 }, { 15, 0x7fef, 0, 0 }, - { 15, 0x7fed, 0, 0 }, { 19, 0x7ffdf, 0, 0 }, - { 19, 0x7ffdd, 0, 0 }, { 19, 0x7ffdb, 0, 0 }, - { 19, 0x7ffd9, 0, 0 }, { 23, 0x7fffbf, 0, 0 }, - { 23, 0x7fffbd, 0, 0 }, { 23, 0x7fffbb, 0, 0 }, - { 23, 0x7fffb9, 0, 0 }, { 23, 0x7fffb7, 0, 0 }, - { 23, 0x7fffb5, 0, 0 }, { 23, 0x7fffb3, 0, 0 }, - { 23, 0x7fffb1, 0, 0 }, { 28, 0xfffff1f, 0, 0 }, - { 28, 0xfffff1d, 0, 0 }, { 28, 0xfffff1b, 0, 0 }, - { 28, 0xfffff19, 0, 0 }, { 28, 0xfffff17, 0, 0 }, - { 28, 0xfffff15, 0, 0 }, { 28, 0xfffff13, 0, 0 }, - { 28, 0xfffff11, 0, 0 }, { 28, 0xfffff0f, 0, 0 }, - { 28, 0xfffff0d, 0, 0 }, { 28, 0xfffff0b, 0, 0 }, - { 28, 0xfffff09, 0, 0 }, { 28, 0xfffff07, 0, 0 }, - { 28, 0xfffff05, 0, 0 }, { 28, 0xfffff03, 0, 0 }, - { 28, 0xfffff01, 0, 0 }, { 32, 0xfffffe7f, 0, 0 }, - { 32, 0xfffffe7d, 0, 0 }, { 32, 0xfffffe7b, 0, 0 }, - { 32, 0xfffffe79, 0, 0 }, { 32, 0xfffffe77, 0, 0 }, - { 32, 0xfffffe75, 0, 0 }, { 32, 0xfffffe73, 0, 0 }, - { 32, 0xfffffe71, 0, 0 }, { 32, 0xfffffe6f, 0, 0 }, - { 32, 0xfffffe6d, 0, 0 }, { 32, 0xfffffe6b, 0, 0 }, - { 32, 0xfffffe69, 0, 0 }, { 32, 0xfffffe67, 0, 0 }, - { 32, 0xfffffe65, 0, 0 }, { 32, 0xfffffe63, 0, 0 }, - { 32, 0xfffffe61, 0, 0 }, { 32, 0xfffffe5f, 0, 0 }, - { 32, 0xfffffe5d, 0, 0 }, { 32, 0xfffffe5b, 0, 0 }, - { 32, 0xfffffe59, 0, 0 }, { 32, 0xfffffe57, 0, 0 }, - { 32, 0xfffffe55, 0, 0 }, { 32, 0xfffffe53, 0, 0 }, - { 32, 0xfffffe51, 0, 0 }, { 32, 0xfffffe4f, 0, 0 }, - { 32, 0xfffffe4d, 0, 0 }, { 32, 0xfffffe4b, 0, 0 }, - { 32, 0xfffffe49, 0, 0 }, { 32, 0xfffffe47, 0, 0 }, - { 32, 0xfffffe45, 0, 0 }, { 32, 0xfffffe43, 0, 0 }, - { 32, 0xfffffe41, 0, 0 }, { 29, 0x1ffffffb, 7, 0x7f }, - { 29, 0x1ffffffb, 7, 0x7d }, { 29, 0x1ffffffb, 7, 0x7b }, - { 29, 0x1ffffffb, 7, 0x79 }, { 29, 0x1ffffffb, 7, 0x77 }, - { 29, 0x1ffffffb, 7, 0x75 }, { 29, 0x1ffffffb, 7, 0x73 }, - { 29, 0x1ffffffb, 7, 0x71 }, { 29, 0x1ffffffb, 7, 0x6f }, - { 29, 0x1ffffffb, 7, 0x6d }, { 29, 0x1ffffffb, 7, 0x6b }, - { 29, 0x1ffffffb, 7, 0x69 }, { 29, 0x1ffffffb, 7, 0x67 }, - { 29, 0x1ffffffb, 7, 0x65 }, { 29, 0x1ffffffb, 7, 0x63 }, - { 29, 0x1ffffffb, 7, 0x61 }, { 29, 0x1ffffffb, 7, 0x5f }, - { 29, 0x1ffffffb, 7, 0x5d }, { 29, 0x1ffffffb, 7, 0x5b }, - { 29, 0x1ffffffb, 7, 0x59 }, { 29, 0x1ffffffb, 7, 0x57 }, - { 29, 0x1ffffffb, 7, 0x55 }, { 29, 0x1ffffffb, 7, 0x53 }, - { 29, 0x1ffffffb, 7, 0x51 }, { 29, 0x1ffffffb, 7, 0x4f }, - { 29, 0x1ffffffb, 7, 0x4d }, { 29, 0x1ffffffb, 7, 0x4b }, - { 29, 0x1ffffffb, 7, 0x49 }, { 29, 0x1ffffffb, 7, 0x47 }, - { 29, 0x1ffffffb, 7, 0x45 }, { 29, 0x1ffffffb, 7, 0x43 }, - { 29, 0x1ffffffb, 7, 0x41 }, { 29, 0x1ffffffb, 7, 0x3f }, - { 29, 0x1ffffffb, 7, 0x3d }, { 29, 0x1ffffffb, 7, 0x3b }, - { 29, 0x1ffffffb, 7, 0x39 }, { 29, 0x1ffffffb, 7, 0x37 }, - { 29, 0x1ffffffb, 7, 0x35 }, { 29, 0x1ffffffb, 7, 0x33 }, - { 29, 0x1ffffffb, 7, 0x31 }, { 29, 0x1ffffffb, 7, 0x2f }, - { 29, 0x1ffffffb, 7, 0x2d }, { 29, 0x1ffffffb, 7, 0x2b }, - { 29, 0x1ffffffb, 7, 0x29 }, { 29, 0x1ffffffb, 7, 0x27 }, - { 29, 0x1ffffffb, 7, 0x25 }, { 29, 0x1ffffffb, 7, 0x23 }, - { 29, 0x1ffffffb, 7, 0x21 }, { 29, 0x1ffffffb, 7, 0x1f }, - { 29, 0x1ffffffb, 7, 0x1d }, { 29, 0x1ffffffb, 7, 0x1b }, - { 29, 0x1ffffffb, 7, 0x19 }, { 29, 0x1ffffffb, 7, 0x17 }, - { 29, 0x1ffffffb, 7, 0x15 }, { 29, 0x1ffffffb, 7, 0x13 }, - { 29, 0x1ffffffb, 7, 0x11 }, { 29, 0x1ffffffb, 7, 0xf }, - { 29, 0x1ffffffb, 7, 0xd }, { 29, 0x1ffffffb, 7, 0xb }, - { 29, 0x1ffffffb, 7, 0x9 }, { 29, 0x1ffffffb, 7, 0x7 }, - { 29, 0x1ffffffb, 7, 0x5 }, { 29, 0x1ffffffb, 7, 0x3 }, - { 29, 0x1ffffffb, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 12 zeroes - */ - { - { 12, 0xff5, 0, 0 }, { 16, 0xffe3, 0, 0 }, - { 16, 0xffe1, 0, 0 }, { 20, 0xfffc7, 0, 0 }, - { 20, 0xfffc5, 0, 0 }, { 20, 0xfffc3, 0, 0 }, - { 20, 0xfffc1, 0, 0 }, { 24, 0xffff8f, 0, 0 }, - { 24, 0xffff8d, 0, 0 }, { 24, 0xffff8b, 0, 0 }, - { 24, 0xffff89, 0, 0 }, { 24, 0xffff87, 0, 0 }, - { 24, 0xffff85, 0, 0 }, { 24, 0xffff83, 0, 0 }, - { 24, 0xffff81, 0, 0 }, { 28, 0xfffff3f, 0, 0 }, - { 28, 0xfffff3d, 0, 0 }, { 28, 0xfffff3b, 0, 0 }, - { 28, 0xfffff39, 0, 0 }, { 28, 0xfffff37, 0, 0 }, - { 28, 0xfffff35, 0, 0 }, { 28, 0xfffff33, 0, 0 }, - { 28, 0xfffff31, 0, 0 }, { 28, 0xfffff2f, 0, 0 }, - { 28, 0xfffff2d, 0, 0 }, { 28, 0xfffff2b, 0, 0 }, - { 28, 0xfffff29, 0, 0 }, { 28, 0xfffff27, 0, 0 }, - { 28, 0xfffff25, 0, 0 }, { 28, 0xfffff23, 0, 0 }, - { 28, 0xfffff21, 0, 0 }, { 32, 0xfffffebf, 0, 0 }, - { 32, 0xfffffebd, 0, 0 }, { 32, 0xfffffebb, 0, 0 }, - { 32, 0xfffffeb9, 0, 0 }, { 32, 0xfffffeb7, 0, 0 }, - { 32, 0xfffffeb5, 0, 0 }, { 32, 0xfffffeb3, 0, 0 }, - { 32, 0xfffffeb1, 0, 0 }, { 32, 0xfffffeaf, 0, 0 }, - { 32, 0xfffffead, 0, 0 }, { 32, 0xfffffeab, 0, 0 }, - { 32, 0xfffffea9, 0, 0 }, { 32, 0xfffffea7, 0, 0 }, - { 32, 0xfffffea5, 0, 0 }, { 32, 0xfffffea3, 0, 0 }, - { 32, 0xfffffea1, 0, 0 }, { 32, 0xfffffe9f, 0, 0 }, - { 32, 0xfffffe9d, 0, 0 }, { 32, 0xfffffe9b, 0, 0 }, - { 32, 0xfffffe99, 0, 0 }, { 32, 0xfffffe97, 0, 0 }, - { 32, 0xfffffe95, 0, 0 }, { 32, 0xfffffe93, 0, 0 }, - { 32, 0xfffffe91, 0, 0 }, { 32, 0xfffffe8f, 0, 0 }, - { 32, 0xfffffe8d, 0, 0 }, { 32, 0xfffffe8b, 0, 0 }, - { 32, 0xfffffe89, 0, 0 }, { 32, 0xfffffe87, 0, 0 }, - { 32, 0xfffffe85, 0, 0 }, { 32, 0xfffffe83, 0, 0 }, - { 32, 0xfffffe81, 0, 0 }, { 30, 0x1fff7400, 7, 0x7f }, - { 30, 0x1fff7400, 7, 0x7d }, { 30, 0x1fff7400, 7, 0x7b }, - { 30, 0x1fff7400, 7, 0x79 }, { 30, 0x1fff7400, 7, 0x77 }, - { 30, 0x1fff7400, 7, 0x75 }, { 30, 0x1fff7400, 7, 0x73 }, - { 30, 0x1fff7400, 7, 0x71 }, { 30, 0x1fff7400, 7, 0x6f }, - { 30, 0x1fff7400, 7, 0x6d }, { 30, 0x1fff7400, 7, 0x6b }, - { 30, 0x1fff7400, 7, 0x69 }, { 30, 0x1fff7400, 7, 0x67 }, - { 30, 0x1fff7400, 7, 0x65 }, { 30, 0x1fff7400, 7, 0x63 }, - { 30, 0x1fff7400, 7, 0x61 }, { 30, 0x1fff7400, 7, 0x5f }, - { 30, 0x1fff7400, 7, 0x5d }, { 30, 0x1fff7400, 7, 0x5b }, - { 30, 0x1fff7400, 7, 0x59 }, { 30, 0x1fff7400, 7, 0x57 }, - { 30, 0x1fff7400, 7, 0x55 }, { 30, 0x1fff7400, 7, 0x53 }, - { 30, 0x1fff7400, 7, 0x51 }, { 30, 0x1fff7400, 7, 0x4f }, - { 30, 0x1fff7400, 7, 0x4d }, { 30, 0x1fff7400, 7, 0x4b }, - { 30, 0x1fff7400, 7, 0x49 }, { 30, 0x1fff7400, 7, 0x47 }, - { 30, 0x1fff7400, 7, 0x45 }, { 30, 0x1fff7400, 7, 0x43 }, - { 30, 0x1fff7400, 7, 0x41 }, { 30, 0x1fff7400, 7, 0x3f }, - { 30, 0x1fff7400, 7, 0x3d }, { 30, 0x1fff7400, 7, 0x3b }, - { 30, 0x1fff7400, 7, 0x39 }, { 30, 0x1fff7400, 7, 0x37 }, - { 30, 0x1fff7400, 7, 0x35 }, { 30, 0x1fff7400, 7, 0x33 }, - { 30, 0x1fff7400, 7, 0x31 }, { 30, 0x1fff7400, 7, 0x2f }, - { 30, 0x1fff7400, 7, 0x2d }, { 30, 0x1fff7400, 7, 0x2b }, - { 30, 0x1fff7400, 7, 0x29 }, { 30, 0x1fff7400, 7, 0x27 }, - { 30, 0x1fff7400, 7, 0x25 }, { 30, 0x1fff7400, 7, 0x23 }, - { 30, 0x1fff7400, 7, 0x21 }, { 30, 0x1fff7400, 7, 0x1f }, - { 30, 0x1fff7400, 7, 0x1d }, { 30, 0x1fff7400, 7, 0x1b }, - { 30, 0x1fff7400, 7, 0x19 }, { 30, 0x1fff7400, 7, 0x17 }, - { 30, 0x1fff7400, 7, 0x15 }, { 30, 0x1fff7400, 7, 0x13 }, - { 30, 0x1fff7400, 7, 0x11 }, { 30, 0x1fff7400, 7, 0xf }, - { 30, 0x1fff7400, 7, 0xd }, { 30, 0x1fff7400, 7, 0xb }, - { 30, 0x1fff7400, 7, 0x9 }, { 30, 0x1fff7400, 7, 0x7 }, - { 30, 0x1fff7400, 7, 0x5 }, { 30, 0x1fff7400, 7, 0x3 }, - { 30, 0x1fff7400, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 13 zeroes - */ - { - { 12, 0xff7, 0, 0 }, { 16, 0xffe7, 0, 0 }, - { 16, 0xffe5, 0, 0 }, { 20, 0xfffcf, 0, 0 }, - { 20, 0xfffcd, 0, 0 }, { 20, 0xfffcb, 0, 0 }, - { 20, 0xfffc9, 0, 0 }, { 24, 0xffff9f, 0, 0 }, - { 24, 0xffff9d, 0, 0 }, { 24, 0xffff9b, 0, 0 }, - { 24, 0xffff99, 0, 0 }, { 24, 0xffff97, 0, 0 }, - { 24, 0xffff95, 0, 0 }, { 24, 0xffff93, 0, 0 }, - { 24, 0xffff91, 0, 0 }, { 28, 0xfffff5f, 0, 0 }, - { 28, 0xfffff5d, 0, 0 }, { 28, 0xfffff5b, 0, 0 }, - { 28, 0xfffff59, 0, 0 }, { 28, 0xfffff57, 0, 0 }, - { 28, 0xfffff55, 0, 0 }, { 28, 0xfffff53, 0, 0 }, - { 28, 0xfffff51, 0, 0 }, { 28, 0xfffff4f, 0, 0 }, - { 28, 0xfffff4d, 0, 0 }, { 28, 0xfffff4b, 0, 0 }, - { 28, 0xfffff49, 0, 0 }, { 28, 0xfffff47, 0, 0 }, - { 28, 0xfffff45, 0, 0 }, { 28, 0xfffff43, 0, 0 }, - { 28, 0xfffff41, 0, 0 }, { 32, 0xfffffeff, 0, 0 }, - { 32, 0xfffffefd, 0, 0 }, { 32, 0xfffffefb, 0, 0 }, - { 32, 0xfffffef9, 0, 0 }, { 32, 0xfffffef7, 0, 0 }, - { 32, 0xfffffef5, 0, 0 }, { 32, 0xfffffef3, 0, 0 }, - { 32, 0xfffffef1, 0, 0 }, { 32, 0xfffffeef, 0, 0 }, - { 32, 0xfffffeed, 0, 0 }, { 32, 0xfffffeeb, 0, 0 }, - { 32, 0xfffffee9, 0, 0 }, { 32, 0xfffffee7, 0, 0 }, - { 32, 0xfffffee5, 0, 0 }, { 32, 0xfffffee3, 0, 0 }, - { 32, 0xfffffee1, 0, 0 }, { 32, 0xfffffedf, 0, 0 }, - { 32, 0xfffffedd, 0, 0 }, { 32, 0xfffffedb, 0, 0 }, - { 32, 0xfffffed9, 0, 0 }, { 32, 0xfffffed7, 0, 0 }, - { 32, 0xfffffed5, 0, 0 }, { 32, 0xfffffed3, 0, 0 }, - { 32, 0xfffffed1, 0, 0 }, { 32, 0xfffffecf, 0, 0 }, - { 32, 0xfffffecd, 0, 0 }, { 32, 0xfffffecb, 0, 0 }, - { 32, 0xfffffec9, 0, 0 }, { 32, 0xfffffec7, 0, 0 }, - { 32, 0xfffffec5, 0, 0 }, { 32, 0xfffffec3, 0, 0 }, - { 32, 0xfffffec1, 0, 0 }, { 30, 0x3ffffff9, 7, 0x7f }, - { 30, 0x3ffffff9, 7, 0x7d }, { 30, 0x3ffffff9, 7, 0x7b }, - { 30, 0x3ffffff9, 7, 0x79 }, { 30, 0x3ffffff9, 7, 0x77 }, - { 30, 0x3ffffff9, 7, 0x75 }, { 30, 0x3ffffff9, 7, 0x73 }, - { 30, 0x3ffffff9, 7, 0x71 }, { 30, 0x3ffffff9, 7, 0x6f }, - { 30, 0x3ffffff9, 7, 0x6d }, { 30, 0x3ffffff9, 7, 0x6b }, - { 30, 0x3ffffff9, 7, 0x69 }, { 30, 0x3ffffff9, 7, 0x67 }, - { 30, 0x3ffffff9, 7, 0x65 }, { 30, 0x3ffffff9, 7, 0x63 }, - { 30, 0x3ffffff9, 7, 0x61 }, { 30, 0x3ffffff9, 7, 0x5f }, - { 30, 0x3ffffff9, 7, 0x5d }, { 30, 0x3ffffff9, 7, 0x5b }, - { 30, 0x3ffffff9, 7, 0x59 }, { 30, 0x3ffffff9, 7, 0x57 }, - { 30, 0x3ffffff9, 7, 0x55 }, { 30, 0x3ffffff9, 7, 0x53 }, - { 30, 0x3ffffff9, 7, 0x51 }, { 30, 0x3ffffff9, 7, 0x4f }, - { 30, 0x3ffffff9, 7, 0x4d }, { 30, 0x3ffffff9, 7, 0x4b }, - { 30, 0x3ffffff9, 7, 0x49 }, { 30, 0x3ffffff9, 7, 0x47 }, - { 30, 0x3ffffff9, 7, 0x45 }, { 30, 0x3ffffff9, 7, 0x43 }, - { 30, 0x3ffffff9, 7, 0x41 }, { 30, 0x3ffffff9, 7, 0x3f }, - { 30, 0x3ffffff9, 7, 0x3d }, { 30, 0x3ffffff9, 7, 0x3b }, - { 30, 0x3ffffff9, 7, 0x39 }, { 30, 0x3ffffff9, 7, 0x37 }, - { 30, 0x3ffffff9, 7, 0x35 }, { 30, 0x3ffffff9, 7, 0x33 }, - { 30, 0x3ffffff9, 7, 0x31 }, { 30, 0x3ffffff9, 7, 0x2f }, - { 30, 0x3ffffff9, 7, 0x2d }, { 30, 0x3ffffff9, 7, 0x2b }, - { 30, 0x3ffffff9, 7, 0x29 }, { 30, 0x3ffffff9, 7, 0x27 }, - { 30, 0x3ffffff9, 7, 0x25 }, { 30, 0x3ffffff9, 7, 0x23 }, - { 30, 0x3ffffff9, 7, 0x21 }, { 30, 0x3ffffff9, 7, 0x1f }, - { 30, 0x3ffffff9, 7, 0x1d }, { 30, 0x3ffffff9, 7, 0x1b }, - { 30, 0x3ffffff9, 7, 0x19 }, { 30, 0x3ffffff9, 7, 0x17 }, - { 30, 0x3ffffff9, 7, 0x15 }, { 30, 0x3ffffff9, 7, 0x13 }, - { 30, 0x3ffffff9, 7, 0x11 }, { 30, 0x3ffffff9, 7, 0xf }, - { 30, 0x3ffffff9, 7, 0xd }, { 30, 0x3ffffff9, 7, 0xb }, - { 30, 0x3ffffff9, 7, 0x9 }, { 30, 0x3ffffff9, 7, 0x7 }, - { 30, 0x3ffffff9, 7, 0x5 }, { 30, 0x3ffffff9, 7, 0x3 }, - { 30, 0x3ffffff9, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 14 zeroes - */ - { - { 13, 0x1ff1, 0, 0 }, { 16, 0xffeb, 0, 0 }, - { 16, 0xffe9, 0, 0 }, { 20, 0xfffd7, 0, 0 }, - { 20, 0xfffd5, 0, 0 }, { 20, 0xfffd3, 0, 0 }, - { 20, 0xfffd1, 0, 0 }, { 24, 0xffffaf, 0, 0 }, - { 24, 0xffffad, 0, 0 }, { 24, 0xffffab, 0, 0 }, - { 24, 0xffffa9, 0, 0 }, { 24, 0xffffa7, 0, 0 }, - { 24, 0xffffa5, 0, 0 }, { 24, 0xffffa3, 0, 0 }, - { 24, 0xffffa1, 0, 0 }, { 28, 0xfffff7f, 0, 0 }, - { 28, 0xfffff7d, 0, 0 }, { 28, 0xfffff7b, 0, 0 }, - { 28, 0xfffff79, 0, 0 }, { 28, 0xfffff77, 0, 0 }, - { 28, 0xfffff75, 0, 0 }, { 28, 0xfffff73, 0, 0 }, - { 28, 0xfffff71, 0, 0 }, { 28, 0xfffff6f, 0, 0 }, - { 28, 0xfffff6d, 0, 0 }, { 28, 0xfffff6b, 0, 0 }, - { 28, 0xfffff69, 0, 0 }, { 28, 0xfffff67, 0, 0 }, - { 28, 0xfffff65, 0, 0 }, { 28, 0xfffff63, 0, 0 }, - { 28, 0xfffff61, 0, 0 }, { 27, 0x7fffff8, 6, 0x3f }, - { 27, 0x7fffff8, 6, 0x3d }, { 27, 0x7fffff8, 6, 0x3b }, - { 27, 0x7fffff8, 6, 0x39 }, { 27, 0x7fffff8, 6, 0x37 }, - { 27, 0x7fffff8, 6, 0x35 }, { 27, 0x7fffff8, 6, 0x33 }, - { 27, 0x7fffff8, 6, 0x31 }, { 27, 0x7fffff8, 6, 0x2f }, - { 27, 0x7fffff8, 6, 0x2d }, { 27, 0x7fffff8, 6, 0x2b }, - { 27, 0x7fffff8, 6, 0x29 }, { 27, 0x7fffff8, 6, 0x27 }, - { 27, 0x7fffff8, 6, 0x25 }, { 27, 0x7fffff8, 6, 0x23 }, - { 27, 0x7fffff8, 6, 0x21 }, { 27, 0x7fffff8, 6, 0x1f }, - { 27, 0x7fffff8, 6, 0x1d }, { 27, 0x7fffff8, 6, 0x1b }, - { 27, 0x7fffff8, 6, 0x19 }, { 27, 0x7fffff8, 6, 0x17 }, - { 27, 0x7fffff8, 6, 0x15 }, { 27, 0x7fffff8, 6, 0x13 }, - { 27, 0x7fffff8, 6, 0x11 }, { 27, 0x7fffff8, 6, 0xf }, - { 27, 0x7fffff8, 6, 0xd }, { 27, 0x7fffff8, 6, 0xb }, - { 27, 0x7fffff8, 6, 0x9 }, { 27, 0x7fffff8, 6, 0x7 }, - { 27, 0x7fffff8, 6, 0x5 }, { 27, 0x7fffff8, 6, 0x3 }, - { 27, 0x7fffff8, 6, 0x1 }, { 30, 0x3ffffffa, 7, 0x7f }, - { 30, 0x3ffffffa, 7, 0x7d }, { 30, 0x3ffffffa, 7, 0x7b }, - { 30, 0x3ffffffa, 7, 0x79 }, { 30, 0x3ffffffa, 7, 0x77 }, - { 30, 0x3ffffffa, 7, 0x75 }, { 30, 0x3ffffffa, 7, 0x73 }, - { 30, 0x3ffffffa, 7, 0x71 }, { 30, 0x3ffffffa, 7, 0x6f }, - { 30, 0x3ffffffa, 7, 0x6d }, { 30, 0x3ffffffa, 7, 0x6b }, - { 30, 0x3ffffffa, 7, 0x69 }, { 30, 0x3ffffffa, 7, 0x67 }, - { 30, 0x3ffffffa, 7, 0x65 }, { 30, 0x3ffffffa, 7, 0x63 }, - { 30, 0x3ffffffa, 7, 0x61 }, { 30, 0x3ffffffa, 7, 0x5f }, - { 30, 0x3ffffffa, 7, 0x5d }, { 30, 0x3ffffffa, 7, 0x5b }, - { 30, 0x3ffffffa, 7, 0x59 }, { 30, 0x3ffffffa, 7, 0x57 }, - { 30, 0x3ffffffa, 7, 0x55 }, { 30, 0x3ffffffa, 7, 0x53 }, - { 30, 0x3ffffffa, 7, 0x51 }, { 30, 0x3ffffffa, 7, 0x4f }, - { 30, 0x3ffffffa, 7, 0x4d }, { 30, 0x3ffffffa, 7, 0x4b }, - { 30, 0x3ffffffa, 7, 0x49 }, { 30, 0x3ffffffa, 7, 0x47 }, - { 30, 0x3ffffffa, 7, 0x45 }, { 30, 0x3ffffffa, 7, 0x43 }, - { 30, 0x3ffffffa, 7, 0x41 }, { 30, 0x3ffffffa, 7, 0x3f }, - { 30, 0x3ffffffa, 7, 0x3d }, { 30, 0x3ffffffa, 7, 0x3b }, - { 30, 0x3ffffffa, 7, 0x39 }, { 30, 0x3ffffffa, 7, 0x37 }, - { 30, 0x3ffffffa, 7, 0x35 }, { 30, 0x3ffffffa, 7, 0x33 }, - { 30, 0x3ffffffa, 7, 0x31 }, { 30, 0x3ffffffa, 7, 0x2f }, - { 30, 0x3ffffffa, 7, 0x2d }, { 30, 0x3ffffffa, 7, 0x2b }, - { 30, 0x3ffffffa, 7, 0x29 }, { 30, 0x3ffffffa, 7, 0x27 }, - { 30, 0x3ffffffa, 7, 0x25 }, { 30, 0x3ffffffa, 7, 0x23 }, - { 30, 0x3ffffffa, 7, 0x21 }, { 30, 0x3ffffffa, 7, 0x1f }, - { 30, 0x3ffffffa, 7, 0x1d }, { 30, 0x3ffffffa, 7, 0x1b }, - { 30, 0x3ffffffa, 7, 0x19 }, { 30, 0x3ffffffa, 7, 0x17 }, - { 30, 0x3ffffffa, 7, 0x15 }, { 30, 0x3ffffffa, 7, 0x13 }, - { 30, 0x3ffffffa, 7, 0x11 }, { 30, 0x3ffffffa, 7, 0xf }, - { 30, 0x3ffffffa, 7, 0xd }, { 30, 0x3ffffffa, 7, 0xb }, - { 30, 0x3ffffffa, 7, 0x9 }, { 30, 0x3ffffffa, 7, 0x7 }, - { 30, 0x3ffffffa, 7, 0x5 }, { 30, 0x3ffffffa, 7, 0x3 }, - { 30, 0x3ffffffa, 7, 0x1 }, { 0, 0, 0, 0 } - }, - - /* - * prefixed with 15 zeroes - */ - { - { 13, 0x1ff3, 0, 0 }, { 2, 0x3, 0, 0 }, - { 2, 0x1, 0, 0 }, { 3, 0x7, 0, 0 }, - { 3, 0x5, 0, 0 }, { 3, 0x3, 0, 0 }, - { 3, 0x1, 0, 0 }, { 31, 0x7ffffffb, 4, 0xf }, - { 31, 0x7ffffffb, 4, 0xd }, { 31, 0x7ffffffb, 4, 0xb }, - { 31, 0x7ffffffb, 4, 0x9 }, { 31, 0x7ffffffb, 4, 0x7 }, - { 31, 0x7ffffffb, 4, 0x5 }, { 31, 0x7ffffffb, 4, 0x3 }, - { 31, 0x7ffffffb, 4, 0x1 }, { 5, 0x1f, 0, 0 }, - { 5, 0x1d, 0, 0 }, { 5, 0x1b, 0, 0 }, - { 5, 0x19, 0, 0 }, { 5, 0x17, 0, 0 }, - { 5, 0x15, 0, 0 }, { 5, 0x13, 0, 0 }, - { 5, 0x11, 0, 0 }, { 5, 0xf, 0, 0 }, - { 5, 0xd, 0, 0 }, { 5, 0xb, 0, 0 }, - { 5, 0x9, 0, 0 }, { 5, 0x7, 0, 0 }, - { 5, 0x5, 0, 0 }, { 5, 0x3, 0, 0 }, - { 5, 0x1, 0, 0 }, { 6, 0x3f, 0, 0 }, - { 6, 0x3d, 0, 0 }, { 6, 0x3b, 0, 0 }, - { 6, 0x39, 0, 0 }, { 6, 0x37, 0, 0 }, - { 6, 0x35, 0, 0 }, { 6, 0x33, 0, 0 }, - { 6, 0x31, 0, 0 }, { 6, 0x2f, 0, 0 }, - { 6, 0x2d, 0, 0 }, { 6, 0x2b, 0, 0 }, - { 6, 0x29, 0, 0 }, { 6, 0x27, 0, 0 }, - { 6, 0x25, 0, 0 }, { 6, 0x23, 0, 0 }, - { 6, 0x21, 0, 0 }, { 6, 0x1f, 0, 0 }, - { 6, 0x1d, 0, 0 }, { 6, 0x1b, 0, 0 }, - { 6, 0x19, 0, 0 }, { 6, 0x17, 0, 0 }, - { 6, 0x15, 0, 0 }, { 6, 0x13, 0, 0 }, - { 6, 0x11, 0, 0 }, { 6, 0xf, 0, 0 }, - { 6, 0xd, 0, 0 }, { 6, 0xb, 0, 0 }, - { 6, 0x9, 0, 0 }, { 6, 0x7, 0, 0 }, - { 6, 0x5, 0, 0 }, { 6, 0x3, 0, 0 }, - { 6, 0x1, 0, 0 }, { 7, 0x7f, 0, 0 }, - { 7, 0x7d, 0, 0 }, { 7, 0x7b, 0, 0 }, - { 7, 0x79, 0, 0 }, { 7, 0x77, 0, 0 }, - { 7, 0x75, 0, 0 }, { 7, 0x73, 0, 0 }, - { 7, 0x71, 0, 0 }, { 7, 0x6f, 0, 0 }, - { 7, 0x6d, 0, 0 }, { 7, 0x6b, 0, 0 }, - { 7, 0x69, 0, 0 }, { 7, 0x67, 0, 0 }, - { 7, 0x65, 0, 0 }, { 7, 0x63, 0, 0 }, - { 7, 0x61, 0, 0 }, { 7, 0x5f, 0, 0 }, - { 7, 0x5d, 0, 0 }, { 7, 0x5b, 0, 0 }, - { 7, 0x59, 0, 0 }, { 7, 0x57, 0, 0 }, - { 7, 0x55, 0, 0 }, { 7, 0x53, 0, 0 }, - { 7, 0x51, 0, 0 }, { 7, 0x4f, 0, 0 }, - { 7, 0x4d, 0, 0 }, { 7, 0x4b, 0, 0 }, - { 7, 0x49, 0, 0 }, { 7, 0x47, 0, 0 }, - { 7, 0x45, 0, 0 }, { 7, 0x43, 0, 0 }, - { 7, 0x41, 0, 0 }, { 7, 0x3f, 0, 0 }, - { 7, 0x3d, 0, 0 }, { 7, 0x3b, 0, 0 }, - { 7, 0x39, 0, 0 }, { 7, 0x37, 0, 0 }, - { 7, 0x35, 0, 0 }, { 7, 0x33, 0, 0 }, - { 7, 0x31, 0, 0 }, { 7, 0x2f, 0, 0 }, - { 7, 0x2d, 0, 0 }, { 7, 0x2b, 0, 0 }, - { 7, 0x29, 0, 0 }, { 7, 0x27, 0, 0 }, - { 7, 0x25, 0, 0 }, { 7, 0x23, 0, 0 }, - { 7, 0x21, 0, 0 }, { 7, 0x1f, 0, 0 }, - { 7, 0x1d, 0, 0 }, { 7, 0x1b, 0, 0 }, - { 7, 0x19, 0, 0 }, { 7, 0x17, 0, 0 }, - { 7, 0x15, 0, 0 }, { 7, 0x13, 0, 0 }, - { 7, 0x11, 0, 0 }, { 7, 0xf, 0, 0 }, - { 7, 0xd, 0, 0 }, { 7, 0xb, 0, 0 }, - { 7, 0x9, 0, 0 }, { 7, 0x7, 0, 0 }, - { 7, 0x5, 0, 0 }, { 7, 0x3, 0, 0 }, - { 7, 0x1, 0, 0 }, { 0, 0, 0, 0 } - } -}; - -VlcMagic _magic_values[] = { - { 0x0, 0, 1 }, - { 0x1, 0, 2 }, - { 0x4, 0, 3 }, - { 0xB, 1, 1 }, - { 0xC, 0, 4 }, - { 0x1A, 0, 5 }, - { 0x1B, 2, 1 }, - { 0x38, 3, 1 }, - { 0x39, 1, 2 }, - { 0x3A, 1, 3 }, - { 0x3B, 0, 6 }, - { 0x78, 4, 1 }, - { 0x79, 5, 1 }, - { 0x7A, 6, 1 }, - { 0x7B, 2, 2 }, - { 0xF8, 1, 4 }, - { 0xF9, 7, 1 }, - { 0xFA, 8, 1 }, - { 0xFB, 3, 2 }, - { 0x1F8, 4, 2 }, - { 0x1F9, 5, 2 }, - { 0x1FA, 2, 3 }, - { 0x1FB, 2, 4 }, - { 0x3F8, 1, 5 }, - { 0x3F9, 1, 6 }, - { 0x3FA, 0, 7 }, - { 0x3FB, 9, 1 }, - { 0x7F8, 10, 1 }, - { 0x7F9, 11, 1 }, - { 0x7FA, 12, 1 }, - { 0x7FB, 13, 1 }, - { 0xFF8, 14, 1 }, - { 0xFF9, 15, 1 }, - { 0xFFA, 6, 2 }, - { 0xFFB, 7, 2 }, - { 0x1FF8, 8, 2 }, - { 0x1FF9, 9, 2 }, - { 0x1FFA, 10, 2 }, - { 0x1FFB, 11, 2 }, - { 0x3FF8, 12, 2 }, - { 0x3FF9, 13, 2 }, - { 0x3FFA, 14, 2 }, - { 0x3FFB, 3, 3 }, - { 0x7FF8, 4, 3 }, - { 0x7FF9, 5, 3 }, - { 0x7FFA, 6, 3 }, - { 0x7FFB, 7, 3 }, - { 0xFFF8, 8, 3 }, - { 0xFFF9, 9, 3 }, - { 0xFFFA, 10, 3 }, - { 0xFFFB, 11, 3 }, - { 0x1FFF8, 12, 3 }, - { 0x1FFF9, 13, 3 }, - { 0x1FFFA, 14, 3 }, - { 0x1FFFB, 3, 4 }, - { 0x3FFF8, 4, 4 }, - { 0x3FFF9, 5, 4 }, - { 0x3FFFA, 6, 4 }, - { 0x3FFFB, 7, 4 }, - { 0x7FFF8, 8, 4 }, - { 0x7FFF9, 9, 4 }, - { 0x7FFFA, 10, 4 }, - { 0x7FFFB, 11, 4 }, - { 0xFFFF8, 12, 4 }, - { 0xFFFF9, 13, 4 }, - { 0xFFFFA, 14, 4 }, - { 0xFFFFB, 2, 5 }, - { 0x1FFFF8, 3, 5 }, - { 0x1FFFF9, 4, 5 }, - { 0x1FFFFA, 5, 5 }, - { 0x1FFFFB, 6, 5 }, - { 0x3FFFF8, 7, 5 }, - { 0x3FFFF9, 8, 5 }, - { 0x3FFFFA, 9, 5 }, - { 0x3FFFFB, 10, 5 }, - { 0x7FFFF8, 11, 5 }, - { 0x7FFFF9, 12, 5 }, - { 0x7FFFFA, 13, 5 }, - { 0x7FFFFB, 14, 5 }, - { 0xFFFFF8, 2, 6 }, - { 0xFFFFF9, 3, 6 }, - { 0xFFFFFA, 4, 6 }, - { 0xFFFFFB, 5, 6 }, - { 0x1FFFFF8, 6, 6 }, - { 0x1FFFFF9, 7, 6 }, - { 0x1FFFFFA, 8, 6 }, - { 0x1FFFFFB, 9, 6 }, - { 0x3FFFFF8, 10, 6 }, - { 0x3FFFFF9, 11, 6 }, - { 0x3FFFFFA, 12, 6 }, - { 0x3FFFFFB, 13, 6 }, - { 0x7FFFFF8, 14, 6 }, - { 0x7FFFFF9, 1, 7 }, - { 0x7FFFFFA, 2, 7 }, - { 0x7FFFFFB, 3, 7 }, - { 0xFFFFFF8, 4, 7 }, - { 0xFFFFFF9, 5, 7 }, - { 0xFFFFFFA, 6, 7 }, - { 0xFFFFFFB, 7, 7 }, - { 0x1FFFFFF8, 8, 7 }, - { 0x1FFFFFF9, 9, 7 }, - { 0x1FFFFFFA, 10, 7 }, - { 0x1FFFFFFB, 11, 7 }, - { 0x3FFFFFF8, 12, 7 }, - { 0x3FFFFFF9, 13, 7 }, - { 0x3FFFFFFA, 14, 7 } -}; - -/* - * _find_magic - * - * Internal helper-function used to locate a given - * VlcMagic entry. - */ -VlcMagic *_find_magic(guint magic) -{ - gint low = 0; - gint high = sizeof(_magic_values) / sizeof(VlcMagic) - 1; - gint mid; - - while (low <= high) { - mid = (low + high) / 2; - - if (_magic_values[mid].magic < magic) - low = mid + 1; - else if (_magic_values[mid].magic > magic) - high = mid - 1; - else - return &_magic_values[mid]; - } - - return NULL; -} - -/* - * _initialize_vlcdec_lookup - * - * Internal helper-function used to initialize - * the lookup-table used by the VLC-decoder. - */ -void _initialize_vlcdec_lookup(gint8 *lookup_tbl) -{ - gint8 util_buf[3072]; - gint v1_start, v1_end, v1_dec, util_buf_offset; - gint util_buf_offset_inc, buf1_val, samples_offset; - gint v1, v2; - gint8 *p, *p1, *p2, *p3; - - util_buf[0] = 0; - util_buf[1] = 0; - util_buf[2] = 0; - util_buf[3] = 1; - util_buf[4] = 1; - util_buf[5] = 1; - util_buf[765] = 1; - util_buf[766] = 0; - util_buf[767] = 1; - lookup_tbl[255] = 255; - lookup_tbl[256] = 1; - - v1_start = -3; - v1_dec = 4; - - util_buf_offset = 11; - util_buf_offset_inc = 12; - buf1_val = 2; - - samples_offset = 509; - - do { - v1 = v1_start; - v1_end = -(abs(v1_start) + 1) / 2; - v2 = 0; - - p2 = util_buf + util_buf_offset - 3; - - do { - p1 = util_buf + ((v1 & 0xff) * 3); - p1[0] = buf1_val; - p1[1] = v2; - p1[2] = buf1_val; - - p2[1] = buf1_val; - p2[2] = v2 + 1; - p2[3] = buf1_val; - - p3 = lookup_tbl + samples_offset + v2 + 1; - p3[0] = v1 & 0xff; - p3[1] = -(v1 & 0xff); - - v1++; - v2 += 2; - p2 -= 3; - } while (v1 <= v1_end); - - v1_start -= v1_dec; - v1_dec *= 2; - - util_buf_offset += util_buf_offset_inc; - util_buf_offset_inc *= 2; - buf1_val++; - - samples_offset += 255; - } while (buf1_val <= 7); - - p = lookup_tbl + 1785 + util_buf[388]; - p[0] = 129; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/vlc_decode.c b/kopete/protocols/msn/webcam/libmimic/vlc_decode.c deleted file mode 100644 index fed26743..00000000 --- a/kopete/protocols/msn/webcam/libmimic/vlc_decode.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2005 Ole Andr� Vadla Ravn�s <[email protected]> - * - * 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 <string.h> -#include "mimic-private.h" - -extern guchar _col_zag[64]; - -/* - * _vlc_decode_block - * - * De-serialize (reconstruct) a variable length coded 8x8 block. - */ -gboolean _vlc_decode_block(MimCtx *ctx, gint *block, gint num_coeffs) -{ - guint pos; - - memset(block, 0, 64 * sizeof(gint)); - - /* The DC-value is read in as is. */ - block[0] = _read_bits(ctx, 8); - - for (pos = 1; pos < num_coeffs; pos++) { - - guint prev_data_index, prev_cur_chunk_len, prev_chunk; - guint value, num_bits; - gboolean prev_read_odd, found_magic; - - /* Save context. */ - prev_data_index = ctx->data_index; - prev_cur_chunk_len = ctx->cur_chunk_len; - prev_chunk = ctx->cur_chunk; - prev_read_odd = ctx->read_odd; - - /* Grab 16 bits. */ - value = _read_bits(ctx, 16) << 16; - - /* Restore context. */ - ctx->data_index = prev_data_index; - ctx->cur_chunk_len = prev_cur_chunk_len; - ctx->cur_chunk = prev_chunk; - ctx->read_odd = prev_read_odd; - - /* Analyze and determine number of bits to read initially. */ - num_bits = 3; - if ((value >> 30) == 0 || (value >> 30) == 1) { - num_bits = 2; - } else if ((value & 0xE0000000) != 0x80000000) { - guint nibble = value >> 28; - - if (nibble == 11 || nibble == 12) { - num_bits = 4; - } else if (nibble == 10) { - _read_bits(ctx, 4); - - return TRUE; - } else { - if (((value << 2) & 0x8000000) == 0) - num_bits = 2; - - num_bits += 2; - } - } - - /* Read that number of bits. */ - value = _read_bits(ctx, num_bits); - - /* - * Look up the current value against the magic ones, - * and continue extending it bit by bit from the input - * stream until the magic value is found or we have - * read 32 bits (in which case we give up). - */ - found_magic = FALSE; - while (!found_magic) { - VlcMagic *magic; - - if (num_bits > 32) - return FALSE; - - magic = _find_magic(value); - - if (magic != NULL) { - pos += magic->pos_add; - num_bits = magic->num_bits; - - found_magic = TRUE; - } else { - value <<= 1; - value |= _read_bits(ctx, 1); - - num_bits++; - } - } - - /* Read the number of bits given by magic value entry. */ - value = _read_bits(ctx, num_bits); - - /* Gotcha! :-) */ - block[_col_zag[pos]] = ctx->vlcdec_lookup[(num_bits * 255) + value]; - } - - return TRUE; -} - diff --git a/kopete/protocols/msn/webcam/libmimic/vlc_encode.c b/kopete/protocols/msn/webcam/libmimic/vlc_encode.c deleted file mode 100644 index 6aeebe1c..00000000 --- a/kopete/protocols/msn/webcam/libmimic/vlc_encode.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 2005 Ole André Vadla Ravnås <[email protected]> - * - * 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 <stdlib.h> -#include "mimic-private.h" - -extern guchar _col_zag[64]; -extern VlcSymbol _vlc_alphabet[16][128]; - -/* - * _vlc_encode_block - * - * Serialize an 8x8 block using variable length coding. - */ -void _vlc_encode_block(MimCtx *ctx, const gint *block, gint num_coeffs) -{ - gint i, num_zeroes; - - /* The DC value is written out as is. */ - _write_bits(ctx, block[0], 8); - - /* Number of zeroes prefixing the next non-zero value. */ - num_zeroes = 0; - - for (i = 1; i < num_coeffs && num_zeroes <= 14; i++) { - - /* Fetch AC coefficients from block in zig-zag order. */ - gint value = block[_col_zag[i]]; - - if (value != 0) { - VlcSymbol sym; - - /* Clip input values to [-128, +128]. */ - if (value < -128) - value = -128; - else if (value > 128) - value = 128; - - /* Look up symbol for the current non-zero value. */ - sym = _vlc_alphabet[num_zeroes][abs(value) - 1]; - - /* No symbol? very rare... */ - if (sym.length1 <= 0) - break; - - /* The symbols for negative values are the same as for positives, minus one. */ - if (value < 0) { - if (sym.length2 > 0) - sym.part2 -= 1; - else - sym.part1 -= 1; - } - - /* Write out the full symbol. */ - _write_bits(ctx, sym.part1, sym.length1); - if (sym.length2 > 0) - _write_bits(ctx, sym.part2, sym.length2); - - /* Start counting zeroes again. */ - num_zeroes = 0; - } else { - num_zeroes++; - } - } - - /* Write out EOB if necessary. */ - if (num_zeroes > 0) - _write_bits(ctx, 0xA, 4); -} - diff --git a/kopete/protocols/msn/webcam/mimicwrapper.cpp b/kopete/protocols/msn/webcam/mimicwrapper.cpp deleted file mode 100644 index 75eb52cf..00000000 --- a/kopete/protocols/msn/webcam/mimicwrapper.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - Copyright (c) 2005 by Olivier Goffart <ogoffart@ kde.org> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - - -#include "mimicwrapper.h" - -#include "libmimic/mimic.h" - -//#include <tqbytearray.h> -#include <kdebug.h> -#include <tqimage.h> - -MimicWrapper::MimicWrapper() : m_init(false) -{ - m_mimctx=mimic_open(); -} - -MimicWrapper::~MimicWrapper() -{ - mimic_close(m_mimctx); -} - - -TQPixmap MimicWrapper::decode(const TQByteArray& data) -{ - if(!m_init) - { - if(!mimic_decoder_init(m_mimctx, (guchar*)(data.data()))) - { - kdWarning(14140) << k_funcinfo << "Impossible to init decoder" << endl; - return TQPixmap(); - } - if (!mimic_get_property( m_mimctx, "buffer_size", &m_bufferSize) ) - { - kdWarning(14140) << k_funcinfo << "Impossible to get buffer size" << endl; - return TQPixmap(); - } - m_init=true; - } - - TQByteArray buff(m_bufferSize); - if(!mimic_decode_frame(m_mimctx, (guchar*)(data.data()) , (guchar*)(buff.data()) ) ) - { - kdWarning(14140) << k_funcinfo << "Impossible to decode frame" << endl; - return TQPixmap(); - } - int width,height; - mimic_get_property(m_mimctx, "width", &width); - mimic_get_property(m_mimctx, "height", &height); - - - TQByteArray buff2(m_bufferSize*4/3); - uint b2=0; - for(uint f=0;f<m_bufferSize;f+=3) - { - buff2[b2+0]=buff[f+2]; - buff2[b2+1]=buff[f+1]; - buff2[b2+2]=buff[f+0]; - buff2[b2+3]=0x00; - b2+=4; - } - - TQImage img( (uchar*)(buff2.data()) , width , height , 32 , 0L , 0, TQImage::BigEndian ); - return TQPixmap(img); -} - -TQByteArray MimicWrapper::encode(const TQByteArray& data) -{ - if(!m_init) - { - if(!mimic_encoder_init(m_mimctx, MIMIC_RES_HIGH)) - { - kdWarning(14140) << k_funcinfo << "Impossible to init encoder" << endl; - return TQByteArray(); - } - if (!mimic_get_property( m_mimctx, "buffer_size", &m_bufferSize) ) - { - kdWarning(14140) << k_funcinfo << "Impossible to get buffer size" << endl; - return TQByteArray(); - } - m_init=true; - m_numFrames=0; - } - - TQByteArray buff(m_bufferSize); - int buff_new_size; - if(!mimic_encode_frame(m_mimctx, (guchar*)(data.data()) , (guchar*)(buff.data()) , (gint*)(&buff_new_size) , m_numFrames%15==0 ) ) - { - kdWarning(14140) << k_funcinfo << "Impossible to decode frame" << endl; - return TQByteArray(); - } - buff.resize(buff_new_size); - ++m_numFrames; - return buff; -} diff --git a/kopete/protocols/msn/webcam/mimicwrapper.h b/kopete/protocols/msn/webcam/mimicwrapper.h deleted file mode 100644 index 1ed048a2..00000000 --- a/kopete/protocols/msn/webcam/mimicwrapper.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright (c) 2005 by Olivier Goffart <ogoffart@ kde.org> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef MIMICWRAPPER_H -#define MIMICWREPPER_H - -#include <tqpixmap.h> - -#include "kopete_export.h" - -typedef struct _MimCtx MimCtx; - -class KOPETE_EXPORT MimicWrapper -{ - public: - MimicWrapper(); - ~MimicWrapper(); - - TQPixmap decode(const TQByteArray &data); - TQByteArray encode(const TQByteArray &data); - - private: - MimCtx *m_mimctx; - bool m_init; - uint m_bufferSize; - uint m_numFrames; -}; - -#endif - diff --git a/kopete/protocols/msn/webcam/msnwebcamdialog.cpp b/kopete/protocols/msn/webcam/msnwebcamdialog.cpp deleted file mode 100644 index f10d6abe..00000000 --- a/kopete/protocols/msn/webcam/msnwebcamdialog.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - Kopete MSN Protocol - Copyright (c) 2005 by Olivier Goffart <ogoffart @kde.org> - - Note: this is just YahooWebcamDialog with s/Yahoo/MSN/g - - Copyright (c) 2005 by Matt Rogers <[email protected]> - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "msnwebcamdialog.h" - -#include <tqframe.h> -#include <tqobject.h> -#include <tqwidget.h> -#include <kdebug.h> -#include <tdelocale.h> - - - -MSNWebcamDialog::MSNWebcamDialog( const TQString& contact, TQWidget * parent, const char * name ) - : KDialogBase( KDialogBase::Plain, i18n( "Webcam for %1" ).arg( contact ), - KDialogBase::Close, KDialogBase::Close, parent, name, false, true /*seperator*/ ), - m_imageContainer( this ) -{ - setInitialSize( TQSize(320,290), true ); - - setEscapeButton( KDialogBase::Close ); - /* - TQObject::connect( contact, TQT_SIGNAL( signalReceivedWebcamImage( const TQPixmap& ) ), - this, TQT_SLOT( newImage( const TQPixmap& ) ) ); - */ - TQObject::connect( this, TQT_SIGNAL( closeClicked() ), this, TQT_SIGNAL( closingWebcamDialog() ) ); - /* - TQObject::connect( contact, TQT_SIGNAL( webcamClosed( int ) ), this, TQT_SLOT( webcamClosed( int ) ) ); - */ - TQFrame* page = plainPage(); - if ( page ) - { - kdDebug(14180) << k_funcinfo << "Adding webcam image container" << endl; - //m_imageContainer.setText( i18n( "No webcam image received" ) ); - //m_imageContainer.setAlignment( TQt::AlignCenter ); - m_imageContainer.setMinimumSize(320,240); - } - show(); -} - -MSNWebcamDialog::~ MSNWebcamDialog( ) -{ - -} - -void MSNWebcamDialog::newImage( const TQPixmap & image ) -{ - kdDebug(14180) << k_funcinfo << "New image received" << endl; - // kdDebug(14180) << image << endl; - //m_imageContainer.clear(); - m_imageContainer.updatePixmap( image ); - //show(); -} - -void MSNWebcamDialog::webcamClosed( int reason ) -{ - kdDebug(14180) << k_funcinfo << "webcam closed with reason?? " << reason <<endl; - //m_imageContainer.clear(); - //m_imageContainer.setText( i18n( "Webcam closed with reason %1" ).arg( TQString::number( reason ) ) ); - //m_imageContainer.setAlignment( TQt::AlignCenter ); - //show(); -} - -// kate: indent-mode csands; tab-width 4; - -#include "msnwebcamdialog.moc" diff --git a/kopete/protocols/msn/webcam/msnwebcamdialog.h b/kopete/protocols/msn/webcam/msnwebcamdialog.h deleted file mode 100644 index a740e8ab..00000000 --- a/kopete/protocols/msn/webcam/msnwebcamdialog.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - Kopete MSN Protocol - - Copyright (c) 2005 by Olivier Goffart <ogoffart @kde.org> - - Note: this is just YahooWebcamDialog with s/Yahoo/MSN/g - - Copyright (c) 2005 by Matt Rogers <[email protected]> - Kopete (c) 2002-2005 by the Kopete developers <[email protected]> - - ************************************************************************* - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef YAHOOWEBCAMDIALOG_H_ -#define YAHOOWEBCAMDIALOG_H_ - -//#include <tqlabel.h> -#include <webcamwidget.h> -#include <kdialogbase.h> - -#include "kopete_export.h" - - -class TQPixmap; -class TQWidget; -class MSNContact; - -class KOPETE_EXPORT MSNWebcamDialog : public KDialogBase -{ -Q_OBJECT - -public: - MSNWebcamDialog( const TQString& contact, TQWidget* parent = 0, const char* name = 0 ); - ~MSNWebcamDialog(); - -public slots: - void newImage( const TQPixmap& image ); - void webcamClosed( int ); - -signals: - void closingWebcamDialog(); - -private: - Kopete::WebcamWidget m_imageContainer; - -}; - -#endif -//kate: indent-mode csands; auto-insert-doxygen on; |