Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Right-click on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(18) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(47) |
Feb
(49) |
Mar
(3) |
Apr
(32) |
May
(79) |
Jun
(91) |
Jul
(116) |
Aug
(143) |
Sep
(53) |
Oct
(68) |
Nov
(8) |
Dec
(82) |
2007 |
Jan
(28) |
Feb
(46) |
Mar
(18) |
Apr
(85) |
May
(77) |
Jun
(44) |
Jul
(66) |
Aug
(79) |
Sep
(9) |
Oct
(95) |
Nov
(68) |
Dec
(57) |
2008 |
Jan
(263) |
Feb
(161) |
Mar
(139) |
Apr
(174) |
May
(180) |
Jun
(181) |
Jul
(159) |
Aug
(124) |
Sep
(95) |
Oct
(48) |
Nov
(126) |
Dec
(71) |
2009 |
Jan
(81) |
Feb
(110) |
Mar
(287) |
Apr
(224) |
May
(137) |
Jun
(72) |
Jul
(295) |
Aug
(173) |
Sep
(111) |
Oct
(82) |
Nov
(128) |
Dec
(53) |
2010 |
Jan
(108) |
Feb
(60) |
Mar
(41) |
Apr
(11) |
May
(22) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
|
|
|
1
|
2
(5) |
3
(1) |
4
|
5
|
6
(1) |
7
|
8
(5) |
9
(1) |
10
(2) |
11
|
12
(4) |
13
|
14
|
15
(1) |
16
(2) |
17
(12) |
18
(6) |
19
(14) |
20
(4) |
21
(3) |
22
(5) |
23
(6) |
24
(10) |
25
(8) |
26
(3) |
27
(3) |
28
(3) |
29
(3) |
30
|
31
(6) |
|
|
|
|
|
|
From: <gedghill@us...> - 2010-01-31 23:40:45
|
Revision: 5876 http://kmess.svn.sourceforge.net/kmess/?rev=5876&view=rev Author: gedghill Date: 2010-01-31 23:40:34 +0000 (Sun, 31 Jan 2010) Log Message: ----------- Fixed compile error for msntransport lib Modified Paths: -------------- trunk/kmess/CMakeLists.txt trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h Modified: trunk/kmess/CMakeLists.txt =================================================================== --- trunk/kmess/CMakeLists.txt 2010-01-31 22:50:40 UTC (rev 5875) +++ trunk/kmess/CMakeLists.txt 2010-01-31 23:40:34 UTC (rev 5876) @@ -104,6 +104,14 @@ ENDIF( WANT_ISF ) MACRO_BOOL_TO_01( ISFQT_FOUND HAVE_LIBISFQT ) # For config-kmess.h.in +OPTION( WANT_MSNTRANSPORT "Enable support for Live Messenger's p2p signaling" ON ) +IF( WANT_MSNTRANSPORT ) + MACRO_OPTIONAL_FIND_PACKAGE( msntransport QUIET ) + MACRO_LOG_FEATURE( MSNTRANSPORT_FOUND "msntransport" "Library to provide Live messenger signaling protocol" "http://www.kmess.org"; FALSE "" + " Required for Live messenger's peer to peer signaling. + In the absence of an installed msntransport version, the bundled version will be compiled" ) +ENDIF( WANT_MSNTRANSPORT ) + # Check for KNotificationItem. KDE 4.3.1 and later have it integrated in kdelibs/experimental. # It will be available by default in 4.4. message( STATUS ${KDE_VERSION} ) @@ -156,6 +164,18 @@ SET( ISFQT_FOUND TRUE ) ENDIF( NOT ISFQT_FOUND ) + +# If the MSNTRANSPORT library is not installed on the system. +# use the bundled version. +IF( NOT MSNTRANSPORT_FOUND ) + SET( MSNTRANSPORT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/contrib/msntransport/include ) + SET( MSNTRANSPORT_LIBRARIES msntransport ) + + SET( USE_BUNDLED_LIBRARIES ${USE_BUNDLED_LIBRARIES} MSNTRANSPORT ) + SET( HAVE_MSNTRANSPORT 1 ) + SET( MSNTRANSPORT_FOUND TRUE ) +ENDIF( NOT MSNTRANSPORT_FOUND ) + ADD_DEFINITIONS( ${QT_DEFINITIONS} ${KDE4_DEFINITIONS} ) INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBXML2_INCLUDE_DIR}) @@ -275,6 +295,9 @@ ADD_SUBDIRECTORY( contrib/isf-qt ) ENDIF() +IF( USE_BUNDLED_LIBRARIES MATCHES "MSNTRANSPORT" ) + ADD_SUBDIRECTORY( contrib/msntransport ) +ENDIF() # Also add the tests if compiling in development mode IF( CMAKE_BUILD_TYPE STREQUAL debugfull AND KMESS_DEBUG_OUTPUT EQUAL 1 ) Modified: trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h =================================================================== --- trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h 2010-01-31 22:50:40 UTC (rev 5875) +++ trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h 2010-01-31 23:40:34 UTC (rev 5876) @@ -43,7 +43,7 @@ * * @author Gregg Edghill */ -class RtcSignalingEndpoint : public QObject, protected SignalingSessionClient//, public SignalingSessionManager +class RtcSignalingEndpoint : public QObject, public SignalingSessionClient//, public SignalingSessionManager { Q_OBJECT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <codingdomain@us...> - 2010-01-31 22:50:55
|
Revision: 5875 http://kmess.svn.sourceforge.net/kmess/?rev=5875&view=rev Author: codingdomain Date: 2010-01-31 22:50:40 +0000 (Sun, 31 Jan 2010) Log Message: ----------- svn-to-git: added gedghill, changed paths to svn2git, enabled rsync by default Modified Paths: -------------- trunk/svn-to-git/authors.txt trunk/svn-to-git/svn-to-git.sh Modified: trunk/svn-to-git/authors.txt =================================================================== --- trunk/svn-to-git/authors.txt 2010-01-31 21:22:41 UTC (rev 5874) +++ trunk/svn-to-git/authors.txt 2010-01-31 22:50:40 UTC (rev 5875) @@ -6,6 +6,7 @@ fontknocker Adam Goossens <fontknocker@...> rubenv Ruben Vandamme <ruben@...> dazjorz Sjors Gielen <dazjorz@...> +gedghill Gregg Edghill <gedghill@...> pano9000 Panagiotis Papadopoulos <pano@...> mdcurtis Michael Curtis <mdcurtis@...> mjarrett Michael Jarrett <msjarret@...> Modified: trunk/svn-to-git/svn-to-git.sh =================================================================== --- trunk/svn-to-git/svn-to-git.sh 2010-01-31 21:22:41 UTC (rev 5874) +++ trunk/svn-to-git/svn-to-git.sh 2010-01-31 22:50:40 UTC (rev 5875) @@ -1,15 +1,15 @@ #!/bin/sh -SVNREPOS=kmess-svndb -GITDIR=kmess-git +set -e +cd `dirname $0` + +SVNREPOS=`pwd`/kmess-svndb AUTHORS=authors.txt RULES=svn-to-git.rules -cd `dirname $0` +echo "syncing repository.." +rsync -av "rsync://kmess.svn.sourceforge.net/svn/kmess/"; $SVNREPOS -#echo "syncing repository.." -#rsync -av "rsync://kmess.svn.sourceforge.net/svn/kmess/"; $SVNREPOS - # Create dirs dirs=`grep '^create repository' svn-to-git.rules | sed -e 's/create repository\s\+//'` for dir in $dirs @@ -28,7 +28,7 @@ # pass $@, so you can also pass: # --resume-from # --max-rev -./svn-all-fast-export --identity-map=$AUTHORS "$@" svn-to-git.rules $SVNREPOS 2>&1 | tee svnimport.log +./svn2git/svn-all-fast-export --identity-map="$AUTHORS" "$@" --rules="svn-to-git.rules" "$SVNREPOS" 2>&1 | tee svnimport.log for dir in $dirs do This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-31 21:22:48
|
Revision: 5874 http://kmess.svn.sourceforge.net/kmess/?rev=5874&view=rev Author: it_amroth Date: 2010-01-31 21:22:41 +0000 (Sun, 31 Jan 2010) Log Message: ----------- Added a new class, ClientCapabilities, to manage client caps. Rewritten pertinent code for both the contacts and the library own caps. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/msncontact.h trunk/kmess/lib/include/KMess/networkglobals.h trunk/kmess/lib/include/KMess/utils.h trunk/kmess/lib/src/CMakeLists.txt trunk/kmess/lib/src/connections/msnnotificationconnection.cpp trunk/kmess/lib/src/msnchat.cpp trunk/kmess/lib/src/msncontact.cpp trunk/kmess/lib/src/utils/utils.cpp trunk/kmess/lib/src/utils/utils_internal.cpp trunk/kmess/lib/src/utils/utils_internal.h Added Paths: ----------- trunk/kmess/lib/include/KMess/ClientCapabilities trunk/kmess/lib/include/KMess/clientcapabilities.h trunk/kmess/lib/src/clientcapabilities.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/ChangeLog 2010-01-31 21:22:41 UTC (rev 5874) @@ -1,3 +1,13 @@ +2010-01-31 Valerio Pilo <valerio@...> + + * ClientCapabilities: Added. It allows to parse, store and get info about a client's + capabilities flags. + * MsnNotificationConnection, MsnContact, MsnChat: Updated to use the new + ClientCapabilities class. + * Utils, UtilsInternal: Removed old client caps parsing code. + * Utils: added new getters for client name, version, caps, and a client caps setter. + * NetworkGlobals: Removed old client caps flags. + 2010-01-29 Valerio Pilo <valerio@...> * MsnSession: Fixed a signal, reorganized the settings code a bit, and fixed option to Added: trunk/kmess/lib/include/KMess/ClientCapabilities =================================================================== --- trunk/kmess/lib/include/KMess/ClientCapabilities (rev 0) +++ trunk/kmess/lib/include/KMess/ClientCapabilities 2010-01-31 21:22:41 UTC (rev 5874) @@ -0,0 +1 @@ +#include "clientcapabilities.h" Added: trunk/kmess/lib/include/KMess/clientcapabilities.h =================================================================== --- trunk/kmess/lib/include/KMess/clientcapabilities.h (rev 0) +++ trunk/kmess/lib/include/KMess/clientcapabilities.h 2010-01-31 21:22:41 UTC (rev 5874) @@ -0,0 +1,148 @@ +/*************************************************************************** + clientcapabilities.h - Client capabilities detection + ------------------- + begin : Sat Jan 30 2010 + copyright : (C) 2010 by Valerio Pilo + email : valerio@... + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 CLIENTCAPS_H +#define CLIENTCAPS_H + +#include <QString> + + +namespace KMess +{ + + + +/** + * @brief Parsing and retrieval of MSNP clients capabilities. + * + * Client capabilities are flags determining which actions or features are + * supported by a certain MSNP client. + * + * + * @author Valerio Pilo <valerio@...> + * @author Gregg Edghill <edghill@...> + */ +class ClientCapabilities +{ + + public: + /** + * Client capabilities flags. + * + * These flags describe the possible features supported by a client. + * Some, however, describe a particular state the client currently has or not, for + * example <code>CF_ONLINE_VIA_MOBILE</code>. + */ + enum CapabilitiesFlags + { + CF_NONE = 0x000000000L + , CF_ONLINE_VIA_MOBILE = 0x000000001L + , CF_ONLINE_VIA_MSN_EXPLORER = 0x000000002L + , CF_SUPPORTS_GIF_INK = 0x000000004L + , CF_SUPPORTS_ISF_INK = 0x000000008L + , CF_WEBCAM_DETECTED = 0x000000010L + , CF_SUPPORTS_MESSAGE_CHUNKING = 0x000000020L + , CF_IS_MOBILE_ENABLED = 0x000000040L + , CF_IS_MSN_DIRECT_DEVICE_ENABLED = 0x000000080L + , CF_MOBILE_MESSAGING_DISABLED = 0x000000100L + , CF_ONLINE_VIA_WEBIM = 0x000000200L + , CF_MOBILE_DEVICE = 0x000000400L + , CF_ONLINE_VIA_FEDERATED_GATEWAY = 0x000000800L + , CF_HAS_MSN_SPACE = 0x000001000L + , CF_IS_MEDIA_CENTER_EDITION_USER = 0x000002000L + , CF_SUPPORTS_DIRECTIM = 0x000004000L + , CF_SUPPORTS_WINKS = 0x000008000L + , CF_SUPPORTS_SHARED_SEARCH = 0x000010000L + , CF_IS_BOT = 0x000020000L + , CF_SUPPORTS_VOICEIM = 0x000040000L + , CF_P2P_SUPPORTS_SECURECHANNEL = 0x000080000L + , CF_SUPPORTS_SIP_INVITE = 0x000100000L + , CF_SUPPORTS_MULTIPARTY_MEDIA = 0x000200000L + , CF_SUPPORTS_SHARED_DRIVE = 0x000400000L + , CF_SUPPORTS_PAGE_MODE_MESSAGING = 0x000800000L + , CF_HAS_ONECARE = 0x001000000L + , CF_P2P_SUPPORTS_TURN = 0x002000000L + , CF_P2P_SUPPORTS_BOOTSTRAPPING_VIA_UUN = 0x004000000L + , CF_USING_ALIAS = 0x008000000L + , CF_VERSION_6_0 = 0x010000000L + , CF_VERSION_6_1 = 0x020000000L + , CF_VERSION_6_2 = 0x030000000L + , CF_VERSION_7_0 = 0x040000000L + , CF_VERSION_7_5 = 0x050000000L + , CF_VERSION_8_0 = 0x060000000L + , CF_VERSION_8_1 = 0x070000000L + , CF_VERSION_8_5 = 0x080000000L + , CF_VERSION_9_0 = 0x090000000L + , CF_VERSION_14_0 = 0x0A0000000L + , CF_SUPPORTS_RTC_VIDEO = 0x100000000L ///< The client supports RTC Video + , CF_SUPPORTS_P2P_VERSION_2 = 0x200000000L ///< Client supports P2P v2 + }; + + /** + * Container for the client version number. + */ + struct Version + { + int major; + int minor; + + /** + * Constructor for a client version number. + * @param vMajor Major version number + * @param vMinor Minor version number + */ + Version( int vMajor = 0, int vMminor = 0 ) + { + major = vMajor; + minor = vMminor; + } + }; + + + public: + + ClientCapabilities(); + ClientCapabilities( const QString caps ); + CapabilitiesFlags caps() const; + bool setCaps( const QString newCapsString ); + bool setCaps( const CapabilitiesFlags newCaps ); + QString toString() const; + Version getClientVersion() const; + bool isOnlineViaTheWeb() const; + bool isOnlineViaMobileDevice() const; + bool supportsMessageChunking() const; + bool supportsP2p() const; + + + protected: + + static CapabilitiesFlags parseCaps( const QString caps ); + + + private: + + quint64 capabilities_; + QString capsString_; + + +}; + +}; // namespace KMess + + + +#endif Modified: trunk/kmess/lib/include/KMess/msncontact.h =================================================================== --- trunk/kmess/lib/include/KMess/msncontact.h 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/include/KMess/msncontact.h 2010-01-31 21:22:41 UTC (rev 5874) @@ -18,6 +18,7 @@ #ifndef MSNCONTACT_H #define MSNCONTACT_H +#include <KMess/ClientCapabilities> #include <KMess/MsnObject> #include <KMess/NetworkGlobals> @@ -27,9 +28,11 @@ namespace KMess { - +// Forward declarations class MPOPEndpoint; + + /** * @brief The library's representation of an MSN Contact. * @@ -45,7 +48,7 @@ class MsnContact : public QObject { Q_OBJECT - + // Make friends with the classes which need to change the contact details friend class ListsManager; friend class MsnNotificationConnection; @@ -53,13 +56,13 @@ public: // Public methods - quint32 capabilities() const; + const ClientCapabilities capabilities() const; QHash<QUuid,MPOPEndpoint*> endpoints() const; const QString& email() const; const QString& friendlyName() const; const QStringList& groups() const; const QString& guid() const; - bool hasCapability( MsnClientCapabilities capability ) const; + bool hasCapability( ClientCapabilities::CapabilitiesFlags capability ) const; const QString& id() const; NetworkType network() const; const QString& media( QString& = *((QString*)0) ) const; @@ -68,6 +71,7 @@ const QString& personalStatus() const; MsnStatus status() const; bool supportsInkType( InkFormat ) const; + bool supportsP2P() const; public: // Public inline methods @@ -146,12 +150,12 @@ private: // Private constructors/destructors MsnContact( const QString&, const QString&, int, const QStringList&, const QString& ); - + protected: // Protected methods - void setCapabilities( quint32 ); - void setEndpoints( QList<MPOPEndpoint *> endpoints ); + void setCapabilities( ClientCapabilities ); + void setEndpoints( QList<MPOPEndpoint *> ); void setFriendlyName( const QString& ); void setGroupIds( const QStringList& ); void setGuid( const QString& ); @@ -165,7 +169,7 @@ private: /// The capabilities of this contact - quint32 capabilities_; + ClientCapabilities capabilities_; /// The known MPOP endpoints for this contact (provided by their UBX info) QHash<QUuid, MPOPEndpoint*> endpoints_; /// Email address of the contact Modified: trunk/kmess/lib/include/KMess/networkglobals.h =================================================================== --- trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-31 21:22:41 UTC (rev 5874) @@ -79,68 +79,6 @@ /** - * @brief The values for the bitwise client capabilities flag returned by getCapabilities(). - * - * This flag is used to advertise the features supported by a client. - */ -enum MsnClientCapability -{ - MSN_CAP_WIN_MOBILE = 0x00000001 ///< The client is a Windows Mobile device, display an phone icon overlay in buddy list. -, MSN_CAP_MSN8_USER = 0x00000002 ///< MSN 8 user?? -, MSN_CAP_INK_GIF = 0x00000004 ///< The client supports handwritten messages in GIF format. -, MSN_CAP_INK_ISF = 0x00000008 ///< The client supports handwritten messages in ISF format. -, MSN_CAP_VIDEO_CHAT = 0x00000010 ///< The client supports video chats; the webcam is connected and shared. -, MSN_CAP_MULTI_PACKET = 0x00000020 ///< The client supports multi-packet MIME messages. -, MSN_CAP_MSN_MOBILE = 0x00000040 ///< The contact has a MSN Mobile device you can page them on (MSN6 displays a yellow icon if they're offline. This is equivalent to the <code>BPR MOB Y</code> setting). -, MSN_CAP_MSN_DIRECT = 0x00000080 ///< The user has a MSN Direct device you can direct-page them on (equivalent to <code>BPR WWE</code> setting). -, MSN_CAP_WEB_CLIENT = 0x00000200 ///< The client is http://webmessenger.msn.com/. -, MSN_CAP_MSO_CLIENT = 0x00000800 ///< The client is Office Live client, or internal Microsoft client. -, MSN_CAP_LIVE_SPACE = 0x00001000 ///< The user has an Windows Live space. -, MSN_CAP_MCE_CLIENT = 0x00002000 ///< The client is a Windows Media Center client. -, MSN_CAP_DIRECT_IM = 0x00004000 ///< The client supports direct-im (chats without a switchboard connection) -, MSN_CAP_WINKS = 0x00008000 ///< The client supports Winks. -, MSN_CAP_SHARED_SEARCH = 0x00010000 ///< The client supports MSN shared search. -, MSN_CAP_BOT = 0x00020000 ///< This is set by the server if the account has been provisioned by MSN as being a Bot account (and thus have its limitations removed). -, MSN_CAP_VOICE_CLIPS = 0x00040000 ///< The client supports Voice Clips. -, MSN_CAP_SCHANNEL = 0x00080000 ///< The client supports SChannel to send secure messages. -, MSN_CAP_SIP_INVITE = 0x00100000 ///< The client supports unknown SIP-based communications. -, MSN_CAP_UNKN_2009 = 0x00200000 ///< seen since WLM 2009, meaning unknown. -, MSN_CAP_FOLDER_SHARING = 0x00400000 ///< The client supports folder sharing (sdrive) -, MSN_CAP_ONECARE = 0x01000000 ///< The client supports OneCare. -, MSN_CAP_P2P_TURN = 0x02000000 ///< The client supports TURN as P2P transport layer. -, MSN_CAP_P2P_UUN = 0x04000000 ///< The client supports bootstrapping P2P via UUN. -, MSN_CAP_MSN60 = 0x10000000 ///< The client supports the P2P protocol features of MSNC1 (introduced with MSN 6.0). -, MSN_CAP_MSN61 = 0x20000000 ///< The client supports the P2P protocol features of MSNC2 (introduced with MSN 6.1). -, MSN_CAP_MSN62 = 0x30000000 ///< The client supports the P2P protocol features of MSNC3 (introduced with MSN 6.2). -, MSN_CAP_MSN70 = 0x40000000 ///< The client supports the P2P protocol features of MSNC4 (introduced with MSN 7.0). -, MSN_CAP_MSN75 = 0x50000000 ///< The client supports the P2P protocol features of MSNC5 (introduced with MSN 7.5). -, MSN_CAP_MSN80 = 0x60000000 ///< The client supports the P2P protocol features of MSNC6 (introduced with WLM 8.0). -, MSN_CAP_MSN81 = 0x70000000 ///< The client supports the P2P protocol features of MSNC7 (introduced with WLM 8.1). -, MSN_CAP_MSN85 = 0x80000000 ///< The client supports the P2P protocol features of MSNC8 (introduced with WLM 8.5). -, MSN_CAP_MSN90beta = 0x90000000 ///< The client supports the P2P protocol features of MSNC9 (introduced with WLM 9.0 beta). -, MSN_CAP_MSN2009 = 0xa0000000 ///< The client supports the P2P protocol features of MSNC10 (introduced with WLM 2009). -}; - -Q_DECLARE_FLAGS( MsnClientCapabilities, MsnClientCapability) -Q_DECLARE_OPERATORS_FOR_FLAGS( MsnClientCapabilities ) - - -/** - * @brief The values for the bitwise extended client capabilities flag. - * - * This flag (currently unused within KMess) is used to advertise the extra features supported by a client. - * It was probably needed for a bit shortage in the other flag. - * This flag is sent with the presence commands in MsnNotificationConnection. - */ -enum MsnClientExtendedCapabilities -{ - MSN_EXTCAP_RTC_VIDEO = 0x10 ///< The client supports RTC Video -, MSN_EXTCAP_P2P_V2 = 0x20 ///< Client supports P2P v2 -}; - - - -/** * @brief Membership lists */ enum MsnMembership Modified: trunk/kmess/lib/include/KMess/utils.h =================================================================== --- trunk/kmess/lib/include/KMess/utils.h 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/include/KMess/utils.h 2010-01-31 21:22:41 UTC (rev 5874) @@ -21,6 +21,7 @@ #include <QtGlobal> +#include <KMess/ClientCapabilities> #include <KMess/NetworkGlobals> class QString; @@ -28,6 +29,7 @@ namespace KMess { + class Utils { public: // Static public method @@ -37,8 +39,11 @@ static QString generateGUID(); // Generate an random number to use as ID static quint32 generateID(); - // Return the library capabilities - static quint64 getCapabilities(); + // Return the client capabilities + static const ClientCapabilities getClientCapabilities(); + static ChatLoggingMode getClientLogging(); + static const QString getClientName(); + static const QString getClientVersion(); // Converts a string with HTML to one with escaped entities static QString &htmlEscape( QString &string ); // Converts a string constant with HTML to one with escaped entities @@ -49,13 +54,12 @@ static QString htmlUnescape( const QString &string ); // Extract the nonce from a QByteArray static QString extractNonce( const QByteArray &buffer, const int offset = 32 ); - // Set the capabilities that of the application (Ink, Winks, Video chat). - static void setApplicationCapabilities( MsnClientCapabilities caps ); // These three methods inform the library of the client name/version, logging mode // and capabilities. Passed to other clients. static void setClientName( const QString &name, const QString &version ); static void setClientLogging( ChatLoggingMode loggingMode ); - static void setClientCapabilities( MsnClientCapabilities capabilities ); + static void setClientCapabilities( ClientCapabilities::CapabilitiesFlags capabilities ); + }; } Modified: trunk/kmess/lib/src/CMakeLists.txt =================================================================== --- trunk/kmess/lib/src/CMakeLists.txt 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/CMakeLists.txt 2010-01-31 21:22:41 UTC (rev 5874) @@ -54,6 +54,7 @@ utils/xmlfunctions.cpp chatfactory.cpp + clientcapabilities.cpp contactlistmodel.cpp contactlistmodelitem.cpp listsmanager.cpp @@ -68,10 +69,12 @@ SET( LIBKMESS_MSN_PUBLIC_HEADERS ../include/KMess/ActionMessage ../include/KMess/actionmessage.h + ../include/KMess/ClientCapabilities + ../include/KMess/clientcapabilities.h ../include/KMess/ClientCapsMessage ../include/KMess/clientcapsmessage.h - ../include/KMess/ContactListModelItem - ../include/KMess/contactlistmodelitem.h + ../include/KMess/ContactListModelItem + ../include/KMess/contactlistmodelitem.h ../include/KMess/DataMessage ../include/KMess/datamessage.h ../include/KMess/EmailMessage Added: trunk/kmess/lib/src/clientcapabilities.cpp =================================================================== --- trunk/kmess/lib/src/clientcapabilities.cpp (rev 0) +++ trunk/kmess/lib/src/clientcapabilities.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -0,0 +1,258 @@ +/*************************************************************************** + clientcapabilities.cpp - Client capabilities detection + ------------------- + begin : Sat Jan 30 2010 + copyright : (C) 2010 by Valerio Pilo + email : vapclerio@... + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 <KMess/ClientCapabilities> + +#include <QStringList> + + +using namespace KMess; + +// Used to extract only the MSN client version number +#define CAPS_VERSION_MASK 0xF0000000 + + + +/** + * Empty constructor. + */ +ClientCapabilities::ClientCapabilities() +: capabilities_( 0 ) +{ +} + + + +/** + * Constructor. + * + * @param caps A capabilities string + */ +ClientCapabilities::ClientCapabilities( const QString caps ) +: capsString_( caps ) +{ + capabilities_ = parseCaps( caps ); +} + + + +/** + * Return the capabilities flags. + * + * @return flags + */ +ClientCapabilities::CapabilitiesFlags ClientCapabilities::caps() const +{ + return (CapabilitiesFlags) capabilities_; +} + + + +/** + * Change the caps with new ones. + * Returns whether the specified caps are different from the current. + * + * @param newCapsString A capabilities string + * @return True if the given caps are different + */ +bool ClientCapabilities::setCaps( const QString newCapsString ) +{ + quint64 newCaps = parseCaps( newCapsString ); + + capsString_ = newCapsString; + capabilities_ = newCaps; + + return ( newCaps != capabilities_ ); +} + + + +/** + * Change the caps with new ones. + * Returns whether the specified caps are different from the current. + * + * @param newCaps A capabilities flags list + * @return True if the given caps are different + */ +bool ClientCapabilities::setCaps( const ClientCapabilities::CapabilitiesFlags newCaps ) +{ + capabilities_ = newCaps; + + // First empty it or it won't be recreated + capsString_ = QString(); + capsString_ = toString(); + + return ( (quint64)newCaps != capabilities_ ); +} + + + +/** + * Parse a client capabilities string into flags + * + * The caps are expressed with enums. Probably the MSN protocol development + * team also had the caps into an enum, because they seem to have had no more + * available values for new caps and resorted to another enum: the other enum's + * values are appended to the old one after a colon: "caps:extcaps" or "12345678:123". + * We just use a 64-bit value to store the caps internally. + * + * @param caps A capabilities string + * @return Client caps flags + */ +ClientCapabilities::CapabilitiesFlags ClientCapabilities::parseCaps( const QString string ) +{ + // Check the string beforehand + if( string.length() < 3 ) + { + return CF_NONE; + } + + QStringList pair( string.split( ':', QString::KeepEmptyParts ) ); + + Q_ASSERT( pair.size() > 0 ); + + // Parse the standard capabilities first + + bool ok; + quint64 caps = pair[0].toLong( &ok ); + if( ! ok ) + { + return CF_NONE; + } + + // Parse the new extended caps + if( pair.size() > 1 ) + { + quint64 extCaps = pair[1].toLong( &ok ); + + // If the ext caps are not valid, just skip them + if( ok ) + { + // Shift left the extended caps to have them fill up the most significant 32 bits + caps += ( extCaps << 32 ); + } + } + + return (CapabilitiesFlags) caps; +} + + + +/** + * Return the capabilities as a string. + * + * The protocol requires the caps to be expressed as two 32-bit integers separated by a colon: + * CF_VERSION_8_5 and CF_SUPPORTS_P2P_VERSION_2 is <code>2147483648:2</code> + * + * @return string + */ +QString ClientCapabilities::toString() const +{ + if( ! capsString_.isEmpty() ) + { + return capsString_; + } + + // Extract the extended caps (the most significant 32 bits) and the + // standard caps ( the least significant 32 bits) + quint32 standardCapabilities = ( capabilities_ & 0xFFFFFFFF ); + quint32 extendedCapabilities = ( capabilities_ >> 32 ); + + // Create and return the string + return QString::number( standardCapabilities, 10 ) + + ":" + + QString::number( extendedCapabilities, 10 ); +} + + + +/** + * Gets the messenger client version. + * + * return version number structure. + */ +ClientCapabilities::Version ClientCapabilities::getClientVersion() const +{ + Version version; + + switch( capabilities_ & CAPS_VERSION_MASK ) + { + case CF_VERSION_6_0: version = Version( 6, 0 ); break; + case CF_VERSION_6_1: version = Version( 6, 1 ); break; + case CF_VERSION_6_2: version = Version( 6, 2 ); break; + case CF_VERSION_7_0: version = Version( 7, 0 ); break; + case CF_VERSION_7_5: version = Version( 7, 5 ); break; + case CF_VERSION_8_0: version = Version( 8, 0 ); break; + case CF_VERSION_8_1: version = Version( 8, 1 ); break; + case CF_VERSION_8_5: version = Version( 8, 5 ); break; + case CF_VERSION_9_0: version = Version( 9, 0 ); break; + case CF_VERSION_14_0: version = Version( 14, 0 ); break; + default: version = Version( 0, 0 ); break; + } + + return version; +} + + + +/** + * Gets a value indicating whether the user is online via the web. + * + * @return bool + */ +bool ClientCapabilities::isOnlineViaTheWeb() const +{ + return ( capabilities_ & CF_ONLINE_VIA_WEBIM ) != 0; +} + + + +/** + * Gets a value indicating whether the user is online via a mobile device. + * + * @return bool + */ +bool ClientCapabilities::isOnlineViaMobileDevice() const +{ + return ( capabilities_ & CF_ONLINE_VIA_MOBILE ) != 0; +} + + + +/** + * Gets a value indicating whether the client supports sending large messages. + * + * @return bool + */ +bool ClientCapabilities::supportsMessageChunking() const +{ + return ( capabilities_ & CF_SUPPORTS_MESSAGE_CHUNKING ) != 0; +} + + + +/** + * Gets a value indicating whether the client's capabilities include P2P support. + * + * @return bool + */ +bool ClientCapabilities::supportsP2p() const +{ + return ( capabilities_ & CAPS_VERSION_MASK ) != 0; +} + + Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -481,7 +481,7 @@ QStringList parameters; parameters << InternalUtils::statusToCode( newStatus ); - parameters << InternalUtils::getCapabilitiesString(); + parameters << Utils::getClientCapabilities().toString(); const QString &objString( QUrl::toPercentEncoding( session_->getMsnObjectString() ) ); @@ -865,20 +865,19 @@ { KMESS_NULL( session_ ); - QString handle; - KMess::NetworkType networkId; - KMess::MsnClientCapabilities capabilities = (KMess::MsnClientCapabilities) 0; - KMess::MsnClientExtendedCapabilities extendedCapabilities = (KMess::MsnClientExtendedCapabilities) 0; + QString handle; + KMess::NetworkType networkId; + QString clientCaps( command[2] ); InternalUtils::getHandle( command[1], handle, networkId ); - InternalUtils::getCaps ( command[2], capabilities, extendedCapabilities ); -#warning networkId, capabilities, extendedCapabilities ignored for now +#warning networkId ignored for now debug() << handle << "went offline."; MsnContact *contact = session_->getContact( handle ); contact->setStatus( OfflineStatus ); + contact->setCapabilities( clientCaps ); // signal that the contact went offline listsManager_->model()->contactUpdate( contact, false ); @@ -892,30 +891,28 @@ { KMESS_NULL( session_ ); - QString handle; - KMess::NetworkType networkId; - KMess::MsnClientCapabilities capabilities = (KMess::MsnClientCapabilities) 0; - KMess::MsnClientExtendedCapabilities extendedCapabilities = (KMess::MsnClientExtendedCapabilities) 0; + QString handle; + KMess::NetworkType networkId; - // Get the contact info from the message - + // The MsnObject can be positioned differently, depending on the command format + // TODO: Describe the two different cases int msnObjectPos = 4; if( command.length() == 6 ) { - InternalUtils::getCaps( command[4], capabilities, extendedCapabilities ); msnObjectPos = 5; } + // Get the contact info from the message + InternalUtils::getHandle( command[2], handle, networkId ); - InternalUtils::getCaps ( command[4], capabilities, extendedCapabilities ); MsnStatus status = InternalUtils::statusFromCode( command[1] ); const QString &friendlyName( QUrl::fromPercentEncoding( command[3].toUtf8() ) ); + QString clientCaps ( command[4] ); QString msnObject ( QUrl::fromPercentEncoding( command[msnObjectPos].toUtf8() ) ); -#warning networkId and extendedCapabilities ignored for now +#warning networkId ignored for now Q_UNUSED( networkId ); - Q_UNUSED( extendedCapabilities ); // Check if the received MSN object is empty, a "0" (Kopete), or shorter than the string "<msnobject/>" if( msnObject.isEmpty() || msnObject.compare( QString( "0" ) ) <= 0 || msnObject.length() < 12 ) @@ -937,7 +934,7 @@ MsnContact *contact = session_->getContact( handle ); contact->setStatus( status ); contact->setFriendlyName( friendlyName ); - contact->setCapabilities( capabilities ); + contact->setCapabilities( clientCaps ); contact->setMsnObject( msnObject ); listsManager_->model()->contactUpdate( contact, false ); @@ -1123,15 +1120,12 @@ { KMESS_NULL( session_ ); - KMess::MsnClientCapabilities capabilities = (KMess::MsnClientCapabilities) 0; - KMess::MsnClientExtendedCapabilities extendedCapabilities = (KMess::MsnClientExtendedCapabilities) 0; - // Get the contact info from the message MsnStatus status = InternalUtils::statusFromCode( command[1] ); const QString &idString( command[2] ); + const QString clientCaps( command[4] ); const QString &friendlyName( QUrl::fromPercentEncoding( command[3].toUtf8() ) ); - InternalUtils::getCaps( command[4], capabilities, extendedCapabilities ); // If the MsnObject is available, get it QString msnObject; @@ -1146,9 +1140,6 @@ } } -#warning extendedCapabilities ignored for now - Q_UNUSED( extendedCapabilities ); - if( msnObject.isEmpty() ) { debug() << "Contact" << idString << "went online with status" << command[1] @@ -1166,8 +1157,7 @@ contact->setStatus( status ); contact->setFriendlyName( friendlyName ); -#warning extendedCapabilities ignored for now - contact->setCapabilities( capabilities ); + contact->setCapabilities( clientCaps ); contact->setMsnObject( msnObject ); if ( lastStatus == OfflineStatus ) @@ -2073,7 +2063,7 @@ if( initialUpdate ) { xml = "<EndpointData>" - "<Capabilities>" + InternalUtils::getCapabilitiesString() + "</Capabilities>" + "<Capabilities>" + Utils::getClientCapabilities().toString() + "</Capabilities>" "</EndpointData>"; sendCommand( "UUX", QString(), xml ); Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -19,10 +19,10 @@ #warning applications_old and messages_old were deleted in rev 5486. #include "libkmessdebug.h" -#include "utils/utils_internal.h" #include <KMess/MsnChat> #include <KMess/MsnContact> #include <KMess/MsnSession> +#include <KMess/Utils> #include <KMess/ClientCapsMessage> #include <KMess/TextMessage> @@ -76,7 +76,7 @@ // create one instance. keep it for life. createSwitchboardConnection(); - + connect( offlineImService_, SIGNAL( sendMessageFailed(QString,MimeMessage) ), this, SIGNAL( sendingFailed(QString,MimeMessage) ) ); } @@ -616,16 +616,16 @@ ClientCapsMessage message ( this, 0 ); // Check if we are logging chats or not - QString appName = "libkmess-msn"; - QString appVer = LIBKMESS_MSN_VERSION; + QString appName( "libkmess-msn" ); + QString appVer ( LIBKMESS_MSN_VERSION ); ChatLoggingMode appLogMode = LoggingInactive; // overwrite with app-supplied details. - if ( ! InternalUtils::applicationName_.isEmpty() ) + if ( ! Utils::getClientName().isEmpty() ) { - appName = InternalUtils::applicationName_; - appVer = InternalUtils::applicationVersion_; - appLogMode = InternalUtils::applicationLogging_; + appName = Utils::getClientName(); + appVer = Utils::getClientVersion(); + appLogMode = Utils::getClientLogging(); } message.setClientName( appName ); @@ -691,7 +691,7 @@ } MsnContact *contact = session_->getContact( lastContact_ ); - + if ( switchboard_->state() == MsnSwitchboardConnection::StateConnecting ) { // remember, opening the connection is not instant. we have to wait for @@ -699,13 +699,13 @@ return; } - if ( switchboard_->isConnected() && + if ( switchboard_->isConnected() && switchboard_->state() != MsnSwitchboardConnection::StateReady ) { // keep waiting - we're probably authorizing or inviting initial contacts. return; } - + // not connected, not ready, not waiting for a connection. // is this is an offline session? if ( contact && ! contact->isOnline() ) @@ -1583,7 +1583,7 @@ } } -#warning TODO-P2P: MsnObject download of contacts who've joined chat. +#warning TODO-P2P: MsnObject download of contacts who have joined chat. // TODO how and where do we do this (probably not automatically?): /* // Check whether the contact picture is outdated. @@ -1703,15 +1703,15 @@ return; } - if ( switchboard_->isConnected() ) + if ( switchboard_->isConnected() ) { warning() << "Switchboard is already connected! Disconnecting first."; switchboard_->closeConnection(); } - + // Initialize the switchboard as a user-requested chat switchboard_->start( server, port, authorization ); - + emit switchboardCreated(); } @@ -1733,7 +1733,7 @@ warning() << "Switchboard is already connected! Disconnecting first."; switchboard_->closeConnection(); } - + // Initialize the switchboard as a contact-requested chat switchboard_->start( server, port, authorization, chatId ); Modified: trunk/kmess/lib/src/msncontact.cpp =================================================================== --- trunk/kmess/lib/src/msncontact.cpp 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/msncontact.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -106,11 +106,11 @@ if ( deletedEndpoints.contains( ep->guid() ) ) { deletedEndpoints.removeAll( ep->guid() ); - + MPOPEndpoint *existingEp = endpoints_.value( ep->guid() ); - + debug() << "Updated MPOP endpoint" << ep->guid() << " (name:" << ep->name() << ") for contact " << email(); - + // copy/update data. *existingEp = *ep; } @@ -122,31 +122,29 @@ endpoints_.insert( ep->guid(), ep ); } } - + // at this point deletedEndpoints contains the guids that for // endpoints that no longer exist. remove them. foreach ( QUuid id, deletedEndpoints ) { MPOPEndpoint *ep = endpoints_.take( id ); - + debug() << "Deleted MPOP endpoint" << ep->guid() << " (name:" << ep->name() << ") from contact " << email(); delete ep; } - + emit endpointsChanged(); } /** - * @brief Returns the capabilitiies of this contact. + * @brief Returns the capabilities of the contact's client. * - * The capabilities are given as an unsigned int, where all capabilities are - * added as bitwise flags. You can use the MSN_CAP_ constants to check for - * several capabilities. + * @return The client's capabilities. */ -quint32 MsnContact::capabilities() const +const ClientCapabilities MsnContact::capabilities() const { return capabilities_; } @@ -194,9 +192,9 @@ * Return TRUE if the contact has the given capability, FALSE otherwise. * @return bool */ -bool MsnContact::hasCapability( MsnClientCapabilities capability ) const +bool MsnContact::hasCapability( ClientCapabilities::CapabilitiesFlags capability ) const { - return ( capabilities_ && capability ); + return ( capabilities_.caps() & capability ); } @@ -311,7 +309,7 @@ /** * Set the capabilities of this MsnContact. */ -void MsnContact::setCapabilities( quint32 capabilities ) +void MsnContact::setCapabilities( ClientCapabilities capabilities ) { capabilities_ = capabilities; } @@ -324,7 +322,7 @@ void MsnContact::setFriendlyName( const QString &friendly ) { friendlyName_ = friendly; - + emit changedFriendlyName( this ); } @@ -363,7 +361,7 @@ void MsnContact::setId( const QString &idString ) { id_ = idString; - + bool isIdValid = InternalUtils::getHandle( idString, email_, network_ ); debug() << "Setting MsnContact to" << ( isIdValid ? "valid" : "invalid" ) << "id:" << idString; @@ -433,7 +431,7 @@ MsnStatus prevStatus = status_; status_ = status; - + if ( status_ == OfflineStatus ) { emit contactOffline( this ); @@ -462,8 +460,40 @@ -bool MsnContact::supportsInkType( InkFormat ) const +/** + * Return whether the contact supports a certain Ink type. + * + * This is just a convenience method over contact->hasCapability(). + * + * @param format Specified Ink format + * @return bool + */ +bool MsnContact::supportsInkType( InkFormat format ) const { -#warning todo - return true; + const ClientCapabilities::CapabilitiesFlags caps = capabilities_.caps(); + + switch( format ) + { + case FORMAT_GIF: + return ( caps & ClientCapabilities::CF_SUPPORTS_GIF_INK ); + case FORMAT_ISF: + return ( caps & ClientCapabilities::CF_SUPPORTS_ISF_INK ); + default: + warning() << "Unknown Ink format" << format << "specified!"; + return false; + } } + + + +/** + * Return whether the contact's client supports MSNP2P. + * + * This is just a convenience method over contact->hasCapability(). + * + * @return bool + */ +bool MsnContact::supportsP2P() const +{ + return capabilities_.supportsP2p(); +} Modified: trunk/kmess/lib/src/utils/utils.cpp =================================================================== --- trunk/kmess/lib/src/utils/utils.cpp 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/utils/utils.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -31,11 +31,17 @@ using namespace KMess; -// Settings for debugging. +// Settings for debugging #define NOTIFICATION_HIDE_P2P_SUPPORT 0 +// Internal variables used by Utils +static ClientCapabilities clientCapabilities_; +static QString clientName_; +static QString clientVersion_; +static ChatLoggingMode clientLogging_ = LoggingInactive; + /** * Extract a nonce from a QByteArray of data. * @todo documentation @@ -120,45 +126,62 @@ -// Return the library capabilities -quint64 KMess::Utils::getCapabilities() +/** + * Return the client capabilities. + * + * @return ClientCapabilities + */ +const ClientCapabilities KMess::Utils::getClientCapabilities() { - // NOTE: When changing this property, all MSNP2P code need to be retested again!! - // The capabilities are like a contract. The other client assumes everything works that's promised here. + return clientCapabilities_; +} - quint64 capabilities = MSN_CAP_MULTI_PACKET; - // We can choose not to advertise any protocol-related caps, for p2p testing -#if NOTIFICATION_HIDE_P2P_SUPPORT == 0 - capabilities |= MSN_CAP_MSN2009; -#endif - // The library doesn't natively support Ink, it only acts as a transport for - // ink data. The client must be able to tell the lib that it supports isf and/or - // gif ink. - capabilities |= InternalUtils::applicationCapabilities_; +/** + * Return the client chat logging mode. + * + * FIXME: Isn't chat logging mode to be set per-chat? ie if I want to disable chat logging + * for a single chat, with this global method I can only tell I'm not logging anymore for + * *all* new chats... + * + * @return ChatLoggingMode + */ +ChatLoggingMode KMess::Utils::getClientLogging() +{ + return clientLogging_; +} - // NOTE: The caps are stored in an enum. Probably the MSN protocol development - // team also had them into an enum, because they have no more available values - // and resorted to another enum. The other enum's values are appended to the - // old one's after a colon: "caps:extcaps" or "12345678:123". - // We don't need such madness, so we just use a bigger value :> - // The enum is 32 bit long, so shift the extended caps by 32 bits :) - quint64 extendedCapabilities = 0LL; -#if 0 - extendedCapabilities = - | MSN_EXTCAP_RTC_VIDEO - | MSN_EXTCAP_P2P_V2; -#endif +/** + * Return the client name. + * + * This string will be sent to other clients in chat metadata. + * + * @return QString + */ +const QString KMess::Utils::getClientName() +{ + return clientName_; +} - extendedCapabilities <<= 32; - return capabilities + extendedCapabilities; + +/** + * Return the client version number. + * + * This string will be sent to other clients in chat metadata. + * + * @return QString + */ +const QString KMess::Utils::getClientVersion() +{ + return clientVersion_; } + /** * Converts a string with HTML to one with escaped entities * @@ -173,7 +196,6 @@ { string.replace( ";", ";" ) .replace( "&", "&" ) - .replace( "&#59;", ";" ) // oh god :( .replace( "<", "<" ) .replace( ">", ">" ) .replace( "'", "'" ) @@ -216,7 +238,6 @@ .replace( "'", "'" ) .replace( ">", ">" ) .replace( "<", "<" ) - .replace( ";", "&#59;" ) .replace( "&", "&" ) .replace( ";", ";" ); @@ -242,30 +263,87 @@ /** - * Use this to inform the library what capabilities your application supports. This is - * advertised to clients that you chat to. + * Set in the library which capabilities are supported by the application. * - * By default, the library does not assume that the application is capable of supporting - * any particular set of capabilities (apart from protocol ones which are fixed). The - * capabilities you can set here are: - * - * CapabilityInkIsf, CapabilityInkGif, CapabilityWinks, CapabilityVideoChat. + * This is advertised to clients that you chat to. + * Use this early in the application startup to set which features your application can + * interpret. * - * Any other values that you attempt to set will be ignored. If you do not set these - * capabilities they will not be advertised and clients will not attempt to perform actions - * that require these capabilities (i.e, if you do not advertise CapabilityWinks you will + * By default, the library assumes that the application is NOT capable of supporting + * any particular set of capabilities. + * The library itself will advertise some capabilities it internally uses and supports, + * while the others are left to the application to set. + * The list of capabilities you can set follows. + * + * CF_SUPPORTS_GIF_INK + * CF_ONLINE_VIA_MOBILE + * CF_ONLINE_VIA_MSN_EXPLORER + * CF_SUPPORTS_GIF_INK + * CF_SUPPORTS_ISF_INK + * CF_WEBCAM_DETECTED + * CF_IS_MOBILE_ENABLED + * CF_IS_MSN_DIRECT_DEVICE_ENABLED + * CF_MOBILE_MESSAGING_DISABLED + * CF_ONLINE_VIA_WEBIM + * CF_MOBILE_DEVICE + * CF_HAS_MSN_SPACE + * CF_IS_MEDIA_CENTER_EDITION_USER + * CF_SUPPORTS_WINKS + * CF_IS_BOT + * CF_SUPPORTS_VOICEIM + * CF_HAS_ONECARE + * CF_USING_ALIAS + * CF_SUPPORTS_RTC_VIDEO + * CF_SUPPORTS_P2P_VERSION_2 + * + * Setting any capability other than these will have no effect. If you do not set a + * capability, it will not be advertised and clients will not attempt to perform actions + * that require that capability (i.e, if you do not advertise CF_SUPPORTS_WINKS you will * not receive any winks). * - * @param capabilities The capabilities supported by your application. Advertised to other contacts. + * @param capabilities The bitwise ORed capabilities supported by your application. */ -void Utils::setClientCapabilities( MsnClientCapabilities capabilities ) +void Utils::setClientCapabilities( ClientCapabilities::CapabilitiesFlags capabilities ) { - MsnClientCapabilities sanitized; - - // sanitize them so the client can't start advertising things we don't support in the library! - sanitized = (MsnClientCapabilities) ( capabilities & ( MSN_CAP_INK_GIF | MSN_CAP_INK_ISF | MSN_CAP_VIDEO_CHAT | MSN_CAP_WINKS ) ); + quint64 libraryCaps = ClientCapabilities::CF_NONE; - InternalUtils::applicationCapabilities_ = sanitized; + // NOTE: When changing the libraryCaps, all MSNP2P code need to be retested again! + // The capabilities are like a contract. The other client assumes everything that's promised here will work. + + // Message chuncks are supported + libraryCaps |= ClientCapabilities::CF_SUPPORTS_MESSAGE_CHUNKING; + + // We can choose to not advertise any protocol-related caps, for P2P testing +#if NOTIFICATION_HIDE_P2P_SUPPORT != 0 + libraryCaps |= ClientCapabilities::CF_VERSION_14_0; +#endif + + quint64 acceptedCaps = + ClientCapabilities::CF_SUPPORTS_GIF_INK + | ClientCapabilities::CF_ONLINE_VIA_MOBILE + | ClientCapabilities::CF_ONLINE_VIA_MSN_EXPLORER + | ClientCapabilities::CF_SUPPORTS_GIF_INK + | ClientCapabilities::CF_SUPPORTS_ISF_INK + | ClientCapabilities::CF_WEBCAM_DETECTED + | ClientCapabilities::CF_IS_MOBILE_ENABLED + | ClientCapabilities::CF_IS_MSN_DIRECT_DEVICE_ENABLED + | ClientCapabilities::CF_MOBILE_MESSAGING_DISABLED + | ClientCapabilities::CF_ONLINE_VIA_WEBIM + | ClientCapabilities::CF_MOBILE_DEVICE + | ClientCapabilities::CF_HAS_MSN_SPACE + | ClientCapabilities::CF_IS_MEDIA_CENTER_EDITION_USER + | ClientCapabilities::CF_SUPPORTS_WINKS + | ClientCapabilities::CF_IS_BOT + | ClientCapabilities::CF_SUPPORTS_VOICEIM + | ClientCapabilities::CF_HAS_ONECARE + | ClientCapabilities::CF_USING_ALIAS + | ClientCapabilities::CF_SUPPORTS_RTC_VIDEO + | ClientCapabilities::CF_SUPPORTS_P2P_VERSION_2; + + // Only keep the caps we accept by ANDing them with our "whitelist" + clientCapabilities_.setCaps( + (ClientCapabilities::CapabilitiesFlags) + ( libraryCaps | ( acceptedCaps & capabilities ) ) ); } @@ -287,8 +365,8 @@ */ void Utils::setClientName( const QString &name, const QString &version ) { - InternalUtils::applicationName_ = name; - InternalUtils::applicationVersion_ = version; + clientName_ = name; + clientVersion_ = version; } @@ -302,5 +380,5 @@ */ void Utils::setClientLogging( ChatLoggingMode loggingMode ) { - InternalUtils::applicationLogging_ = loggingMode; + clientLogging_ = loggingMode; } Modified: trunk/kmess/lib/src/utils/utils_internal.cpp =================================================================== --- trunk/kmess/lib/src/utils/utils_internal.cpp 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/utils/utils_internal.cpp 2010-01-31 21:22:41 UTC (rev 5874) @@ -17,6 +17,7 @@ #include "libkmessdebug.h" +#include <KMess/ClientCapabilities> #include <KMess/Utils> #include "utils_internal.h" @@ -30,55 +31,8 @@ using namespace KMess; -// see utils_internal.h -MsnClientCapabilities InternalUtils::applicationCapabilities_ = (MsnClientCapabilities)0; -QString InternalUtils::applicationName_ = QString(); -QString InternalUtils::applicationVersion_ = QString(); -ChatLoggingMode InternalUtils::applicationLogging_ = LoggingInactive; -/** - * @brief Retrieve the contact caps from a string of the form "caps:extcaps" - * - * @return bool - */ -bool InternalUtils::getCaps( const QString &string, MsnClientCapabilities &caps, MsnClientExtendedCapabilities &extCaps ) -{ - // Check the string beforehand - if( string.length() < 3 ) - { - caps = (MsnClientCapabilities) 0; - extCaps = (MsnClientExtendedCapabilities) 0; - return false; - } - - bool ok1, ok2; - QStringList pair( string.split( ':', QString::KeepEmptyParts ) ); - - KMESS_ASSERT( pair.size() == 2 ); - - // Extract the plain old capabilities value - caps = (MsnClientCapabilities) pair[0].toLong( &ok1 ); - - // Extract the new extended caps - extCaps = (MsnClientExtendedCapabilities) pair[1].toLong( &ok2 ); - - // The numbers were not correct - if( ! ok1 || ! ok2 ) - { - caps = (MsnClientCapabilities) 0; - extCaps = (MsnClientExtendedCapabilities) 0; - - warning() << "Got unrecognizable capabilities numbers:" << string << "!"; - - return false; - } - - return true; -} - - - /** * @brief Retrieve the handle and network of a contact from a string of the form "netid:handle" * @@ -132,24 +86,6 @@ -// Return the library capabilities, in string form -QString InternalUtils::getCapabilitiesString() -{ - quint64 fullCaps = KMess::Utils::getCapabilities(); - - // Extract the extended caps (the most significant 32 bits) and the - // standard caps ( the least significant 32 bits) - quint32 capabilities = ( fullCaps & 0xFFFFFFFF ); - quint32 extendedCapabilities = ( fullCaps >> 32 ); - - // Create and return the string - return QString::number( capabilities, 10 ) + - ":" + - QString::number( extendedCapabilities, 10 ); -} - - - // Combine the handle and network of a contact into a correctly-formed string QString InternalUtils::makeHandle( const QString &handle, NetworkType network ) { Modified: trunk/kmess/lib/src/utils/utils_internal.h =================================================================== --- trunk/kmess/lib/src/utils/utils_internal.h 2010-01-31 21:21:37 UTC (rev 5873) +++ trunk/kmess/lib/src/utils/utils_internal.h 2010-01-31 21:22:41 UTC (rev 5874) @@ -25,8 +25,13 @@ -namespace KMess { +namespace KMess +{ +// Forward declarations +class ClientCapabilities; + + /** * @brief Utilities not exported in the library API. * @@ -40,12 +45,8 @@ public: // Static public methods - // Retrieve the contact caps from a string of the form "caps:extcaps" - static bool getCaps( const QString &string, MsnClientCapabilities &caps, MsnClientExtendedCapabilities &extCaps ); // Retrieve the handle and network of a contact from a string of the form "netid:handle" static bool getHandle( const QString &string, QString &handle, NetworkType &network ); - // Return the library capabilities, in string form - static QString getCapabilitiesString(); // Combine the handle and network of a contact into a correctly-formed string static QString makeHandle( const QString &handle, NetworkType network ); // Decode MIME strings like =?iso...=...?=... @@ -60,13 +61,7 @@ private: // Private static methods // Decode a Quoted-Printable string static QByteArray quotedPrintableDecode( const QByteArray& in ); - - public: - // this is set by Utils::setApplicationCapabilties(). - static MsnClientCapabilities applicationCapabilities_; - static QString applicationName_; - static QString applicationVersion_; - static ChatLoggingMode applicationLogging_; + }; }; // end of namespace KMess This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-31 21:21:44
|
Revision: 5873 http://kmess.svn.sourceforge.net/kmess/?rev=5873&view=rev Author: it_amroth Date: 2010-01-31 21:21:37 +0000 (Sun, 31 Jan 2010) Log Message: ----------- Fixed a signal in MsnSession, reorganized the session settings code a bit, and fixed option to disable the verbose settings debug output. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-31 21:21:01 UTC (rev 5872) +++ trunk/kmess/lib/ChangeLog 2010-01-31 21:21:37 UTC (rev 5873) @@ -1,6 +1,7 @@ 2010-01-29 Valerio Pilo <valerio@...> - * MsnSession: Fixed a signal. + * MsnSession: Fixed a signal, reorganized the settings code a bit, and fixed option to + disable its debug output. 2010-01-29 Adam Goossens <adam@...> Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-31 21:21:01 UTC (rev 5872) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-31 21:21:37 UTC (rev 5873) @@ -38,10 +38,8 @@ #include <QBuffer> -#ifdef KMESSDEBUG_MSNSESSION - #define KMESSDEBUG_MSNSESSION_MSNOBJECT - //#define KMESSDEBUG_MSNSESSION_SETTINGS -#endif +// Uncomment this to enable debugging the session settings. +// #define LIBKMESS_MSN_DEBUG_SETTINGS using namespace KMess; @@ -803,7 +801,7 @@ { ensureSessionSettingExists( name.toAscii() ); - #ifdef MSNDEBUG_MSNSESSION +#ifdef LIBKMESS_MSN_DEBUG_SETTINGS debug() << "Retrieving from setting" << name << "the value:" << sessionSettings_[ name ]; #endif @@ -1149,12 +1147,6 @@ SettingsList list; list[ name ] = value; - // handle this one specially. - if ( name == "MachineGUID" ) - { - localEndpoint_->setGuid( QUuid( value.toString() ) ); - } - setSessionSettings( list ); } @@ -1188,18 +1180,27 @@ // Not using the [] operator because it creates an empty item if the key is not found if( sessionSettings_.value( name ) == value ) { +#ifdef LIBKMESS_MSN_DEBUG_SETTINGS debug() << "Setting" << name << "already has value" << value; +#endif continue; } +#ifdef LIBKMESS_MSN_DEBUG_SETTINGS debug() << "Changing session setting" << name << "to" << value; +#endif sessionSettings_[ name ] = value; - // Check which signals need to be emitted + // Manage some settings which require further actions, like + // calling methods or emitting signals - if( name == "EmailCount" ) + if ( name == "MachineGUID" ) { + localEndpoint_->setGuid( QUuid( value.toString() ) ); + } + else if( name == "EmailCount" ) + { emitNewEmailSignal = true; } } @@ -1222,7 +1223,9 @@ // Apply the status change status_ = status; +#ifdef LIBKMESS_MSN_DEBUG_SETTINGS debug() << "Status was changed to" << InternalUtils::statusToCode( status_ ); +#endif // Also update the user's MsnContact listsManager_->self()->setStatus( status_ ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-31 21:21:08
|
Revision: 5872 http://kmess.svn.sourceforge.net/kmess/?rev=5872&view=rev Author: it_amroth Date: 2010-01-31 21:21:01 +0000 (Sun, 31 Jan 2010) Log Message: ----------- Fixed a signal in MsnSession. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-31 16:28:31 UTC (rev 5871) +++ trunk/kmess/lib/ChangeLog 2010-01-31 21:21:01 UTC (rev 5872) @@ -1,3 +1,7 @@ +2010-01-29 Valerio Pilo <valerio@...> + + * MsnSession: Fixed a signal. + 2010-01-29 Adam Goossens <adam@...> * MsnSession: when disconnected from NS, wipe ListsManager and ChatFactory manually. @@ -4,7 +8,7 @@ * ChatFactory: add reset() method that will delete each held MsnChat and then clear the chats_ list. Also wrap MsnChat instances in QPointers for safety. - 2010-01-27 Adam Goossens <adam@...> +2010-01-27 Adam Goossens <adam@...> * MsnNotificationConnection: wrap MsnChat instances in openRequests_ in QPointer instances. If the MsnChat is deleted before we get the SB response it will cause a crash. QPointer will Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-31 16:28:31 UTC (rev 5871) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-31 21:21:01 UTC (rev 5872) @@ -125,8 +125,8 @@ this, SIGNAL( chatCreated(KMess::MsnChat*) ) ); connect( chatFactory_, SIGNAL( chatDestroyed(KMess::MsnChat*) ), this, SIGNAL( chatDestroyed(KMess::MsnChat*) ) ); - connect( chatFactory_, SIGNAL(chatMessageReceived(KMess::Message&) ), - this, SIGNAL(chatMessageReceived(KMess::Message&) ) ); + connect( chatFactory_, SIGNAL(chatMessageReceived(KMess::Message) ), + this, SIGNAL(chatMessageReceived(KMess::Message) ) ); connect( chatFactory_, SIGNAL( switchboardRequested(KMess::MsnChat* ) ), msnNotificationConnection_, SLOT ( inviteToChat(KMess::MsnChat* ) ) ); @@ -1321,11 +1321,11 @@ { // give the user one last chance. emit loggedOut(); - + // now wipe MsnContact and MsnChat instances. chatFactory_->reset(); listsManager_->reset(); - + // Platform::instance()->shutdown(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dazjorz@us...> - 2010-01-31 16:28:38
|
Revision: 5871 http://kmess.svn.sourceforge.net/kmess/?rev=5871&view=rev Author: dazjorz Date: 2010-01-31 16:28:31 +0000 (Sun, 31 Jan 2010) Log Message: ----------- * Fixed applications bug, applications can now properly be accepted and cancelled again. Modified Paths: -------------- branches/kmess/kmess-nokde/ChangeLog branches/kmess/kmess-nokde/src/chat/chatview.cpp Modified: branches/kmess/kmess-nokde/ChangeLog =================================================================== --- branches/kmess/kmess-nokde/ChangeLog 2010-01-29 12:51:31 UTC (rev 5870) +++ branches/kmess/kmess-nokde/ChangeLog 2010-01-31 16:28:31 UTC (rev 5871) @@ -1,4 +1,8 @@ +2010-01-31 (Sjors) (nokde branch) + * Fixed applications bug, applications can now properly be accepted and + cancelled again. + 2010-01-17 (Sjors) (nokde branch) * Synced 2.0.x branch (revision 5791) to nokde branch. * Added 'finkbuild', a script for building KDE in Fink on Mac. Modified: branches/kmess/kmess-nokde/src/chat/chatview.cpp =================================================================== --- branches/kmess/kmess-nokde/src/chat/chatview.cpp 2010-01-29 12:51:31 UTC (rev 5870) +++ branches/kmess/kmess-nokde/src/chat/chatview.cpp 2010-01-31 16:28:31 UTC (rev 5871) @@ -884,7 +884,10 @@ */ QString path ( chatViewClickedUrl_.path() .mid( 1 ) ); // remove first / - QString query ( chatViewClickedUrl_.encodedQuery().mid( 1 ) ); // Remove the ? + // in KUrl, encodedQuery apparantly includes the ?, so there is .mid(1) in + // the line below; in QUrl, this can be removed as encodedQuery does not + // include the query question mark + QString query ( chatViewClickedUrl_.encodedQuery() ); QString method ( path.section( "/", 0, 0 ) ); // First parameter: response type QString contact( path.section( "/", 1, 1 ) ); // Second parameter: contact handle This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rubenv@us...> - 2010-01-29 12:51:40
|
Revision: 5870 http://kmess.svn.sourceforge.net/kmess/?rev=5870&view=rev Author: rubenv Date: 2010-01-29 12:51:31 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Trunk backport: Added workaround where "last seen" and/or "last message" are in the year 2106. Modified Paths: -------------- branches/kmess/kmess-2.0.x/ChangeLog branches/kmess/kmess-2.0.x/src/dialogs/contactpropertiesdialog.cpp branches/kmess/kmess-2.0.x/src/kmessview.cpp Modified: branches/kmess/kmess-2.0.x/ChangeLog =================================================================== --- branches/kmess/kmess-2.0.x/ChangeLog 2010-01-29 09:15:06 UTC (rev 5869) +++ branches/kmess/kmess-2.0.x/ChangeLog 2010-01-29 12:51:31 UTC (rev 5870) @@ -1,4 +1,7 @@ - + +2010-01-29 (Ruben) + * Trunk backport: Added workaround where "last seen" and/or "last message" are in the year 2106. + 2010-01-28 (Pano) * Merged an updated Traditional Chinese translation by Yen-chou Chen. * Merged an updated Dutch translation by Sjors Gielen. Modified: branches/kmess/kmess-2.0.x/src/dialogs/contactpropertiesdialog.cpp =================================================================== --- branches/kmess/kmess-2.0.x/src/dialogs/contactpropertiesdialog.cpp 2010-01-29 09:15:06 UTC (rev 5869) +++ branches/kmess/kmess-2.0.x/src/dialogs/contactpropertiesdialog.cpp 2010-01-29 12:51:31 UTC (rev 5870) @@ -398,7 +398,9 @@ { lastSeenString = i18n( "Connected" ); } - else if( extension->getLastSeen().toTime_t() == 0 || extension->getLastSeen().isNull() ) + else if( extension->getLastSeen().toTime_t() == 0 + || extension->getLastSeen().toTime_t() == UINT_MAX + || extension->getLastSeen().isNull() ) { lastSeenString = i18n( "Not seen yet" ); } @@ -407,7 +409,9 @@ lastSeenString = extension->getLastSeen().toString(); } - if( extension->getLastMessageDate().toTime_t() == 0 || extension->getLastMessageDate().isNull() ) + if( extension->getLastMessageDate().toTime_t() == 0 + || extension->getLastMessageDate().toTime_t() == UINT_MAX + || extension->getLastMessageDate().isNull() ) { lastMessageString = i18n( "No messages yet" ); } Modified: branches/kmess/kmess-2.0.x/src/kmessview.cpp =================================================================== --- branches/kmess/kmess-2.0.x/src/kmessview.cpp 2010-01-29 09:15:06 UTC (rev 5869) +++ branches/kmess/kmess-2.0.x/src/kmessview.cpp 2010-01-29 12:51:31 UTC (rev 5870) @@ -1289,7 +1289,9 @@ { lastSeenString = i18n( "Connected" ); } - else if( lastSeen.toTime_t() == 0 || lastSeen.isNull() ) + else if( lastSeen.toTime_t() == 0 + || lastSeen.toTime_t() == UINT_MAX + || lastSeen.isNull() ) { lastSeenString = i18n( "Not seen yet" ); } @@ -1304,7 +1306,9 @@ // Add last message date const QDateTime& lastMessage( itemData[ "lastMessage" ].toDateTime() ); QString lastMessageString; - if( lastMessage.toTime_t() == 0 || lastMessage.isNull() ) + if( lastMessage.toTime_t() == 0 + || lastMessage.toTime_t() == UINT_MAX + || lastMessage.isNull() ) { lastMessageString = i18n( "No messages yet" ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fontknocker@us...> - 2010-01-29 09:15:13
|
Revision: 5869 http://kmess.svn.sourceforge.net/kmess/?rev=5869&view=rev Author: fontknocker Date: 2010-01-29 09:15:06 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Upon disconnection from NS for whatever reason, clear ListsManager and ChatFactory. In ChatFactory, wrap MsnChat instances in QPointers for added safety. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/src/chatfactory.cpp trunk/kmess/lib/src/chatfactory.h trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-29 00:22:02 UTC (rev 5868) +++ trunk/kmess/lib/ChangeLog 2010-01-29 09:15:06 UTC (rev 5869) @@ -1,5 +1,11 @@ -2010-01-27 Adam Goossens <adam@...> +2010-01-29 Adam Goossens <adam@...> + * MsnSession: when disconnected from NS, wipe ListsManager and ChatFactory manually. + * ChatFactory: add reset() method that will delete each held MsnChat and then clear the chats_ list. + Also wrap MsnChat instances in QPointers for safety. + + 2010-01-27 Adam Goossens <adam@...> + * MsnNotificationConnection: wrap MsnChat instances in openRequests_ in QPointer instances. If the MsnChat is deleted before we get the SB response it will cause a crash. QPointer will guard the pointer for us. Modified: trunk/kmess/lib/src/chatfactory.cpp =================================================================== --- trunk/kmess/lib/src/chatfactory.cpp 2010-01-29 00:22:02 UTC (rev 5868) +++ trunk/kmess/lib/src/chatfactory.cpp 2010-01-29 09:15:06 UTC (rev 5869) @@ -22,6 +22,7 @@ #include <KMess/Message> #include <KMess/MsnContact> +#include <QPointer> using namespace KMess; @@ -43,6 +44,9 @@ // The destructor ChatFactory::~ChatFactory() { + debug() << "DESTROYING..."; + + reset(); } @@ -61,9 +65,9 @@ */ KMess::MsnChat *ChatFactory::getExclusiveChatWith( const QString &handle ) const { - foreach( KMess::MsnChat *check, chats_ ) + foreach( QPointer<MsnChat> check, chats_ ) { - if( check->isPrivateChatWith( handle ) ) + if( check && check->isPrivateChatWith( handle ) ) { return check; } @@ -75,6 +79,25 @@ /** + * Reset the chat factory. In short, delete all MsnChat instances. + */ +void ChatFactory::reset() +{ + // make sure to delete each MsnChat instance. + foreach( QPointer<MsnChat> chat, chats_ ) + { + if ( chat ) + { + delete chat; + } + } + + chats_.clear(); +} + + + +/** * A chat has been destroyed, remove it from the list. */ void ChatFactory::slotChatDestroyed() @@ -108,7 +131,7 @@ connect( chat, SIGNAL( messageReceived(KMess::Message) ), this, SIGNAL( chatMessageReceived(KMess::Message) ) ); - chats_.append( chat ); + chats_.append( QPointer<MsnChat>( chat ) ); debug() << "Created chat with" << handle; @@ -178,7 +201,7 @@ /** * @brief Return a list of MsnChat objects. */ -const QList<MsnChat*> &ChatFactory::getChats() const +const QList<QPointer<MsnChat> > &ChatFactory::getChats() const { return chats_; } Modified: trunk/kmess/lib/src/chatfactory.h =================================================================== --- trunk/kmess/lib/src/chatfactory.h 2010-01-29 00:22:02 UTC (rev 5868) +++ trunk/kmess/lib/src/chatfactory.h 2010-01-29 09:15:06 UTC (rev 5869) @@ -21,6 +21,7 @@ #include <KMess/Message> #include <KMess/NetworkGlobals> +#include <QPointer> namespace KMess @@ -59,7 +60,7 @@ // Find a chat with only this contact in it (do we need this call here?) //MsnChat *findChatWithContact() const; // Get the list of MsnChat objects - const QList<MsnChat*> &getChats() const; + const QList< QPointer<MsnChat> > &getChats() const; // Get an exclusive chat with a contact MsnChat *getExclusiveChatWith( const QString &handle ) const; @@ -67,14 +68,16 @@ // Create a new MsnChat object and return it MsnChat *createChat( const QString &handle ); void message( KMess::Message message ); - + // reset the factory (delete all MsnChat instances) + void reset(); + private slots: void slotChatDestroyed(); // The user has been invited to a contact's chat session void invitedToChat( const QString &handle, const QString &server, const quint16 &port, const QString &auth, const QString &chatId ); private: // Private attributes - QList<MsnChat*> chats_; + QList< QPointer<MsnChat> > chats_; MsnSession *session_; signals: Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-29 00:22:02 UTC (rev 5868) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-29 09:15:06 UTC (rev 5869) @@ -73,8 +73,6 @@ this, SLOT ( mns_OnLoggedOut() ) ); connect( msnNotificationConnection_, SIGNAL( loggedIn() ), this, SIGNAL( loggedIn() ) ); - connect( msnNotificationConnection_, SIGNAL( disconnected() ), - this, SIGNAL( loggedOut() ) ); connect( msnNotificationConnection_, SIGNAL(authenticationFailed() ), this, SIGNAL(authenticationFailed() ) ); connect( msnNotificationConnection_, SIGNAL( contactAddedUser(QString) ), @@ -115,10 +113,6 @@ connect( msnNotificationConnection_, SIGNAL( changedStatus(KMess::MsnStatus) ), this, SLOT ( slotChangedStatus(KMess::MsnStatus) ) ); - // hook up disconnect signal to reset slot of list manager. - connect( msnNotificationConnection_, SIGNAL( disconnected() ), - listsManager_, SLOT( reset() ) ); - // Initialize the chat factory chatFactory_ = new ChatFactory( this ); @@ -1318,8 +1312,20 @@ +/** + * Emit loggedOut, but then wipe MsnContact/MsnChat instances and start fresh. + * + * Also shut down the Transport platform. + */ void MsnSession::mns_OnLoggedOut() { + // give the user one last chance. + emit loggedOut(); + + // now wipe MsnContact and MsnChat instances. + chatFactory_->reset(); + listsManager_->reset(); + // Platform::instance()->shutdown(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rubenv@us...> - 2010-01-29 01:27:52
|
Revision: 5868 http://kmess.svn.sourceforge.net/kmess/?rev=5868&view=rev Author: rubenv Date: 2010-01-29 00:22:02 +0000 (Fri, 29 Jan 2010) Log Message: ----------- Use fuzzy time strings as "last seen" and "last message". (Based upon Amarok code) Added workaround where "last seen" and/or "last message" are in the year 2106. Modified Paths: -------------- trunk/kmess/ChangeLog trunk/kmess/src/dialogs/contactpropertiesdialog.cpp trunk/kmess/src/utils/kmessshared.cpp trunk/kmess/src/utils/kmessshared.h trunk/kmess/src/widgets/dynamictooltip.cpp Modified: trunk/kmess/ChangeLog =================================================================== --- trunk/kmess/ChangeLog 2010-01-28 22:10:42 UTC (rev 5867) +++ trunk/kmess/ChangeLog 2010-01-29 00:22:02 UTC (rev 5868) @@ -1,4 +1,8 @@ +2010-01-29 (Ruben) + * Use fuzzy time strings as "last seen" and "last message". (Based upon Amarok code) + * Added workaround where "last seen" and/or "last message" are in the year 2106. + 2010-01-28 (Valerio) * Reimplemented reconnection mechanisms, this time entirely on the KMess side. * Added a method to select the initial status programmatically in InitialView. Modified: trunk/kmess/src/dialogs/contactpropertiesdialog.cpp =================================================================== --- trunk/kmess/src/dialogs/contactpropertiesdialog.cpp 2010-01-28 22:10:42 UTC (rev 5867) +++ trunk/kmess/src/dialogs/contactpropertiesdialog.cpp 2010-01-29 00:22:02 UTC (rev 5868) @@ -18,6 +18,7 @@ #include "contactpropertiesdialog.h" #include "../contact/contactextension.h" +#include "../utils/kmessshared.h" #include "../utils/kmessconfig.h" #include "../account.h" #include "../kmessglobal.h" @@ -408,22 +409,26 @@ { lastSeenString = i18n( "Connected" ); } - else if( extension->getLastSeen().toTime_t() == 0 || extension->getLastSeen().isNull() ) + else if( extension->getLastSeen().toTime_t() == 0 + || extension->getLastSeen().toTime_t() == UINT_MAX + || extension->getLastSeen().isNull() ) { lastSeenString = i18n( "Not seen yet" ); } else { - lastSeenString = extension->getLastSeen().toString(); + lastSeenString = KMessShared::fuzzyTimeSince( extension->getLastSeen() ); } - if( extension->getLastMessageDate().toTime_t() == 0 || extension->getLastMessageDate().isNull() ) + if( extension->getLastMessageDate().toTime_t() == 0 + || extension->getLastMessageDate().toTime_t() == UINT_MAX + || extension->getLastMessageDate().isNull() ) { lastMessageString = i18n( "No messages yet" ); } else { - lastMessageString = extension->getLastMessageDate().toString(); + lastMessageString = KMessShared::fuzzyTimeSince( extension->getLastMessageDate() ); } lastSeenLabel_ ->setText( i18nc( "Contact props dialog info", "Last seen: %1", lastSeenString ) ); @@ -464,7 +469,7 @@ // Set the group list const QStringList& groupIdsList( msnContact_->groups() ); const GroupsListIterator it( globalSession->getGroupsList() ); - + QListWidgetItem *item; foreach( KMess::MsnGroup *group, globalSession->getGroupsList() ) Modified: trunk/kmess/src/utils/kmessshared.cpp =================================================================== --- trunk/kmess/src/utils/kmessshared.cpp 2010-01-28 22:10:42 UTC (rev 5867) +++ trunk/kmess/src/utils/kmessshared.cpp 2010-01-29 00:22:02 UTC (rev 5868) @@ -24,12 +24,15 @@ #include "kmessconfig.h" +#include <KCalendarSystem> +#include <KGlobal> #include <KRun> #include <KUrl> #include <KShell> #include <KToolInvocation> +#include <QDateTime> #include <QFile> #include <QPainter> @@ -463,3 +466,59 @@ +/** + * @brief Returns the time passed in a fuzzy format. + * + * Returns the time passed in a fuzzy format. + * Based on Amarok code. + * + * @param datetime date&time + * @return QString fuzzy string describing time passed + */ +QString KMessShared::fuzzyTimeSince( const QDateTime &datetime ) +{ + + const QDateTime now = QDateTime::currentDateTime(); + const int datediff = datetime.daysTo( now ); + + // Date in the future, should not happen, but we see it as "never". + if( datediff < 0 ) + return i18n( "Never" ); + + // Return the absolute date & month + if( datediff >= 6*7 /*six weeks*/ ) + { + const KCalendarSystem *cal = KGlobal::locale()->calendar(); + const QDate date = datetime.date(); + return i18nc( "monthname year", "%1 %2", cal->monthName(date), + cal->yearString(date, KCalendarSystem::LongFormat) ); + } + + //TODO "last week" = maybe within 7 days, but prolly before last Sunday + + if( datediff >= 7 ) // return difference in weeks + return i18np( "One week ago", "%1 weeks ago", (datediff+3)/7 ); + + const int timediff = datetime.secsTo( now ); + + if( timediff >= 24*60*60 /*24 hours*/ ) // return difference in days + return datediff == 1 ? + i18n( "Yesterday" ) : + i18np( "One day ago", "%1 days ago", (timediff+12*60*60)/(24*60*60) ); + + if( timediff >= 90*60 /*90 minutes*/ ) // return difference in hours + return i18np( "One hour ago", "%1 hours ago", (timediff+30*60)/(60*60) ); + + //TODO are we too specific here? Be more fuzzy? ie, use units of 5 minutes, or "Recently" + + if( timediff >= 0 ) // return difference in minutes + return timediff/60 ? + i18np( "One minute ago", "%1 minutes ago", (timediff+30)/60 ) : + i18n( "Within the last minute" ); + + // Time in the future, should not happen, but we see it as "never". + return i18n( "Never" ); +} + + + Modified: trunk/kmess/src/utils/kmessshared.h =================================================================== --- trunk/kmess/src/utils/kmessshared.h 2010-01-28 22:10:42 UTC (rev 5867) +++ trunk/kmess/src/utils/kmessshared.h 2010-01-29 00:22:02 UTC (rev 5868) @@ -23,6 +23,7 @@ // Forward declaration class KUrl; +class QDateTime; @@ -49,6 +50,8 @@ static bool selectNextFile( const QString &directory, const QString &baseName, QString &suffix, const QString &extension, int &startingNumber ); // Draws an icon with an overlay from two pixmaps (width and height -1, the defaults, mean take the width and height from the icon itself) static QPixmap drawIconOverlay( const QPixmap icon, const QPixmap overlay, int width = -1, int height = -1, float sizeFactor = 0.5, float iconSizeFactor = 1.0 ); + // Returns the time passed in a fuzzy format. + static QString fuzzyTimeSince( const QDateTime &datetime ); private: // Create the html file to request the given service Modified: trunk/kmess/src/widgets/dynamictooltip.cpp =================================================================== --- trunk/kmess/src/widgets/dynamictooltip.cpp 2010-01-28 22:10:42 UTC (rev 5867) +++ trunk/kmess/src/widgets/dynamictooltip.cpp 2010-01-29 00:22:02 UTC (rev 5868) @@ -21,6 +21,7 @@ #include "../contact/group.h" #include "../contact/contactextension.h" #include "../utils/richtextparser.h" +#include "../utils/kmessshared.h" #include "../emoticonmanager.h" #include "../kmessdebug.h" @@ -255,13 +256,13 @@ { lastSeenString = i18n( "Connected" ); } - else if( lastSeen.toTime_t() == 0 || lastSeen.isNull() ) + else if( lastSeen.toTime_t() == 0 || lastSeen.toTime_t() == UINT_MAX || lastSeen.isNull() ) { lastSeenString = i18n( "Not seen yet" ); } else { - lastSeenString = lastSeen.toString(); + lastSeenString = KMessShared::fuzzyTimeSince( lastSeen ); } ui->lastSeenLabel_->setText( lastSeenString ); @@ -270,13 +271,13 @@ QString lastMessageString; const QDateTime& lastMessage( contact->getExtension()->getLastMessageDate() ); - if( lastMessage.toTime_t() == 0 || lastMessage.isNull() ) + if( lastMessage.toTime_t() == 0 || lastMessage.toTime_t() == UINT_MAX || lastMessage.isNull() ) { lastMessageString = i18n( "No messages yet" ); } else { - lastMessageString = lastMessage.toString(); + lastMessageString = KMessShared::fuzzyTimeSince( lastMessage ); } ui->lastMessageLabel_->setText( lastMessageString ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-28 22:10:50
|
Revision: 5867 http://kmess.svn.sourceforge.net/kmess/?rev=5867&view=rev Author: it_amroth Date: 2010-01-28 22:10:42 +0000 (Thu, 28 Jan 2010) Log Message: ----------- * Reimplemented reconnection mechanisms, this time entirely on the KMess side. * Added a method to select the initial status programmatically in InitialView. * Changed the logout code structure a bit. Modified Paths: -------------- trunk/kmess/ChangeLog trunk/kmess/src/accountsmanager.cpp trunk/kmess/src/initialview.cpp trunk/kmess/src/initialview.h trunk/kmess/src/kmessapplication.cpp trunk/kmess/src/mainwindow.cpp trunk/kmess/src/mainwindow.h Modified: trunk/kmess/ChangeLog =================================================================== --- trunk/kmess/ChangeLog 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/ChangeLog 2010-01-28 22:10:42 UTC (rev 5867) @@ -1,4 +1,9 @@ +2010-01-28 (Valerio) + * Reimplemented reconnection mechanisms, this time entirely on the KMess side. + * Added a method to select the initial status programmatically in InitialView. + * Changed the logout code structure a bit. + 2010-01-28 (Pano) * Merged an updated Dutch translation by Heimen Stoffels. Modified: trunk/kmess/src/accountsmanager.cpp =================================================================== --- trunk/kmess/src/accountsmanager.cpp 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/accountsmanager.cpp 2010-01-28 22:10:42 UTC (rev 5867) @@ -40,8 +40,8 @@ // Initialize the singleton instance to zero AccountsManager* AccountsManager::instance_(0); +#warning IDEA: Add two signals connected to globalSession, to allow the AccountsManager to do by itself what MainWindow::disconnected() does with accounts. - /** * Constructor */ Modified: trunk/kmess/src/initialview.cpp =================================================================== --- trunk/kmess/src/initialview.cpp 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/initialview.cpp 2010-01-28 22:10:42 UTC (rev 5867) @@ -81,15 +81,13 @@ //kmessLogo_->setMinimumSize( icon.width(), icon.height() ); // Add the items to the initial status combo box - QStringList states; - states << i18n("Online") - << i18n("Away") - << i18n("Be Right Back") - << i18n("Busy") - << i18n("Out to Lunch") - << i18n("On the Phone") - << i18n("Invisible"); - initialStatus_->insertItems( 0, states ); + initialStatus_->insertItem( KMess::OnlineStatus, i18n("Online") ); + initialStatus_->insertItem( KMess::AwayStatus, i18n("Away") ); + initialStatus_->insertItem( KMess::BrbStatus, i18n("Be Right Back") ); + initialStatus_->insertItem( KMess::BusyStatus, i18n("Busy") ); + initialStatus_->insertItem( KMess::LunchStatus, i18n("Out to Lunch") ); + initialStatus_->insertItem( KMess::PhoneStatus, i18n("On the Phone") ); + initialStatus_->insertItem( KMess::InvisibleStatus, i18n("Invisible") ); // Load the accounts list into our combo box const QList<Account*> accountsList = AccountsManager::instance()->getAccounts(); @@ -954,4 +952,12 @@ +// Change the selected initial status +void InitialView::setSelectedStatus( KMess::MsnStatus status ) +{ + initialStatus_->setCurrentIndex( status ); +} + + + #include "initialview.moc" Modified: trunk/kmess/src/initialview.h =================================================================== --- trunk/kmess/src/initialview.h 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/initialview.h 2010-01-28 22:10:42 UTC (rev 5867) @@ -69,6 +69,8 @@ void paintEvent( QPaintEvent * ); // Reset the view to its initial state void reset(); + // Change the selected initial status + void setSelectedStatus( KMess::MsnStatus status ); // Start connecting with a specified account bool startConnecting( const QString handle, bool emitConnectionSignal = true ); Modified: trunk/kmess/src/kmessapplication.cpp =================================================================== --- trunk/kmess/src/kmessapplication.cpp 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/kmessapplication.cpp 2010-01-28 22:10:42 UTC (rev 5867) @@ -237,6 +237,9 @@ // Initialize KApplication setTopWidget( mainWindow ); + // Connect the reconnection event coming from chat windows + connect( chatMaster_, SIGNAL( reconnect() ), mainWindow, SLOT( reconnect() ) ); + // Apply our own quit policy. // Only quit when the user wanted to, or KDE is logging out. setQuitOnLastWindowClosed( false ); @@ -499,9 +502,6 @@ connect( timer, SIGNAL(timeout()), chatMaster_, SLOT(timedUpdate()) ); timer->start( 30000 ); // every 30s, as used to be the case. - // TODO: remove reconnect() from MsnSession? - connect( chatMaster_, SIGNAL(reconnect()), globalSession, SIGNAL(reconnect()) ); - connect( globalSession, SIGNAL( connecting() ), chatMaster_, SLOT( connecting() ) ); connect( globalSession, SIGNAL( loggedIn() ), Modified: trunk/kmess/src/mainwindow.cpp =================================================================== --- trunk/kmess/src/mainwindow.cpp 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/mainwindow.cpp 2010-01-28 22:10:42 UTC (rev 5867) @@ -100,6 +100,7 @@ , actionCollection_( actionCollection() ) , initialView_( 0 ) , isErrorStatus_( true ) +, lastStatusEvent_( KMess::MESSAGE_PROGRESS_DISCONNECTED ) , view_( 0 ) { // Assign the instance to the singleton variable @@ -171,10 +172,6 @@ connect( globalSession, SIGNAL( changedStatus() ), this, SLOT ( changedNowListeningSettings() )); - // FIXME remove me - connect( globalSession, SIGNAL( reconnect() ), - this, SLOT ( reconnect() ) ); - // Connect current account connect( globalSession, SIGNAL( loggedIn() ), this, SLOT ( loggedIn() ) ); @@ -186,6 +183,8 @@ this, SLOT ( showContactAddedUserDialog(QString) ) ); connect( globalSession, SIGNAL( proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*) ), this, SLOT ( proxyAuthenticate(QNetworkProxy,QAuthenticator*) ) ); + connect( globalSession, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ), + this, SLOT ( slotStatusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ) ); // Connect the account management signals AccountsManager *accountsManager = AccountsManager::instance(); @@ -733,27 +732,27 @@ // create the actions for the "Sort Contacts by" menu. actionViewMode_ = new KSelectAction( this ); actionViewModeMenu_ = new KActionMenu( KIcon("view-list-tree") , i18n("&Sort Contacts by"), this ); - + actionDisconnectMenu_ = new KMenu( this ); actionDisconnectMenu_->setTitle( i18n("&Disconnect") ); actionDisconnectMenu_->setIcon( KIcon("network-disconnect") ); - + // Populate ViewMode select viewModes << i18n( "Group" ) // Account::VIEW_BYGROUP << i18n( "Online/Offline" ) // Account::VIEW_BYSTATUS << i18n( "Mixed" ); // Account::VIEW_MIXED actionViewMode_->setItems( viewModes ); - + // add the actions that KSelectAction generates to the menu we're building. foreach( QAction *action, actionViewMode_->actions() ) { actionViewModeMenu_->addAction( action ); } - + // now create the alphabetical sort action. actionViewAlphabetical_ = new KToggleAction( KIcon( "view-sort-ascending" ), i18n( "&Alphabetical" ), this ); - + // and add it. actionViewModeMenu_->addSeparator(); actionViewModeMenu_->addAction( actionViewAlphabetical_ ); @@ -839,7 +838,7 @@ actionCollection_->addAction( "showMenuBar", actionShowMenuBar_ ); actionCollection_->addAction( "showStatusBar", actionShowStatusBar_ ); actionCollection_->addAction( "showTransfers", actionShowTransferWindow_ ); - + // View Modes menu actionCollection_->addAction( "viewModeMenu", actionViewModeMenu_ ); @@ -882,39 +881,38 @@ // Disconnect was selected from the menu. void MainWindow::disconnectClicked( QAction *action ) { + // Do a local log out only when called by hand + if( ! action ) + { + globalSession->logOut(); + return; + } - if ( action ) + const QString data( action->data().toString() ); + + // log out everywhere + if( data == "EVERYWHERE" ) { - QString data = action->data().toString(); - - // log out everywhere - if ( data == "EVERYWHERE" ) + globalSession->logOutEverywhere(); + return; + } + // log out locally + else if( data == globalSession->localEndpoint()->guid() ) + { + globalSession->logOut(); + return; + } + + // Else, log out from a specific endpoint + foreach( KMess::MPOPEndpoint *ep, globalSession->self()->endpoints() ) + { + if( ep->guid() == data ) { - globalSession->logOutEverywhere(); + globalSession->logOutFrom( ep ); return; } - // log out locally - else if ( data == globalSession->localEndpoint()->guid() ) - { - globalSession->logOut(); - return; - } - // log out from specific endpoint - else - { - foreach( KMess::MPOPEndpoint *ep, globalSession->self()->endpoints() ) - { - if ( ep->guid() == data ) - { - globalSession->logOutFrom( ep ); - return; - } - } - } } - - // local log out only. - globalSession->logOut(); + // If that endpoint wasn't found (UI out of sync?), do nothing } @@ -931,6 +929,7 @@ return; } + #ifdef KMESSDEBUG_MAINWINDOW kDebug() << "Updating UI to disconnected status"; #endif @@ -941,7 +940,11 @@ #endif Account *account = Account::connectedAccount; + const KMess::MsnStatus lastStatus = globalSession->getStatus(); + // Record the account handle to be able to reconnect later + lastConnectedAccount_ = globalSession->getHandle(); + if( account ) { if( account->isGuestAccount() ) @@ -984,6 +987,17 @@ // Update the current account globalSession->changeStatus( KMess::OfflineStatus ); globalSession->setSessionSetting( "AutoReplyEnabled", false ); + + // Finally, decide if it's the case to reconnect to the server + if( lastStatusEvent_ != KMess::MESSAGE_PROGRESS_DISCONNECTED + && lastStatusEvent_ != KMess::MESSAGE_ERROR_CONNECTION_OTHER + && lastStatusEvent_ != KMess::MESSAGE_ERROR_AUTH_LOGIN + && lastStatusEvent_ != KMess::MESSAGE_ERROR_CONNECTING_GATEWAY + && lastStatusEvent_ != KMess::MESSAGE_ERROR_AUTH_COMPUTATION ) + { + initialView_->setSelectedStatus( lastStatus ); + initialView_->reconnect( lastConnectedAccount_ ); + } } @@ -1058,7 +1072,7 @@ void MainWindow::loadContactList() { -#ifdef KMESSDEBUG_CONTACTLIST +#ifdef KMESSDEBUG_MAINWINDOW kDebug() << "Loading properties for the contact list"; #endif @@ -1199,7 +1213,7 @@ actionShowScriptConsole_->setEnabled( true ); rebuildDisconnectMenu(); - + // Load and show the contact list switchViewToContactList(); @@ -1494,26 +1508,26 @@ actionDisconnectMenu_->clear(); // create the actions for "sign out from here" and "Sign out from everywhere" - KAction *action = new KAction( i18nc( "%1 is the name of the local computer", - "Sign out from here (%1)", + KAction *action = new KAction( i18nc( "%1 is the name of the local computer", + "Sign out from here (%1)", globalSession->localEndpoint()->name() ) , actionDisconnectMenu_ ); action->setData( globalSession->localEndpoint()->guid().toString() ); actionDisconnectMenu_->addAction( action ); - + action = new KAction( i18n( "Sign out from everywhere" ), actionDisconnectMenu_ ); action->setData( "EVERYWHERE" ); actionDisconnectMenu_->addAction( action ); - + actionDisconnectMenu_->addSeparator(); - + // now add the actions for signing out of the other endpoints. foreach( KMess::MPOPEndpoint *ep, globalSession->self()->endpoints() ) { if ( ep->guid() == globalSession->localEndpoint()->guid() ) continue; - + QString title = i18nc( "%1 is the name of the remote computer", "Sign out from %1", ep->name() ); - + action = new KAction( title, actionDisconnectMenu_ ); action->setData( ep->guid().toString() ); @@ -1524,10 +1538,19 @@ // The user wants to reconnect void MainWindow::reconnect() { -#ifdef KMESSDEBUG - kDebug() << "Reconnecting"; + if( lastConnectedAccount_.isEmpty() ) + { +#ifdef KMESSDEBUG_MAINWINDOW + kDebug() << "Unable to reconnect: invalid account."; #endif - connectWithAccount( Account::connectedAccount ); + return; + } + +#ifdef KMESSDEBUG_MAINWINDOW + kDebug() << "Reconnecting" << lastConnectedAccount_; +#endif + + initialView_->reconnect( lastConnectedAccount_, true ); } @@ -1977,7 +2000,17 @@ +// Record the network library states +void MainWindow::slotStatusEvent( KMess::StatusMessageType type, KMess::StatusMessage message, QVariant data ) +{ + Q_UNUSED( type ); + Q_UNUSED( data ); + lastStatusEvent_ = message; +} + + + // Initiate a connection to the server. Use connectWithAccount() to connect, not this method. void MainWindow::startConnection( Account *account, const QString &password ) { @@ -2112,17 +2145,16 @@ initialView_ = new InitialView( this ); // Connect it so it triggers the login process - connect( initialView_, SIGNAL( connectWithAccount(QString,QString,bool,bool,bool,KMess::MsnStatus) ), - this, SLOT ( connectWithAccount(QString,QString,bool,bool,bool,KMess::MsnStatus) ) ); - connect( initialView_, SIGNAL( disconnectClicked() ), - this, SLOT ( disconnectClicked() ) ); + connect( initialView_, SIGNAL( connectWithAccount(QString,QString,bool,bool,bool,KMess::MsnStatus) ), + this, SLOT ( connectWithAccount(QString,QString,bool,bool,bool,KMess::MsnStatus) ) ); + connect( initialView_, SIGNAL( disconnectClicked() ), + this, SLOT ( disconnectClicked() ) ); // Show settings connect( initialView_, SIGNAL( showSettings(Account*) ), this, SLOT ( showSettingsForAccount(Account*) ) ); - connect( globalSession, SIGNAL( reconnect(QString) ), - initialView_, SLOT ( reconnect(QString) ) ); + // Events connect( globalSession, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ), initialView_, SLOT ( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ) ); Modified: trunk/kmess/src/mainwindow.h =================================================================== --- trunk/kmess/src/mainwindow.h 2010-01-28 14:20:45 UTC (rev 5866) +++ trunk/kmess/src/mainwindow.h 2010-01-28 22:10:42 UTC (rev 5867) @@ -211,6 +211,8 @@ void slotConnectionStatusChanged( Solid::Networking::Status newStatus ); // The user was presented the "contact added user" dialog and has made a choice void slotContactAddedUserDialogChoice( const QString &handle, const QStringList &groupIds, const int code ); + // Record the network library states + void slotStatusEvent( KMess::StatusMessageType type, KMess::StatusMessage message, QVariant data ); // Change the status bar message. void statusMessage( QString message, bool isError ); // The "show allowed contacts" menu item has been toggled. @@ -251,6 +253,10 @@ bool isErrorStatus_; // Whether the user has forced the Idle status or if it's been changed automatically bool isIdleForced_; + // The last account which was connected + QString lastConnectedAccount_; + // Last status event from the library + KMess::StatusMessage lastStatusEvent_; // Current message QString message_; // Minutes online This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pano9000@us...> - 2010-01-28 14:20:53
|
Revision: 5866 http://kmess.svn.sourceforge.net/kmess/?rev=5866&view=rev Author: pano9000 Date: 2010-01-28 14:20:45 +0000 (Thu, 28 Jan 2010) Log Message: ----------- * Merged an updated Dutch translation * Merged an updated Traditional Chinese translation Modified Paths: -------------- branches/kmess/kmess-2.0.x/ChangeLog branches/kmess/kmess-2.0.x/NEWS branches/kmess/kmess-2.0.x/po/nl.po branches/kmess/kmess-2.0.x/po/zh_TW.po Modified: branches/kmess/kmess-2.0.x/ChangeLog =================================================================== --- branches/kmess/kmess-2.0.x/ChangeLog 2010-01-28 14:09:53 UTC (rev 5865) +++ branches/kmess/kmess-2.0.x/ChangeLog 2010-01-28 14:20:45 UTC (rev 5866) @@ -1,13 +1,18 @@ -2009-01-24 (Adam) + +2010-01-28 (Pano) + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + * Merged an updated Dutch translation by Sjors Gielen. + +2010-01-24 (Adam) * New feature: if proxy connection fails, remove proxy details and try again. -2009-01-24 (Pano) +2010-01-24 (Pano) * Added a Russian translation by Dmitriy Simbiriatin. -2009-01-21 (Ruben) +2010-01-21 (Ruben) * Improved layout flexibility of the contact properties dialog. (Trunk backport) -2009-01-20 (Pano) +2010-01-20 (Pano) * Merged an updated Brazilian Portuguese translation by Morris Arozi Moraes. 2010-01-19 (Adam) Modified: branches/kmess/kmess-2.0.x/NEWS =================================================================== --- branches/kmess/kmess-2.0.x/NEWS 2010-01-28 14:09:53 UTC (rev 5865) +++ branches/kmess/kmess-2.0.x/NEWS 2010-01-28 14:20:45 UTC (rev 5866) @@ -6,6 +6,8 @@ - updated French translation by Grégory Bellier. - updated Greek translation by Dimitrios Glentadakis. - updated Brazilian Portuguese translation by Morris Arozi Moraes. +- updated Traditional Chinese translation by Yen-chou Chen. +- updated Dutch translation by Sjors Gielen. Changes between KMess 2.0.2 and 2.0.1: -------------------------------------- Modified: branches/kmess/kmess-2.0.x/po/nl.po =================================================================== --- branches/kmess/kmess-2.0.x/po/nl.po 2010-01-28 14:09:53 UTC (rev 5865) +++ branches/kmess/kmess-2.0.x/po/nl.po 2010-01-28 14:20:45 UTC (rev 5866) @@ -9,15 +9,15 @@ # Heimen <djmusic121@...>, 2009. # Sjors Gielen <dazjorz@...>, 2009. # Sjors Gielen <dazjorz@...>, 2009. -# Sjors Gielen <sjors@...>, 2009. +# Sjors Gielen <sjors@...>, 2009, 2010. msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n"; "POT-Creation-Date: 2010-01-10 17:57+0100\n" -"PO-Revision-Date: 2009-11-05 22:24+0100\n" -"Last-Translator: Sjors Gielen <sjors@...>\n" -"Language-Team: Dutch <kde-i18n-doc@...>\n" +"PO-Revision-Date: 2010-01-24 19:04+0100\n" +"Last-Translator: \n" +"Language-Team: American English <kde-i18n-doc@...>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -784,11 +784,10 @@ msgid "%1 and %2 are typing..." msgstr "%1 en %2 zijn aan het typen..." -#: chat/chatwindow.cpp:2129 -#, fuzzy, kde-format +#: chat/chatwindow.cpp:2129, kde-format msgid "%1, %2 and 1 other are typing..." msgid_plural "%1, %2 and %3 others are typing..." -msgstr[0] "%1, %2 en %3 anderen zijn aan het typen..." +msgstr[0] "%1, %2 en nog iemand zijn aan het typen..." msgstr[1] "%1, %2 en %3 anderen zijn aan het typen..." #: chat/chatwindow.cpp:2613 @@ -2163,25 +2162,24 @@ msgstr[1] "%1 contactpersonen" #: kmessview.cpp:1764 -#, fuzzy msgctxt "Default friendly name tooltip" msgid "Click here to change your friendly name" -msgstr "Klik hier om uw wachtwoord op te laten slaan door KMess" +msgstr "Klik hier om uw schermnaam te veranderen" #: kmessview.cpp:1824 msgctxt "Default personal message shown in the contact list" msgid "[i]Click to set a personal message[/i]" -msgstr "" +msgstr "[i]Klik hier om een persoonlijk bericht in te stellen[/i]" #: kmessview.cpp:1825 -#, fuzzy msgctxt "Default personal message tooltip" msgid "" "Click here to insert a message to show to your contacts: they will see it " "along with your friendly name" msgstr "" -"Voer hier een bericht in om aan uw contacten te tonen. Het wordt samen met " -"uw schermnaam weergegeven." +"Voer hier een bericht in om aan uw contacten te tonen: zij zullen het " +"bericht " +"zien samen met uw schermnaam." #: kmessview.cpp:2005 msgid "No chat logs could be found for this contact." @@ -2389,9 +2387,8 @@ msgstr "Sergio Rafael Lemke" #: main.cpp:91 -#, fuzzy msgid "Morris Arozi Moraes" -msgstr "Maurício Arozi Moraes" +msgstr "Morris Arozi Moraes" #: main.cpp:93 msgid "Catalan translation" @@ -2887,11 +2884,12 @@ #: main.cpp:182 msgid "Internationalization fixes, drag'n'drop of images into display pictures" msgstr "" +"Verbetering van de internationalisering, klik-en-sleep van plaatjes naar " +"contactpersoonplaatjes" #: main.cpp:182 -#, fuzzy msgid "Marco Mentasti" -msgstr "Sarcastisch" +msgstr "Marco Mentasti" #: main.cpp:185 msgid "Inspiration and assorted code" @@ -3491,9 +3489,8 @@ msgstr "De groep is niet leeg" #: network/msnconnection.cpp:454 -#, fuzzy msgid "The group name is too long; it cannot be longer than 61 characters" -msgstr "De groepnaam is te lang; hij kan niet langer zijn dan 61 bytes" +msgstr "De groepnaam is te lang; hij kan niet langer zijn dan 61 tekens" #: network/msnconnection.cpp:459 msgid "Attempted to change group \"0\"" @@ -4371,10 +4368,9 @@ msgid "Select Directory" msgstr "Map selecteren" -#: utils/inlineeditlabel.cpp:147 -#, fuzzy, kde-format +#: utils/inlineeditlabel.cpp:147, kde-format msgid "The text cannot be longer than %1 characters." -msgstr "De groepnaam is te lang; hij kan niet langer zijn dan 61 bytes" +msgstr "De text kan niet langer zijn dan %1 tekens." #: utils/kmess-send/kmesssendplugin.cpp:116 msgid "Send with KMess" @@ -4591,10 +4587,9 @@ msgstr "Probleem met opmerking verzenden" #: rc.cpp:2 -#, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "translations-nl@..." +msgstr "sjors@..." #. i18n: file: chat/chatwindow.ui:190 #. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) @@ -4854,9 +4849,9 @@ #. i18n: file: dialogs/contactpropertiesdialog.ui:46 #. i18n: ectx: property (toolTip), widget (QLabel, imageContact_) #: rc.cpp:141 -#, fuzzy msgid "Click or Drag&Drop to change the image for this contact" -msgstr "Klik hier om het menu van deze contactpersoon te tonen" +msgstr "" +"Klik of klik-en-sleep om het plaatje van deze contactpersoon te veranderen" #. i18n: file: dialogs/contactpropertiesdialog.ui:68 #. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) @@ -5237,7 +5232,7 @@ #. i18n: ectx: property (windowTitle), widget (QWidget, InlineEditLabel) #: rc.cpp:347 rc.cpp:915 msgid "InlineEditLabel" -msgstr "" +msgstr "InlineEditLabel" #. i18n: file: kmessinterfaceui.rc:5 #. i18n: ectx: Menu (file) Modified: branches/kmess/kmess-2.0.x/po/zh_TW.po =================================================================== --- branches/kmess/kmess-2.0.x/po/zh_TW.po 2010-01-28 14:09:53 UTC (rev 5865) +++ branches/kmess/kmess-2.0.x/po/zh_TW.po 2010-01-28 14:20:45 UTC (rev 5866) @@ -10,7 +10,7 @@ "Project-Id-Version: zh_TW\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n"; "POT-Creation-Date: 2010-01-10 17:57+0100\n" -"PO-Revision-Date: 2009-12-02 23:25+0100\n" +"PO-Revision-Date: 2010-01-28 15:20+0100\n" "Last-Translator: Yen-chou Chen <yenchou.mse90@...>\n" "Language-Team: Chinese Traditional <zh-l10n@...>\n" "MIME-Version: 1.0\n" @@ -19,7 +19,8 @@ "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Lokalize 0.3\n" -#: account.cpp:45 account.cpp:744 +#: account.cpp:45 +#: account.cpp:744 msgid "I am away from my computer" msgstr "我不在電腦前" @@ -27,25 +28,16 @@ msgid "Your name" msgstr "您的名稱" -#: account.cpp:57 settings/accountpage.cpp:218 +#: account.cpp:57 +#: settings/accountpage.cpp:218 #: settings/accountsettingsdialog.cpp:205 msgid "you@..." msgstr "you@..." #: accountsmanager.cpp:559 #, kde-format -msgid "" -"<html>Some insecurely stored account passwords have been found.<br />Do you " -"want to import the passwords to the KDE Wallet named '%1', keep the " -"insecurely stored passwords, or delete them permanently?<br /><br /><i>Note: " -"it is not recommended to keep insecurely stored passwords if the KDE Wallet " -"is available, because your passwords will be easily readable in the KMess " -"configuration files.</i></html>" -msgstr "" -"<html>找到一些帳號的密碼存放方式不夠安全。<br />您要將密碼匯入 KDE 錢包 %1," -"還是保持現有狀態,還是要刪除這些密碼?<br /><br /><i>注意:若您可以使用 KDE " -"錢包,最好就使用錢包。一般不安全的存放方式,密碼可以在 KMess 設定檔中被讀取" -"到。</i></html>" +msgid "<html>Some insecurely stored account passwords have been found.<br />Do you want to import the passwords to the KDE Wallet named '%1', keep the insecurely stored passwords, or delete them permanently?<br /><br /><i>Note: it is not recommended to keep insecurely stored passwords if the KDE Wallet is available, because your passwords will be easily readable in the KMess configuration files.</i></html>" +msgstr "<html>找到一些帳號的密碼存放方式不夠安全。<br />您要將密碼匯入 KDE 錢包 %1,還是保持現有狀態,還是要刪除這些密碼?<br /><br /><i>注意:若您可以使用 KDE 錢包,最好就使用錢包。一般不安全的存放方式,密碼可以在 KMess 設定檔中被讀取到。</i></html>" #: accountsmanager.cpp:567 msgctxt "Dialog box caption" @@ -69,13 +61,8 @@ #: chat/chat.cpp:112 msgctxt "Error dialog box text" -msgid "" -"You cannot send invitations when there are multiple contacts in a chat. " -"Please start a separate chat with the contact you wanted to send the " -"invitation to." -msgstr "" -"當聊天室裡有多個聯絡人時,您不能傳送邀請。請分別開啟與接收者的聊天視窗,並重" -"新傳送您的邀請。" +msgid "You cannot send invitations when there are multiple contacts in a chat. Please start a separate chat with the contact you wanted to send the invitation to." +msgstr "當聊天室裡有多個聯絡人時,您不能傳送邀請。請分別開啟與接收者的聊天視窗,並重新傳送您的邀請。" #: chat/chat.cpp:136 #, kde-format @@ -114,11 +101,8 @@ #: chat/chat.cpp:827 #, kde-format -msgid "" -"<html>KMess could not save the log for this chat:<br />The chat logs " -"directory, "%1", does not exist.</html>" -msgstr "" -"<html>KMess 無法儲存此聊天紀錄。<br />因為聊天紀錄目錄 %1 不存在。</html>" +msgid "<html>KMess could not save the log for this chat:<br />The chat logs directory, "%1", does not exist.</html>" +msgstr "<html>KMess 無法儲存此聊天紀錄。<br />因為聊天紀錄目錄 %1 不存在。</html>" #: chat/chat.cpp:969 msgctxt "Message shown in the chat window (when the wink name is unknown)" @@ -132,9 +116,7 @@ msgstr "你送出了動畫快遞 "%1" 。" #: chat/chat.cpp:1007 -msgid "" -"The chat has been disabled because you are no longer connected to the Live " -"Messenger server." +msgid "The chat has been disabled because you are no longer connected to the Live Messenger server." msgstr "此聊天室已關閉,因為您目前並未連線到 Live Messenger 伺服器。" #: chat/chat.cpp:1164 @@ -144,24 +126,19 @@ #: chat/chat.cpp:1174 msgctxt "Warning message shown in chat" -msgid "" -"There were too many different custom emoticons in your last message. Only " -"the first 7 will be sent." +msgid "There were too many different custom emoticons in your last message. Only the first 7 will be sent." msgstr "在你的上一個訊息中有太多不同的自訂表情圖示。將只傳送前 7 個。" #: chat/chat.cpp:1187 #, kde-format msgctxt "Warning message shown in chat, %1 is the contact's friendly name" -msgid "" -"%1 has sent you a voice clip, but KMess does not support voice clips yet." +msgid "%1 has sent you a voice clip, but KMess does not support voice clips yet." msgstr "%1 送給你一段錄音,但是 KMess 尚未支援語音功能。" #: chat/chat.cpp:1201 #, kde-format msgctxt "Warning message shown in chat, %1 is the contact's friendly name" -msgid "" -"%1 has sent you an action message, but KMess does not support action " -"messages yet." +msgid "%1 has sent you an action message, but KMess does not support action messages yet." msgstr "%1 送給你一個動作訊息,但 KMess 尚未支援動作訊息。" #: chat/chat.cpp:1212 @@ -172,32 +149,20 @@ #: chat/chat.cpp:1226 #, kde-format msgctxt "Warning message shown in chat, %1 is the contact's friendly name" -msgid "" -"%1 has sent you a Live Messenger feature that KMess does not support yet." +msgid "%1 has sent you a Live Messenger feature that KMess does not support yet." msgstr "%1 送給你一個 Live Messenger 的特殊功能,但 KMess 尚未支援。" #: chat/chat.cpp:1252 #, kde-format msgctxt "Message shown in the chat window, %1 is the contact's friendly name" -msgid "" -"You received a wink from %1, but displaying winks has been disabled. You can " -"re-enable it in the <a href='kmess://accountconfig'>account settings</a>." -msgstr "" -"你收到 %1 傳送來的動畫快遞,但顯示動畫快遞的功能是關閉的。你可以在<a " -"href='kmess://accountconfig'>帳號設定</a>中重新開啟。"; +msgid "You received a wink from %1, but displaying winks has been disabled. You can re-enable it in the <a href='kmess://accountconfig'>account settings</a>." +msgstr "你收到 %1 傳送來的動畫快遞,但顯示動畫快遞的功能是關閉的。你可以在<a href='kmess://accountconfig'>帳號設定</a>中重新開啟。"; #: chat/chat.cpp:1262 #, kde-format -msgctxt "" -"Message shown in the chat window, %1 is the contact's friendly name, %2 is " -"the wink name" -msgid "" -"You received the "%2" wink from %1, but displaying winks has been " -"disabled. You can re-enable it in the <a href='kmess://"; -"accountconfig'>account settings</a>." -msgstr "" -"你收到從 %1 傳送來的動畫快遞 "%2" ,但顯示動畫快遞的功能是關閉的。" -"你可以在<a href='kmess://accountconfig'>帳號設定</a>中重新開啟。</html>"; +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, %2 is the wink name" +msgid "You received the "%2" wink from %1, but displaying winks has been disabled. You can re-enable it in the <a href='kmess://accountconfig'>account settings</a>." +msgstr "你收到從 %1 傳送來的動畫快遞 "%2" ,但顯示動畫快遞的功能是關閉的。你可以在<a href='kmess://accountconfig'>帳號設定</a>中重新開啟。</html>"; #: chat/chat.cpp:1292 #, kde-format @@ -207,79 +172,49 @@ #: chat/chat.cpp:1299 #, kde-format -msgctxt "" -"Message shown in the chat window, %1 is the contact's friendly name, %2 is " -"the wink name" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, %2 is the wink name" msgid "%1 has sent you a wink: "%2"!" msgstr "%1 傳送了一個動畫快遞: "%2" 給你!" #: chat/chat.cpp:1321 #, kde-format msgctxt "Message shown in the chat window, %1 is the contact's friendly name" -msgid "" -"You received a wink from %1, but it could not be displayed. Make sure you " -"have the "cabextract" program installed." -msgstr "" -"你已從 %1 接收到動畫快遞,但無法顯示。請確定你已安裝 "" -"cabextract" 。" +msgid "You received a wink from %1, but it could not be displayed. Make sure you have the "cabextract" program installed." +msgstr "你已從 %1 接收到動畫快遞,但無法顯示。請確定你已安裝 "cabextract" 。" #: chat/chat.cpp:1330 #, kde-format -msgctxt "" -"Message shown in the chat window, %1 is the contact's friendly name, %2 is " -"the wink name" -msgid "" -"You received the "%2" wink from %1, but it could not be displayed. " -"Make sure you have the "cabextract" program installed." -msgstr "" -"你已從 %1 接收到動畫快遞: "%2" ,但無法顯示。請確定你已安裝 "" -"cabextract" 。" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, %2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not be displayed. Make sure you have the "cabextract" program installed." +msgstr "你已從 %1 接收到動畫快遞: "%2" ,但無法顯示。請確定你已安裝 "cabextract" 。" #: chat/chat.cpp:1342 #, kde-format msgctxt "Message shown in the chat window, %1 is the contact's friendly name" -msgid "" -"You received a wink from %1, but it could not be displayed. Extracting the " -"wink package with "cabextract" has failed." -msgstr "" -"你從 %1 收到動畫快遞,但無法顯示。以 "cabextract" 解開動畫快遞時發" -"生錯誤。" +msgid "You received a wink from %1, but it could not be displayed. Extracting the wink package with "cabextract" has failed." +msgstr "你從 %1 收到動畫快遞,但無法顯示。以 "cabextract" 解開動畫快遞時發生錯誤。" #: chat/chat.cpp:1351 #, kde-format -msgctxt "" -"Message shown in the chat window, %1 is the contact's friendly name, %2 is " -"the wink name" -msgid "" -"You received the "%2" wink from %1, but it could not be displayed. " -"Extracting the wink package with "cabextract" has failed." -msgstr "" -"你從 %1 收到動畫快遞: "%2" ,但無法顯示。以 "" -"cabextract" 解開動畫快遞時發生錯誤。" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, %2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not be displayed. Extracting the wink package with "cabextract" has failed." +msgstr "你從 %1 收到動畫快遞: "%2" ,但無法顯示。以 "cabextract" 解開動畫快遞時發生錯誤。" #: chat/chat.cpp:1363 #, kde-format msgctxt "Message shown in the chat window, %1 is the contact's friendly name" -msgid "" -"You received a wink from %1, but it could not be displayed. The data could " -"not be read." +msgid "You received a wink from %1, but it could not be displayed. The data could not be read." msgstr "你收到從 %1 送來的動畫快遞,但無法顯示。資料無法讀取。" #: chat/chat.cpp:1372 #, kde-format -msgctxt "" -"Message shown in the chat window, %1 is the contact's friendly name, %2 is " -"the wink name" -msgid "" -"You received the "%2" wink from %1, but it could not be displayed. " -"The data could not be read." +msgctxt "Message shown in the chat window, %1 is the contact's friendly name, %2 is the wink name" +msgid "You received the "%2" wink from %1, but it could not be displayed. The data could not be read." msgstr "你收到 %1 送來的動畫快遞:"%2",但無法顯示。資料無法讀取。" #: chat/chat.cpp:1414 #, kde-format -msgid "" -"%1 has gone offline. Any messages you send will be delivered the next time " -"he or she logs in." +msgid "%1 has gone offline. Any messages you send will be delivered the next time he or she logs in." msgstr "%1 已離線。任何新送的訊息都會在下次他們登入時傳送。" #: chat/chat.cpp:1419 @@ -298,9 +233,7 @@ msgstr "%1 傳送了一個來電振動給你!" #: chat/chat.cpp:1493 -msgctxt "" -"Phrase to be inserted in place of a contact name, when a message can't be " -"delivered to any of the recipients" +msgctxt "Phrase to be inserted in place of a contact name, when a message can't be delivered to any of the recipients" msgid "all contacts" msgstr "所有聯絡人" @@ -324,17 +257,13 @@ #: chat/chat.cpp:1536 #, kde-format -msgctxt "" -"Error message shown in chat, %1 is the sent message, %2 is the contact's " -"friendly name" +msgctxt "Error message shown in chat, %1 is the sent message, %2 is the contact's friendly name" msgid "Failed to send the message to %2:<br/>%1" msgstr "傳送訊息給 %2 時失敗:<br/>%1" #: chat/chat.cpp:1619 #, kde-format -msgid "" -"The file "%1" could not be found on your computer, and the " -"download failed." +msgid "The file "%1" could not be found on your computer, and the download failed." msgstr "在電腦中找不到檔案 "%1",下載也失敗。" #: chat/chat.cpp:1656 @@ -349,27 +278,19 @@ #: chat/chat.cpp:1728 #, kde-format -msgid "" -"%1 is currently offline. Any messages you send will be delivered the next " -"time he or she logs in." +msgid "%1 is currently offline. Any messages you send will be delivered the next time he or she logs in." msgstr "%1 目前離線中。任何你送的訊息都會在下次他們登入時傳送。" #: chat/chatmaster.cpp:1316 #, kde-format msgctxt "Error message shown in chat, %1 is the name of the contact" -msgid "" -"You received an handwritten message from %1, but it could not be displayed. " -"This version of KMess was built without ISF support." -msgstr "" -"你收到從 %1 送來的手寫訊息,但無法顯示。這個版本的 KMess 沒有以 ISF 支援來編" -"譯。" +msgid "You received an handwritten message from %1, but it could not be displayed. This version of KMess was built without ISF support." +msgstr "你收到從 %1 送來的手寫訊息,但無法顯示。這個版本的 KMess 沒有以 ISF 支援來編譯。" #: chat/chatmaster.cpp:1337 #, kde-format msgctxt "Error message shown in chat, %1 is the name of the contact" -msgid "" -"You received an handwritten message from %1, but it could not be displayed. " -"The data could not be read." +msgid "You received an handwritten message from %1, but it could not be displayed. The data could not be read." msgstr "你收到從 %1 送來的手寫訊息,但無法顯示。資料無法讀取。" #: chat/chatmaster.cpp:1466 @@ -384,16 +305,13 @@ #: chat/chatmessageview.cpp:345 #, kde-format -msgctxt "" -"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgctxt "Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" msgid "Chat with %1<br/>Started on: %2" msgstr "與 %1 的對話<br/>開始於:%2" #: chat/chatmessageview.cpp:392 #, kde-format -msgctxt "" -"Header of a single chat saved as plain text chat log: %1 is the chat date " -"and time" +msgctxt "Header of a single chat saved as plain text chat log: %1 is the chat date and time" msgid "Chat started on: %1" msgstr "對話開始於:%1" @@ -403,7 +321,8 @@ msgid "Saved KMess chats with %1" msgstr "儲存與 %1 的 KMess 對話" -#: chat/chatmessageview.cpp:1095 utils/richtextparser.cpp:658 +#: chat/chatmessageview.cpp:1095 +#: utils/richtextparser.cpp:658 #, kde-format msgid "Add this emoticon: %1" msgstr "加入這個表情符號:%1" @@ -429,8 +348,7 @@ #, kde-format msgid "" "Could not save chat log in directory '%1'.\n" -"Make sure you have permission to write in the folder where logs are being " -"saved." +"Make sure you have permission to write in the folder where logs are being saved." msgstr "" "無法將聊天紀錄儲存在目錄 %1。\n" "請確定您有寫入儲存紀錄的資料夾的權限。" @@ -455,12 +373,14 @@ "檔案 %1 已存在。\n" "您要覆寫它嗎?" -#: chat/chatview.cpp:568 network/applications/filetransfer.cpp:261 +#: chat/chatview.cpp:568 +#: network/applications/filetransfer.cpp:261 #: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "覆寫檔案" -#: chat/chatview.cpp:569 network/applications/filetransfer.cpp:261 +#: chat/chatview.cpp:569 +#: network/applications/filetransfer.cpp:261 #: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "覆寫(&W)" @@ -493,7 +413,8 @@ msgid "Copy &Address" msgstr "複製地址(&A)" -#: chat/chatview.cpp:965 chat/chatwindow.cpp:539 +#: chat/chatview.cpp:965 +#: chat/chatwindow.cpp:539 msgid "C&lear Chat" msgstr "清除聊天紀錄(&L)" @@ -505,7 +426,8 @@ msgid "Contacts" msgstr "聯絡人" -#: chat/chatwindow.cpp:129 settings/accountsettingsdialog.cpp:90 +#: chat/chatwindow.cpp:129 +#: settings/accountsettingsdialog.cpp:90 #: settings/accountsettingsdialog.cpp:91 msgid "Emoticons" msgstr "表情符號" @@ -515,13 +437,8 @@ msgstr "我的表情符號" #: chat/chatwindow.cpp:375 -msgid "" -"<html>There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?<br /><br /><i>Note: You can close all " -"tabs at once by pressing Alt+F4.</i></html>" -msgstr "" -"<html>在此聊天視窗中開啟了多個分頁。你要關閉目前的分頁,還是所有的分頁?<br /" -"><br /><i>注意:你可以用 Alt+F4 一次關閉所有的分頁。</i></html>" +msgid "<html>There are multiple tabs open in this chat window. Do you want to close the current tab only, or all tabs?<br /><br /><i>Note: You can close all tabs at once by pressing Alt+F4.</i></html>" +msgstr "<html>在此聊天視窗中開啟了多個分頁。你要關閉目前的分頁,還是所有的分頁?<br /><br /><i>注意:你可以用 Alt+F4 一次關閉所有的分頁。</i></html>" #: chat/chatwindow.cpp:379 msgctxt "Dialog box caption: closing a chatwindow with a single tab" @@ -588,11 +505,13 @@ msgid "Send a &File" msgstr "傳送檔案(&F)" -#: chat/chatwindow.cpp:492 chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:492 +#: chat/chatwindow.cpp:493 msgid "P&revious Tab" msgstr "前一個分頁(&r)" -#: chat/chatwindow.cpp:494 chat/chatwindow.cpp:495 +#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:495 msgid "Ne&xt Tab" msgstr "下一個分頁(&x)" @@ -600,7 +519,8 @@ msgid "Enable or disable the contacts panel" msgstr "開啟或關閉聯絡人面板" -#: chat/chatwindow.cpp:511 chat/chatwindow.cpp:512 +#: chat/chatwindow.cpp:511 +#: chat/chatwindow.cpp:512 msgctxt "Toolbar button" msgid "Contacts" msgstr "聯絡人" @@ -609,7 +529,8 @@ msgid "Enable or disable the standard emoticons panel" msgstr "開啟或關閉標準表情符號面板" -#: chat/chatwindow.cpp:517 chat/chatwindow.cpp:518 +#: chat/chatwindow.cpp:517 +#: chat/chatwindow.cpp:518 msgctxt "Toolbar button" msgid "Emoticons" msgstr "表情符號" @@ -618,7 +539,8 @@ msgid "Enable or disable the custom emoticons panel" msgstr "開啟或關閉自定表情符號面板" -#: chat/chatwindow.cpp:523 chat/chatwindow.cpp:524 +#: chat/chatwindow.cpp:523 +#: chat/chatwindow.cpp:524 msgctxt "Toolbar button" msgid "My Emoticons" msgstr "我的表情符號" @@ -636,14 +558,8 @@ msgstr "清除聊天視窗(&L)" #: chat/chatwindow.cpp:1105 -msgid "" -"<html>You used an incorrect syntax for the /status command. The correct " -"syntax is: <b>/status online|away|idle|brb|busy|lunch|phone|invisible</b>." -"<br/>You can also use shortcuts like <b>/online</b> or <b>/phone</b>.</html>" -msgstr "" -"<html>您的 /status 指令用了不正確的語法。正確的語法為:<b>/status online|" -"away|idle|brb|busy|lunch|phone|invisible</b>。<br />您也可以直接使用 <b>/" -"online</b>,<b>/phone</b> 等。</html>" +msgid "<html>You used an incorrect syntax for the /status command. The correct syntax is: <b>/status online|away|idle|brb|busy|lunch|phone|invisible</b>.<br/>You can also use shortcuts like <b>/online</b> or <b>/phone</b>.</html>" +msgstr "<html>您的 /status 指令用了不正確的語法。正確的語法為:<b>/status online|away|idle|brb|busy|lunch|phone|invisible</b>。<br />您也可以直接使用 <b>/online</b>,<b>/phone</b> 等。</html>" #: chat/chatwindow.cpp:1108 msgctxt "Dialog box caption for wrong command syntax warning" @@ -670,12 +586,8 @@ #: chat/chatwindow.cpp:1216 #, kde-format -msgid "" -"<html>Unknown command <b>%1</b>. If you did not want this message to be a " -"command, prepend your message with another /.</html>" -msgstr "" -"<html>未知的指令 <b>%1</b>。若您並不是要輸入指令,請在您的訊息上再加一個 / 。" -"</html>" +msgid "<html>Unknown command <b>%1</b>. If you did not want this message to be a command, prepend your message with another /.</html>" +msgstr "<html>未知的指令 <b>%1</b>。若您並不是要輸入指令,請在您的訊息上再加一個 / 。</html>" #: chat/chatwindow.cpp:1219 msgctxt "Caption when an unknown command was requested" @@ -689,9 +601,7 @@ #: chat/chatwindow.cpp:1512 msgctxt "Error message shown in chat" -msgid "" -"Failed to send the handwritten message: an error has occurred while creating " -"it." +msgid "Failed to send the handwritten message: an error has occurred while creating it." msgstr "傳送手寫訊息給時失敗:當創建它時發生錯誤。" #: chat/chatwindow.cpp:1802 @@ -705,17 +615,15 @@ msgid "%1 - Chat" msgstr "%1 ─ 聊天" -#: chat/chatwindow.cpp:1826 kmessinterface.cpp:674 +#: chat/chatwindow.cpp:1826 +#: kmessinterface.cpp:674 #, kde-format msgctxt "Question dialog box message" -msgid "" -"<html>Are you sure you want to hide the menu bar? You will be able to show " -"it again by using this keyboard shortcut: <b>%1</b></html>" -msgstr "" -"<html>您確定您要隱藏選單列嗎?您可以用此快捷鍵來重新顯示選單:<b>%1</b></" -"html>" +msgid "<html>Are you sure you want to hide the menu bar? You will be able to show it again by using this keyboard shortcut: <b>%1</b></html>" +msgstr "<html>您確定您要隱藏選單列嗎?您可以用此快捷鍵來重新顯示選單:<b>%1</b></html>" -#: chat/chatwindow.cpp:1830 kmessinterface.cpp:678 +#: chat/chatwindow.cpp:1830 +#: kmessinterface.cpp:678 msgctxt "Dialog box caption: hiding the menu bar" msgid "Hiding the Menu" msgstr "隱藏選單" @@ -726,7 +634,8 @@ #. i18n: file: chat/chatwindow.ui:364 #. i18n: ectx: property (toolTip), widget (QToolButton, inkEraseButton_) -#: chat/chatwindow.cpp:1922 rc.cpp:41 +#: chat/chatwindow.cpp:1922 +#: rc.cpp:41 msgid "Erase brush" msgstr "橡皮擦" @@ -741,7 +650,7 @@ msgstr "%1 與 %2 正在輸入..." #: chat/chatwindow.cpp:2129 -#, fuzzy, kde-format +#, kde-format msgid "%1, %2 and 1 other are typing..." msgid_plural "%1, %2 and %3 others are typing..." msgstr[0] "%1,%2 和其他 %3 個人正在輸入..." @@ -749,45 +658,36 @@ #: chat/chatwindow.cpp:2613 #, kde-format msgctxt "Tool tip for chat tabs" -msgid "" -"<html><h2>Chat Info</h2><dl><dt><b>Contacts:</b></dt><dd><ul><li>%1</li></" -"ul></dd><dt><b>Chat started on:</b></dt><dd>%2</dd><dt><b>Connected with " -"account:</b></dt><dd>%3</dd></dl></html>" -msgstr "" -"<html><h2>聊天資訊</h2><dl><dt><b>聯絡人:</b></dt><dd><ul><li>%1</li></ul></" -"dd><dt><b>聊天開始於:</b></dt><dd>%2</dd><dt><b>連線帳號:</b></dt><dd>%3</" -"dd></dl></html>" +msgid "<html><h2>Chat Info</h2><dl><dt><b>Contacts:</b></dt><dd><ul><li>%1</li></ul></dd><dt><b>Chat started on:</b></dt><dd>%2</dd><dt><b>Connected with account:</b></dt><dd>%3</dd></dl></html>" +msgstr "<html><h2>聊天資訊</h2><dl><dt><b>聯絡人:</b></dt><dd><ul><li>%1</li></ul></dd><dt><b>聊天開始於:</b></dt><dd>%2</dd><dt><b>連線帳號:</b></dt><dd>%3</dd></dl></html>" #. i18n: file: chat/chatwindow.ui:212 #. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) -#: chat/chatwindow.cpp:2749 rc.cpp:11 +#: chat/chatwindow.cpp:2749 +#: rc.cpp:11 msgid "Handwriting mode" msgstr "手寫模式" #: chat/chatwindow.cpp:2758 msgctxt "Label text" -msgid "" -"Handwriting is disabled: some of the contacts do not support receiving " -"handwritten messages." +msgid "Handwriting is disabled: some of the contacts do not support receiving handwritten messages." msgstr "手寫功能已關閉:某些聯絡人不支援接收手寫訊息。" #: chat/chatwindow.cpp:2764 msgctxt "Label text" -msgid "" -"Handwriting is disabled: this contact does not support receiving handwritten " -"messages." +msgid "Handwriting is disabled: this contact does not support receiving handwritten messages." msgstr "手寫功能已關閉:此聯絡人不支援接收手寫訊息。" #. i18n: file: chat/chatwindow.ui:276 #. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) -#: chat/chatwindow.cpp:2772 rc.cpp:29 +#: chat/chatwindow.cpp:2772 +#: rc.cpp:29 msgid "Winks" msgstr "動畫快遞" #: chat/chatwindow.cpp:2781 msgctxt "Label text" -msgid "" -"Winks are disabled: some of the contacts do not support receiving winks." +msgid "Winks are disabled: some of the contacts do not support receiving winks." msgstr "動畫快遞已關閉:某些聯絡人不支援接收動畫快遞。" #: chat/chatwindow.cpp:2787 @@ -799,57 +699,71 @@ msgid "&Start Private Chat" msgstr "開始私密聊天(&S)" -#: chat/contactframe.cpp:350 kmessview.cpp:689 +#: chat/contactframe.cpp:350 +#: kmessview.cpp:689 msgid "&Send Email" msgstr "傳送電子郵件(&S)" -#: chat/contactframe.cpp:351 kmessview.cpp:690 +#: chat/contactframe.cpp:351 +#: kmessview.cpp:690 msgid "&View Profile" msgstr "檢視帳號(&V)" -#: chat/contactframe.cpp:353 chat/contactframe.cpp:406 kmessview.cpp:692 +#: chat/contactframe.cpp:353 +#: chat/contactframe.cpp:406 +#: kmessview.cpp:692 msgid "&Properties" msgstr "特性(&P)" -#: chat/contactframe.cpp:355 kmessview.cpp:694 +#: chat/contactframe.cpp:355 +#: kmessview.cpp:694 msgid "&Add Contact" msgstr "新增聯絡人(&A)" -#: chat/contactframe.cpp:356 kmessview.cpp:695 +#: chat/contactframe.cpp:356 +#: kmessview.cpp:695 msgid "A&llow Contact" msgstr "允許此聯絡人(&l)" -#: chat/contactframe.cpp:357 kmessview.cpp:698 +#: chat/contactframe.cpp:357 +#: kmessview.cpp:698 msgid "&Delete Contact" msgstr "刪除此聯絡人(&D)" -#: chat/contactframe.cpp:359 kmessview.cpp:696 +#: chat/contactframe.cpp:359 +#: kmessview.cpp:696 msgid "&Block Contact" msgstr "封鎖此聯絡人(&B)" -#: chat/contactframe.cpp:360 kmessview.cpp:697 +#: chat/contactframe.cpp:360 +#: kmessview.cpp:697 msgid "&Unblock Contact" msgstr "解除此聯絡人的封鎖(&U)" -#: chat/contactframe.cpp:362 kmessview.cpp:701 +#: chat/contactframe.cpp:362 +#: kmessview.cpp:701 msgid "&Friendly Name" msgstr "暱稱(&F)" -#: chat/contactframe.cpp:363 kmessview.cpp:702 +#: chat/contactframe.cpp:363 +#: kmessview.cpp:702 msgid "&Personal Message" msgstr "個人訊息(&P)" -#: chat/contactframe.cpp:364 kmessview.cpp:703 +#: chat/contactframe.cpp:364 +#: kmessview.cpp:703 msgid "&Email Address" msgstr "電子郵件位址(&E)" -#: chat/contactframe.cpp:365 kmessview.cpp:704 +#: chat/contactframe.cpp:365 +#: kmessview.cpp:704 msgid "Song &Name" msgstr "歌曲名稱(&N)" #. i18n: file: dialogs/contactpropertiesdialog.ui:24 #. i18n: ectx: attribute (title), widget (QWidget, tab) -#: chat/contactframe.cpp:367 rc.cpp:138 +#: chat/contactframe.cpp:367 +#: rc.cpp:138 msgid "&Information" msgstr "資訊(&I)" @@ -859,17 +773,20 @@ #. i18n: file: dialogs/contactpropertiesdialog.ui:363 #. i18n: ectx: attribute (title), widget (QWidget, tab_3) -#: chat/contactframe.cpp:369 rc.cpp:174 +#: chat/contactframe.cpp:369 +#: rc.cpp:174 msgid "&Notes" msgstr "備忘(&N)" #. i18n: file: dialogs/contactpropertiesdialog.ui:373 #. i18n: ectx: attribute (title), widget (QWidget, tab_4) -#: chat/contactframe.cpp:370 rc.cpp:177 +#: chat/contactframe.cpp:370 +#: rc.cpp:177 msgid "&Emoticons" msgstr "表情符號(&E)" -#: chat/contactframe.cpp:399 kmessview.cpp:739 +#: chat/contactframe.cpp:399 +#: kmessview.cpp:739 msgid "&Copy" msgstr "複製(&C)" @@ -879,23 +796,29 @@ #: chat/contactframe.cpp:816 #, kde-format -msgctxt "" -"Tooltip for a contact's status icon, arg %1 is the Live Messenger status, " -"like 'Online'" +msgctxt "Tooltip for a contact's status icon, arg %1 is the Live Messenger status, like 'Online'" msgid "The contact is %1" msgstr "此聯絡人的狀態為%1" -#: chat/contactswidget.cpp:298 kmessview.cpp:523 settings/accountpage.cpp:489 +#: chat/contactswidget.cpp:298 +#: kmessview.cpp:523 +#: settings/accountpage.cpp:489 msgid "Downloading of display picture failed" msgstr "下載顯示圖片失敗" -#: chat/contactswidget.cpp:298 chat/contactswidget.cpp:334 kmessview.cpp:523 -#: kmessview.cpp:560 main.cpp:43 settings/accountpage.cpp:489 +#: chat/contactswidget.cpp:298 +#: chat/contactswidget.cpp:334 +#: kmessview.cpp:523 +#: kmessview.cpp:560 +#: main.cpp:43 +#: settings/accountpage.cpp:489 #: settings/accountpage.cpp:550 msgid "KMess" msgstr "KMess" -#: chat/contactswidget.cpp:332 kmessview.cpp:558 settings/accountpage.cpp:548 +#: chat/contactswidget.cpp:332 +#: kmessview.cpp:558 +#: settings/accountpage.cpp:548 msgid "" "An error occurred while trying to change the display picture.\n" "Make sure that you have selected an existing image file." @@ -905,12 +828,8 @@ #: chat/emoticonswidget.cpp:290 msgctxt "Informative label on the chat's emoticons bar" -msgid "" -"<html><p><b>You have not added any custom emoticons yet.</b></p><p>To add " -"new emoticons, <a href='#'>click here</a>!</p></html>" -msgstr "" -"<html><p><b>您尚未加入任何自訂的表情符號。</b></p><p>要新增表情符號,請<a " -"href='#'>點選這裡</a>。</p></html>" +msgid "<html><p><b>You have not added any custom emoticons yet.</b></p><p>To add new emoticons, <a href='#'>click here</a>!</p></html>" +msgstr "<html><p><b>您尚未加入任何自訂的表情符號。</b></p><p>要新增表情符號,請<a href='#'>點選這裡</a>。</p></html>" #: chat/emoticonswidget.cpp:439 msgid "Add to Chat" @@ -924,18 +843,15 @@ msgid "Edit" msgstr "編輯" -#: chat/emoticonswidget.cpp:442 kmess.cpp:580 +#: chat/emoticonswidget.cpp:442 +#: kmess.cpp:580 msgid "Remove" msgstr "移除" #: chat/winkswidget.cpp:94 msgctxt "Informative label on the chat's winks bar" -msgid "" -"<html><p><b>You do not have any winks yet.</b></p><p>To add new ones, have " -"your contacts send you some!</p></html>" -msgstr "" -"<html><p><b>您尚未加入任何動畫快遞。</b></p><p>要新增動畫快遞,請您的聯絡人送" -"一些給您!</p></html>" +msgid "<html><p><b>You do not have any winks yet.</b></p><p>To add new ones, have your contacts send you some!</p></html>" +msgstr "<html><p><b>您尚未加入任何動畫快遞。</b></p><p>要新增動畫快遞,請您的聯絡人送一些給您!</p></html>" #: contact/contactbase.cpp:290 msgid "Windows Mobile" @@ -957,7 +873,8 @@ msgid "Windows Media Center" msgstr "Windows 媒體中心" -#: contact/contactbase.cpp:313 contact/contactbase.cpp:318 +#: contact/contactbase.cpp:313 +#: contact/contactbase.cpp:318 #, kde-format msgid "MSN Messenger %1 compatible" msgstr "MSN Messenger %1 相容" @@ -980,16 +897,23 @@ msgid "Windows Live Messenger compatible" msgstr "Windows Live Messenger 相容" -#: contact/msnstatus.cpp:159 contact/msnstatus.cpp:172 initialview.cpp:85 -#: model/contactlist.cpp:1825 settings/accountpage.cpp:99 +#: contact/msnstatus.cpp:159 +#: contact/msnstatus.cpp:172 +#: initialview.cpp:85 +#: model/contactlist.cpp:1825 +#: settings/accountpage.cpp:99 msgid "Online" msgstr "上線" -#: contact/msnstatus.cpp:160 initialview.cpp:88 settings/accountpage.cpp:102 +#: contact/msnstatus.cpp:160 +#: initialview.cpp:88 +#: settings/accountpage.cpp:102 msgid "Busy" msgstr "忙啦" -#: contact/msnstatus.cpp:161 initialview.cpp:86 settings/accountpage.cpp:100 +#: contact/msnstatus.cpp:161 +#: initialview.cpp:86 +#: settings/accountpage.cpp:100 msgid "Away" msgstr "離開" @@ -1001,27 +925,37 @@ msgid "Idle" msgstr "閒置" -#: contact/msnstatus.cpp:164 initialview.cpp:87 settings/accountpage.cpp:101 +#: contact/msnstatus.cpp:164 +#: initialview.cpp:87 +#: settings/accountpage.cpp:101 msgid "Be Right Back" msgstr "馬上回來" -#: contact/msnstatus.cpp:165 initialview.cpp:90 settings/accountpage.cpp:104 +#: contact/msnstatus.cpp:165 +#: initialview.cpp:90 +#: settings/accountpage.cpp:104 msgid "On the Phone" msgstr "請等等...電話中" -#: contact/msnstatus.cpp:166 initialview.cpp:89 settings/accountpage.cpp:103 +#: contact/msnstatus.cpp:166 +#: initialview.cpp:89 +#: settings/accountpage.cpp:103 msgid "Out to Lunch" msgstr "外出午餐" -#: contact/msnstatus.cpp:167 initialview.cpp:91 settings/accountpage.cpp:105 +#: contact/msnstatus.cpp:167 +#: initialview.cpp:91 +#: settings/accountpage.cpp:105 msgid "Invisible" msgstr "隱形" -#: contact/msnstatus.cpp:168 model/contactlist.cpp:1826 +#: contact/msnstatus.cpp:168 +#: model/contactlist.cpp:1826 msgid "Offline" msgstr "離線" -#: contact/msnstatus.cpp:195 contact/msnstatus.cpp:197 +#: contact/msnstatus.cpp:195 +#: contact/msnstatus.cpp:197 msgid "&My Status" msgstr "我的狀態(&M)" @@ -1034,7 +968,8 @@ msgid "Add a Contact" msgstr "新增聯絡人" -#: dialogs/addemoticondialog.cpp:61 dialogs/addemoticondialog.cpp:304 +#: dialogs/addemoticondialog.cpp:61 +#: dialogs/addemoticondialog.cpp:304 msgid "Add New Emoticon" msgstr "新增表情符號" @@ -1051,15 +986,8 @@ msgstr "請輸入與此表情符號有關連的文字。" #: dialogs/addemoticondialog.cpp:203 -msgid "" -"Shortcuts must not:<ul><li>be longer than 7 characters,</li><li>start with " -"\"/\" (they would interfere with irc-like commands),</li><li>contain square " -"brackets with text within (like [b] or [color], which can be text formatting " -"options)</li></ul>" -msgstr "" -"捷徑不能為:<ul><li>長過 7 個字元,</li><li>以 \"/\" 為開頭(它們為類似 irc " -"指令的介面),</li><li>包含內含文字的方框(例如:[b] 或 [彩色],這些為文字格" -"式選項)</li></ul>" +msgid "Shortcuts must not:<ul><li>be longer than 7 characters,</li><li>start with \"/\" (they would interfere with irc-like commands),</li><li>contain square brackets with text within (like [b] or [color], which can be text formatting options)</li></ul>" +msgstr "捷徑不能為:<ul><li>長過 7 個字元,</li><li>以 \"/\" 為開頭(它們為類似 irc 指令的介面),</li><li>包含內含文字的方框(例如:[b] 或 [彩色],這些為文字格式選項)</li></ul>" #: dialogs/addemoticondialog.cpp:303 #, kde-format @@ -1078,13 +1006,8 @@ #: dialogs/chathistorydialog.cpp:305 #, kde-format msgctxt "Dialog box text" -msgid "" -"There has been an error while opening your logs. This is commonly a " -"permission problem, check if you have read/write access to directory " -"<i>"%1"</i>. Otherwise, your logs may be corrupted." -msgstr "" -"當開啟你的紀錄時出現了一個錯誤。通常這是權限問題,請檢查您是否有讀取/寫入資料" -"夾<i>\"%1\"</i>的權限。若不是權限問題,可能是您的紀錄已損毀。" +msgid "There has been an error while opening your logs. This is commonly a permission problem, check if you have read/write access to directory <i>"%1"</i>. Otherwise, your logs may be corrupted." +msgstr "當開啟你的紀錄時出現了一個錯誤。通常這是權限問題,請檢查您是否有讀取/寫入資料夾<i>\"%1\"</i>的權限。若不是權限問題,可能是您的紀錄已損毀。" #: dialogs/chathistorydialog.cpp:310 msgctxt "Dialog box title" @@ -1128,16 +1051,21 @@ msgid "Contact Properties for %1" msgstr "%1 的聯絡人特性" -#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:816 kmessview.cpp:1290 -#: network/msnsockethttp.cpp:199 network/msnsockettcp.cpp:386 +#: dialogs/contactpropertiesdialog.cpp:399 +#: kmess.cpp:816 +#: kmessview.cpp:1290 +#: network/msnsockethttp.cpp:199 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "已連線" -#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1294 +#: dialogs/contactpropertiesdialog.cpp:403 +#: kmessview.cpp:1294 msgid "Not seen yet" msgstr "尚未看到" -#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1309 +#: dialogs/contactpropertiesdialog.cpp:412 +#: kmessview.cpp:1309 msgid "No messages yet" msgstr "尚未有訊息" @@ -1215,8 +1143,10 @@ #. i18n: file: dialogs/networkwindow.ui:13 #. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) -#: dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1281 -#: dialogs/networkwindow.cpp:1308 rc.cpp:237 +#: dialogs/networkwindow.cpp:57 +#: dialogs/networkwindow.cpp:1281 +#: dialogs/networkwindow.cpp:1308 +#: rc.cpp:237 msgid "Network Window" msgstr "網路視窗" @@ -1241,9 +1171,7 @@ "無法開啟網路視窗。" #: dialogs/networkwindow.cpp:1132 -msgid "" -"Could not save the Network Window log. Make sure you have permission to " -"write in the folder where it is being saved." +msgid "Could not save the Network Window log. Make sure you have permission to write in the folder where it is being saved." msgstr "無法儲存網路視窗紀錄。請確定您有寫入紀錄資料夾的權限。" #: dialogs/networkwindow.cpp:1179 @@ -1251,29 +1179,23 @@ msgstr "無法關閉主連結標籤" #: dialogs/networkwindow.cpp:1275 -msgid "" -"Sending commands to the server is a risky operation.<br />If you do not know " -"how to exactly do it, you could be lucky and just get disconnected, or " -"<i>you may incur in more serious consequences</i>.<br />You have been warned!" -"<br /><b>Do you want to continue sending this message?</b>" -msgstr "" -"傳送指令到伺服器是很冒險的。<br />若您不知道怎麼做卻要硬做,運氣好的話您只是" -"被踢出去,不好的話<i>會導致嚴重的後果</i>。<br />我們已經警告您了!<br /> <b>" -"您還是要繼續傳送此訊息嗎?</b>" +msgid "Sending commands to the server is a risky operation.<br />If you do not know how to exactly do it, you could be lucky and just get disconnected, or <i>you may incur in more serious consequences</i>.<br />You have been warned!<br /><b>Do you want to continue sending this message?</b>" +msgstr "傳送指令到伺服器是很冒險的。<br />若您不知道怎麼做卻要硬做,運氣好的話您只是被踢出去,不好的話<i>會導致嚴重的後果</i>。<br />我們已經警告您了!<br /> <b>您還是要繼續傳送此訊息嗎?</b>" #: dialogs/networkwindow.cpp:1305 msgid "" -"The payload you are trying to send does not end with the required newline " -"('\\r\\n')!<br />Do you want KMess to add it for you?" +"The payload you are trying to send does not end with the required newline ('\\r\\n" +"')!<br />Do you want KMess to add it for you?" msgstr "" -"您試圖傳送的資料內容並未以換行字元〈'\\r\\n'〉結束!<br />要讓 KMess 自動將它" -"加上嗎?" +"您試圖傳送的資料內容並未以換行字元〈'\\r\\n" +"'〉結束!<br />要讓 KMess 自動將它加上嗎?" #: dialogs/networkwindow.cpp:1381 msgid "Cannot send commands to this kind of connection!" msgstr "無法傳送指令給此類型的連線。" -#: dialogs/transferentry.cpp:132 network/applications/filetransfer.cpp:127 +#: dialogs/transferentry.cpp:132 +#: network/applications/filetransfer.cpp:127 #: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 #: network/applications/filetransferp2p.cpp:766 @@ -1290,19 +1212,22 @@ msgid "Completed" msgstr "完成" -#: dialogs/transferentry.cpp:270 network/applications/filetransfer.cpp:635 +#: dialogs/transferentry.cpp:270 +#: network/applications/filetransfer.cpp:635 #: network/applications/filetransferp2p.cpp:741 #, kde-format msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:275 network/applications/filetransfer.cpp:640 +#: dialogs/transferentry.cpp:275 +#: network/applications/filetransfer.cpp:640 #: network/applications/filetransferp2p.cpp:746 #, kde-format msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:279 network/applications/filetransfer.cpp:644 +#: dialogs/transferentry.cpp:279 +#: network/applications/filetransfer.cpp:644 #: network/applications/filetransferp2p.cpp:750 #, kde-format msgid "%1 bytes" @@ -1324,7 +1249,8 @@ #. i18n: file: settings/miscellaneouspage.ui:285 #. i18n: ectx: attribute (title), widget (QWidget, tab_3) -#: dialogs/transferwindow.cpp:54 rc.cpp:897 +#: dialogs/transferwindow.cpp:54 +#: rc.cpp:897 msgid "File Transfers" msgstr "檔案傳輸" @@ -1332,7 +1258,8 @@ msgid "&Use" msgstr "使用(&U)" -#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:60 +#: dialogs/userpicturesdialog.cpp:44 +#: settings/accountsettingsdialog.cpp:60 msgid "&Delete" msgstr "刪除(&D)" @@ -1351,9 +1278,7 @@ #: emoticontheme.cpp:627 #, kde-format -msgid "" -"Could not save the emoticon theme. Make sure you have permission to write to " -"the theme folder '%1'." +msgid "Could not save the emoticon theme. Make sure you have permission to write to the theme folder '%1'." msgstr "無法儲存此表情符號主題。請確定您有寫入主題資料夾 %1 的權限。" #: emoticontheme.cpp:823 @@ -1682,12 +1607,11 @@ msgid "Cannot reconnect: this account has no saved password" msgstr "無法重新連線:帳號並未儲存密碼。" -#: initialview.cpp:309 initialview.cpp:417 +#: initialview.cpp:309 +#: initialview.cpp:417 #, kde-format msgctxt "Status message on login screen" -msgid "" -"Waiting for an Internet connection to reconnect...<br /><a href='%" -"1'>Reconnect now!</a>" +msgid "Waiting for an Internet connection to reconnect...<br /><a href='%1'>Reconnect now!</a>" msgstr "等待網際網路連線來重新連線...<br/><a href='%1'>現在重新連線!</a>" #: initialview.cpp:422 @@ -1698,11 +1622,8 @@ #: initialview.cpp:443 #, kde-format msgctxt "Status message on login screen" -msgid "" -"Waiting %1 second before reconnection...<br /><a href='%2'>Reconnect now!</a>" -msgid_plural "" -"Waiting %1 seconds before reconnection...<br /><a href='%2'>Reconnect now!</" -"a>" +msgid "Waiting %1 second before reconnection...<br /><a href='%2'>Reconnect now!</a>" +msgid_plural "Waiting %1 seconds before reconnection...<br /><a href='%2'>Reconnect now!</a>" msgstr[0] "在重新連線之前等待 %1 秒...<br/><a href='%2'>現在重新連線!</a>" #: initialview.cpp:662 @@ -1749,9 +1670,7 @@ #: kmess.cpp:577 #, kde-format -msgid "" -"<qt>Are you sure you want to remove the contact <b>%1</b> from your contact " -"list?</qt>" +msgid "<qt>Are you sure you want to remove the contact <b>%1</b> from your contact list?</qt>" msgstr "<qt>您確定要將聯絡人 <b>%1</b> 從清單中移除嗎?</qt>" #: kmess.cpp:579 @@ -1765,12 +1684,11 @@ #: kmess.cpp:627 #, kde-format msgctxt "dialog text" -msgid "" -"The group <b>%1</b> is not empty! First remove all contacts from it, then " -"try again!" +msgid "The group <b>%1</b> is not empty! First remove all contacts from it, then try again!" msgstr "群組 %1 不是空的:請先將所有聯絡人從群組中移走,然後再試一次。" -#: kmess.cpp:629 kmess.cpp:636 +#: kmess.cpp:629 +#: kmess.cpp:636 msgctxt "dialog title" msgid "Group Removal" msgstr "群組移除" @@ -1778,9 +1696,7 @@ #: kmess.cpp:634 #, kde-format msgctxt "dialog text" -msgid "" -"<qt>Are you sure you want to remove the group <b>%1</b> from your contact " -"list?</qt>" +msgid "<qt>Are you sure you want to remove the group <b>%1</b> from your contact list?</qt>" msgstr "<qt>您確定要將群組 <b>%1</b> 從聯絡人清單中移除嗎?</qt>" #: kmess.cpp:637 @@ -1803,9 +1719,7 @@ #: kmess.cpp:755 #, kde-format msgctxt "dialog text" -msgid "" -"<p>Cannot login automatically with account <b>%1</b>:<br/>you must first " -"save the account password!</p>" +msgid "<p>Cannot login automatically with account <b>%1</b>:<br/>you must first save the account password!</p>" msgstr "<p>無法自動以帳號 <b>%1</b> 登入:<br />您必須先儲存密碼。</p>" #: kmess.cpp:758 @@ -1824,25 +1738,15 @@ #: kmess.cpp:1485 #, kde-format -msgctxt "" -"Paragraph to be added to the text of a message dialog box, but only when KDE " -"gives a list of folders where to search for an application file" +msgctxt "Paragraph to be added to the text of a message dialog box, but only when KDE gives a list of folders where to search for an application file" msgid "<p>KMess has searched for it in the following folders:<br>%1</p>" msgstr "<p>KMess 已搜尋了以下的資料夾:<br>%1</p>" #: kmess.cpp:1497 #, kde-format -msgctxt "" -"Text for a message dialog box; %1 is an explanation about the list of " -"folders where the file was searched for, which is only shown if any folders " -"are found" -msgid "" -"<html><p>KMess will not be able to play sounds nor show notifications.</" -"p><p>The required file 'kmess.notifyrc' could not be found in any " -"application folder.</p>%1<p>Please verify your installation.</p></html>" -msgstr "" -"<html><p>KMess 無法播放音效或顯示通知。</p><p>因為在以下的路徑中找不到需要的" -"設定檔 kmess.notifyrc。</p>%1<p>請檢查您的安裝。</p></html>" +msgctxt "Text for a message dialog box; %1 is an explanation about the list of folders where the file was searched for, which is only shown if any folders are found" +msgid "<html><p>KMess will not be able to play sounds nor show notifications.</p><p>The required file 'kmess.notifyrc' could not be found in any application folder.</p>%1<p>Please verify your installation.</p></html>" +msgstr "<html><p>KMess 無法播放音效或顯示通知。</p><p>因為在以下的路徑中找不到需要的設定檔 kmess.notifyrc。</p>%1<p>請檢查您的安裝。</p></html>" #: kmess.cpp:1503 msgctxt "Message box title" @@ -1851,14 +1755,14 @@ #: kmess.cpp:1781 #, kde-format -msgctxt "" -"Main window caption: switched order to easily distinguish it from chats" +msgctxt "Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess ─ %1" #. i18n: file: initialview.ui:348 #. i18n: ectx: property (text), widget (QPushButton, connectButton_) -#: kmessinterface.cpp:160 rc.cpp:326 +#: kmessinterface.cpp:160 +#: rc.cpp:326 msgid "&Connect" msgstr "連線(&C)" @@ -1918,7 +1822,8 @@ msgid "&Export Contact List..." msgstr "匯出聯絡人清單(&E)..." -#: kmessinterface.cpp:183 kmessview.cpp:691 +#: kmessinterface.cpp:183 +#: kmessview.cpp:691 msgid "Show Chat &History..." msgstr "顯示聊天紀錄(H)..." @@ -2083,40 +1988,32 @@ msgstr[0] "%1 個聯絡人" #: kmessview.cpp:1764 -#, fuzzy msgctxt "Default friendly name tooltip" msgid "Click here to change your friendly name" -msgstr "點選此處讓 KMess 儲存你的密碼" +msgstr "點選此處來改變你的暱稱" #: kmessview.cpp:1824 msgctxt "Default personal message shown in the contact list" msgid "[i]Click to set a personal message[/i]" -msgstr "" +msgstr "[i]點選來設定個人訊息[/i]" #: kmessview.cpp:1825 -#, fuzzy msgctxt "Default personal message tooltip" -msgid "" -"Click here to insert a message to show to your contacts: they will see it " -"along with your friendly name" -msgstr "在此輸入要顯示給聯絡人看的訊息:他們會在你的暱稱旁看到。" +msgid "Click here to insert a message to show to your contacts: they will see it along with your friendly name" +msgstr "在此輸入要顯示給你聯絡人看的訊息:他們會在你的暱稱旁看到。" #: kmessview.cpp:2005 msgid "No chat logs could be found for this contact." msgstr "找不到這個聯絡人的聊天記錄" -#: kmessview.cpp:2006 kmessview.cpp:2012 +#: kmessview.cpp:2006 +#: kmessview.cpp:2012 msgid "No chat history found" msgstr "找不到聊天紀錄" #: kmessview.cpp:2011 -msgid "" -"No chat logs could be found for this contact. Note that new chats are not " -"logged; if you want your chats to be logged, you can enable it in your " -"account settings." -msgstr "" -"找不到這個聯絡人的聊天記錄。注意:新的交談沒有被記錄;如果你想要你的交談被記" -"錄,可以在帳號設定裡開啟功能。" +msgid "No chat logs could be found for this contact. Note that new chats are not logged; if you want your chats to be logged, you can enable it in your account settings." +msgstr "找不到這個聯絡人的聊天記錄。注意:新的交談沒有被記錄;如果你想要你的交談被記錄,可以在帳號設定裡開啟功能。" #: kmessview.cpp:2205 #, kde-format @@ -2126,8 +2023,7 @@ #: kmessviewdelegate.cpp:289 #, kde-format -msgctxt "" -"Group name in the contact list with online/total contacts of that group" +msgctxt "Group name in the contact list with online/total contacts of that group" msgid "%1 (%2/%3)" msgstr "%1(%2/%3)" @@ -2175,7 +2071,8 @@ msgid "Michael Curtis" msgstr "Michael Curtis" -#: main.cpp:65 main.cpp:74 +#: main.cpp:65 +#: main.cpp:74 msgid "Jan Tönjes" msgstr "Jan Tönjes" @@ -2183,15 +2080,22 @@ msgid "Project support" msgstr "專案支援" -#: main.cpp:66 main.cpp:67 main.cpp:68 main.cpp:69 main.cpp:70 main.cpp:71 +#: main.cpp:66 +#: main.cpp:67 +#: main.cpp:68 +#: main.cpp:69 +#: main.cpp:70 +#: main.cpp:71 msgid "Current developer" msgstr "目前開發者" -#: main.cpp:66 main.cpp:106 +#: main.cpp:66 +#: main.cpp:106 msgid "Diederik van der Boor" msgstr "Diederik van der Boor" -#: main.cpp:67 main.cpp:129 +#: main.cpp:67 +#: main.cpp:129 msgid "Valerio Pilo" msgstr "Valerio Pilo" @@ -2203,18 +2107,18 @@ msgid "Ruben Vandamme" msgstr "Ruben Vandamme" -#: main.cpp:70 main.cpp:169 +#: main.cpp:70 +#: main.cpp:169 msgid "Sjors Gielen" msgstr "Sjors Gielen" -#: main.cpp:71 main.cpp:168 +#: main.cpp:71 +#: main.cpp:168 msgid "Adam Goossens" msgstr "Adam Goossens" #: main.cpp:74 -msgid "" -"German translation, testing, documentation, web master, project management, " -"etc..." +msgid "German translation, testing, documentation, web master, project management, etc..." msgstr "德文翻譯,測試,文件和網站設計,計劃主持、、、等" #: main.cpp:75 @@ -2257,7 +2161,8 @@ msgid "Michael Anderton" msgstr "Michael Anderton" -#: main.cpp:83 main.cpp:112 +#: main.cpp:83 +#: main.cpp:112 msgid "Panagiotis Papadopoulos" msgstr "Panagiotis Papadopoulos" @@ -2293,7 +2198,9 @@ msgid "Leonel Freire" msgstr "Leonel Freire" -#: main.cpp:89 main.cpp:90 main.cpp:91 +#: main.cpp:89 +#: main.cpp:90 +#: main.cpp:91 msgid "More Brazilian Portuguese translation" msgstr "更多巴西、葡萄牙文翻譯" @@ -2302,9 +2209,8 @@ msgstr "Sergio Rafael Lemke" #: main.cpp:91 -#, fuzzy msgid "Morris Arozi Moraes" -msgstr "Maurício Arozi Moraes" +msgstr "Morris Arozi Moraes" #: main.cpp:93 msgid "Catalan translation" @@ -2330,11 +2236,13 @@ msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "簡體中文翻譯,文件傳送臭蟲修復,代理連結程式。" -#: main.cpp:97 main.cpp:164 +#: main.cpp:97 +#: main.cpp:164 msgid "Liu Sizhuang" msgstr "Liu Sizhuang" -#: main.cpp:97 main.cpp:98 +#: main.cpp:97 +#: main.cpp:98 msgid "More Simplified Chinese translation" msgstr "更多的簡體中文翻譯" @@ -2382,7 +2290,11 @@ msgid "Dutch translation" msgstr "荷蘭文翻譯" -#: main.cpp:106 main.cpp:107 main.cpp:108 main.cpp:109 main.cpp:110 +#: main.cpp:106 +#: main.cpp:107 +#: main.cpp:108 +#: main.cpp:109 +#: main.cpp:110 msgid "More Dutch translation" msgstr "更多的荷蘭文翻譯" @@ -2434,7 +2346,9 @@ msgid "Joonas Niilola" msgstr "Joonas Niilola" -#: main.cpp:117 main.cpp:118 main.cpp:119 +#: main.cpp:117 +#: main.cpp:118 +#: main.cpp:119 msgid "More Finnish translation" msgstr "更多的芬蘭文翻譯" @@ -2466,7 +2380,9 @@ msgid "Andrea Blankenstijn" msgstr "Andrea Blankenstijn" -#: main.cpp:123 main.cpp:124 main.cpp:125 +#: main.cpp:123 +#: main.cpp:124 +#: main.cpp:125 msgid "More French translation" msgstr "法文翻譯" @@ -2494,7 +2410,8 @@ msgid "Pauli Henrik" msgstr "Pauli Henrik" -#: main.cpp:129 main.cpp:130 +#: main.cpp:129 +#: main.cpp:130 msgid "More Italian translation" msgstr "更多的義大利文翻譯" @@ -2507,8 +2424,7 @@ msgstr "Andrea Decorte" #: main.cpp:131 -msgid "" -"More Italian translation, Group selection in 'contact added user' dialog" +msgid "More Italian translation, Group selection in 'contact added user' dialog" msgstr "更多的義大利文翻譯,在「聯絡人新增使用者」對話框中加入群組選擇" #: main.cpp:133 @@ -2571,8 +2487,14 @@ msgid "J.C.A. Javi" msgstr "J.C.A. Javi" -#: main.cpp:143 main.cpp:144 main.cpp:145 main.cpp:146 main.cpp:147 -#: main.cpp:148 main.cpp:149 main.cpp:150 +#: main.cpp:143 +#: main.cpp:144 +#: main.cpp:145 +#: main.cpp:146 +#: main.cpp:147 +#: main.cpp:148 +#: main.cpp:149 +#: main.cpp:150 msgid "More Spanish translation" msgstr "更多的西班牙文翻譯" @@ -2640,7 +2562,8 @@ msgid "Barbaros Ulutas" msgstr "Barbaros Ulutas" -#: main.cpp:157 main.cpp:158 +#: main.cpp:157 +#: main.cpp:158 msgid "More Turkish translation" msgstr "更多土耳其文翻譯" @@ -2701,9 +2624,7 @@ msgstr "Matteo Nardi" #: main.cpp:168 -msgid "" -"Notifications blocking option, winks disabling option, last message date " -"feature" +msgid "Notifications blocking option, winks disabling option, last message date feature" msgstr "通知阻擋選項,動畫快遞關閉選項,上次訊息日期功能" #: main.cpp:169 @@ -2755,9 +2676,7 @@ msgstr "Camille Begue" #: main.cpp:178 -msgid "" -"Chat History functionality when disconnected, autologin checkbox on login " -"screen" +msgid "Chat History functionality when disconnected, autologin checkbox on login screen" msgstr "當斷線時的交談歷史紀錄功能,登入畫面裡的自動登入勾選框框" #: main.cpp:179 @@ -2781,18 +2700,16 @@ msgstr "Anastasios Bourazanis" #: main.cpp:181 -msgid "" -"Emoticon preview in settings page,clickable contact properties dialog text" +msgid "Emoticon preview in settings page,clickable contact properties dialog text" msgstr "設定頁面裡的表情符號預覽,可選擇的聯絡人特性對話文字" #: main.cpp:182 msgid "Internationalization fixes, drag'n'drop of images into display pictures" -msgstr "" +msgstr "國際化修正,拖曳圖案進入顯示圖片" #: main.cpp:182 -#, fuzzy msgid "Marco Mentasti" -msgstr "諷刺" +msgstr "Marco Mentasti" #: main.cpp:185 msgid "Inspiration and assorted code" @@ -2831,14 +2748,11 @@ msgstr "Amarok" #: main.cpp:189 -msgid "" -"Custom crash handler implementation, System tray icon overlay implementation" +msgid "Custom crash handler implementation, System tray icon overlay implementation" msgstr "自訂的程式錯誤處理器實作,系統工具列圖示覆蓋實作" #: main.cpp:190 -msgid "" -"KNotify not giving focus bug fix and KWin focus stealing prevention " -"workaround" +msgid "KNotify not giving focus bug fix and KWin focus stealing prevention workaround" msgstr "KNotify 沒有修正聚焦的程式臭蟲,而 KWin 避免失焦是可行的方案。" #: main.cpp:190 @@ -2857,7 +2771,8 @@ msgid "Your name here?" msgstr "還有您!" -#: main.cpp:196 rc.cpp:1 +#: main.cpp:196 +#: rc.cpp:1 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Tryneeds-Chinese 翻譯平台 http://tryneeds.westart.tw/"; @@ -2944,15 +2859,12 @@ #: network/applications/filetransfer.cpp:290 #: network/applications/filetransferp2p.cpp:376 #, kde-format -msgid "" -"The transfer of the file "%1" failed. Could not save the file." +msgid "The transfer of the file "%1" failed. Could not save the file." msgstr "檔案 %1 傳輸失敗。無法儲存檔案。" #: network/applications/filetransfer.cpp:295 #, kde-format -msgid "" -"The transfer of the file "%1" failed. Could not open the " -"destination file." +msgid "The transfer of the file "%1" failed. Could not open the destination file." msgstr "%1 的傳輸失敗。無法開啟目的檔。" #: network/applications/filetransfer.cpp:319 @@ -3003,15 +2915,13 @@ #: network/applications/filetransfer.cpp:742 #: network/applications/filetransferp2p.cpp:811 #, kde-format -msgid "" -"The transfer of the file "%1" failed. The file does not exist." +msgid "The transfer of the file "%1" failed. The file does not exist." msgstr "檔案 %1 傳輸失敗。檔案不存在。" #: network/applications/filetransfer.cpp:747 #: network/applications/filetransferp2p.cpp:816 #, kde-format -msgid "" -"The transfer of the file "%1" failed. The file could not be read." +msgid "The transfer of the file "%1" failed. The file could not be read." msgstr "檔案 %1 的傳輸失敗。無法讀取檔案。" #: network/applications/filetransfer.cpp:774 @@ -3051,9 +2961,7 @@ #: network/applications/inktransferp2p.cpp:108 #, kde-format msgctxt "Error message shown in chat, %1 is the contact's friendly name" -msgid "" -"<html>%1 has tried to send you an handwritten message, but it could not be " -"received.</html>" +msgid "<html>%1 has tried to send you an handwritten message, but it could not be received.</html>" msgstr "<html>%1 嘗試傳送手寫訊息給你,但無法接收。</html>" #: network/applications/inktransferp2p.cpp:114 @@ -3097,9 +3005,7 @@ #: network/applications/p2papplication.cpp:1763 #: network/applications/p2papplication.cpp:1887 #: network/applications/p2papplicationbase.cpp:706 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess does not " -"support it." +msgid "The invitation was cancelled. The contact sent bad data, or KMess does not support it." msgstr "邀請被取消。聯絡人傳送了錯誤的資料,或 KMess 不支援它" #: network/applications/p2papplication.cpp:1085 @@ -3113,8 +3019,7 @@ #: network/applications/p2papplication.cpp:1744 #: network/applications/p2papplicationbase.cpp:855 #: network/applications/p2papplicationbase.cpp:935 -msgid "" -"The transfer failed. The contact sent bad data, or KMess does not support it." +msgid "The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援。" #: network/applications/p2papplication.cpp:1810 @@ -3139,15 +3044,11 @@ msgstr "等候連線" #: network/applications/p2papplication.cpp:3423 -msgid "" -"The invitation was cancelled. A timeout occurred waiting for the contact to " -"accept." +msgid "The invitation was cancelled. A timeout occurred waiting for the contact to accept." msgstr "邀請取消。等候聯絡人接受逾時。" #: network/applications/p2papplication.cpp:3432 -msgid "" -"The invitation was cancelled. A timeout occurred waiting for a connection to " -"succeed or fail." +msgid "The invitation was cancelled. A timeout occurred waiting for a connection to succeed or fail." msgstr "邀請取消。等候連線 成功/失敗 逾時。" #: network/applications/p2papplication.cpp:3499 @@ -3194,9 +3095,7 @@ msgstr "遠端桌面" #: network/applications/unknownapplication.cpp:71 -msgid "" -"You are invited to start a voice conversation but support for this was not " -"installed" +msgid "You are invited to start a voice conversation but support for this was not installed" msgstr "您被邀請加入語音交談,但是並未安裝語音支援" #: network/extra/msnftpconnection.cpp:120 @@ -3270,9 +3169,7 @@ msgstr "給定的帳號不合法" #: network/msnconnection.cpp:401 -msgid "" -"This account name is invalid, or your Passport account has not been " -"confirmed yet" +msgid "This account name is invalid, or your Passport account has not been confirmed yet" msgstr "帳號名稱不合法,或是您的 Passport 帳號尚未確認。" #: network/msnconnection.cpp:404 @@ -3305,15 +3202,11 @@ msgstr "此聯絡人無法同時被加入允許與阻擋的清單中。" #: network/msnconnection.cpp:433 -msgid "" -"The group name is already present in your contact list. Please use a " -"different name" +msgid "The group name is already present in your contact list. Please use a different name" msgstr "此群組名稱已經在您的聯絡人清單中。請使用其他的名稱。" #: network/msnconnection.cpp:437 -msgid "" -"Your contact list has too many groups; you are allowed to only have at most " -"30" +msgid "Your contact list has too many groups; you are allowed to only have at most 30" msgstr "您的聯絡人清單中的群組過多。您最多只能有三十個群組。" #: network/msnconnection.cpp:441 @@ -3329,9 +3222,8 @@ msgstr "此群組不是空的" #: network/msnconnection.cpp:454 -#, fuzzy msgid "The group name is too long; it cannot be longer than 61 characters" -msgstr "群組名稱太長;不能大於 61 個位元。" +msgstr "群組名稱太長;不能大於 61 個字元。" #: network/msnconnection.cpp:459 msgid "Attempted to change group \"0\"" @@ -3375,8 +3267,7 @@ msgstr "未登入" #: network/msnconnection.cpp:493 -msgctxt "" -"MSN error, due to e.g. trying the beta service without an allowed account" +msgctxt "MSN error, due to e.g. trying the beta service without an allowed account" msgid "This account was denied access to the Live Messenger service" msgstr "此帳號被拒絕使用 Live Messenger 服務。" @@ -3433,8 +3324,7 @@ msgstr "不接受新的聯絡人" #: network/msnconnection.cpp:559 -msgid "" -"You have a Kids Passport account, you need parental consent to chat online" +msgid "You have a Kids Passport account, you need parental consent to chat online" msgstr "您有一個兒童 Passport 帳號,您需要家長的同意才能上線聊天。" #: network/msnconnection.cpp:562 @@ -3450,14 +3340,11 @@ msgstr "存取連絡人清單錯誤。過會兒再試。" #: network/msnconnection.cpp:585 -msgid "" -"The Live Messenger service is temporarily unavailable. There was an internal " -"server error" +msgid "The Live Messenger service is temporarily unavailable. There was an internal server error" msgstr "Live Messenger 服務暫時無法使用,因為發生內部錯誤。" #: network/msnconnection.cpp:596 -msgid "" -"The Live Messenger service is temporarily unavailable. The server is too busy" +msgid "The Live Messenger service is temporarily unavailable. The server is too busy" msgstr "Live Messenger 服務暫時無法使用,因為伺服器過於忙碌" #: network/msnconnection.cpp:600 @@ -3491,8 +3378,7 @@ #: network/msnconnection.cpp:635 #, kde-format -msgid "" -"Unknown error code received from the server: %1<br/>Technical details: %2" +msgid "Unknown error code received from the server: %1<br/>Technical details: %2" msgstr "從伺服器收到一個不明的錯誤代碼:%1<br>技術詳情:%2" #: network/msnconnection.cpp:657 @@ -3575,9 +3461,7 @@ #: network/msnnotificationconnection.cpp:3065 msgctxt "Connection error: dialog box" -msgid "" -"<p>Authentication has failed, please verify your account email and password." -"</p>" +msgid "<p>Authentication has failed, please verify your account email and password.</p>" msgstr "<p>認證失敗,請核對您的電子信箱帳號和密碼。</p>" #: network/msnnotificationconnection.cpp:3067 @@ -3594,52 +3478,27 @@ #: network/msnnotificationconnection.cpp:3081 #, kde-format msgctxt "Connection error: detailed message" -msgid "" -"<p>You have been disconnected: you have connected with the account <i>%1</i> " -"from another Messenger client, or from another location.</p>" -msgstr "" -"<p>您被斷線了:您使用其他的 Messenger 軟體或從氣他地方以此帳號 <i>%1</i> 連" -"線。</p>" +msgid "<p>You have been disconnected: you have connected with the account <i>%1</i> from another Messenger client, or from another location.</p>" +msgstr "<p>您被斷線了:您使用其他的 Messenger 軟體或從氣他地方以此帳號 <i>%1</i> 連線。</p>" #: network/msnnotificationconnection.cpp:3093 msgctxt "Connection error: passive notification message" -msgid "" -"<p>Unable to connect to the Live Messenger service.<br/>Maybe you need to " -"authenticate before you can access the network?</p>" -msgstr "" -"<p>無法連線到 Live Messenger 服務。<br/>或許您在存取網路之前需要認證?</p>" +msgid "<p>Unable to connect to the Live Messenger service.<br/>Maybe you need to authenticate before you can access the network?</p>" +msgstr "<p>無法連線到 Live Messenger 服務。<br/>或許您在存取網路之前需要認證?</p>" #: network/msnnotificationconnection.cpp:3096 #, kde-format msgctxt "Connection error: detailed message" -msgid "" -"<p>KMess could not connect to the Live Messenger servers.<br />There may be " -"a problem with your Internet connection, or the Live Messenger servers may " -"be temporarily unavailable.<br/>It is also possible that an authentication " -"to a web page or proxy may be required to access the network.</p><p><a " -"href='%1'>Click here</a> to visit the Messenger service status page.</p>" -msgstr "" -"<p>KMess 無法連線到 Live Messenger 伺服器。<br/>可能是您的網際網路連線有問" -"題,或是 Live Messenger 伺服器暫時關閉。<br/>也有可能是到網頁或代理伺服器需要" -"存取網路的認證。</p><p><a href='%1'>點選這裡</a>來造訪 Messenger 服務狀態頁" -"面。</p>" +msgid "<p>KMess could not connect to the Live Messenger servers.<br />There may be a problem with your Internet connection, or the Live Messenger servers may be temporarily unavailable.<br/>It is also possible that an authentication to a web page or proxy may be required to access the network.</p><p><a href='%1'>Click here</a> to visit the Messenger service status page.</p>" +msgstr "<p>KMess 無法連線到 Live Messenger 伺服器。<br/>可能是您的網際網路連線有問題,或是 Live Messenger 伺服器暫時關閉。<br/>也有可能是到網頁或代理伺服器需要存取網路的認證。</p><p><a href='%1'>點選這裡</a>來造訪 Messenger 服務狀態頁面。</p>" #: network/msnnotificationconnection.cpp:3109 -msgid "" -"<p>Unable to resolve the authentication on the client<br/>Maybe you do not " -"have installed qca2 and/or qca2-plugin-ossl?</p>" -msgstr "" -"<p>不能解決客戶端上的認證。<br/>或許你沒有安裝 qca2 和/或 qca2-plugin-ossl ?" -"</p>" +msgid "<p>Unable to resolve the authentication on the client<br/>Maybe you do not have installed qca2 and/or qca2-plugin-ossl?</p>" +msgstr "<p>不能解決客戶端上的認證。<br/>或許你沒有安裝 qca2 和/或 qca2-plugin-ossl ?</p>" #: network/msnnotificationconnection.cpp:3111 -msgid "" -"<p>KMess could not connect to the Live Messenger servers.<br />You probably " -"need to install qca2 and qca2-plugin-ossl to make KMess work.<br/>It is also " -"possible that the MSN network is unavailable at the moment.</p>" -msgstr "" -"<p>KMess 無法連線到 Live Messenger 伺服器。<br/>你可能需要安裝 qca2 和 qca2-" -"plugin-ossl 來讓 KMess 作動。<br/>也有可能是 MSN 網路目前無法使用。</p>" +msgid "<p>KMess could not connect to the Live Messenger servers.<br />You probably need to install qca2 and qca2-plugin-ossl to make KMess work.<br/>It is also possible that the MSN network is unavailable at the moment.</p>" +msgstr "<p>KMess 無法連線到 Live Messenger 伺服器。<br/>你可能需要安裝 qca2 和 qca2-plugin-ossl 來讓 KMess 作動。<br/>也有可能是 MSN 網路目前無法使用。</p>" #: network/msnnotificationconnection.cpp:3126 msgctxt "Connection error: passive notification message" @@ -3649,20 +3508,12 @@ #: network/msnnotificationconnection.cpp:3128 #, kde-format msgctxt "Connection error: detailed message" -msgid "" -"<p>KMess could not connect to the Live Messenger servers.<br />There may be " -"a problem with your Internet connection, or the Live Messenger servers may " -"be temporarily unavailable.</p><p><a href='%1'>Click here</a> to visit the " -"Messenger service status page.</p>" -msgstr "" -"<p>KMess 無法連線到 Live Messenger 伺服器。<br/>可能是您的網際網路連線有問" -"題,或是 Live Messenger 伺服器暫時關閉。</p><p><a href='%1'>點選這裡</a>來造" -"訪 Messenger 服務狀態頁面。</p>" +msgid "<p>KMess could not connect to the Live Messenger servers.<br />There may be a problem with your Internet connection, or the Live Messenger servers may be temporarily unavailable.</p><p><a href='%1'>Click here</a> to visit the Messenger service status page.</p>" +msgstr "<p>KMess 無法連線到 Live Messenger 伺服器。<br/>可能是您的網際網路連線有問題,或是 Live Messenger 伺服器暫時關閉。</p><p><a href='%1'>點選這裡</a>來造訪 Messenger 服務狀態頁面。</p>" #: network/msnnotificationconnection.cpp:3139 #, kde-format -msgctxt "" -"Connection error (Server-reported user error): passive notification message" +msgctxt "Connection error (Server-reported user error): passive notification message" msgid "<p><i>Error</i>: %1</p>" msgstr "<p><i>錯誤</i>:%1</p>" @@ -3674,8 +3525,7 @@ #: network/msnnotificationconnection.cpp:3152 #, kde-format -msgctxt "" -"Connection error (Server-reported server error): passive notification message" +msgctxt "Connection error (Server-reported server error): passive notification message" msgid "<p><i>Messenger Service Error</i>: %1</p>" msgstr "<p><i>Messeenger 服務錯誤</i>:%1</p>" @@ -3687,8 +3537,7 @@ #: network/msnnotificationconnection.cpp:3162 #, kde-format -msgctxt "" -"Connection error (Server-reported client error): passive notification message" +msgctxt "Connection error (Server-reported client error): passive notification message" msgid "<p><i>KMess Error</i>: %1</p>" msgstr "<p><i>KMess 錯誤</i>:%1</p>" @@ -3711,11 +3560,8 @@ #: network/msnnotificationconnection.cpp:3233 #, kde-format msgctxt "Developer details placed on the network error dialog box" -msgid "" -"<p><b>Developer info:</b><br/><i>Error number:</i> %1<br/><i>Error string:</" -"i> %2</p>" -msgstr "" -"<p><b>開發者資訊:</b><br/><i>錯誤號碼:</i> %1<br/><i>錯誤字串:</i> %2</p>" +msgid "<p><b>Developer info:</b><br/><i>Error number:</i> %1<br/><i>Error string:</i> %2</p>" +msgstr "<p><b>開發者資訊:</b><br/><i>錯誤號碼:</i> %1<br/><i>錯誤字串:</i> %2</p>" #: network/msnsocketbase.cpp:135 msgctxt "Dialog box message" @@ -3731,9 +3577,7 @@ #: network/msnsockethttp.cpp:701 #, kde-format msgctxt "Error message shown with HTTP connection" -msgid "" -"%1 (Internal error code: %2)<br/><i>Response:</i> %3 %4<br/><i>Redirection " -"target:</i> %5" +msgid "%1 (Internal error code: %2)<br/><i>Response:</i> %3 %4<br/><i>Redirection target:</i> %5" msgstr "%1 (內部錯誤碼:%2)<br/><i>回應:</i>%3 %4<br/><i>重新指向目標:</i>%5" #: network/msnsockettcp.cpp:366 @@ -3741,11 +3585,10 @@ msgstr "超過連線時間限制" #: network/msnsockettcp.cpp:380 -#, fuzzy, kde-format +#, kde-format msgid "1 ping lost" msgid_plural "%1 pings lost" -msgstr[0] "失去 1 ping" -msgstr[1] "失去 1 pings" +msgstr[0] "失去 %1 ping" #: network/msnsockettcp.cpp:395 msgid "The connection to the server was lost" @@ -3760,9 +3603,7 @@ #: network/soap/addressbookservice.cpp:793 #, kde-format msgctxt "Error message" -msgid "" -"The specified email address, \"%1\", does not belong to a Live Messenger " -"account!" +msgid "The specified email address, \"%1\", does not belong to a Live Messenger account!" msgstr "特定的電子郵件,\"%1\",不屬於 Live Messenger 帳號!" #: network/soap/addressbookservice.cpp:801 @@ -3983,14 +3824,11 @@ msgstr "隱藏" #: notification/systemtraywidget.cpp:79 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'Connect' menu to quit the application." -msgstr "" -"關閉主視窗會讓 KMess 保持在系統列執行。使用「連線」中的「結束」選單來結束程" -"式。" +msgid "Closing the main window will keep KMess running in the system tray. Use 'Quit' from the 'Connect' menu to quit the application." +msgstr "關閉主視窗會讓 KMess 保持在系統列執行。使用「連線」中的「結束」選單來結束程式。" -#: notification/systemtraywidget.cpp:90 notification/systemtraywidget.cpp:189 +#: notification/systemtraywidget.cpp:90 +#: notification/systemtraywidget.cpp:189 #: notification/systemtraywidget.cpp:199 msgid "Docking in System Tray" msgstr "嵌入系統匣" @@ -4027,11 +3865,13 @@ #. i18n: file: settings/accountpage.ui:133 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) -#: settings/accountpage.cpp:459 rc.cpp:392 +#: settings/accountpage.cpp:459 +#: rc.cpp:392 msgid "Display Picture" msgstr "顯示圖片" -#: settings/accountsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:69 +#: settings/accountsettingsdialog.cpp:62 +#: settings/globalsettingsdialog.cpp:69 #: settings/globalsettingsdialog.cpp:70 msgid "Settings" msgstr "設定" @@ -4044,11 +3884,13 @@ msgid "My Account" msgstr "我的帳號" -#: settings/accountsettingsdialog.cpp:85 settings/accountsettingsdialog.cpp:86 +#: settings/accountsettingsdialog.cpp:85 +#: settings/accountsettingsdialog.cpp:86 msgid "Contact List" msgstr "聯絡人清單" -#: settings/accountsettingsdialog.cpp:96 settings/accountsettingsdialog.cpp:97 +#: settings/accountsettingsdialog.cpp:96 +#: settings/accountsettingsdialog.cpp:97 msgid "Chatting" msgstr "交談" @@ -4061,17 +3903,14 @@ msgctxt "Button tooltip text" msgid "" "Click here to delete this account from the list of registered accounts.\n" -"You cannot delete the currently connected account nor a guest account, which " -"will be deleted when you disconnect." +"You cannot delete the currently connected account nor a guest account, which will be deleted when you disconnect." msgstr "" "點擊此處以從註冊帳號清單中刪除此帳號。\n" "您不能刪除目前連線中的帳號,或是訪客帳號。訪客帳號在您離線時即會被刪除。" #: settings/accountsettingsdialog.cpp:207 #, kde-format -msgid "" -"The email address you have entered is not valid, and cannot be used as an " -"account: '%1'" +msgid "The email address you have entered is not valid, and cannot be used as an account: '%1'" msgstr "您輸入的電子郵件地址不合法,無法做為帳號:%1" #: settings/accountsettingsdialog.cpp:215 @@ -4089,9 +3928,7 @@ #: settings/accountsmanagerpage.cpp:160 #, kde-format -msgid "" -"<html>Are you sure you want to delete the account '%1' ?<br/>All settings of " -"this account will be lost.</html>" +msgid "<html>Are you sure you want to delete the account '%1' ?<br/>All settings of this account will be lost.</html>" msgstr "<html>您確定您要刪除帳號 %1 嗎?<br/>所有此帳號的設定都將消失。</html>" #: settings/chatstylepage.cpp:371 @@ -4124,11 +3961,13 @@ msgid "KMess Settings" msgstr "KMess 設定" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:62 +#: settings/globalsettingsdialog.cpp:61 +#: settings/globalsettingsdialog.cpp:62 msgid "Accounts" msgstr "帳號" -#: settings/globalsettingsdialog.cpp:65 settings/globalsettingsdialog.cpp:67 +#: settings/globalsettingsdialog.cpp:65 +#: settings/globalsettingsdialog.cpp:67 msgid "Notifications" msgstr "通知" @@ -4146,13 +3985,8 @@ #: settings/miscellaneouspage.cpp:291 #, c-format -msgid "" -"<html>The console command you have specified to launch a custom web browser " -"does not contain the '%u' parameter. Without this, opening web sites will " -"not work.<br />Do you want KMess to add it for you?</html>" -msgstr "" -"<html>您輸入的指令中沒有 '%u' 參數。這樣無法連結到您要去的網址。<br />您確定" -"要這樣嗎?</html>" +msgid "<html>The console command you have specified to launch a custom web browser does not contain the '%u' parameter. Without this, opening web sites will not work.<br />Do you want KMess to add it for you?</html>" +msgstr "<html>您輸入的指令中沒有 '%u' 參數。這樣無法連結到您要去的網址。<br />您確定要這樣嗎?</html>" #: settings/miscellaneouspage.cpp:316 msgid "You have to specify a console command to launch a custom email client!" @@ -4160,13 +3994,8 @@ #: settings/miscellaneouspage.cpp:321 #, c-format -msgid "" -"<html>The console command you specified to launch a custom email client does " -"not contain the '%u' parameter. Without this, composing emails will not work." -"<br />Do you want KMess to add it for you?</html>" -msgstr "" -"<html>您輸入的指令並未包含 '%u' 參數。這樣您無法發送信件。<br />您確定要這樣" -"做嗎?</html>" +msgid "<html>The console command you specified to launch a custom email client does not contain the '%u' parameter. Without this, composing emails will not work.<br />Do you want KMess to add it for you?</html>" +msgstr "<html>您輸入的指令並未包含 '%u' 參數。這樣您無法發送信件。<br />您確定要這樣做嗎?</html>" #: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" @@ -4177,9 +4006,9 @@ msgstr "選擇檔案目錄" #: utils/inlineeditlabel.cpp:147 -#, fuzzy, kde-format +#, kde-format msgid "The text cannot be longer than %1 characters." -msgstr "群組名稱太長;不能大於 61 個位元。" +msgstr "文字不能長於 %1 個字元。" #: utils/kmess-send/kmesssendplugin.cpp:116 msgid "Send with KMess" @@ -4211,44 +4040,24 @@ msgstr "歡迎使用 %1。" #: utils/likeback/likeback.cpp:336 -msgctxt "" -"Welcome dialog text, explanation for both the like and dislike buttons" -msgid "" -"Each time you have a great or frustrating experience, please click on the " -"appropriate face below the window title-bar, briefly describe what you like " -"or dislike and click on 'Send'." -msgstr "" -"當您有好的或不好的經驗,請點選視窗標題列底下的臉,表達您喜歡或不喜歡,然後按" -"「傳送」。" +msgctxt "Welcome dialog text, explanation for both the like and dislike buttons" +msgid "Each time you have a great or frustrating experience, please click on the appropriate face below the window title-bar, briefly describe what you like or dislike and click on 'Send'." +msgstr "當您有好的或不好的經驗,請點選視窗標題列底下的臉,表達您喜歡或不喜歡,然後按「傳送」。" #: utils/likeback/likeback.cpp:343 msgctxt "Welcome dialog text, explanation for the like button alone" -msgid "" -"Each time you have a great experience, please click on the smiling face " -"below the window title-bar, briefly describe what you like and click on " -"'Send'." -msgstr "" -"當您有好的經驗時,請點選視窗標題列底下的笑臉,表示您喜歡,然後按「傳送」。" +msgid "Each time you have a great experience, please click on the smiling face below the window title-bar, briefly describe what you like and click on 'Send'." +msgstr "當您有好的經驗時,請點選視窗標題列底下的笑臉,表示您喜歡,然後按「傳送」。" #: utils/likeback/likeback.cpp:350 msgctxt "Welcome dialog text, explanation for the dislike button alone" -msgid "" -"Each time you have a frustrating experience, please click on the frowning " -"face below the window title-bar, briefly describe what you dislike and click " -"on 'Send'." -msgstr "" -"當年有不好的經驗的時候,您可以點選視窗標題列下的皺眉頭的臉,表示您不喜歡,然" -"後按「傳送」。" +msgid "Each time you have a frustrating experience, please click on the frowning face below the window title-bar, briefly describe what you dislike and click on 'Send'." +msgstr "當年有不好的經驗的時候,您可以點選視窗標題列下的皺眉頭的臉,表示您不喜歡,然後按「傳送」。" #: utils/likeback/likeback.cpp:360 msgctxt "Welcome dialog text, explanation for the bug button" -msgid "" -"If you experience an improper behavior in the application, just click on the " -"broken-object icon in the top-right corner of the window, describe the " -"behavior and click on 'Send'." -msgstr "" -"若您覺得應用程式中某些行為不恰當,只要點選視窗右上角的「破碎」圖示,描述一" -"下,然後按「傳送」。" +msgid "If you experience an improper behavior in the application, just click on the broken-object icon in the top-right corner of the window, describe the behavior and click on 'Send'." +msgstr "若您覺得應用程式中某些行為不恰當,只要點選視窗右上角的「破碎」圖示,描述一下,然後按「傳送」。" #: utils/likeback/likeback.cpp:372 msgctxt "Welcome dialog text, usage example" @@ -4257,15 +4066,12 @@ #: utils/likeback/likeback.cpp:380 msgctxt "Welcome dialog text, usage example" -msgid "" -"<b>I dislike</b> the welcome page of this assistant. Too time consuming." +msgid "<b>I dislike</b> the welcome page of this assistant. Too time consuming." msgstr "<b>我不喜歡</b>小助手的歡迎頁面。太浪費時間。" #: utils/likeback/likeback.cpp:388 msgctxt "Welcome dialog text, usage example" -msgid "" -"<b>The application shows an improper behaviour</b> when clicking the Add " -"button. Nothing happens." +msgid "<b>The application shows an improper behaviour</b> when clicking the Add button. Nothing happens." msgstr "點擊「新增」按鍵時,<b>它的行為不正確</b>。沒有任何作用。" #: utils/likeback/likeback.cpp:396 @@ -4295,68 +4101,40 @@ #: utils/likeback/likebackdialog.cpp:140 #, kde-format -msgctxt "" -"Feedback dialog text, message with one accepted language for the comments" -msgid "" -"Please, write it in <b>%1</b>, or the developers will not be able to read " -"your comment!<br/>You may want to use an <a href=\"%2\">online translation " -"tool</a> to translate your message.<br/>" -msgstr "" -"請以 <b>%1</b> 撰寫,否則開發人員無法讀取你的建議!<br/>你可以用 <a href=\"%2" -"\">線上翻譯工具</a>來翻譯你的訊息。<br/>" +msgctxt "Feedback dialog text, message with one accepted language for the comments" +msgid "Please, write it in <b>%1</b>, or the developers will not be able to read your comment!<br/>You may want to use an <a href=\"%2\">online translation tool</a> to translate your message.<br/>" +msgstr "請以 <b>%1</b> 撰寫,否則開發人員無法讀取你的建議!<br/>你可以用 <a href=\"%2\">線上翻譯工具</a>來翻譯你的訊息。<br/>" #: utils/likeback/likebackdialog.cpp:152 #, kde-format -msgctxt "" -"Feedback dialog text, message with list of accepted languages for the " -"comments" -msgid "" -"Please, write it in <b>%1 or %2</b>, or the developers will not be able to " -"read your comment!<br/>You may want to use an <a href=\"%3\">online " -"translation tool</a> to translate your message.<br/>" -msgstr "" -"請以 <b>%1 或 %2</b> 撰寫,否則開發人員無法讀取你的建議!<br/>你可以用<a " -"href=\"%3\">線上翻譯工具</a>來翻譯你的訊息。<br/>" +msgctxt "Feedback dialog text, message with list of accepted languages for the comments" +msgid "Please, write it in <b>%1 or %2</b>, or the developers will not be able to read your comment!<br/>You may want to use an <a href=\"%3\">online translation tool</a> to translate your message.<br/>" +msgstr "請以 <b>%1 或 %2</b> 撰寫,否則開發人員無法讀取你的建議!<br/>你可以用<a href=\"%3\">線上翻譯工具</a>來翻譯你的訊息。<br/>" #: utils/likeback/likebackdialog.cpp:168 -msgctxt "" -"Feedback dialog text, message to remind to balance the likes and dislikes" -msgid "" -"To make the comments you send more useful in improving this application, try " -"to send the same amount of positive and negative comments.<br/>" -msgstr "" -"為了讓您傳送的意見對我們改進程式更有幫助,請試著盡量多傳送包括正面與負面的意" -"見。<br/>" +msgctxt "Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "To make the comments you send more useful in improving this application, try to send the same amount of positive and negative comments.<br/>" +msgstr "為了讓您傳送的意見對我們改進程式更有幫助,請試著盡量多傳送包括正面與負面的意見。<br/>" #: utils/likeback/likebackdialog.cpp:177 msgctxt "Feedback dialog text, text to disallow feature requests" -msgid "" -"Please, do not ask for new features: this kind of request will be ignored." -"<br/>" +msgid "Please, do not ask for new features: this kind of request will be ignored.<br/>" msgstr "請不要要求新功能:這類的要求會被忽略。<br/>" #: utils/likeback/likebackdialog.cpp:183 #, kde-format -msgctxt "" -"Feedback dialog text, %1=Application name,%2=message with list of accepted " -"languages for the comment,%3=optional text to remind to balance the likes " -"and dislikes,%4=optional text to disallow feature requests." -msgid "" -"<p>You can provide the developers a brief description of your opinions about " -"%1.<br/>%2 %3%4</p>" +msgctxt "Feedback dialog text, %1=Application name,%2=message with list of accepted languages for the comment,%3=optional text to remind to balance the likes and dislikes,%4=optional text to disallow feature requests." +msgid "<p>You can provide the developers a brief description of your opinions about %1.<br/>%2 %3%4</p>" msgstr "<p>您可以提供開發者關於 %1 的您的意見的簡短描述。<br/>%2 %3%4</p>" #: utils/likeback/likebackdialog.cpp:225 #, kde-format -msgid "" -"The email address you have entered is not valid, and cannot be used: '%1'" +msgid "The email address you have entered is not valid, and cannot be used: '%1'" msgstr "您輸入的電子郵件地址不合法,因此無法使用:%1" #: utils/likeback/likebackdialog.cpp:299 msgctxt "Dialog box text" -msgid "" -"<p>Your comment has been sent successfully. It will help us improve the " -"application!</p><p>Thanks for your time.</p>" +msgid "<p>Your comment has been sent successfully. It will help us improve the application!</p><p>Thanks for your time.</p>" msgstr "<p>您的意見已成功傳送。相信這個軟體會越來越好!</p><p>感謝您!</p>" #: utils/likeback/likebackdialog.cpp:302 @@ -4366,9 +4144,7 @@ #: utils/likeback/likebackdialog.cpp:313 msgctxt "Dialog box text" -msgid "" -"<p>There has been an error while trying to send the comment.</p><p>Please, " -"try again later.</p>" +msgid "<p>There has been an error while trying to send the comment.</p><p>Please, try again later.</p>" msgstr "<p>傳送報告時發生錯誤。</p><p>請稍後再試一次。</p>" #: utils/likeback/likebackdialog.cpp:315 @@ -4377,10 +4153,9 @@ msgstr "意見傳送錯誤" #: rc.cpp:2 -#, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "tryneeds@..." +msgstr "你的 Email" #. i18n: file: chat/chatwindow.ui:190 #. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) @@ -4397,9 +4172,7 @@ #. i18n: file: chat/chatwindow.ui:215 #. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) #: rc.cpp:14 -msgid "" -"Click this button to switch to the handwriting mode, so you can write or " -"paint a handwritten message." +msgid "Click this button to switch to the handwriting mode, so you can write or paint a handwritten message." msgstr "點擊此按鍵切換到手寫模式,您可以寫或畫出您的訊息。" #. i18n: file: chat/chatwindow.ui:238 @@ -4411,11 +4184,8 @@ #. i18n: file: chat/chatwindow.ui:241 #. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) #: rc.cpp:20 -msgid "" -"Click this button to show all default Live Messenger emoticons, so you can " -"easily insert them in your messages." -msgstr "" -"點擊此按鍵會顯示所有預設的 Live Messenger 表情圖示,您可以將它們加入訊息中。" +msgid "Click this button to show all default Live Messenger emoticons, so you can easily insert them in your messages." +msgstr "點擊此按鍵會顯示所有預設的 Live Messenger 表情圖示,您可以將它們加入訊息中。" #. i18n: file: chat/chatwindow.ui:257 #. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) @@ -4426,9 +4196,7 @@ #. i18n: file: chat/chatwindow.ui:260 #. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) #: rc.cpp:26 -msgid "" -"Click this button to show all custom emoticons, so you can easily insert " -"them in your messages." +msgid "Click this button to show all custom emoticons, so you can easily insert them in your messages." msgstr "點擊此按鍵會顯示所有自訂的表情圖示,您可以將它們加入訊息中。" #. i18n: file: chat/chatwindow.ui:279 @@ -4526,16 +4294,15 @@ #. i18n: file: dialogs/addcontactdialog.ui:47 #. i18n: ectx: property (whatsThis), widget (QLabel, label) #: rc.cpp:86 -msgid "" -"Enter here the email address of the person you wish to add to your contact " -"list" +msgid "Enter here the email address of the person you wish to add to your contact list" msgstr "請在此輸入您要加入的聯絡人的電子郵件地址" #. i18n: file: dialogs/addcontactdialog.ui:50 #. i18n: ectx: property (text), widget (QLabel, label) #. i18n: file: initialview.ui:160 #. i18n: ectx: property (text), widget (QLabel, TextLabel2) -#: rc.cpp:89 rc.cpp:284 +#: rc.cpp:89 +#: rc.cpp:284 msgid "Email address:" msgstr "電子郵件地址:" @@ -4554,8 +4321,7 @@ #. i18n: file: dialogs/awaymessagedialog.ui:19 #. i18n: ectx: property (whatsThis), widget (QLabel, label) #: rc.cpp:101 -msgid "" -"Enter a message to be automatically sent to people who try to message you." +msgid "Enter a message to be automatically sent to people who try to message you." msgstr "請輸入訊息。當其他人傳訊息給您的時候,會自動以此訊息回覆。" #. i18n: file: dialogs/awaymessagedialog.ui:22 @@ -4627,9 +4393,8 @@ #. i18n: file: dialogs/contactpropertiesdialog.ui:46 #. i18n: ectx: property (toolTip), widget (QLabel, imageContact_) #: rc.cpp:141 -#, fuzzy msgid "Click or Drag&Drop to change the image for this contact" -msgstr "點擊此處以顯示此聯絡人的選單" +msgstr "點選或拖曳來改變此聯絡人的圖案" #. i18n: file: dialogs/contactpropertiesdialog.ui:68 #. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) @@ -4694,13 +4459,8 @@ #. i18n: file: dialogs/contactpropertiesdialog.ui:379 #. i18n: ectx: property (text), widget (QLabel, label) #: rc.cpp:180 -msgid "" -"<html>You can choose to hide any emoticon received from this contact. Just " -"right-click on a received emoticon and choose \"Hide this Emoticon\". With " -"this page, you can restore the hidden emoticons.</html>" -msgstr "" -"<html>您可以選擇隱藏任何從聯絡人傳來的表情符號。只要在表情符號上點選右鍵,並" -"選擇 「隱藏這個表情符號」。您可以在此頁面回復隱藏的表情符號。</html>" +msgid "<html>You can choose to hide any emoticon received from this contact. Just right-click on a received emoticon and choose \"Hide this Emoticon\". With this page, you can restore the hidden emoticons.</html>" +msgstr "<html>您可以選擇隱藏任何從聯絡人傳來的表情符號。只要在表情符號上點選右鍵,並選擇 「隱藏這個表情符號」。您可以在此頁面回復隱藏的表情符號。</html>" #. i18n: file: dialogs/contactpropertiesdialog.ui:453 #. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) @@ -4873,16 +4633,13 @@ #. i18n: file: initialview.ui:97 #. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) #: rc.cpp:281 -msgid "" -"<html>Click here to display the options for the currently selected account, " -"or scroll using the mouse wheel to switch between the saved accounts</html>" +msgid "<html>Click here to display the options for the currently selected account, or scroll using the mouse wheel to switch between the saved accounts</html>" msgstr "<html>按這裡顯示使用者設定,或滾動滑鼠滾輪切換使用者。</html>" #. i18n: file: initialview.ui:179 #. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) #: rc.cpp:287 -msgid "" -"Enter here the email address of your registered Passport or Live account" +msgid "Enter here the email address of your registered Passport or Live account" msgstr "請輸入您已用於註冊 Live 或護照帳號的電子郵件地址" #. i18n: file: initialview.ui:195 @@ -4924,9 +4681,7 @@ #. i18n: file: initialview.ui:285 #. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) #: rc.cpp:311 -msgid "" -"If you choose to remember an account within KMess, you can also save its " -"password" +msgid "If you choose to remember an account within KMess, you can also save its password" msgstr "若您選擇要將帳號記在 KMess 內,您可以儲存密碼" #. i18n: file: initialview.ui:288 @@ -4944,8 +4699,7 @@ #. i18n: file: initialview.ui:345 #. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) #: rc.cpp:323 -msgid "" -"Click this button to start using KMess, or to cancel a connection attempt" +msgid "Click this button to start using KMess, or to cancel a connection attempt" msgstr "點擊此按鍵開始使用 KMess,或是取消連線嘗試" #. i18n: file: initialview.ui:444 @@ -4963,12 +4717,8 @@ #. i18n: file: initialview.ui:450 #. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) #: rc.cpp:335 -msgid "" -"<html>Click here to register a new Live account, which you can use to " -"connect to MSN.<br/>You can also use your existing email address</html>" -msgstr "" -"<html>點擊此處以註冊新的 Live 帳號,以便連線到 MSN。<br/>您可以使用您現有的電" -"子郵件地址。</html>" +msgid "<html>Click here to register a new Live account, which you can use to connect to MSN.<br/>You can also use your existing email address</html>" +msgstr "<html>點擊此處以註冊新的 Live 帳號,以便連線到 MSN。<br/>您可以使用您現有的電子郵件地址。</html>" #. i18n: file: initialview.ui:479 #. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) @@ -4985,18 +4735,17 @@ #. i18n: file: initialview.ui:485 #. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) #: rc.cpp:344 -msgid "" -"<html>Click here to go to the Live web site, to reset your account's " -"password</html>" +msgid "<html>Click here to go to the Live web site, to reset your account's password</html>" msgstr "<html>請點擊此處連線到 Live 網站,您可以重設您的密碼。</html>" #. i18n: file: inlineeditlabel.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, InlineEditLabel) #. i18n: file: utils/inlineeditlabel.ui:14 #. i18n: ectx: property (windowTitle), widget (QWidget, InlineEditLabel) -#: rc.cpp:347 rc.cpp:915 +#: rc.cpp:347 +#: rc.cpp:915 msgid "InlineEditLabel" -msgstr "" +msgstr "內聯編輯標籤" #. i18n: file: kmessinterfaceui.rc:5 #. i18n: ectx: Menu (file) @@ -5046,12 +4795,8 @@ #. i18n: file: settings/accountpage.ui:60 #. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) #: rc.cpp:371 -msgid "" -"Enter the email address of your MSN Passport account. You can register a new " -"account at http://register.passport.com/"; -msgstr "" -"請輸入您用於註冊 MSN Passport 帳號的電子郵件地址。您可以在 http://register."; -"passport.com/ 註冊一個新的帳號。" +msgid "Enter the email address of your MSN Passport account. You can register a new account at http://register.passport.com/"; +msgstr "請輸入您用於註冊 MSN Passport 帳號的電子郵件地址。您可以在 http://register.passport.com/ 註冊一個新的帳號。" #. i18n: file: settings/accountpage.ui:63 #. i18n: ectx: property (text), widget (QLabel, handleLabel_4) @@ -5062,12 +4807,8 @@ #. i18n: file: settings/accountpage.ui:79 #. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) #: rc.cpp:377 -msgid "" -"Enter the password of your MSN Passport account. You can register a new " -"account at http://register.passport.com/"; -msgstr "" -"請輸入您的 MSN Passport 帳號的密碼。您可以在 http://register.passport.com/ 註" -"冊一個新的帳號。" +msgid "Enter the password of your MSN Passport account. You can register a new account at http://register.passport.com/"; +msgstr "請輸入您的 MSN Passport 帳號的密碼。您可以在 http://register.passport.com/ 註冊一個新的帳號。" #. i18n: file: settings/accountpage.ui:82 #. i18n: ectx: property (text), widget (QLabel, passwordLabel_) @@ -5084,15 +4825,8 @@ #. i18n: file: settings/accountpage.ui:114 #. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberPasswordCheckBox_) #: rc.cpp:386 -msgid "" -"If you enable this option, KMess will save your account's password. This way " -"you will not have to enter your password on every start up, in order to log " -"in. Please keep in mind, that other persons that have access to this " -"computer may easily log in to your account, if this option is enabled." -msgstr "" -"如果你開啟此選項,KMess 會儲存你帳號的密碼。這樣做你不需要在每次啟動時輸入你" -"的密碼來登入。請留意,如果開啟此選項,其他人如果能存取此電腦,就能輕易地登入" -"你的帳號。" +msgid "If you enable this option, KMess will save your account's password. This way you will not have to enter your password on every start up, in order to log in. Please keep in mind, that other persons that have access to this computer may easily log in to your account, if this option is enabled." +msgstr "如果你開啟此選項,KMess 會儲存你帳號的密碼。這樣做你不需要在每次啟動時輸入你的密碼來登入。請留意,如果開啟此選項,其他人如果能存取此電腦,就能輕易地登入你的帳號。" #. i18n: file: settings/accountpage.ui:117 #. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) @@ -5122,18 +4856,13 @@ #. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) #: rc.cpp:410 msgid "" -"<html>The option \"Remember account\" was left unchecked while logging in, " -"so your settings will not be saved by default. Enable this option if you " -"want to save your account settings permanently on this system.\n" +"<html>The option \"Remember account\" was left unchecked while logging in, so your settings will not be saved by default. Enable this option if you want to save your account settings permanently on this system.\n" "\n" -"It is recommended to enable this option, unless you are using KMess as guest " -"or you are using a public system (e.g. Internet cafe).</html>" +"It is recommended to enable this option, unless you are using KMess as guest or you are using a public system (e.g. Internet cafe).</html>" msgstr "" -"<html>「記住帳號」選項在登入時並未勾選,所以您的設定將不會被保留。若您希望保" -"留您的帳號設定,請開啟此選項。\n" +"<html>「記住帳號」選項在登入時並未勾選,所以您的設定將不會被保留。若您希望保留您的帳號設定,請開啟此選項。\n" "\n" -"除非您使用的是公共系統(例如:網咖的電腦)上的 KMess,否則建議您開啟此選項。" -"</html>" +"除非您使用的是公共系統(例如:網咖的電腦)上的 KMess,否則建議您開啟此選項。</html>" #. i18n: file: settings/accountpage.ui:294 #. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) @@ -5168,17 +4897,13 @@ #. i18n: file: settings/accountpage.ui:375 #. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) #: rc.cpp:433 -msgid "" -"You need to connect to the Passport site to confirm that your email address " -"exists." +msgid "You need to connect to the Passport site to confirm that your email address exists." msgstr "您必須連線到微軟護照認證網站來確認您的電子郵件地址是否存在。" #. i18n: file: settings/accountpage.ui:378 #. i18n: ectx: property (text), widget (QLabel, verifyLabel_) #: rc.cpp:436 -msgid "" -"You cannot change your friendly name because your Passport email address is " -"not verified." +msgid "You cannot change your friendly name because your Passport email address is not verified." msgstr "您無法變更您的暱稱,因為您的 Passport 帳號尚未認證。" #. i18n: file: settings/accountpage.ui:418 @@ -5196,21 +4921,13 @@ #. i18n: file: settings/accountpage.ui:446 #. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) #: rc.cpp:445 -msgid "" -"<html>You need a Passport account to connect to the Live Messenger network. " -"You can register your current email address at register.passport.com or use " -"a Live Mail account to connect.</html>" -msgstr "" -"<html>您需要一個 Passport 的帳號才能連線到 Live Messenger 網路。您可以用您的" -"電子郵件地址到 register.passport.com 註冊一個帳號,或是用 Live Mail 帳號來連" -"線。</html>" +msgid "<html>You need a Passport account to connect to the Live Messenger network. You can register your current email address at register.passport.com or use a Live Mail account to connect.</html>" +msgstr "<html>您需要一個 Passport 的帳號才能連線到 Live Messenger 網路。您可以用您的電子郵件地址到 register.passport.com 註冊一個帳號,或是用 Live Mail 帳號來連線。</html>" #. i18n: file: settings/accountpage.ui:449 #. i18n: ectx: property (text), widget (QLabel, registerLabel_) #: rc.cpp:448 -msgid "" -"To connect to the Live Messenger service, you will need to register an email " -"address as Passport account." +msgid "To connect to the Live Messenger service, you will need to register an email address as Passport account." msgstr "要連線到 Live Messenger 服務,您必須用電子郵件地址註冊 Passport 帳號。" #. i18n: file: settings/accountpage.ui:489 @@ -5234,13 +4951,8 @@ #. i18n: file: settings/accountpage.ui:522 #. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) #: rc.cpp:460 -msgid "" -"If enabled, your status will be changed automatically to \"Idle\" when you " -"are not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"若開啟此選項,當你未使用電腦的數分鐘後,會自動將您的狀態切換為「閒置」。若此" -"選項無法選取,則表示 KMess 未將此功能支援編譯進來。" +msgid "If enabled, your status will be changed automatically to \"Idle\" when you are not using the computer for a few minutes. If this option is not available, KMess was built without support for this feature." +msgstr "若開啟此選項,當你未使用電腦的數分鐘後,會自動將您的狀態切換為「閒置」。若此選項無法選取,則表示 KMess 未將此功能支援編譯進來。" #. i18n: file: settings/accountpage.ui:525 #. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) @@ -5254,9 +4966,10 @@ #. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) #. i18n: file: settings/accountpage.ui:582 #. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) -#: rc.cpp:469 rc.cpp:475 rc.cpp:478 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Idle\"." +#: rc.cpp:469 +#: rc.cpp:475 +#: rc.cpp:478 +msgid "Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "控制 KMess 經過多久後會轉變狀態為「離開─閒置」" #. i18n: file: settings/accountpage.ui:559 @@ -5274,13 +4987,8 @@ #. i18n: file: settings/accountpage.ui:618 #. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) #: rc.cpp:484 -msgid "" -"<html>This happens because KMess was built without support for the " -"\"XScreenSaver\" Xorg extension, which is used to detect user activity. " -"Refer to your package manager for more details.</html>" -msgstr "" -"<html>KMess 編譯時並未加入 \"XScreenSaver\" 的 Xorg 延伸功能,此功能是用於偵" -"測使用者活動用的。詳情請詢問您的套件供應商。</html>" +msgid "<html>This happens because KMess was built without support for the \"XScreenSaver\" Xorg extension, which is used to detect user activity. Refer to your package manager for more details.</html>" +msgstr "<html>KMess 編譯時並未加入 \"XScreenSaver\" 的 Xorg 延伸功能,此功能是用於偵測使用者活動用的。詳情請詢問您的套件供應商。</html>" #. i18n: file: settings/accountpage.ui:621 #. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) @@ -5291,9 +4999,7 @@ #. i18n: file: settings/accountpage.ui:647 #. i18n: ectx: property (toolTip), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) #: rc.cpp:490 -msgid "" -"If enabled, you will not receive any notifications when your status is set " -"to \"Busy\"." +msgid "If enabled, you will not receive any notifications when your status is set to \"Busy\"." msgstr "如果開啟,當你的狀態為 \"忙碌\" 時,將部會收到任何通知。" #. i18n: file: settings/accountpage.ui:650 @@ -5311,11 +5017,8 @@ #. i18n: file: settings/accountsmanagerpage.ui:76 #. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) #: rc.cpp:499 -msgid "" -"Click here to create a new KMess account for an email already associated to " -"a Live account" -msgstr "" -"點擊此處以可用您現有已註冊為 Live 帳號的電子郵件地址建立一個新的 KMess 帳號" +msgid "Click here to create a new KMess account for an email already associated to a Live account" +msgstr "點擊此處以可用您現有已註冊為 Live 帳號的電子郵件地址建立一個新的 KMess 帳號" #. i18n: file: settings/accountsmanagerpage.ui:79 #. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) @@ -5357,22 +5060,14 @@ #. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) #: rc.cpp:529 msgid "" -"<html><p>If you enable chat logging, every chat you have will be saved in a " -"certain place (which can be specified below).</p>\n" -"<p>The chat logs will allow you to find something in your old discussions, " -"like a link, or you may use them to remember what you did say in a certain " -"occasion to someone.</p>\n" -"<p>They may also pose some privacy issues though, because unauthorized " -"people who use your account may read your chat logs.</p>\n" -"<p><b>Be sure to keep this option disabled on publicly accessible computers!" -"</b></p></html>" +"<html><p>If you enable chat logging, every chat you have will be saved in a certain place (which can be specified below).</p>\n" +"<p>The chat logs will allow you to find something in your old discussions, like a link, or you may use them to remember what you did say in a certain occasion to someone.</p>\n" +"<p>They may also pose some privacy issues though, because unauthorized people who use your account may read your chat logs.</p>\n" +"<p><b>Be sure to keep this option disabled on publicly accessible computers!</b></p></html>" msgstr "" -"<html><p>如果你開啟聊天紀錄功能,每次你的聊天內容都會儲存在一個特定的地方(可" -"以在下方指定)。</p>\n" -"<p>儲存的聊天內容可以讓你在過去的討論中尋找東西,例如連結,或是回憶起你在特定" -"狀況下對某人說了什麼話。</p>\n" -"<p>不過這樣做也可能產生一些隱私上的問題,因為某個未經允許就使用你帳號的人也可" -"以看到這些內容。</p>\n" +"<html><p>如果你開啟聊天紀錄功能,每次你的聊天內容都會儲存在一個特定的地方(可以在下方指定)。</p>\n" +"<p>儲存的聊天內容可以讓你在過去的討論中尋找東西,例如連結,或是回憶起你在特定狀況下對某人說了什麼話。</p>\n" +"<p>不過這樣做也可能產生一些隱私上的問題,因為某個未經允許就使用你帳號的人也可以看到這些內容。</p>\n" "<p><b>請確定在公用電腦中關閉此選項!</b></p></html>\n" @@ Diff output truncated at 100000 characters. @@ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pano9000@us...> - 2010-01-28 14:10:01
|
Revision: 5865 http://kmess.svn.sourceforge.net/kmess/?rev=5865&view=rev Author: pano9000 Date: 2010-01-28 14:09:53 +0000 (Thu, 28 Jan 2010) Log Message: ----------- Merged an updated Dutch translation Modified Paths: -------------- trunk/kmess/ChangeLog trunk/kmess/po/nl.po Modified: trunk/kmess/ChangeLog =================================================================== --- trunk/kmess/ChangeLog 2010-01-27 11:38:11 UTC (rev 5864) +++ trunk/kmess/ChangeLog 2010-01-28 14:09:53 UTC (rev 5865) @@ -1,3 +1,7 @@ + +2010-01-28 (Pano) + * Merged an updated Dutch translation by Heimen Stoffels. + 2010-01-25 (Valerio) * Fixed some signals. * Made notifications to work again. @@ -3,5 +7,5 @@ 2010-01-24 (Ruben) - * Improved Accountsmanager and Applicationstyle UI's. + * Improved Accountsmanager and Applicationstyle UIs. * Changed some strings to follow KDE HIG. * Made stylesheet for the Contactlist more specific (don't style all QTreeViews). Modified: trunk/kmess/po/nl.po =================================================================== --- trunk/kmess/po/nl.po 2010-01-27 11:38:11 UTC (rev 5864) +++ trunk/kmess/po/nl.po 2010-01-28 14:09:53 UTC (rev 5865) @@ -1,4 +1,4 @@ -# translation of nl.po to Nederlands +# translation of nl.po to # translation of KMess to Dutch # Copyright (C) 2009 The KMess team and KMess NL translators # This file is distributed under the same license as the KMess package. @@ -10,27 +10,26 @@ # Heimen <djmusic121@...>, 2009. # Sjors Gielen <dazjorz@...>, 2009. # Sjors Gielen <dazjorz@...>, 2009. -# Heimen (GMail) <vistausss@...>, 2009. +# Heimen (GMail) <vistausss@...>, 2009, 2010. msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n"; "POT-Creation-Date: 2009-08-25 16:52+0200\n" -"PO-Revision-Date: 2009-08-17 21:47+0200\n" +"PO-Revision-Date: 2010-01-24 17:08+0100\n" "Last-Translator: Heimen <vistausss@...>\n" -"Language-Team: Nederlands <kde-i18n-doc@...>\n" +"Language-Team: <en@...>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Dutch\n" "X-Poedit-Country: NETHERLANDS\n" -"X-Generator: Lokalize 1.0\n" +"X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account.cpp:53 -#, fuzzy msgid "Unknown name" -msgstr "Onbekend commando" +msgstr "Onbekende naam" #: account.cpp:81 msgid "I am away from my computer" @@ -165,8 +164,7 @@ #: chat/chat.cpp:1151 #, kde-format msgctxt "Warning message shown in chat, %1 is the contact's friendly name" -msgid "" -"%1 has sent you a voice clip, but KMess does not support voice clips yet." +msgid "%1 has sent you a voice clip, but KMess does not support voice clips yet." msgstr "" "%1 heeft u een voiceclip verstuurd, maar KMess ondersteunt nog geen " "voiceclips." @@ -184,13 +182,12 @@ #: chat/chat.cpp:1176 msgctxt "Warning message shown in chat" msgid "One or more contacts do not support the handwriting message." -msgstr "" +msgstr "Eén of meerdere contactpersonen ondersteunen geen handgeschreven berichten." #: chat/chat.cpp:1190 #, kde-format msgctxt "Warning message shown in chat, %1 is the contact's friendly name" -msgid "" -"%1 has sent you a Live Messenger feature that KMess does not support yet." +msgid "%1 has sent you a Live Messenger feature that KMess does not support yet." msgstr "" "%1 heeft u een Live Messenger-mogelijkheid verstuurd die KMess nog niet " "ondersteunt." @@ -418,8 +415,7 @@ #: chat/chatmessageview.cpp:342 #, kde-format -msgctxt "" -"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgctxt "Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" msgid "Chat with %1<br/>Started on: %2" msgstr "Gesprek met %1<br/>Gestart op: %2" @@ -705,8 +701,7 @@ #: chat/chatwindow.cpp:1086 msgid "<html>You cannot use the /block command in a group chat.</html>" -msgstr "" -"<html>In een groepsgesprek kunt u het /block commando niet gebruiken.</html>" +msgstr "<html>In een groepsgesprek kunt u het /block commando niet gebruiken.</html>" #: chat/chatwindow.cpp:1088 msgctxt "Caption when trying to block someone in a group chat" @@ -804,8 +799,7 @@ #: chat/chatwindow.cpp:2607 msgctxt "Label text" -msgid "" -"Handwriting is disabled: KMess cannot send drawings to some of the contacts." +msgid "Handwriting is disabled: KMess cannot send drawings to some of the contacts." msgstr "" "Handgescreven berichten verzenden is uitgeschakeld. KMess kan deze niet " "verzenden naar sommige contacten." @@ -833,8 +827,7 @@ #: chat/chatwindow.cpp:2636 msgctxt "Label text" msgid "Winks are disabled: KMess cannot send winks to this contact." -msgstr "" -"Winks zijn uitgeschakeld: KMess kan geen winks verzenden naar dit contact." +msgstr "Winks zijn uitgeschakeld: KMess kan geen winks verzenden naar dit contact." #: chat/contactframe.cpp:272 msgid "&Start Private Chat" @@ -1195,8 +1188,7 @@ #: dialogs/contactpropertiesdialog.cpp:663 msgctxt "Dialog box text" msgid "Are you sure you want to use the display picture of this contact?" -msgstr "" -"Weet u zeker dat u de schermafbeelding van deze contactpersoon wil gebruiken?" +msgstr "Weet u zeker dat u de schermafbeelding van deze contactpersoon wil gebruiken?" #: dialogs/contactpropertiesdialog.cpp:665 msgid "Copy Contact Picture" @@ -1718,8 +1710,7 @@ #: initialview.cpp:274 msgctxt "Status message on login screen" msgid "Cannot reconnect: this account has no saved password" -msgstr "" -"Kan niet opnieuw verbinden: dit account heeft geen opgeslagen wachtwoord." +msgstr "Kan niet opnieuw verbinden: dit account heeft geen opgeslagen wachtwoord." #: initialview.cpp:302 initialview.cpp:409 #, kde-format @@ -1739,8 +1730,7 @@ #: initialview.cpp:435 #, kde-format msgctxt "Status message on login screen" -msgid "" -"Waiting %1 second before reconnection...<br /><a href='%2'>Reconnect now!</a>" +msgid "Waiting %1 second before reconnection...<br /><a href='%2'>Reconnect now!</a>" msgid_plural "" "Waiting %1 seconds before reconnection...<br /><a href='%2'>Reconnect now!</" "a>" @@ -1772,33 +1762,29 @@ msgstr "Gelieve een een geldig e-mailadres in te voeren." #: initialview.cpp:804 -#, fuzzy msgctxt "Status event message" msgid "Connecting..." msgstr "Verbinden..." #: initialview.cpp:807 -#, fuzzy msgctxt "Status event message" msgid "Authenticating..." -msgstr "Aanmelden..." +msgstr "Controleren van gegevens..." #: initialview.cpp:811 -#, fuzzy msgctxt "Status event message" msgid "Retrieving contact list..." -msgstr "Wachten op contactpersonenlijst..." +msgstr "Verkrijgen van contactpersonenlijst..." #: initialview.cpp:814 msgctxt "Status event message" msgid "Going online..." -msgstr "" +msgstr "Bezig met online gaan..." #: initialview.cpp:817 -#, fuzzy msgctxt "Status event message" msgid "Connected!" -msgstr "Verbonden" +msgstr "Verbonden!" #: kmess.cpp:288 msgid "Contact Information" @@ -1807,8 +1793,7 @@ #: kmess.cpp:289 #, kde-format msgid "<html>The contact <b>%1</b> is already in your contact list.</html>" -msgstr "" -"<html>De contactpersoon <b>%1</b> staat al in uw contactenlijst.</html>" +msgstr "<html>De contactpersoon <b>%1</b> staat al in uw contactenlijst.</html>" #: kmess.cpp:310 msgid "New Group" @@ -1993,8 +1978,7 @@ #: kmess.cpp:1650 #, kde-format -msgctxt "" -"Main window caption: switched order to easily distinguish it from chats" +msgctxt "Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess - %1" @@ -2132,8 +2116,7 @@ msgid "" "German translation, testing, documentation, web master, project management, " "etc..." -msgstr "" -"Duitse vertaling, testen, documentatie, webmaster, projectmanagement, enz..." +msgstr "Duitse vertaling, testen, documentatie, webmaster, projectmanagement, enz..." #: main.cpp:73 msgid "Dane Harnett" @@ -2401,7 +2384,7 @@ #: main.cpp:124 msgid "Émeric Dupont" -msgstr "" +msgstr "Émeric Dupont" #: main.cpp:126 msgid "Hungarian translation" @@ -2432,8 +2415,7 @@ msgstr "Andrea Decorte" #: main.cpp:130 -msgid "" -"More Italian translation, Group selection in 'contact added user' dialog" +msgid "More Italian translation, Group selection in 'contact added user' dialog" msgstr "" "Verdere Italiaanse vertaling, groepselectie in dialoogvenster 'toegevoegde " "gebruiker contacteren'" @@ -2725,16 +2707,14 @@ #: main.cpp:182 msgid "Close-to-tray icon screenshot code" -msgstr "" -"Code voor screenshot met instructies betreft het sluiten naar het systeemvak" +msgstr "Code voor screenshot met instructies betreft het sluiten naar het systeemvak" #: main.cpp:183 msgid "Amarok" msgstr "Amarok" #: main.cpp:183 -msgid "" -"Custom crash handler implementation, system tray icon overlay implementation" +msgid "Custom crash handler implementation, system tray icon overlay implementation" msgstr "" "Implementatie van eigen crash-handeling, implementatie van embleem op het " "systeemvak-icoon" @@ -2743,8 +2723,7 @@ msgid "" "KNotify not giving focus bug fix and KWin focus stealing prevention " "workaround" -msgstr "" -"KNotify geeft geen focus bug fix en KWin focus stealing prevention workaround" +msgstr "KNotify geeft geen focus bug fix en KWin focus stealing prevention workaround" #: main.cpp:184 msgid "Quassel" @@ -2852,8 +2831,7 @@ #: network/applications/filetransfer.cpp:290 #: network/applications/filetransferp2p.cpp:377 #, kde-format -msgid "" -"The transfer of the file "%1" failed. Could not save the file." +msgid "The transfer of the file "%1" failed. Could not save the file." msgstr "" "De overdracht van bestand "%1" is mislukt. Kon het bestand niet " "opslaan." @@ -2863,8 +2841,7 @@ msgid "" "The transfer of the file "%1" failed. Could not open the " "destination file." -msgstr "" -"De overdracht van "%1" is mislukt. Kon het bronbestand niet openen." +msgstr "De overdracht van "%1" is mislukt. Kon het bronbestand niet openen." #: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." @@ -2881,8 +2858,7 @@ #: network/applications/filetransferp2p.cpp:549 #, kde-format msgid "The contact has cancelled the transfer of the file "%1"." -msgstr "" -"De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." +msgstr "De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." #: network/applications/filetransfer.cpp:432 #: network/applications/filetransferp2p.cpp:560 @@ -2915,16 +2891,13 @@ #: network/applications/filetransfer.cpp:742 #: network/applications/filetransferp2p.cpp:812 #, kde-format -msgid "" -"The transfer of the file "%1" failed. The file does not exist." -msgstr "" -"Bestandsoverdracht van "%1" is mislukt. Het bestand bestaat niet." +msgid "The transfer of the file "%1" failed. The file does not exist." +msgstr "Bestandsoverdracht van "%1" is mislukt. Het bestand bestaat niet." #: network/applications/filetransfer.cpp:747 #: network/applications/filetransferp2p.cpp:817 #, kde-format -msgid "" -"The transfer of the file "%1" failed. The file could not be read." +msgid "The transfer of the file "%1" failed. The file could not be read." msgstr "" "Bestandsoverdracht van "%1" is mislukt. Het bestand kan niet " "gelezen worden." @@ -2994,8 +2967,7 @@ #, kde-format msgctxt "Error message shown in chat, %1 is the contact's friendly name" msgid "<html>The handwritten message to %1 could not be delivered.</html>" -msgstr "" -"<html>Het verzenden van het handgeschreven bericht naar %1 is mislukt.</html>" +msgstr "<html>Het verzenden van het handgeschreven bericht naar %1 is mislukt.</html>" #: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It is not supported by the other client." @@ -3064,14 +3036,12 @@ #: network/applications/p2papplication.cpp:1190 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "" -"De uitnodiging is geannuleerd. Het bericht werd niet naar ons verstuurd." +msgstr "De uitnodiging is geannuleerd. Het bericht werd niet naar ons verstuurd." #: network/applications/p2papplication.cpp:1742 #: network/applications/p2papplicationbase.cpp:875 #: network/applications/p2papplicationbase.cpp:955 -msgid "" -"The transfer failed. The contact sent bad data, or KMess does not support it." +msgid "The transfer failed. The contact sent bad data, or KMess does not support it." msgstr "" "De overdracht is mislukt. De contactpersoon heeft corrupte data verzonden, " "of KMess ondersteunt dit niet." @@ -3093,8 +3063,7 @@ #: network/applications/p2papplication.cpp:2142 #: network/applications/p2papplication.cpp:3376 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "" -"Terugschakelen naar indirecte bestandsoverdracht (is mogelijk langzaam)" +msgstr "Terugschakelen naar indirecte bestandsoverdracht (is mogelijk langzaam)" #: network/applications/p2papplication.cpp:3167 msgid "Waiting for connection" @@ -3166,8 +3135,7 @@ #: network/applications/voiceconversation.cpp:204 msgid "The invitation was cancelled. The audio device could not be opened." -msgstr "" -"De uitnodiging is geannuleerd. Het audioapparaat kon niet geopend worden." +msgstr "De uitnodiging is geannuleerd. Het audioapparaat kon niet geopend worden." #: network/applications/voiceconversation.cpp:217 #, kde-format @@ -3215,8 +3183,7 @@ #: network/extra/msnftpconnection.cpp:126 #, kde-format msgid "The contact has cancelled the transfer of file "%1"." -msgstr "" -"De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." +msgstr "De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." #: network/extra/msnftpconnection.cpp:133 msgid "Failed" @@ -3243,8 +3210,7 @@ #: network/extra/msnftpconnection.cpp:469 #, kde-format msgid "The transfer of %1 failed. A connection could not be made." -msgstr "" -"De overdracht van %1 is mislukt. Er kon geen verbinding worden gemaakt." +msgstr "De overdracht van %1 is mislukt. Er kon geen verbinding worden gemaakt." #: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." @@ -3457,41 +3423,36 @@ "><i>Foutmelding:</i> %2</p>" #: notification/statusnotification.cpp:125 -#, fuzzy msgctxt "Status event message" msgid "The Offline Messages web service is currently not available." -msgstr "De service voor offlineberichten is momenteel niet beschikbaar" +msgstr "De webservice voor offlineberichten is momenteel niet beschikbaar." #: notification/statusnotification.cpp:129 -#, fuzzy msgctxt "Status event message" msgid "The Live Messenger web service is experiencing problems." -msgstr "De webservice van Live Messenger ondergaat momenteel problemen" +msgstr "De webservice van Live Messenger heeft momenteel problemen." #: notification/statusnotification.cpp:138 -#, fuzzy msgctxt "Status event message" msgid "Network connection lost." -msgstr "<p>Netwerkverbinding verbroken.</p>" +msgstr "Netwerkverbinding verbroken." #: notification/statusnotification.cpp:141 -#, fuzzy msgctxt "Status event message" msgid "KMess could not connect to the Live servers." -msgstr "<p>Kon geen verbinding maken met de Live Messenger-service.</p>" +msgstr "KMess kon geen verbinding maken met de Live Messenger-servers." #: notification/statusnotification.cpp:145 -#, fuzzy msgctxt "Status event message" msgid "" "KMess could not connect to the Live server.<br/>Maybe you need to " "authenticate before you can access the network?" msgstr "" -"<p>Kon geen verbinding maken met de Live Messenger-service.<br/>Wellicht " -"moet u zich eerst aanmelden bij het netwerk?</p>" +"Kon geen verbinding maken met de Live Messenger-server.<br/>Wellicht " +"moet u zich eerst aanmelden bij het netwerk?" #: notification/statusnotification.cpp:148 -#, fuzzy, kde-format +#, kde-format msgctxt "Status event detailed message" msgid "" "KMess could not connect to the Live servers.<br/>There may be a problem with " @@ -3500,44 +3461,39 @@ "be required to access the network.</p><p><a href='%1'>Click here</a> to " "visit the Messenger service status page." msgstr "" -"<p>KMess kan geen verbinding maken met de Live Messenger-servers.<br>Er is " +"KMess kan geen verbinding maken met de Live Messenger-servers.<br/>Er is " "mogelijk een probleen met uw internetverbinding, of de Live Messenger-" -"servers zijn tijdelijk niet beschikbaar.<br/>Het is ook mogelijk dat u zich " -"eerst moet aanmelden bij een webpagina of proxy, voordat u toegang krijgt " -"tot het netwerk.</p><p><a href='%1'>Klik hier</a> om de statuspagina van de " -"Live Messenger-service te openen.</p>" +"servers zijn tijdelijk niet beschikbaar. " +"<br/>Het is ook mogelijk dat u zich eerst moet aanmelden bij een webpagina of proxy, " +"voordat u toegang krijgt tot het netwerk.</p><p><a href='%1'>Klik hier</a> om de " +"statuspagina van de Live Messenger-service te openen." #: notification/statusnotification.cpp:158 msgctxt "Status event message" msgid "Connection not successful within time limit." -msgstr "" +msgstr "Verbinding niet geslaagd binnen het tijdslimiet." #: notification/statusnotification.cpp:161 -#, fuzzy msgctxt "Status event message" msgid "Connected from another location." -msgstr "<p>Het account <i>%1</i> is op een andere locatie aangemeld.</p>" +msgstr "Verbonden vanaf een andere locatie." #: notification/statusnotification.cpp:164 -#, fuzzy msgctxt "Status event message" msgid "Authentication not successful within time limit." -msgstr "Aanmeldstijdslimiet overschreden" +msgstr "Aanmelding niet geslaagd binnen het tijdslimiet." #: notification/statusnotification.cpp:167 -#, fuzzy msgctxt "Status event message" msgid "Authentication failed. Wrong login credentials." -msgstr "Aanmelden mislukt" +msgstr "Aanmelden mislukt. Verkeerde inloggegevens." #: notification/statusnotification.cpp:169 -#, fuzzy msgctxt "Status event detailed message" -msgid "" -"Authentication has failed, please verify your account email and password." +msgid "Authentication has failed, please verify your account email and password." msgstr "" -"<p>Aanmelden mislukt. Controleer het e-mailadres en wachtwoord van uw " -"account.</p>" +"Aanmelden mislukt. Controleer het e-mailadres en wachtwoord van uw " +"account." #: notification/statusnotification.cpp:174 msgctxt "Status event message" @@ -3546,24 +3502,25 @@ "or a required software package (QCA2) or one of its components may be " "missing." msgstr "" +"Aanmelden niet mogelijk!<br/>Het Live-netwerk is tijdelijk niet beschikbaar, " +"of een benodigd softwarepakket (QCA2) of 1 van zijn onderdelen missen." #: notification/statusnotification.cpp:178 -#, fuzzy msgctxt "Status event detailed message" msgid "" "KMess could not connect to the Live servers.<br/>Make sure you have " "installed the packages of QCA2 and its OpenSSL plugin!<br/>It is also " "possible that the Live network is unavailable at the moment." msgstr "" -"<p>KMess kan geen verbinding krijgen met de Live Messenger-servers.<br/>Zorg " -"ervoor dat u QCA2 and zijn OpenSSL-plugin geïnstalleerd hebt!<br/>Het is ook " -"mogelijk dat het MSN-netwerk op dit moment niet beschikbaar is.</p>" +"KMess kan geen verbinding krijgen met de Live Messenger-servers.<br/>Zorg " +"ervoor dat u QCA2 en zijn OpenSSL-plugin geïnstalleerd hebt!<br/>Het is ook " +"mogelijk dat het Live-netwerk op dit moment niet beschikbaar is." #: notification/statusnotification.cpp:212 #: notification/statusnotification.cpp:217 msgctxt "Status event message" msgid "An internal error has occurred in KMess. Network connection lost." -msgstr "" +msgstr "Een interne fout is opgetreden in KMess. Netwerkverbinding verbroken." #: notification/statusnotification.cpp:219 #, kde-format @@ -3572,12 +3529,13 @@ "KMess has encountered an internal error, and the connection to the server " "was lost.</p><p><i>Server error:</i> %1" msgstr "" +"KMess heeft een interne fout ervaren, en de verbinding met de server is verbroken. " +"</p><p><i>Serverfout:</i> %1" #: notification/statusnotification.cpp:228 -#, fuzzy msgctxt "Status event message" msgid "Unexpected response from server. Network connection lost." -msgstr "Onverwacht antwoord van server (%1)" +msgstr "Onverwacht antwoord van server. Netwerkverbinding verbroken." #: notification/statusnotification.cpp:230 #, kde-format @@ -3587,53 +3545,48 @@ "connection to the server has been closed to avoid further problems.</" "p><p><i>Error code:</i> %1<br/><p><i>Error message:</i> %2" msgstr "" +"KMess heeft een onverwacht antwoordt verkregen van de Live-server, en de " +"verbinding met de server is verbroken om verdere problemen te voorkomen.</p> " +"<p><i>Foutcode:</i> %1<br/><p><i>Foutmelding:<i>%2" #: notification/statusnotification.cpp:240 msgctxt "Status event message" msgid "Server request not successful within time limit." -msgstr "" +msgstr "Serveraanvraag niet geslaagd binnen het tijdslimiet." #: notification/statusnotification.cpp:243 msgctxt "Status event message" msgid "Unexpected redirection from server. Network connection lost." -msgstr "" +msgstr "Onverwachte doorsturing van server. Netwerkverbinding verbroken." #: notification/statusnotification.cpp:247 -#, fuzzy msgctxt "Status event message" -msgid "" -"The email address you have tried to add is not a Live Messenger account." -msgstr "" -"Het e-mailadres dat u probeerde toe te voegen, is geen Live Messenger-" -"account." +msgid "The email address you have tried to add is not a Live Messenger account." +msgstr "Het e-mailadres dat u probeerde toe te voegen is geen Live Messenger-account." #: notification/statusnotification.cpp:250 -#, fuzzy msgctxt "Status event message" msgid "Your contact list is full." -msgstr "Uw contactpersonenlijst is vol" +msgstr "Uw contactpersonenlijst is vol." #: notification/statusnotification.cpp:253 -#, fuzzy msgctxt "Status event message" msgid "This contact is not online." -msgstr "Deze contactpersoon is niet online" +msgstr "Deze contactpersoon is niet online." #: notification/statusnotification.cpp:256 -#, fuzzy msgctxt "Status event message" msgid "" "Your contact list has too many groups; you are allowed to only have at most " "30." msgstr "" "Uw contactpersonenlijst heeft te veel groepen; u mag maximaal 30 groepen " -"hebben" +"hebben." #: notification/statusnotification.cpp:259 -#, fuzzy msgctxt "Status event message" msgid "The group name is too long; it cannot be longer than 61 bytes." -msgstr "De groepsnaam is te lang; hij kan niet langer zijn dan 61 bytes" +msgstr "De groepsnaam is te lang; hij kan niet langer zijn dan 61 bytes." #: notification/statusnotification.cpp:263 msgctxt "Status event message" @@ -3641,113 +3594,95 @@ "Chat request failed, the Live server is experiencing problems; try again " "later." msgstr "" +"Chat-aanvraag mislukt, de Live-server ondervind problemen; probeer het later " +"nog eens." #: notification/statusnotification.cpp:266 msgctxt "Status event message" msgid "This user has not logged in." -msgstr "" +msgstr "Deze gebruiker is niet ingelogd." #: notification/statusnotification.cpp:269 -#, fuzzy msgctxt "Status event message" msgid "" "Error accessing contact list, the Live server is experiencing problems. Try " "again later." msgstr "" -"Een fout trad op tijdens het verkrijgen van de contactpersonenlijst, probeer " -"het later nog eens" +"Een fout trad op tijdens het verkrijgen van de contactpersonenlijst,de Live-server " +"ondervind problemen. Probeer het later nog eens." #: notification/statusnotification.cpp:272 -#, fuzzy msgctxt "Status event message" msgid "This account was denied access to the Live service." -msgstr "Deze account heeft geen toegang tot de Live Messenger-service" +msgstr "Deze account heeft geen toegang tot de Live Messenger-service." #: notification/statusnotification.cpp:288 -#, fuzzy msgctxt "Status event message" msgid "The Live Messenger service is temporarily unavailable. Try again later." -msgstr "" -"De Live Messenger-service is tijdelijk niet beschikbaar. De server is " -"overbelast" +msgstr "De Live Messenger-service is tijdelijk niet beschikbaar. Probeer het later nog eens." #: notification/statusnotification.cpp:291 -#, fuzzy msgctxt "Status event message" msgid "Your account was banned from the Live service!" -msgstr "Deze account heeft geen toegang tot de Live Messenger-service" +msgstr "Uw account is verbannen van de Live-service!" #: notification/statusnotification.cpp:294 -#, fuzzy msgctxt "Status event message" msgid "The server is going down for maintenance. Network connection lost." -msgstr "De Live Messenger-server wordt over %1 afgesloten voor onderhoud." +msgstr "De server wordt afgesloten voor onderhoud. Netwerkverbinding verbroken." #: notification/statusnotification.cpp:297 -#, fuzzy msgctxt "Status event message" msgid "The server will soon go down for maintenance..." -msgstr "De Live Messenger-server wordt over %1 afgesloten voor onderhoud." +msgstr "De server wordt spoedig afgesloten voor onderhoud..." #: notification/statusnotification.cpp:301 -#, fuzzy msgctxt "Status event message" msgid "The server reports that KMess is sending too many requests." -msgstr "De server meldt dat KMess hem overspoelt met data" +msgstr "De server meldt dat KMess hem teveel aanvragen stuurt." #: notification/statusnotification.cpp:304 -#, fuzzy msgctxt "Status event message" msgid "You have too many open chats." -msgstr "U heeft te veel actieve chatsessies" +msgstr "U heeft te veel actieve chatsessies." #: notification/statusnotification.cpp:307 -#, fuzzy msgctxt "Status event message" msgid "You cannot start a chat with someone while you are invisible." -msgstr "" -"U kunt geen chat met iemand starten terwijl uw status op Onzichtbaar staat " -"ingesteld" +msgstr "U kunt geen chat met iemand starten terwijl uw status op Onzichtbaar staat ingesteld." #: notification/statusnotification.cpp:310 -#, fuzzy msgctxt "Status event message" -msgid "" -"You have a Kids Passport account, you need parental consent to chat online." -msgstr "" -"Je hebt een Kids Passport-account, dus heb je toestemming van je ouders " -"nodig om online te chatten" +msgid "You have a Kids Passport account, you need parental consent to chat online." +msgstr "Je hebt een Kids Passport-account, dus heb je toestemming van je ouders nodig om online te chatten." #: notification/statusnotification.cpp:313 -#, fuzzy msgctxt "Status event message" msgid "Your Passport account needs to be verified first." -msgstr "Uw Passport-account moet nog geverifieerd worden" +msgstr "Uw Passport-account moet eerst geverifieerd worden." #: notification/statusnotification.cpp:316 msgctxt "Status event message" msgid "This account is not present on this server. Please try again." -msgstr "" +msgstr "Deze account is niet aanwezig op de server. Probeer opnieuw." #: notification/statusnotification.cpp:324 -#, fuzzy msgctxt "Status event message" msgid "" "Unable to perform authentication!<br/>Make sure you have installed QCA2 and " "its OpenSSL plugin!" msgstr "" -"<p>Het is niet mogelijk om u te authenticeren!<br/>Zorg ervoor dat u QCA2 en " -"zijn OpenSSL-plugin geïnstalleerd hebt.</p>" +"Het is niet mogelijk om u te authenticeren!<br/>Zorg ervoor dat u QCA2 en " +"zijn OpenSSL-plugin geïnstalleerd hebt." #: notification/statusnotification.cpp:327 -#, fuzzy msgctxt "Status event detailed message" msgid "" "KMess could not authenticate to the Live servers.<br />Make sure you have " "installed QCA2 and its OpenSSL plugin!" msgstr "" -"<p>Het is niet mogelijk om u te authenticeren!<br/>Zorg ervoor dat u QCA2 en " -"zijn OpenSSL-plugin geïnstalleerd hebt.</p>" +"Het is niet mogelijk om u te authenticeren!<br/>Zorg ervoor dat u QCA2 en " +"zijn OpenSSL-plugin geïnstalleerd hebt." #: notification/systemtraywidget.cpp:76 msgid "" @@ -3924,8 +3859,7 @@ #: settings/miscellaneouspage.cpp:287 msgid "You have to specify a console command to launch a custom web browser!" -msgstr "" -"U moet een terminalcommando opgeven om een eigen webbrowser op te starten." +msgstr "U moet een terminalcommando opgeven om een eigen webbrowser op te starten." #: settings/miscellaneouspage.cpp:292 #, c-format @@ -4322,8 +4256,7 @@ #. i18n: file: dialogs/awaymessagedialog.ui:19 #. i18n: ectx: property (whatsThis), widget (QLabel, label) #: rc.cpp:93 -msgid "" -"Enter a message to be automatically sent to people who try to message you." +msgid "Enter a message to be automatically sent to people who try to message you." msgstr "" "Voer een bericht in dat automatisch wordt verzonden naar mensen die u " "proberen te bereiken." @@ -4446,8 +4379,7 @@ #. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) #: rc.cpp:154 msgid "Click here to use the selected picture as your display picture" -msgstr "" -"Klik hier om de geselecteerde foto te gebruiken als uw schermafbeelding" +msgstr "Klik hier om de geselecteerde foto te gebruiken als uw schermafbeelding" #. i18n: file: dialogs/contactpropertiesdialog.ui:325 #. i18n: ectx: property (text), widget (QPushButton, useButton_) @@ -4844,10 +4776,8 @@ #. i18n: file: initialview.ui:141 #. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) #: rc.cpp:352 -msgid "" -"Enter here the email address of your registered Passport or Live account" -msgstr "" -"Voer hier het e-mailadres in van uw geregistreerde Passport- of Live-account" +msgid "Enter here the email address of your registered Passport or Live account" +msgstr "Voer hier het e-mailadres in van uw geregistreerde Passport- of Live-account" #. i18n: file: initialview.ui:157 #. i18n: ectx: property (text), widget (QLabel, TextLabel3) @@ -4871,8 +4801,7 @@ #. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) #: rc.cpp:364 msgid "Choose a status to set when successfully connected." -msgstr "" -"Kies een status die wordt ingesteld wanneer u succesvol bent aangemeld." +msgstr "Kies een status die wordt ingesteld wanneer u succesvol bent aangemeld." #. i18n: file: initialview.ui:231 #. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) @@ -4892,8 +4821,7 @@ msgid "" "If you choose to remember an account within KMess, you can also save its " "password" -msgstr "" -"U kunt ook uw wachtwoord bewaren, wanneer u KMess uw account laat onthouden" +msgstr "U kunt ook uw wachtwoord bewaren, wanneer u KMess uw account laat onthouden" #. i18n: file: initialview.ui:250 #. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) @@ -4910,8 +4838,7 @@ #. i18n: file: initialview.ui:307 #. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) #: rc.cpp:388 -msgid "" -"Click this button to start using KMess, or to cancel a connection attempt" +msgid "Click this button to start using KMess, or to cancel a connection attempt" msgstr "" "Klik op deze knop om te beginnen met KMess, of om een loginpoging te " "annuleren" @@ -5104,8 +5031,7 @@ #. i18n: ectx: property (whatsThis), widget (QComboBox, initialStatus_) #: rc.cpp:479 msgid "Here you can select which status KMess should set, after logging in." -msgstr "" -"Hier kunt u selecteren welke status KMess moet aannemen, na het inloggen." +msgstr "Hier kunt u selecteren welke status KMess moet aannemen, na het inloggen." #. i18n: file: settings/accountpage.ui:347 #. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) @@ -5205,8 +5131,7 @@ #. i18n: file: settings/accountpage.ui:554 #. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) #: rc.cpp:518 rc.cpp:524 rc.cpp:527 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Idle\"." +msgid "Controls the number of minutes before KMess changes the status to \"Idle\"." msgstr "" "Bepaalt het aantal minuten voordat KMess de status verandert naar \"Inactief" "\"." @@ -5394,8 +5319,7 @@ #. i18n: ectx: property (toolTip), widget (QLabel, label_2) #: rc.cpp:607 msgid "With this option, you can choose how KMess will save your chats" -msgstr "" -"Met deze optie kunt u kiezen op welke manier KMess uw chatgesprekken bewaart." +msgstr "Met deze optie kunt u kiezen op welke manier KMess uw chatgesprekken bewaart." #. i18n: file: settings/chatloggingpage.ui:54 #. i18n: ectx: property (text), widget (QLabel, label_2) @@ -5783,8 +5707,7 @@ #. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) #: rc.cpp:775 msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Gebruik &effecten in berichten, zoals *vet*, /schuin/ en _onderstreept_" +msgstr "Gebruik &effecten in berichten, zoals *vet*, /schuin/ en _onderstreept_" #. i18n: file: settings/chatstylepage.ui:555 #. i18n: ectx: property (whatsThis), widget (QCheckBox, enableChatFormattingCheckBox_) @@ -6021,8 +5944,7 @@ #. i18n: ectx: property (toolTip), widget (QRadioButton, useKDEBrowserRadio_) #: rc.cpp:899 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" -"Kies deze optie om de browser te gebruiken die door KDE gebruikt wordt." +msgstr "Kies deze optie om de browser te gebruiken die door KDE gebruikt wordt." #. i18n: file: settings/miscellaneouspage.ui:36 #. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) @@ -6050,8 +5972,7 @@ #. i18n: ectx: property (toolTip), widget (QRadioButton, useCustomMailClientRadio_) #: rc.cpp:911 rc.cpp:946 msgid "Choose this option to enter the path to your favorite browser." -msgstr "" -"Kies deze optie om het commando voor uw favoriete browser in te voeren." +msgstr "Kies deze optie om het commando voor uw favoriete browser in te voeren." #. i18n: file: settings/miscellaneouspage.ui:83 #. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) @@ -6184,743 +6105,3 @@ msgid " Hide KMess at startup" msgstr "Verberg KMess bij het opstarten" -#~ msgid "Invalid command syntax" -#~ msgstr "Ongeldige commandosyntaxis" - -#~ msgid "Invalid command parameter" -#~ msgstr "Ongeldige commandoparameter" - -#~ msgid "Domain name missing" -#~ msgstr "Domeinnaam ontbreekt" - -#~ msgid "Already logged in" -#~ msgstr "Al ingelogd" - -#~ msgid "The given account name is invalid" -#~ msgstr "De opgegeven accountnaam is ongeldig" - -#~ msgid "" -#~ "This account name is invalid, or your Passport account has not been " -#~ "confirmed yet" -#~ msgstr "" -#~ "Deze accountnaam is ongeldig of uw Passport-account is nog niet bevestigd" - -#~ msgid "Invalid SBP parameter" -#~ msgstr "Ongeldige SBP-parameter" - -#~ msgid "This contact is already on your list" -#~ msgstr "Deze contactpersoon staat al in uw lijst" - -#~ msgid "This contact is not on your list" -#~ msgstr "Deze contactpersoon staat niet in uw lijst" - -#~ msgid "Already in this mode" -#~ msgstr "Reeds in deze modus" - -#~ msgctxt "MSN error" -#~ msgid "This contact cannot be added to both allow and block list" -#~ msgstr "" -#~ "Deze contactpersoon kan niet zowel aan de lijst voor toegestane en " -#~ "geblokkeerde contactpersonen toegevoegd worden" - -#~ msgid "" -#~ "The group name is already present in your contact list. Please use a " -#~ "different name" -#~ msgstr "" -#~ "Deze groepsnaam is al in gebruik in uw contactpersonenlijst. Gebruik " -#~ "alstublieft een andere naam." - -#~ msgid "This group cannot be changed" -#~ msgstr "Deze groep kan niet gewijzigd worden" - -#~ msgid "Contact is not added to this group" -#~ msgstr "Contact is niet toegevoegd aan deze groep" - -#~ msgid "This group is not empty" -#~ msgstr "Deze groep is niet leeg" - -#~ msgid "Attempted to change group \"0\"" -#~ msgstr "Geprobeerd om groep \"0\" te wijzigen" - -#~ msgid "There was an internal error in KMess: %1" -#~ msgstr "Er trad een interne fout op in KMess: %1" - -#~ msgid "Invalid Group" -#~ msgstr "Ongeldige groep" - -#~ msgid "Empty domain" -#~ msgstr "Lege domeinnaam" - -#~ msgid "Wrong ADL command format" -#~ msgstr "Ongeldig ADL-commandoformaat" - -#~ msgid "Switchboard server failed" -#~ msgstr "Schakelbordserver gefaald" - -#~ msgid "Transfer to switchboard server failed" -#~ msgstr "Overdracht naar schakelbordserver is mislukt" - -#~ msgid "Direct connection (MSNSLP) error, connection failed" -#~ msgstr "Fout met directe verbinding (MSNSLP), verbinding mislukt" - -#~ msgid "Required field missing" -#~ msgstr "Vereist veld mist" - -#~ msgid "Not logged in" -#~ msgstr "Niet ingelogd" - -#~ msgid "Command is disabled" -#~ msgstr "Commando is uitgeschakeld" - -#~ msgid "Your account is banned" -#~ msgstr "Uw account is verbannen" - -#~ msgid "Challenge response failed" -#~ msgstr "Challenge-antwoord mislukt" - -#~ msgid "Bad command data" -#~ msgstr "Corrupte commandodata" - -#~ msgid "You are opening chat sessions too fast" -#~ msgstr "U opent de chatsessies te snel" - -#~ msgid "Unexpected command sequence" -#~ msgstr "Onverwachte commandosequentie" - -#~ msgid "Bad friend name" -#~ msgstr "Corrupte schermnaam" - -#~ msgid "Bad CVR data" -#~ msgstr "Corrupte CVR-data" - -#~ msgid "Authentication ticket was incorrect" -#~ msgstr "Aanmeldingsticket was incorrect" - -#~ msgid "Not accepting new contacts" -#~ msgstr "Geen nieuwe contactpersonen accepteren" - -#~ msgid "Bad USR ticket" -#~ msgstr "Corrupt USR-ticket" - -#~ msgid "" -#~ "The Live Messenger service is temporarily unavailable. There was an " -#~ "internal server error" -#~ msgstr "" -#~ "De Live Messenger-service is tijdelijk niet beschikbaar, er trad een " -#~ "interne serverfout op" - -#~ msgid "Peer notification server down" -#~ msgstr "Peermeldingsserver offline" - -#~ msgid "The server is going down" -#~ msgstr "De server wordt uitgezet" - -#~ msgid "The server is going down soon" -#~ msgstr "De server wordt spoedig uitgezet" - -#~ msgid "Write is blocking" -#~ msgstr "Schrijven blokkeert" - -#~ msgid "Session is overloaded" -#~ msgstr "Sessie is overbelast" - -#~ msgid "The server is not available" -#~ msgstr "De server is niet beschikbaar" - -#~ msgid "" -#~ "Unknown error code received from the server: %1<br/>Technical details: %2" -#~ msgstr "" -#~ "Onbekende foutcode ontvangen van server: %1<br/>Technische details: %2" - -#~ msgctxt "Error dialog box title" -#~ msgid "MSN Error" -#~ msgstr "MSN-fout" - -#~ msgid "Trying the HTTP fallback..." -#~ msgstr "HTTP-terugvalmethode proberen..." - -#~ msgid "" -#~ "Triple DES encryption is not supported. Probably missing QCA2 or its " -#~ "OpenSSL plugin." -#~ msgstr "" -#~ "3x DES-encryptie wordt niet ondersteund. U mist waarschijnlijk QCA2 of " -#~ "zijn OpenSSL- plugin." - -#~ msgid "Authenticated" -#~ msgstr "Aangemeld" - -#~ msgid "Unknown command received from the server: %1" -#~ msgstr "Onbekend commando ontvangen van de server: %1" - -#~ msgctxt "Time left before server maintenance" -#~ msgid "%1 minute" -#~ msgid_plural "%1 minutes" -#~ msgstr[0] "%1 minuut" -#~ msgstr[1] "%1 minuten" - -#~ msgid "Server closes for maintenance in %1!" -#~ msgstr "De server wordt afgesloten voor onderhoud over %1!" - -#~ msgid "KMess could not process Offline-IM messages.<br/>Details: %1" -#~ msgstr "KMess kon de offlineberichten niet doorvoeren.<br/>Details: %1" - -#~ msgid "SOAP client is no longer valid." -#~ msgstr "SOAP-client is niet langer geldig" - -#~ msgctxt "Connection warning: dialog box with message" -#~ msgid "<p><i>Warning</i>: %1</p>" -#~ msgstr "<p><i>Waarschuwing</i>: %1</p>" - -#~ msgctxt "Error dialog box title" -#~ msgid "MSN Warning" -#~ msgstr "MSN-waarschuwing" - -#~ msgid "<br />Internal error reason: %1" -#~ msgstr "<br />Reden voor interne fout: %1" - -#~ msgctxt "Connection error: detailed message" -#~ msgid "" -#~ "<p>You have been disconnected: you have connected with the account <i>%1</" -#~ "i> from another Messenger client, or from another location.</p>" -#~ msgstr "" -#~ "<p>U bent uitgelogd: uw account <i>%1</i> is ingelogd met een ander " -#~ "chatprogramma of op een andere locatie.</p>" - -#~ msgctxt "Connection error: detailed message" -#~ msgid "" -#~ "<p>KMess could not connect to the Live Messenger servers.<br />There may " -#~ "be a problem with your Internet connection, or the Live Messenger servers " -#~ "may be temporarily unavailable.</p><p><a href='%1'>Click here</a> to " -#~ "visit the Messenger service status page.</p>" -#~ msgstr "" -#~ "<p>KMess kan geen verbinding maken met de Live Messenger-servers.<br>Er " -#~ "is mogelijk een probleen met uw internetverbinding, of de Live Messenger-" -#~ "servers zijn tijdelijk niet beschikbaar.</p><p><a href='%1'>Klik hier</a> " -#~ "om de statuspagina van de Live Messenger-service te openen.</p>" - -#~ msgctxt "" -#~ "Connection error (Server-reported user error): passive notification " -#~ "message" -#~ msgid "<p><i>Error</i>: %1</p>" -#~ msgstr "<p><i>Fout</i>: %1</p>" - -#~ msgctxt "Connection error (Server-reported user error): detailed message" -#~ msgid "<p>The Live Messenger server has reported an error:</p><p>%1</p>" -#~ msgstr "" -#~ "<p>De Live Messenger-server heeft een foutmelding gemeld:</p><p>%1</p>" - -#~ msgctxt "" -#~ "Connection error (Server-reported server error): passive notification " -#~ "message" -#~ msgid "<p><i>Messenger Service Error</i>: %1</p>" -#~ msgstr "<p><i>Messenger Service-fout</i>: %1</p>" - -#~ msgctxt "Connection error (Server-reported server error): detailed message" -#~ msgid "<p>The Live Messenger server has reported an error:</p><p>%1</p>" -#~ msgstr "" -#~ "<p>De Live Messenger-server heeft een foutmelding gemeld:</p><p>%1</p>" - -#~ msgctxt "" -#~ "Connection error (Server-reported client error): passive notification " -#~ "message" -#~ msgid "<p><i>KMess Error</i>: %1</p>" -#~ msgstr "<p><i>Foutmelding van KMess</i></p><p>%1</p>" - -#~ msgctxt "Connection error (Server-reported client error): detailed message" -#~ msgid "<p>KMess has encountered an internal error:</p><p>%1</p>" -#~ msgstr "<p>Er trad een interne fout in KMess op:</p><p>%1</p>" - -#~ msgctxt "Connection error: detailed message" -#~ msgid "<p>Connection to the Live Messenger server has been lost.</p>" -#~ msgstr "<p>Verbinding met de Live Messenger-server is verbroken.</p>" - -#~ msgctxt "Error message shown with HTTP connection" -#~ msgid "%1 (Internal error code: %2)" -#~ msgstr "%1 (Interne foutcode: %2)" - -#~ msgctxt "Error message shown with HTTP connection" -#~ msgid "" -#~ "%1 (Internal error code: %2)<br/><i>Response:</i> %3 %4<br/" -#~ "><i>Redirection target:</i> %5" -#~ msgstr "" -#~ "%1 (Interne foutcode: %2)<br/><i>Reactie:</i> %3 %4<br/><i>Omleidingsdoel:" -#~ "</i> %5" - -#~ msgid "Connection time limit exceeded" -#~ msgstr "Verbindings-tijdlimiet is verlopen" - -#~ msgid "1 ping lost" -#~ msgid_plural "%1 pings lost" -#~ msgstr[0] "1 ping verloren" -#~ msgstr[1] "%1 pings verloren" - -#~ msgid "The connection to the server was lost" -#~ msgstr "De verbinding met de server is verbroken" - -#~ msgctxt "Warning message" -#~ msgid "The specified email address, \"%1\", is not a valid email address!" -#~ msgstr "Het opgegeven e-mailadres, \"%1\", is geen geldig adres." - -#~ msgctxt "Error message" -#~ msgid "" -#~ "The specified email address, \"%1\", does not belong to a Live Messenger " -#~ "account!" -#~ msgstr "" -#~ "Het opgegeven e-mailadres, \"%1\", behoort niet tot een Live Messenger-" -#~ "account." - -#~ msgctxt "Error message (system-generated description)" -#~ msgid "Invalid web service request (%1)" -#~ msgstr "Ongeldige webserviceaanvraag (%1)" - -#~ msgctxt "Error message (system-generated description)" -#~ msgid "The web service is not accessible (%1)" -#~ msgstr "De webservice is niet toegankelijk (%1)" - -#~ msgctxt "Error message" -#~ msgid "Too many redirections by web service" -#~ msgstr "Te veel omleidingen bij de webservice" - -#~ msgctxt "Error message with description (system-generated description)" -#~ msgid "Invalid web service response %1 (%2)" -#~ msgstr "Ongeldig webserviceantwoord %1 (%2)" - -#~ msgctxt "Error message" -#~ msgid "No response from web service" -#~ msgstr "Geen antwoord van webservice" - -#~ msgctxt "Do not translate: icon file name" -#~ msgid "process-working" -#~ msgstr "proces-verbinden" - -#~ msgid "" -#~ "\n" -#~ " </property>\n" -#~ " <property name=\"plainText\">\n" -#~ " <string notr=\"true\"/>\n" -#~ " </property>\n" -#~ " </widget>\n" -#~ " </item>\n" -#~ " <item>\n" -#~ " <widget class=\"QPushButton\" name=\"submitButton_\">\n" -#~ " <property name=\"text\">\n" -#~ " <string>Submit" -#~ msgstr "" -#~ "\n" -#~ " </property>\n" -#~ " <property name=\"plainText\">\n" -#~ " <string notr=\"true\"/>\n" -#~ " </property>\n" -#~ " </widget>\n" -#~ " </item>\n" -#~ " <item>\n" -#~ " <widget class=\"QPushButton\" name=\"submitButton_\">\n" -#~ " <property name=\"text\">\n" -#~ " <string>Indienen" - -#~ msgid "" -#~ "Submit</string>\n" -#~ " </property>" -#~ msgstr "" -#~ "Indienen</string>\n" -#~ " </property>" - -#~ msgctxt "" -#~ "Do not translate: undeletable default name, will be overwritten in the " -#~ "code" -#~ msgid "KSqueezedTextLabel" -#~ msgstr "KSqueezedTextLabel" - -#~ msgid "https://accountservices.passport.net/reg.srf"; -#~ msgstr "https://accountservices.passport.net/reg.srf"; - -#~ msgid "https://login.live.com/resetpw.srf"; -#~ msgstr "https://login.live.com/resetpw.srf"; - -#~ msgctxt "" -#~ "Do not translate: undeletable default name, will be overwritten in the " -#~ "code" -#~ msgid "" -#~ "Don't remove this, it makes maketrans break</string>\n" -#~ " </property>" -#~ msgstr "" -#~ "Verwijder dit niet, het zal maketrans beschadigen</string>\n" -#~ " </property>" - -#~ msgid "" -#~ "\n" -#~ " </property>\n" -#~ " <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n" -#~ " <item>\n" -#~ " <widget class=\"QLabel\" name=\"label\">\n" -#~ " <property name=\"text\">\n" -#~ " <string>Available application styles:" -#~ msgstr "" -#~ "\n" -#~ " </property>\n" -#~ " <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n" -#~ " <item>\n" -#~ " <widget class=\"QLabel\" name=\"label\">\n" -#~ " <property name=\"text\">\n" -#~ " <string>Beschikbare programmastijlen:" - -#~ msgid "Your name" -#~ msgstr "Uw naam" - -#~ msgctxt "Status bar message" -#~ msgid "Disconnected" -#~ msgstr "Verbinding verbroken" - -#~ msgid "[%1] %2 goes online" -#~ msgstr "[%1] %2 gaat online" - -#~ msgid "[%1] %2 goes offline" -#~ msgstr "[%1] %2 gaat offline" - -#~ msgid "" -#~ "Connect to a local 'kmesstestserver' instead of the official remote server" -#~ msgstr "" -#~ "Verbinden met een lokale 'kmesstestserver' in plaats van met de officiële " -#~ "externe server" - -#~ msgctxt "" -#~ "Group name in the contact list with online/total contacts of that group" -#~ msgid "%1 (%2/%3)" -#~ msgstr "%1 (%2/%3)" - -#~ msgctxt "Group name in the contact list with total contacts of that group" -#~ msgid "%1 (%2)" -#~ msgstr "%1 (%2)" - -#~ msgid "<html><b>%1</b>:<br/>%2</html>" -#~ msgstr "<html><b>%1</b>:<br/>%2</html>" - -#~ msgctxt "" -#~ "Tray icon HTML tooltip, %1 is the KMess version, %2 the friendly name, %3 " -#~ "the status" -#~ msgid "KMess %1<br><b>%1</b> (%2)" -#~ msgstr "KMess %1<br><b>%1</b> (%2)" - -#~ msgctxt "" -#~ "Tray icon text tooltip, %1 is the KMess version, %2 the friendly name, %3 " -#~ "the status" -#~ msgid "KMess %1 - %2 (%3)" -#~ msgstr "KMess %1 - %2 (%3)" - -#~ msgctxt "Tray icon tooltip, %1 is the KMess version" -#~ msgid "KMess %1" -#~ msgstr "KMess %1" - -#~ msgctxt "Dialog box text" -#~ msgid "You can only use 7 characters for the emoticon shortcuts." -#~ msgstr "U kunt maar maximaal 7 karakters voor de sneltoets gebruiken." - -#~ msgctxt "Dialog box title" -#~ msgid "Invalid Emoticon Name" -#~ msgstr "Ongeldige emoticon-naam" - -#~ msgctxt "Dialog box title" -#~ msgid "Replace Existing Emoticon" -#~ msgstr "Bestaande emoticon vervangen" - -#~ msgid "&Send a Comment to the Developers" -#~ msgstr "Een opmerking naar de ontwikkelaars &versturen" - -#~ msgid "Show &Feedback Icons" -#~ msgstr "&Feedback-pictogrammen weergeven" - -#~ msgctxt "Welcome dialog text, header text for test apps" -#~ msgid "Welcome to this testing version of %1." -#~ msgstr "Welkom bij de testversie van %1." - -#~ msgctxt "Welcome dialog text, header text for released apps" -#~ msgid "Welcome to %1." -#~ msgstr "Welkom bij %1." - -#~ msgctxt "" -#~ "Welcome dialog text, explanation for both the like and dislike buttons" -#~ msgid "" -#~ "Each time you have a great or frustrating experience, please click on the " -#~ "appropriate face below the window title-bar, briefly describe what you " -#~ "like or dislike and click on 'Send'." -#~ msgstr "" -#~ "Wanneer u een frustrerende of positieve ervaring heeft, klik dan op het " -#~ "bijbehorende gezichtje onder de vensterbalk, beschrijf uw ervaring en " -#~ "klik op 'Verzenden'." - -#~ msgctxt "Welcome dialog text, explanation for the like button alone" -#~ msgid "" -#~ "Each time you have a great experience, please click on the smiling face " -#~ "below the window title-bar, briefly describe what you like and click on " -#~ "'Send'." -#~ msgstr "" -#~ "Wanneer u een positieve ervaring heeft, klik dan op het lachende " -#~ "gezichtje onder de vensterbalk, beschrijf uw ervaring en klik op " -#~ "'Verzenden'." - -#~ msgctxt "Welcome dialog text, explanation for the dislike button alone" -#~ msgid "" -#~ "Each time you have a frustrating experience, please click on the frowning " -#~ "face below the window title-bar, briefly describe what you dislike and " -#~ "click on 'Send'." -#~ msgstr "" -#~ "Wanneer u een frustrerende ervaring heeft, klik dan op het fronsende " -#~ "gezichtje onder de vensterbalk, beschrijf uw ervaring en klik op " -#~ "'Verzenden'." - -#~ msgctxt "Welcome dialog text, explanation for the bug button" -#~ msgid "" -#~ "If you experience an improper behavior in the application, just click on " -#~ "the broken-object icon in the top-right corner of the window, describe " -#~ "the behavior and click on 'Send'." -#~ msgstr "" -#~ "Wanneer u een onjuiste handeling of actie tegenkomt in het programma, " -#~ "kunt u op het picogram voor defecte objecten in de rechterbovenhoek van " -#~ "het venster klikken, het beschrijven en op 'Verzenden' drukken." - -#~ msgctxt "Welcome dialog text, usage example" -#~ msgid "<b>I like</b> the new artwork. Very refreshing." -#~ msgstr "Het nieuwe artwork <b>vind ik mooi</i>. Lekker verfrissend." - -#~ msgctxt "Welcome dialog text, usage example" -#~ msgid "" -#~ "<b>I dislike</b> the welcome page of this assistant. Too time consuming." -#~ msgstr "" -#~ "De welkomstpagina van deze assistent <b>gebruik ik niet</b>. Kost onnodig " -#~ "veel tijd." - -#~ msgctxt "Welcome dialog text, usage example" -#~ msgid "" -#~ "<b>The application shows an improper behaviour</b> when clicking the Add " -#~ "button. Nothing happens." -#~ msgstr "" -#~ "<b>Het programma gedraagt zich onjuist</b> wanneer ik op de Toevoegen-" -#~ "knop druk. Er gebeurt niets." - -#~ msgctxt "Welcome dialog text, usage example" -#~ msgid "<b>I desire a new feature</b> allowing me to send my work by email." -#~ msgstr "<b>Ik zou graag zien</b> dat ik mijn werk via e-mail kan versturen." - -#~ msgctxt "Welcome dialog text, us=the developers, it=the application" -#~ msgid "To help us improve it, your comments are important." -#~ msgstr "Uw opmerkingen zijn belangrijk om het programma te verbeteren." - -#~ msgctxt "Welcome dialog text, header for the examples" -#~ msgid "Example" -#~ msgid_plural "Examples" -#~ msgstr[0] "Voorbeeld" -#~ msgstr[1] "Voorbeelden" - -#~ msgctxt "Welcome dialog title" -#~ msgid "Help Improve the Application" -#~ msgstr "Help mee het programma te verbeteren" - -#~ msgid "Send a Comment to the Developers" -#~ msgstr "Verstuur opmerkingen naar de ontwikkelaars" - -#~ msgctxt "" -#~ "Feedback dialog text, message with one accepted language for the comments" -#~ msgid "" -#~ "Please, write it in <b>%1</b> (you may want to use an <a href=\"%3" -#~ "\">online translation tool</a> for this).<br/>" -#~ msgstr "" -#~ "Gelieve in het <b>%1</b> te schrijven (hierbij kunt u een <a href=\"%3" -#~ "\">online vertaalhulpmiddel</a> gebruiken).<br/>" - -#~ msgctxt "" -#~ "Feedback dialog text, message with list of accepted languages for the " -#~ "comments" -#~ msgid "" -#~ "Please, write it in <b>%1 or %2</b> (you may want to use an <a href=\"%3" -#~ "\">online translation tool</a> for this).<br/>" -#~ msgstr "" -#~ "Gelieve in het <b>%1 of %2</b> te schrijven (hierbij kunt u een <a href=" -#~ "\"%3\">online vertaalhulpmiddel</a> gebruiken).<br/>" - -#~ msgctxt "" -#~ "Feedback dialog text, message to remind to balance the likes and dislikes" -#~ msgid "" -#~ "To make the comments you send more useful in improving this application, " -#~ "try to send the same amount of positive and negative comments.<br/>" -#~ msgstr "" -#~ "Probeer eenzelfde aantal positief en negatief commentaar te versturen, om " -#~ "uw opmerkingen meer nuttig te maken.<br/>" - -#~ msgctxt "Feedback dialog text, text to disallow feature requests" -#~ msgid "" -#~ "Please, do not ask for new features: this kind of request will be ignored." -#~ "<br/>" -#~ msgstr "" -#~ "Gelieve niet te vragen om nieuwe mogelijkheden in het programma: deze " -#~ "worden genegeerd.<br />" - -#~ msgctxt "" -#~ "Feedback dialog text, %1=Application name,%2=message with list of " -#~ "accepted languages for the comment,%3=optional text to remind to balance " -#~ "the likes and dislikes,%4=optional text to disallow feature requests." -#~ msgid "" -#~ "<p>You can provide the developers a brief description of your opinions " -#~ "about %1.<br/>%2 %3%4</p>" -#~ msgstr "" -#~ "<p>U kunt de ontwikkelaars een korte omschrijving sturen van uw mening " -#~ "over %1.<br/>%2 %3%4</p>" - -#~ msgid "" -#~ "The email address you have entered is not valid, and cannot be used: '%1'" -#~ msgstr "" -#~ "Het ingevoerde e-mailadres is niet geldig, en kan niet gebruikt worden: '%" -#~ "1'" - -#~ msgctxt "Dialog box text" -#~ msgid "" -#~ "<p>Your comment has been sent successfully. It will help us improve the " -#~ "application!</p><p>Thanks for your time.</p>" -#~ msgstr "" -#~ "<p>Uw opmerking is succesvol verzonden. Het zal ons helpen dit programma " -#~ "te verbeteren!</p><p>Wij bedanken u voor de moeite.</p>" - -#~ msgctxt "Dialog box title" -#~ msgid "Comment Sent" -#~ msgstr "Opmerking verzonden." - -#~ msgctxt "Dialog box text" -#~ msgid "" -#~ "<p>There has been an error while trying to send the comment.</" -#~ "p><p>Please, try again later.</p>" -#~ msgstr "" -#~ "<p>Er was een probleem met het verzenden van het rapport.</p><p>Gelieve " -#~ "het later nog een keer te proberen.</p>" - -#~ msgctxt "Dialog box title" -#~ msgid "Comment Sending Error" -#~ msgstr "Probleem met opmerking verzenden" - -#~ msgid "" -#~ "Welcome to KMess, [insert quite a long name here for testing purposes]!" -#~ msgstr "" -#~ "Welkom bij KMess, [voeg hier een redelijk lange naam toe voor " -#~ "testgebruik]!" - -#~ msgid "" -#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"; -#~ "REC-html40/strict.dtd\">\n" -#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/" -#~ "css\">\n" -#~ "p, li { white-space: pre-wrap; }\n" -#~ "</style></head><body style=\" font-family:'Lucida Grande'; font-" -#~ "size:13pt; font-weight:400; font-style:normal;\">\n" -#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-" -#~ "right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-" -#~ "size:16pt; font-weight:600;\">Hey you! </span>You're using KMess from " -#~ "trunk... Did you know trunk already moved on to 2.1 and that you <span " -#~ "style=\" font-weight:600;\">should use the 2.0.x branch</span> if you " -#~ "want a stable Live Messenger client? If you really want to see pre-alpha " -#~ "2.1 development, this dialog <span style=\" font-weight:600;\">will annoy " -#~ "you for the coming weeks at least</span>. See the last page in this " -#~ "wizard for more information.</p></body></html>" -#~ msgstr "" -#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"; -#~ "REC-html40/strict.dtd\">\n" -#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/" -#~ "css\">\n" -#~ "p, li { white-space: pre-wrap; }\n" -#~ "</style></head><body style=\" font-family:'Lucida Grande'; font-" -#~ "size:13pt; font-weight:400; font-style:normal;\">\n" -#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-" -#~ "right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-" -#~ "size:16pt; font-weight:600;\">Hé u daar! </span>U gebruikt KMess vanuit " -#~ "trunk... Wist u dat trunk al verder gaat met versie 2.1 en dat u<span " -#~ "style=\" font-weight:600;\">de 2.0.x branch moet gebruiken</span> als u " -#~ "een stabiele Live Messenger-client wil? Als u echt graag pre-alpha 2.1 " -#~ "development wil zien, dan zal dit venster <span style=\" font-weight:600;" -#~ "\">u nog zeker een aantal weken blijven lastigvallen.</span>. Zie de " -#~ "laatste pagina in de wizard voor meer informatie!</p></body></html>" - -#~ msgid "" -#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"; -#~ "REC-html40/strict.dtd\">\n" -#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/" -#~ "css\">\n" -#~ "p, li { white-space: pre-wrap; }\n" -#~ "</style></head><body style=\" font-family:'Lucida Grande'; font-" -#~ "size:13pt; font-weight:400; font-style:normal;\">\n" -#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-" -#~ "right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-" -#~ "size:22pt;\">STUFF WON'T WORK!</span></p></body></html>" -#~ msgstr "" -#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"; -#~ "REC-html40/strict.dtd\">\n" -#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/" -#~ "css\">\n" -#~ "p, li { white-space: pre-wrap; }\n" -#~ "</style></head><body style=\" font-family:'Lucida Grande'; font-" -#~ "size:13pt; font-weight:400; font-style:normal;\">\n" -#~ "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-" -#~ "right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-" -#~ "size:22pt;\">DINGEN ZULLEN NIET WERKEN!</span></p></body></html>" - -#~ msgid "Click here to tell the developers about something you liked" -#~ msgstr "" -#~ "Klik hier om de ontwikkelaars te vertellen over iets wat u leuk vind aan " -#~ "KMess" - -#~ msgid "" -#~ "<html>Click on one of these icons to send your feedback to the developers " -#~ "of this application. You can disable the icons with the \"Show Feedback " -#~ "Icons\" checkbox in the Help menu.</html>\n" -#~ " " -#~ msgstr "" -#~ "<html>Klik op één van deze pictogrammen om uw feedback te verzenden naar " -#~ "de ontwikkelaars van dit programma. U kunt deze pictogrammen uitschakelen " -#~ "via \"Feedback-pictogrammen weergeven\" in het Help-menu.</html>\n" -#~ " " - -#~ msgid "Click here to tell the developers about something you did not like" -#~ msgstr "" -#~ "Klik hier om de ontwikkelaars te vertelen over iets dat u niet waardeert" - -#~ msgid "Click here to tell the developers about a problem in the application" -#~ msgstr "" -#~ "Klik hier om de ontwikkelaars te vertellen over een probleem in of met " -#~ "KMess" - -#~ msgid "" -#~ "Click here to tell the developers about new features you would like to " -#~ "have in this application" -#~ msgstr "" -#~ "Klik hier om de ontwikkelaars te vertellen over mogelijkheden die u wenst " -#~ "in dit programma." - -#~ msgid "Your comment:" -#~ msgstr "Uw opmerking:" - -#~ msgid "Your comment is about:" -#~ msgstr "Betreft:" - -#~ msgid "Something you like" -#~ msgstr "Iets dat u leuk vindt" - -#~ msgid "Something you dislike" -#~ msgstr "Iets dat u niet leuk vindt" - -#~ msgid "An improper behavior of the application" -#~ msgstr "Incorrect gedrag van het programma" - -#~ msgid "A new feature you desire" -#~ msgstr "Een gewenste mogelijkheid" - -#~ msgid "Specify an email address to be contacted back:" -#~ msgstr "Geef een e-mailadres op waarnaar geantwoord dient te worden:" - -#~ msgid "" -#~ "<html>Specifying an email address will allow the developers to ask you " -#~ "for more information on your report, or to tell you when your feature " -#~ "will be implemented.<br/>\n" -#~ "<b>Your email address will not be used for anything else but this report." -#~ "</b></html>" -#~ msgstr "" -#~ "<html>Door uw e-mailadres op te geven, kunnen de ontwikkelaars u om " -#~ "verdere informatie vragen, of u vertellen wanneer de door u gewenste " -#~ "mogelijkheid geïmplementeerd gaat worden.<br/>\n" -#~ "<b>Uw e-mailadres zal alleen voor dit doeleinde worden gebruikt.</b></" -#~ "html>" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fontknocker@us...> - 2010-01-27 11:38:17
|
Revision: 5864 http://kmess.svn.sourceforge.net/kmess/?rev=5864&view=rev Author: fontknocker Date: 2010-01-27 11:38:11 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Don't automatically request a chat in MsnChat if the initial contact is offline. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/src/msnchat.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-27 11:21:09 UTC (rev 5863) +++ trunk/kmess/lib/ChangeLog 2010-01-27 11:38:11 UTC (rev 5864) @@ -5,6 +5,7 @@ guard the pointer for us. * MsnSwitchboardConnection: add the SwitchboardState enum which gives a little more information about switchboard state. + * MsnChat: do not request a switchboard if our initial contact is offline. 2010-01-27 Valerio Pilo <valerio@...> Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-27 11:21:09 UTC (rev 5863) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-27 11:38:11 UTC (rev 5864) @@ -117,7 +117,13 @@ return; } - emit requestSwitchboard( this ); + MsnContact *contact = session_->getContact( firstContact_ ); + if ( contact && contact->isOnline() ) + { + emit requestSwitchboard( this ); + } + + // otherwise, it's an Offline IM session. don't get a SB session. } @@ -187,8 +193,8 @@ connect( switchboard_, SIGNAL( receivedTypingNotification(QString) ), this, SLOT ( slotReceivedTypingNotification(QString) ) ); */ - connect( switchboard_, SIGNAL( sendingFailed(const Message) ), - this, SIGNAL( sendingFailed(const Message) ) ); + connect( switchboard_, SIGNAL( sendingFailed(const KMess::Message) ), + this, SIGNAL( sendingFailed(const KMess::Message) ) ); connect( switchboard_, SIGNAL( chatWarning(KMess::ChatWarningType,KMess::MsnContact*) ), this, SIGNAL( chatWarning(KMess::ChatWarningType,KMess::MsnContact*) ) ); connect( switchboard_, SIGNAL( dataSent(const quint32) ), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fontknocker@us...> - 2010-01-27 11:21:18
|
Revision: 5863 http://kmess.svn.sourceforge.net/kmess/?rev=5863&view=rev Author: fontknocker Date: 2010-01-27 11:21:09 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Adjust the commenting out of the P2P code slightly; fixes a crash. Add SwitchboardState enum to MsnSBConnection, to give more fine-grained info about SB state. Wrap MsnChat instances in MsnNSConnection in QPointer instances to prevent crashes if the MsnChat is destroyed before a XFR response. Fix a slight bug in ListsManager's machine-guid handling too. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/src/connections/msnnotificationconnection.cpp trunk/kmess/lib/src/connections/msnnotificationconnection.h trunk/kmess/lib/src/connections/msnswitchboardconnection.cpp trunk/kmess/lib/src/connections/msnswitchboardconnection.h trunk/kmess/lib/src/listsmanager.cpp trunk/kmess/lib/src/msnchat.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/ChangeLog 2010-01-27 11:21:09 UTC (rev 5863) @@ -1,3 +1,11 @@ +2010-01-27 Adam Goossens <adam@...> + + * MsnNotificationConnection: wrap MsnChat instances in openRequests_ in QPointer instances. + If the MsnChat is deleted before we get the SB response it will cause a crash. QPointer will + guard the pointer for us. + * MsnSwitchboardConnection: add the SwitchboardState enum which gives a little more information + about switchboard state. + 2010-01-27 Valerio Pilo <valerio@...> * MsnSession: Added a new statusEvent for application-requested disconnection events. Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-27 11:21:09 UTC (rev 5863) @@ -41,8 +41,8 @@ #include <QTextDocument> // for Qt::escape() #include <QUrl> #include <QUuid> +#include <QPointer> - // NOTE: NOTIFICATION_HIDE_P2P_SUPPORT was moved to utils/utils.cpp using namespace KMess; @@ -1582,10 +1582,11 @@ // This is a switchboard server response: this command is a response to // a user-requested chat request. Look for the requesting chat - MsnChat *msnChat = openRequests_.value( transactionId, 0 ); + QPointer<MsnChat> msnChat = openRequests_.value( transactionId, 0 ); if( msnChat == 0 ) { warning() << "Got an XFR response, but there are no corresponding open requests!"; + openRequests_.take( transactionId ); return; } @@ -2399,7 +2400,7 @@ int transactionId = sendCommand( "XFR", "SB" ); // Store the pending request information so the return value can be handled - openRequests_.insert( transactionId, requester ); + openRequests_.insert( transactionId, QPointer<MsnChat>( requester ) ); } Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.h =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-27 11:21:09 UTC (rev 5863) @@ -25,8 +25,8 @@ #include <QList> #include <QTimer> #include <KMess/Message> +#include <QPointer> - namespace KMess { // Forward declarations @@ -317,7 +317,7 @@ // The Offline-IM SOAP client OfflineImService *offlineImService_; // The list of unanswered chat session requests - QMap<int,MsnChat*> openRequests_; + QMap<int,QPointer<MsnChat> > openRequests_; // The object than handles the passport login PassportLoginService *passportLoginService_; // The Roaming SOAP client Modified: trunk/kmess/lib/src/connections/msnswitchboardconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnswitchboardconnection.cpp 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/connections/msnswitchboardconnection.cpp 2010-01-27 11:21:09 UTC (rev 5863) @@ -67,6 +67,7 @@ , acksPending_( 0 ) , isInvitationSession_( false ) , isReady_( false ) + , state_ ( StateDisconnected ) { setObjectName( "MsnSwitchboardConnection" ); @@ -154,10 +155,10 @@ // Close the connection void MsnSwitchboardConnection::closeConnection() { + state_ = StateDisconnected; + disconnectFromServer(); - isReady_ = false; - debug() << "Session ended"; } @@ -190,8 +191,13 @@ // Signal that the switchboard is no longer busy and can accept new application messages. if( acksPending_ < MAX_PENDING_MESSAGES-1 ) { + state_ = StateReady; emit connectionReady(); } + else + { + state_ = StateBusy; + } } @@ -222,8 +228,7 @@ return; } - // we're now ready! - if ( ! isReady_ ) isReady_ = true; + state_ = StateReady; QString handle( command[4].toLower() ); @@ -258,8 +263,7 @@ debug() << "Contact joined:" << handle; - // with at least one JOI we are ready to go. - if ( !isReady_ ) isReady_ = true; + state_ = StateReady; // Notify the join emit contactJoined( handle ); @@ -389,6 +393,8 @@ debug() << "Authentication successful"; + state_ = StateWaitingForContact; + emit connectionAuthenticated(); } @@ -413,9 +419,11 @@ // Check whether the switchboard is busy (has too many pending messages) bool MsnSwitchboardConnection::isBusy() const { + return state_ == StateBusy; + // unAckedMessages_ also contains messages what have a "NAK_ONLY" flag. // keep a special variable that only lists the normal ACKs. - return ( acksPending_ > MAX_PENDING_MESSAGES ); + //return ( acksPending_ > MAX_PENDING_MESSAGES ); } @@ -429,7 +437,7 @@ */ bool MsnSwitchboardConnection::isReady() const { - return isReady_; + return state_ == StateReady; } @@ -572,6 +580,10 @@ if( ackMode == ConfirmAlways ) { acksPending_++; + if ( acksPending_ > MAX_PENDING_MESSAGES ) + { + state_ = StateBusy; + } } if ( ackMode != ConfirmPtpData ) @@ -594,8 +606,12 @@ { debug() << "Connected to the server, sending authentication"; + state_ = StateConnected; + emit connectionOpened(); + state_ = StateAuthorizing; + QString command; QStringList parameters; @@ -629,6 +645,8 @@ KMESS_ASSERT( session_ != 0 ); KMESS_ASSERT( !isConnected() ); + state_ = StateConnecting; + debug() << "Connecting to" << ip << ":" << port << "in response to an user request"; // Store the authentication information, for the USR command @@ -652,6 +670,8 @@ KMESS_ASSERT( session_ != 0 ); KMESS_ASSERT( !isConnected() ); + state_ = StateConnecting; + debug() << "Connecting to" << ip << ":" << port << "in response to an invitation"; // Store the authentication information, for the USR command @@ -669,3 +689,11 @@ } + +/** + * Return the state of the switchboard. + */ +MsnSwitchboardConnection::SwitchboardState MsnSwitchboardConnection::state() const +{ + return state_; +} Modified: trunk/kmess/lib/src/connections/msnswitchboardconnection.h =================================================================== --- trunk/kmess/lib/src/connections/msnswitchboardconnection.h 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/connections/msnswitchboardconnection.h 2010-01-27 11:21:09 UTC (rev 5863) @@ -56,6 +56,17 @@ , VOICECONVERSATION }; + enum SwitchboardState + { + StateConnected, // socket connected + StateConnecting, // socket connecting + StateDisconnected, // socket closed + StateAuthorizing, // authorizing to SB. + StateWaitingForContact, // waiting for someone to join (either IRO or JOI) + StateReady, // ready to send messages + StateBusy // waiting to send pending messages. + }; + // The constructor MsnSwitchboardConnection( MsnSession* session ); // The destructor @@ -77,6 +88,9 @@ void start( const QString &ip, quint16 port, const QString &authorization ); // Connect to the server, in response to a contact invitation void start( const QString &ip, quint16 port, const QString &authorization, const QString &chatId ); + // Get the state of the switchboard. + SwitchboardState state() const; + // Send a message over the SB qint32 sendMessage( Message &message ); // Clean the old unacked messages void cleanUnackedMessages(); @@ -123,8 +137,9 @@ bool isInvitationSession_; // Whether the switchboard is ready to send/receive messages. bool isReady_; + // Current SB state + SwitchboardState state_; - signals: // The switchboard is done authenticating and is ready to invite contacts. void connectionAuthenticated(); @@ -143,9 +158,9 @@ // Received a chat message void receivedMessage( Message message ); /// Signal that the delivery of a message has failed - void sendingFailed( const Message message, const QString &recipient ); + void sendingFailed( const KMess::Message message, const QString &recipient ); /// Signal that the delivery of a message has succeeded - void sendingSucceeded( const Message message ); + void sendingSucceeded( const KMess::Message message ); // Signal that a warning message needs to be displayed in chat void showWarning( const QString &handle, KMess::ChatWarningType type ); Modified: trunk/kmess/lib/src/listsmanager.cpp =================================================================== --- trunk/kmess/lib/src/listsmanager.cpp 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/listsmanager.cpp 2010-01-27 11:21:09 UTC (rev 5863) @@ -369,7 +369,7 @@ } // strip out machine guid. - handle = handle.section( ';', 0 ); + handle = handle.section( ';', 0, 0 ); // First find it by handle if( contacts_.contains( handle ) ) Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-27 08:44:38 UTC (rev 5862) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-27 11:21:09 UTC (rev 5863) @@ -74,6 +74,9 @@ offlineImService_ = new OfflineImService( session_, this ); + // create one instance. keep it for life. + createSwitchboardConnection(); + connect( offlineImService_, SIGNAL( sendMessageFailed(QString,MimeMessage) ), this, SIGNAL( sendingFailed(QString,MimeMessage) ) ); } @@ -160,10 +163,10 @@ connect( switchboard_, SIGNAL( receivedMessage(Message) ), this, SLOT( gotMessage(Message) ) ); - connect( switchboard_, SIGNAL( sendingFailed( Message, const QString& ) ), - this, SIGNAL( sendingFailed( Message, const QString& ) ) ); - connect( switchboard_, SIGNAL( sendingSucceeded( Message ) ), - this, SIGNAL( sendingSucceeded( Message ) ) ); + connect( switchboard_, SIGNAL( sendingFailed( KMess::Message, const QString& ) ), + this, SIGNAL( sendingFailed( KMess::Message, const QString& ) ) ); + connect( switchboard_, SIGNAL( sendingSucceeded( KMess::Message ) ), + this, SIGNAL( sendingSucceeded( KMess::Message ) ) ); /* connect( switchboard_, SIGNAL( receivedChatMessage(QString,QString,QFont,QString) ), this, SLOT ( slotReceivedChatMessage(QString,QString,QFont,QString) ) ); @@ -376,7 +379,7 @@ // the switchboard is ready for messages to travel across it. return ( switchboard_ != 0 && switchboard_->isConnected() && - switchboard_->isReady() ); + ( switchboard_->isReady() || switchboard_->isBusy() ) ); } @@ -682,15 +685,22 @@ } MsnContact *contact = session_->getContact( lastContact_ ); + + if ( switchboard_->state() == MsnSwitchboardConnection::StateConnecting ) + { + // remember, opening the connection is not instant. we have to wait for + // QAbstractSocket to inform the switchboard that the connection has been made. + return; + } - if ( switchboard_->isConnected() && ! switchboard_->isReady() ) + if ( switchboard_->isConnected() && + switchboard_->state() != MsnSwitchboardConnection::StateReady ) { - // connected to SB but not ready == re-establishing a connection. - // let it finish. + // keep waiting - we're probably authorizing or inviting initial contacts. return; } - - // not connected, not ready. + + // not connected, not ready, not waiting for a connection. // is this is an offline session? if ( contact && ! contact->isOnline() ) { @@ -1288,7 +1298,6 @@ - /** * @brief The switchboard closed. * @@ -1298,8 +1307,9 @@ */ void MsnChat::slotSwitchboardClosed() { +/* const QString handle = participants_.first(); -/* + RtcSignalingEndpoint *endpoint = PtpCollaboration::Platform::instance()->getOrCreateEndpoint(handle); TransportImpl *transport = endpoint->getTransport(); @@ -1687,10 +1697,15 @@ return; } + if ( switchboard_->isConnected() ) + { + warning() << "Switchboard is already connected! Disconnecting first."; + switchboard_->closeConnection(); + } + // Initialize the switchboard as a user-requested chat - switchboard_->start( server, port, authorization ); - + emit switchboardCreated(); } @@ -1701,14 +1716,18 @@ */ void MsnChat::invitedToChat( const QString &server, const quint16 port, const QString &authorization, const QString &chatId ) { - createSwitchboardConnection(); - if( switchboard_ == 0 ) { warning() << "Switchboard creation failed: unable to respond to invitation!"; return; } + if ( switchboard_->isConnected() ) + { + warning() << "Switchboard is already connected! Disconnecting first."; + switchboard_->closeConnection(); + } + // Initialize the switchboard as a contact-requested chat switchboard_->start( server, port, authorization, chatId ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-27 08:44:47
|
Revision: 5862 http://kmess.svn.sourceforge.net/kmess/?rev=5862&view=rev Author: it_amroth Date: 2010-01-27 08:44:38 +0000 (Wed, 27 Jan 2010) Log Message: ----------- * Added a new statusEvent for application-requested disconnection events. * Moved a check to avoid selecting a message for nothing. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/msnsession.h trunk/kmess/lib/include/KMess/networkglobals.h trunk/kmess/lib/src/connections/msnsockettcp.cpp trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-26 22:41:08 UTC (rev 5861) +++ trunk/kmess/lib/ChangeLog 2010-01-27 08:44:38 UTC (rev 5862) @@ -1,3 +1,8 @@ +2010-01-27 Valerio Pilo <valerio@...> + + * MsnSession: Added a new statusEvent for application-requested disconnection events. + * MsnSocketTcp: Moved a check to avoid selecting a message for nothing. + 2010-01-26 Valerio Pilo <valerio@...> * OfflineMessage: Partially rewritten to actually allow being used. Modified: trunk/kmess/lib/include/KMess/msnsession.h =================================================================== --- trunk/kmess/lib/include/KMess/msnsession.h 2010-01-26 22:41:08 UTC (rev 5861) +++ trunk/kmess/lib/include/KMess/msnsession.h 2010-01-27 08:44:38 UTC (rev 5862) @@ -273,7 +273,7 @@ // Ask the user to authenticate on a proxy void proxyAuthenticationRequired( const QNetworkProxy &proxy, QAuthenticator *authenticator ); // A status event has occurred - void statusEvent( const KMess::StatusMessageType type, const KMess::StatusMessage message, const QVariant &extraInfo ); + void statusEvent( const KMess::StatusMessageType type, const KMess::StatusMessage message, const QVariant &extraInfo = QVariant() ) const; // A new MsnChat object has been created void chatCreated( KMess::MsnChat *chat ); // A MsnChat object has been destroyed Modified: trunk/kmess/lib/include/KMess/networkglobals.h =================================================================== --- trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-26 22:41:08 UTC (rev 5861) +++ trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-27 08:44:38 UTC (rev 5862) @@ -207,6 +207,7 @@ , MESSAGE_PROGRESS_GETTING_CONTACT_LIST /// The memberships were received, starting to download the contact list , MESSAGE_PROGRESS_UPDATING_SERVER /// The contacts were received, updating the notification server to get presence data , MESSAGE_PROGRESS_CONNECTED /// The online presence session has started +, MESSAGE_PROGRESS_DISCONNECTED /// The online presence session has ended /// Warnings , MESSAGE_WARNING_LOST_PING /// A 'ping' was sent to the server but no answer was received Modified: trunk/kmess/lib/src/connections/msnsockettcp.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnsockettcp.cpp 2010-01-26 22:41:08 UTC (rev 5861) +++ trunk/kmess/lib/src/connections/msnsockettcp.cpp 2010-01-27 08:44:38 UTC (rev 5862) @@ -491,6 +491,12 @@ warning() << "Received error" << errorCode << "from the socket" "(socket state=" << socket_->state() << ")."; + // Ignore errors when disconnected: avoids duplicate error dialogs + if( ! connected_ ) + { + return; + } + KMess::StatusMessage message; // Find the most appropriate kind of error to report @@ -516,12 +522,6 @@ break; } - // Ignore errors when disconnected: avoids duplicate error dialogs - if( ! connected_ ) - { - return; - } - emit statusEvent( KMess::TYPE_ERROR, message ); } Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-26 22:41:08 UTC (rev 5861) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-27 08:44:38 UTC (rev 5862) @@ -999,6 +999,8 @@ { debug() << "Logging out locally and closing server connection"; + emit statusEvent( TYPE_PROGRESS, MESSAGE_PROGRESS_DISCONNECTED ); + msnNotificationConnection_->closeConnection(); } @@ -1013,6 +1015,8 @@ { debug() << "Logging out from all endpoints and closing server connection."; + emit statusEvent( TYPE_PROGRESS, MESSAGE_PROGRESS_DISCONNECTED ); + // yes, WLM really does send "gtfo" in the body of this command. msnNotificationConnection_->sendUUN( self()->email(), 8, "gtfo" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-26 22:41:16
|
Revision: 5861 http://kmess.svn.sourceforge.net/kmess/?rev=5861&view=rev Author: it_amroth Date: 2010-01-26 22:41:08 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Fixed connecting to an alternative server. Modified Paths: -------------- trunk/kmess/src/kmessapplication.cpp trunk/kmess/src/main.cpp Modified: trunk/kmess/src/kmessapplication.cpp =================================================================== --- trunk/kmess/src/kmessapplication.cpp 2010-01-26 14:38:23 UTC (rev 5860) +++ trunk/kmess/src/kmessapplication.cpp 2010-01-26 22:41:08 UTC (rev 5861) @@ -82,8 +82,10 @@ CrashHandler::activate(); + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + // yes... we have it enough of bug reports about trunk. - if( ! KCmdLineArgs::parsedArgs()->isSet( "iKnowThatTrunkIsBroken" ) ) + if( ! args->isSet( "iKnowThatTrunkIsBroken" ) ) { kDebug() << "The user is using trunk inadvertently: showing a warning and quitting."; KMessageBox::sorry( 0, @@ -109,6 +111,10 @@ kWarning() << "It seems the user knows what he/she's doing."; } +#if ( KMESS_DEBUG == 1 ) + // The debug build allows to use an alternative server + testServerAddress_ = args->getOption( "server" ); +#endif // Start remaining initialisation initializePaths(); @@ -237,10 +243,6 @@ connect( this, SIGNAL(lastWindowClosed()), this, SLOT(slotLastWindowClosed()) ); connect( this, SIGNAL(aboutToQuit()), this, SLOT(slotAboutToQuit()) ); -#if ( KMESS_DEBUG == 1 ) - // The debug build allows to use an alternative server - testServerAddress_ = args->getOption( "server" ); - #warning The --runtest option is currently disabled #if 0 // The debug build allows to run tests from the command line. @@ -254,7 +256,6 @@ return; } #endif -#endif // We found session data for the Contact List, to restore it if( kapp->isSessionRestored() && restoredWindow != -1 ) @@ -445,7 +446,6 @@ // set local endpoint name. globalSession->localEndpoint()->setName( KMESS_VERSION ); -kDebug() << globalSession->localEndpoint()->name() << globalSession->localEndpoint()->guid(); // set our application capabilities and name/version. KMess::Utils::setClientCapabilities( KMess::MSN_CAP_WINKS | KMess::MSN_CAP_INK_ISF | KMess::MSN_CAP_INK_GIF ); Modified: trunk/kmess/src/main.cpp =================================================================== --- trunk/kmess/src/main.cpp 2010-01-26 14:38:23 UTC (rev 5860) +++ trunk/kmess/src/main.cpp 2010-01-26 22:41:08 UTC (rev 5861) @@ -212,7 +212,7 @@ // For the developer build, // make sure we can run tests fast. -#ifdef KMESSTEST +#if ( KMESS_DEBUG == 1 ) #warning --runtest is disabled for now (KMessTest doesn't work) //options.add( "runtest <test>", // ki18n("Run a debug test (developer build only)") ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-26 14:38:30
|
Revision: 5860 http://kmess.svn.sourceforge.net/kmess/?rev=5860&view=rev Author: it_amroth Date: 2010-01-26 14:38:23 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Removed reconnection code. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/msnsession.h trunk/kmess/lib/src/connections/msnnotificationconnection.cpp trunk/kmess/lib/src/connections/msnnotificationconnection.h trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-26 07:00:26 UTC (rev 5859) +++ trunk/kmess/lib/ChangeLog 2010-01-26 14:38:23 UTC (rev 5860) @@ -6,6 +6,8 @@ * MsnSession: Fixed signaling for OIM/federated messages receiving and for status events. * ChatFactory: Same signaling fixes, fixed chat ownership of federated/OIM Messages. * TextMessage: Added safeguard to avoid problems (or even just warnings). + * MsnSession, MsnNotificationConnection: Removed reconnection code. It can be done by the + application manually, when needed. 2010-01-25 Valerio Pilo <valerio@...> Modified: trunk/kmess/lib/include/KMess/msnsession.h =================================================================== --- trunk/kmess/lib/include/KMess/msnsession.h 2010-01-26 07:00:26 UTC (rev 5859) +++ trunk/kmess/lib/include/KMess/msnsession.h 2010-01-26 14:38:23 UTC (rev 5860) @@ -288,11 +288,6 @@ void contactOffline( KMess::MsnContact *contact ); // Contact has changed status void contactChangedStatus( KMess::MsnContact *contact, KMess::MsnStatus newStatus ); - //signals: HACK - Temporary signals for the transition to MsnSession - Decide how to fix them - // Signal a reconnect request. - void reconnect(); // ChatMaster -> KMess - // Signal that the connection should be established again after a disconnection - void reconnect( QString handle ); // MsnNotificationConnection -> InitialView }; Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-26 07:00:26 UTC (rev 5859) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-26 14:38:23 UTC (rev 5860) @@ -1201,9 +1201,6 @@ debug() << "Received notice of disconnection from the server."; closeConnection(); - - // Try connecting again - emit reconnect( session_->getHandle() ); } } Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.h =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-26 07:00:26 UTC (rev 5859) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-26 14:38:23 UTC (rev 5860) @@ -351,8 +351,6 @@ void groupRenamed( KMess::MsnGroup *group, const QString &newName ); // Signal that a new email has been received void newEmail( const QString &sender, const QString &subject, bool inInbox, const QString &command, const QString &folder, const QString &url ); - // Signal that the connection should be established again after a disconnection - void reconnect( QString handle ); // Signal that a chat session was requested by a contact void invitedToChat( const QString &handle, const QString &server, const quint16 &port, const QString &auth, const QString &chatId ); /// Signal that a display picture change has been confirmed by the server Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-26 07:00:26 UTC (rev 5859) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-26 14:38:23 UTC (rev 5860) @@ -136,10 +136,6 @@ connect( chatFactory_, SIGNAL( switchboardRequested(KMess::MsnChat* ) ), msnNotificationConnection_, SLOT ( inviteToChat(KMess::MsnChat* ) ) ); - // HACK - Temporary signals for the transition to MsnSession - Decide how to fix them - connect( msnNotificationConnection_, SIGNAL( reconnect(QString) ), - this, SIGNAL( reconnect(QString) ) ); - // Update the user profile on the server connect( this, SIGNAL( personalMessageChanged() ), msnNotificationConnection_, SLOT ( changePersonalMessage() ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gedghill@us...> - 2010-01-26 07:00:33
|
Revision: 5859 http://kmess.svn.sourceforge.net/kmess/?rev=5859&view=rev Author: gedghill Date: 2010-01-26 07:00:26 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Added basic signaling features to rtcsignalingendpoint. Added Dialog class and made other minor changes. Modified Paths: -------------- trunk/kmess/contrib/msntransport/src/CMakeLists.txt trunk/kmess/contrib/msntransport/src/helper.cpp trunk/kmess/contrib/msntransport/src/helper.h trunk/kmess/contrib/msntransport/src/platform.cpp trunk/kmess/contrib/msntransport/src/proxysignalingsession.cpp trunk/kmess/contrib/msntransport/src/proxysignalingsession.h trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.cpp trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h trunk/kmess/contrib/msntransport/src/sessiondescription.h trunk/kmess/contrib/msntransport/src/signalingmessage.cpp trunk/kmess/contrib/msntransport/src/signalingmessage.h trunk/kmess/contrib/msntransport/src/signalingsessionclient.h trunk/kmess/contrib/msntransport/src/signalinguri.cpp trunk/kmess/contrib/msntransport/src/signalinguri.h trunk/kmess/contrib/msntransport/src/transaction.cpp trunk/kmess/contrib/msntransport/src/transaction.h trunk/kmess/contrib/msntransport/src/transportimpl.cpp trunk/kmess/contrib/msntransport/src/transportimpl.h Added Paths: ----------- trunk/kmess/contrib/msntransport/src/dialog.cpp trunk/kmess/contrib/msntransport/src/dialog.h Modified: trunk/kmess/contrib/msntransport/src/CMakeLists.txt =================================================================== --- trunk/kmess/contrib/msntransport/src/CMakeLists.txt 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/CMakeLists.txt 2010-01-26 07:00:26 UTC (rev 5859) @@ -2,6 +2,7 @@ SET(msntransport_SOURCES contenttype.cpp contentdescription.cpp + dialog.cpp signalinguri.cpp signalingheader.cpp signalingmessage.cpp @@ -35,6 +36,7 @@ ) set(msntransport_MOC_HDRS + dialog.h platform.h transaction.h rtcsignalingendpoint.h Added: trunk/kmess/contrib/msntransport/src/dialog.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/dialog.cpp (rev 0) +++ trunk/kmess/contrib/msntransport/src/dialog.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -0,0 +1,178 @@ +// +// Dialog +// +// Summary: Represents a peer-to-peer relationship between two +// participants that persists for some time. +// +// Authors: +// Gregg Edghill (gregg.edghill at gmail.com) +// +// Copyright (C) 2006 - 2010, Gregg Edghill +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of this software. +// +// 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 "dialog.h" +#include "transaction.h" +#include <QtCore/QRegExp> +#include <QtCore/QTimer> + +namespace PtpSignaling +{ + +Dialog::Dialog(const QUuid &callId, QObject *pobject) : QObject(pobject), state_(SLPDS_PENDING) +{ + currentTransactionId_ = 0; + callId_ = callId; + initiatedRemotely_ = false; +} + +Dialog::Dialog(Transaction *initialTransaction, QObject *pobject) : QObject(pobject), state_(SLPDS_PENDING) +{ + currentTransactionId_ = 0; + initiatedRemotely_ = true; + // Get the signaling request that initiated the dialog + const SignalingRequest & initiatingRequest = initialTransaction->getInitiatingRequest(); + const QRegExp escaperegex("[<>]"); + fromUri_ = SignalingUri(initiatingRequest.getFromHeader().getValue().toString().remove(escaperegex)); + toUri_ = SignalingUri(initiatingRequest.getToHeader().getValue().toString().remove(escaperegex)); + callId_ = QUuid(initiatingRequest.getCallId()); + transactions_.prepend(initialTransaction); +} + +Dialog::~Dialog() +{ + // Delete all the transactions. + qDeleteAll(transactions_); + // Clear the transactions list. + transactions_.clear(); +} + +const QUuid & Dialog::getCallId() const +{ + return callId_; +} + +quint32 Dialog::getCurrentTransactionId() const +{ + return currentTransactionId_; +} + +const SignalingUri & Dialog::getFromUri() const +{ + return !initiatedRemotely_ ? fromUri_ : toUri_; +} + +Transaction * Dialog::getInitialTransaction() const +{ + return transactions_[0]; +} + +quint32 Dialog::getSessionKey() const +{ + return sessionId_; +} + +Dialog::SLP_DIALOG_STATE Dialog::getState() const +{ + return state_; +} + +const SignalingUri & Dialog::getToUri() const +{ + return !initiatedRemotely_ ? toUri_ : fromUri_; +} + +const QList<Transaction*> & Dialog::getTransactions() const +{ + return transactions_; +} + +bool Dialog::isTerminatingOrTerminated() const +{ + return (Dialog::SLPDS_TERMINATING == state_ || Dialog::SLPDS_TERMINATED == state_); +} + +void Dialog::setCurrentTransactionId(quint32 transactionId) +{ + currentTransactionId_ = transactionId; +} + +void Dialog::addTransaction(Transaction *transaction) +{ + // Add the transaction to the list. + transactions_.append(transaction); +} + +void Dialog::setInitialTransaction(Transaction * transaction) +{ + if (0 == transactions_.count()) + { + // Add the transaction to the list. + transactions_.prepend(transaction); + const QRegExp escaperegex("[<>]"); + // Get the signaling request that initiated the dialog + const SignalingRequest & initiatingRequest = transaction->getInitiatingRequest(); + fromUri_ = SignalingUri(initiatingRequest.getFromHeader().getValue().toString().remove(escaperegex)); + toUri_ = SignalingUri(initiatingRequest.getToHeader().getValue().toString().remove(escaperegex)); + } +} + +void Dialog::setSessionKey(quint32 sessionId) +{ + sessionId_ = sessionId; +} + +void Dialog::setState(SLP_DIALOG_STATE state) +{ + state_ = state; +} + +void Dialog::establish() +{ + // Set the dialog state to established + state_ = Dialog::SLPDS_ESTABLISHED; + // Signal that the dialog has been established. + emit established(); +} + +void Dialog::terminate(quint32 timeSpan) +{ + // Check whether the timespan is + // greater than zero (0) + if (timeSpan != 0) + { + // if so, set the dialog state to terminating and wait an + // interval 'timeSpan' before terminating the dialog. + state_ = Dialog::SLPDS_TERMINATING; + // Schedule a one time timer with the given time span. + QTimer::singleShot(timeSpan, this, SLOT(timer_OnDialogTerminateTimespanExpired())); + } + else + { + // Otherwise, set the dialog state to terminated. + state_ = Dialog::SLPDS_TERMINATED; + // Signal that the dialog has terminated. + emit terminated(); + } +} + +//BEGIN Timer Event Handling Functions + +void Dialog::timer_OnDialogTerminateTimespanExpired() +{ + // Set the dialog state to terminated. + state_ = Dialog::SLPDS_TERMINATED; + // Signal that the dialog has terminated. + emit terminated(); +} + +//END + +} Added: trunk/kmess/contrib/msntransport/src/dialog.h =================================================================== --- trunk/kmess/contrib/msntransport/src/dialog.h (rev 0) +++ trunk/kmess/contrib/msntransport/src/dialog.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -0,0 +1,144 @@ +// +// Dialog class +// +// Authors: +// Gregg Edghill (gregg.edghill at gmail.com) +// +// Copyright (C) 2006 - 2010, Gregg Edghill +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of this software. +// +// 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. +// + +#ifndef CLASS_P2P__SLPDIALOG_H +#define CLASS_P2P__SLPDIALOG_H + +#include "signalinguri.h" +#include <QtCore/QObject> +#include <QtCore/QList> +#include <QtCore/QUuid> + +namespace PtpSignaling +{ + +class Transaction; + +/** + * @brief Represents a peer-to-peer relationship between two participants that persists for some time. + * + * A dialog enables the sequencing of messages between clients and the proper routing of requests + * between both of them. A dialog is identified at each client with a dialog ID which consists + * of a Call ID value, a local tag and a remote tag. + * + * A dialog contains certain pieces of state needed for further message transmissions within the + * dialog. This state consists of the dialog ID, a local sequence number (used to order requests + * from the client to its peer), a remote sequence number (used to order requests from its peer to + * the client), a local URI and a target (remote) URI. + * + * Caller Callee + * | | --, + * | INVITE | --, | + * |------------------------------------------------->| | | + * | | | transaction 0 | + * | 200 OK | | | + * |<-------------------------------------------------| | | + * | | --' | + * | | | + * | reINVITE (renegotiate) | --, | + * |------------------------------------------------->| | | + * | | | transaction 1 | + * | 200 OK | | | + * |<-------------------------------------------------| | | dialog + * | | --' | + * | MEDIA / DATA STREAM | | + * |<================================================>| | + * | | | + * | BYE | --, | + * |<-------------------------------------------------| | transaction n | + * | | | | + * | | --' | + * | | --' + * + * @author Gregg Edghill + */ +class Dialog : public QObject +{ + Q_OBJECT + + public: + /** @brief Enumerates the states of a dialog during its lifecycle. */ + enum SLP_DIALOG_STATE { SLPDS_PENDING=0, SLPDS_ESTABLISHED=2, SLPDS_TERMINATING=4, SLPDS_TERMINATED=8 }; + + public: + /** @brief Creates a new instance of the class. */ + Dialog(const QUuid& callId, QObject *pobject); + /** @brief Creates a new instance of the class. */ + Dialog(Transaction *initialTransaction, QObject *pobject); + /** @brief Frees resources and performs other cleanup operations. */ + ~Dialog(); + + public: + /** @brief Gets the UUID used to uniquely identify the dialog. */ + const QUuid & getCallId() const; + /** @brief Gets the current identifier of the transaction in progress. */ + quint32 getCurrentTransactionId() const; + /** @brief Gets the FROM tag used in the initiating request. */ + const SignalingUri & getFromUri() const; + /** @brief Gets the initial transaction of the dialog. */ + Transaction * getInitialTransaction() const; + /** @brief Gets the identifier of the session associated with the dialog. */ + quint32 getSessionKey() const; + /** @brief Gets the state of the dialog. */ + SLP_DIALOG_STATE getState() const; + /** @brief Gets the To tag used in the initiating request. */ + const SignalingUri & getToUri() const; + /** @brief Gets the list of in-dialog transactions. */ + const QList<Transaction*> & getTransactions() const; + /** @brief Gets a value indicating whether the dialog is terminating or has already terminated. */ + bool isTerminatingOrTerminated() const; + /** @brief Adds the transaction to the dialog. */ + void addTransaction(Transaction * transaction); + /** @brief Sets the identifier of the current transaction in progress. */ + void setCurrentTransactionId(quint32 transactionId); + /** @brief Sets the initial transaction of the dialog. */ + void setInitialTransaction(Transaction * transaction); + /** @brief Sets the identifier of the session associated with the dialog. */ + void setSessionKey(quint32 sessionId); + /** @brief Sets the state of the dialog. */ + void setState(SLP_DIALOG_STATE state); + /** @brief Called when the INVITE process is complete. */ + void establish(); + /** @brief Terminates the dialog within the specified timespan. */ + void terminate(quint32 timeSpan=0); + + Q_SIGNALS: + /** @brief Indicates that the INVITE process is complete. */ + void established(); + /** @brief Indicates that the dialog has terminated. */ + void terminated(); + + private Q_SLOTS: + /** @brief Called when the timer timespan expires. */ + void timer_OnDialogTerminateTimespanExpired(); + + private: + QUuid callId_; + quint32 currentTransactionId_; + SignalingUri fromUri_; + bool initiatedRemotely_; + quint32 sessionId_; + SLP_DIALOG_STATE state_; + QList<Transaction*> transactions_; + SignalingUri toUri_; + + Q_DISABLE_COPY(Dialog) + +}; //Dialog +} + +#endif Modified: trunk/kmess/contrib/msntransport/src/helper.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/helper.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/helper.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -34,6 +34,17 @@ namespace PtpInternal { +void Helper::asyncDeleteQObject(QObject *object) +{ + // Check whether the object is not null + if (object) + { + // If so, schedule the object for disposal + object->deleteLater(); + object = 0l; + } +} + QUuid Helper::convertQByteArrayToQUuid(const QByteArray& bytearray) { QUuid uuid; @@ -85,8 +96,10 @@ { Packet *chunk = 0l; + // Check whether the packet is valid if (!packet) { + // If not, bail out. return chunk; } @@ -111,9 +124,8 @@ packetheader.lpsent = packetheader0.lpsent; packetheader.lpsize = packetheader0.lpsize; - // - // Copy 'length' bytes of the packet payload to the packet chunk. - // + // Copy 'length' bytes of the packet payload + // to the packet chunk. QIODevice *payload = packet->getPayload(); if (payload) @@ -276,20 +288,27 @@ } } + // Check whether the message is valid if (message) { - // Parse the raw message data for signaling headers. + // If so, parse the raw message data for signaling headers. qint32 i = 0; QRegExp regex("([^\r\n:]*):\\s([^\r\n]*)"); const QString headerdata = messagedata.section("\r\n\r\n", 0, 0).remove(requestResponseLine+"\r\n"); while((i = regex.indexIn(headerdata, i)) != -1) { + // Add the parsed signaling header to + // the message's header collection. message->addSignalingHeader(SignalingHeader(regex.cap(1), regex.cap(2))); i += regex.matchedLength(); } + // Check whether the message has + // a content description body if (message->getContentLength() > 0) { + // If so, parse the content description body + // from the raw array of bytes. const QString messageBody = messagedata.section("\r\n\r\n", 1, 1, QString::SectionIncludeTrailingSep); // Set the message body content. message->setMessageBody(messageBody.toUtf8()); @@ -302,7 +321,15 @@ QByteArray Helper::readDataFromPacket(Packet *packet) { QByteArray rawdata; - if (!packet) return rawdata; + // Check whether the packet is valid + if (!packet) + { + // If not, return an empty array of bytes + return rawdata; + } + + // Otherwise, read the data from + // the packet's payload. rawdata = packet->getPayload()->readAll(); return rawdata; @@ -310,7 +337,7 @@ QUuid Helper::readQUuidFromPacket(Packet *packet) { - QUuid uuid; + QUuid key; if (packet) { @@ -331,10 +358,10 @@ const quint8 b8 = (packetheader.lpsize >> 56) & 0xFF; // Create the comparison nonce from the byte parameters. - uuid = QUuid(l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8); + key = QUuid(l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8); } - return uuid; + return key; } void Helper::writeQUuidToPacket(Packet *packet, const QUuid &key) Modified: trunk/kmess/contrib/msntransport/src/helper.h =================================================================== --- trunk/kmess/contrib/msntransport/src/helper.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/helper.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -36,6 +36,8 @@ class Q_DECL_EXPORT Helper { public: + /** @brief Asynchronously deletes the supplied QObject. */ + static void asyncDeleteQObject(QObject *object); /** @brief Converts the specified QUuid to a byte array. */ static QByteArray convertQUuidToQByteArray(const QUuid& uuid); /** @brief Converts the specified byte array to a QUuid. */ Modified: trunk/kmess/contrib/msntransport/src/platform.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/platform.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/platform.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -206,7 +206,7 @@ if(!endpoints_.contains(endpointid)) { #ifdef P2PDEBUG_PLATFORM - qDebug("%s: creating ENDPOINT (id=%s)", Q_FUNC_INFO, qPrintable(endpointid)); + qDebug("%s: creating ENDPOINT (target=%s)", Q_FUNC_INFO, qPrintable(endpointid)); #endif // If not, create a new rtc signaling endpoint. QString localUser = getSetting("localUserAddress").toString(); @@ -221,7 +221,7 @@ else { #ifdef P2PDEBUG_PLATFORM - qDebug("%s: ENDPOINT (id=%s)", Q_FUNC_INFO, qPrintable(endpointid)); + qDebug("%s: ENDPOINT (target=%s)", Q_FUNC_INFO, qPrintable(endpointid)); #endif // Otherwise, get the signaling // endpoint from the list. Modified: trunk/kmess/contrib/msntransport/src/proxysignalingsession.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/proxysignalingsession.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/proxysignalingsession.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -52,6 +52,11 @@ ProxySignalingSession::~ProxySignalingSession() {} +quint32 ProxySignalingSession::getSessionId() const +{ + return sessionId_; +} + bool ProxySignalingSession::isTerminatingOrTerminated() const { return ((SLPSS_TERMINATING == signalingState_) || @@ -89,13 +94,19 @@ void ProxySignalingSession::participate() { + // Check whether the signaling session is + // idle (just created) or is in progress. if (SLPSS_IDLE == signalingState_) { + // If just created, try to establish + // the session. establish(); } else if (SLPSS_INCOMING == signalingState_) { + // If in progress, accept the signaling + // session. accept(); } } @@ -128,6 +139,7 @@ return; } + // Create the offer for the signaling session. SessionDescription offer; offer.setField(QLatin1String("EUF-GUID"), eufguid.toString().toUpper()); offer.setField(QLatin1String("SessionID"), sessionId_); @@ -140,13 +152,22 @@ void ProxySignalingSession::terminate() { + // Check whether the signaling session + // is already established or is in + // progress if (SLPSS_ESTABLISHED == signalingState_) { + // If alrady established, terminate + // the signaling session with a BYE + // request. terminate(sendByeMessage_); } else if (SLPSS_INCOMING == signalingState_) { + // If in progress, terminate the + // signaling session with a + // DECLINE response. decline(); } } @@ -161,19 +182,19 @@ if (sendByeMessage) { // If so, set the session description - SessionDescription closebody; - closebody.setField(QLatin1String("SessionID"), sessionId_); + SessionDescription close; + close.setField(QLatin1String("SessionID"), sessionId_); // Retrieve the session decription parameters. const QByteArray closeContextData;// = mediafeature_->getCloseContextData(); // Check whether the context data is valid if (!closeContextData.isNull()) { // If so, add it to the description - closebody.setField(QLatin1String("Context"), closeContextData.toBase64()); + close.setField(QLatin1String("Context"), closeContextData.toBase64()); } // Terminate the signaling session - rtcendpoint_->terminateSession(this, closebody); + rtcendpoint_->terminateSession(this, close); } } Modified: trunk/kmess/contrib/msntransport/src/proxysignalingsession.h =================================================================== --- trunk/kmess/contrib/msntransport/src/proxysignalingsession.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/proxysignalingsession.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -60,6 +60,8 @@ ~ProxySignalingSession(); public: + /** @brief Gets an id that uniquely identifies the signaling session. */ + quint32 getSessionId() const; /** @brief Gets a value indicating whether the session is terminating or has already terminated. */ bool isTerminatingOrTerminated() const; /** @brief Bind the user-specified media feature to the session. */ Modified: trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -18,6 +18,7 @@ // #include "rtcsignalingendpoint.h" +#include "dialog.h" #include "msntransportconfig.h" #include "contentdescription.h" #include "proxysignalingsession.h" @@ -59,6 +60,7 @@ RtcSignalingEndpoint::~RtcSignalingEndpoint() { + shutdown(); } quint32 RtcSignalingEndpoint::generateNewSessionId() @@ -82,6 +84,10 @@ return transport_; } +void RtcSignalingEndpoint::cleanupSignalingSessionResources(const quint32 sessionkey) +{ +} + //BEGIN Signaling Helper Functions const QString RtcSignalingEndpoint::mapResponseCodeToResponseText(const quint16 responseCode) @@ -127,17 +133,16 @@ SignalingRequest request(method, uri, supportedversion_); // Create the via signaling header. SignalingHeader viaHeader(QLatin1String("Via"), QString("MSNSLP/%1/TLP").arg(supportedversion_)); - // Add the branch parameter to the via header. + // Generate a transaction branch uuid and + // add it as a parameter to the via header. viaHeader.addParameter(QLatin1String("branch"), QUuid::createUuid().toString().toUpper()); - // // Per RFC 3261, the From and To headers contain a URI; If the URI // contains a comma, question mark or semicolon, the URI MUST be // enclosed in angle brackets (< and >). Any URI parameters are // contained within these brackets. If the URI is not enclosed in angle // brackets, any semicolon-delimited parameters are header-parameters, // not URI parameters. - // // Set the request headers request.setSignalingHeader(QLatin1String("To"), QString("<%1>").arg(toUri.toString())); @@ -146,6 +151,10 @@ request.setSignalingHeader(QLatin1String("Call-ID"), callId); request.setSignalingHeader(QLatin1String("CSeq"), 0); + //Set the request context information. + request.setId(0); + request.setCorrelationId(qrand() % 0xCF54); + return request; } @@ -160,24 +169,84 @@ response.setSignalingHeader(QLatin1String("Call-ID"), request.getSignalingHeader("Call-ID").getValue()); response.setSignalingHeader(QLatin1String("CSeq"), request.getCSeq() + 1); + // Set the response context information. + response.setId(0); + response.setCorrelationId(request.getId()); + return response; } -void RtcSignalingEndpoint::acceptSessionWithAnswer(ProxySignalingSession *pss, const SessionDescription& answerDescription) +void RtcSignalingEndpoint::acceptSessionWithAnswer(ProxySignalingSession *pssession, const SessionDescription& answerbody) { - const QByteArray answer = answerDescription.getBytes(); + // Get the dialog associated with + // the supplied signaling session + Dialog *dialog = getDialogBySessionKey(pssession->getSessionId()); + // Check whether the dialog object is null + if (!dialog) + { +#ifdef P2PDEBUG_SLP + qWarning("%s: dialog not found (session=%d)", Q_FUNC_INFO, + pssession->getSessionId()); +#endif + // If so, bail out. + return; + } + + // Get the initiating INVITE signaling request + SignalingRequest initiatingRequest = dialog->getInitialTransaction()->getInitiatingRequest(); + // Get the session offer answer. + const QByteArray answer = answerbody.getBytes(); + // Create the MIME content description ContentDescription cd(ContentType("application/x-msnmsgr-sessionreqbody"), answer); + // Send the 200 OK response. + sendSignalingResponse(SignalingResponse::SLPRC_OK, cd, initiatingRequest); } -void RtcSignalingEndpoint::establishSessionWithOffer(ProxySignalingSession *pss, const SessionDescription& offerDescription) +void RtcSignalingEndpoint::establishSessionWithOffer(ProxySignalingSession *pssession, const SessionDescription& offerbody) { - const QByteArray offer = offerDescription.getBytes(); + // Create a new call id for the pending dialog + QUuid callId = QUuid::createUuid(); + // Create a new pending dialog. + Dialog *dialog = new Dialog(callId, this); + // Set the session key associated with the dialog + dialog->setSessionKey(pssession->getSessionId()); + // Get the session offer + const QByteArray offer = offerbody.getBytes(); + // Create the MIME content description ContentDescription cd(ContentType("application/x-msnmsgr-sessionreqbody"), offer); + + // Add the pending dialog to the call map. + addDialogToCallMap(dialog); + + // Generate the signaling request + SignalingRequest initiatingRequest = buildRequest(QLatin1String("INVITE"), callId.toString()); + initiatingRequest.setSignalingHeader(QLatin1String("Content-Type"), cd.getContentType().toString()); + initiatingRequest.setMessageBody(cd.getBody()); + + // Create a new transaction for the request. + Transaction *transaction = new Transaction(initiatingRequest, true, this); + // Add the transaction to the dialog + dialog->setInitialTransaction(transaction); + + // Check whether the underlying transport is connected + if (transport_->isConnected()) + { + // If so, begin the transaction. +// beginTransaction(transaction); + // Send the request to initiate the dialod. + sendSignalingMessage(initiatingRequest); + } + else + { + // Otherwise, queue the transaction until it is. + pendingTransactions_.append(transaction); + } } void RtcSignalingEndpoint::rejectWithErrorCode(const SignalingRequest &request, quint16 responseCode) { ContentDescription none(ContentType("null"), QByteArray()); + // Send the error signaling response. rejectWithErrorCode(request, responseCode, none); } @@ -205,35 +274,109 @@ request.setSignalingHeader(QLatin1String("Content-Type"), contentDescription.getContentType().toString()); request.setMessageBody(contentDescription.getBody()); + // Get the dialog with the supplied call id + Dialog *dialog = getDialogByCallId(callId); + + // Create a new transaction for the request. + Transaction *transaction = new Transaction(request, true, this); + // Add the transaction to the dialog. + dialog->addTransaction(transaction); + // Begin the transaction. +// beginTransaction(transaction); + // Send the request. sendSignalingMessage(request); } void RtcSignalingEndpoint::terminateWithRejection(const quint16 responseCode, const ContentDescription& contentDescription, const SignalingRequest& request) { -#ifdef P2PDEBUG_SLP - qDebug("%s: %d", Q_FUNC_INFO, responseCode); -#endif + // Send the signaling response. sendSignalingResponse(responseCode, contentDescription, request); } -void RtcSignalingEndpoint::terminateSession(ProxySignalingSession *pss, const SessionDescription& closeDescription) +void RtcSignalingEndpoint::terminateSession(ProxySignalingSession *pssession, const SessionDescription& closebody) { - const QByteArray closebody = closeDescription.getBytes(); - ContentDescription cd(ContentType("application/x-msnmsgr-sessionclosebody"), closebody); + // Get the dialog associated with + // the supplied signaling session + Dialog *dialog = getDialogBySessionKey(pssession->getSessionId()); + // Check whether the dialog object is null + if (!dialog) + { +#ifdef P2PDEBUG_SLP + qWarning("%s: dialog not found (session=%d)", Q_FUNC_INFO, + pssession->getSessionId()); +#endif + // If so, bail out. + return; + } + + // Set the dialog's state to terminating. + dialog->setState(Dialog::SLPDS_TERMINATING); + + // Get the signaling session close body + const QByteArray close = closebody.getBytes(); + // Create the MIME content description + ContentDescription cd(ContentType("application/x-msnmsgr-sessionclosebody"), close); + // Send the BYE request + sendSignalingRequest(QLatin1String("BYE"), cd, dialog->getCallId()); } -void RtcSignalingEndpoint::terminateSessionWithDecline(ProxySignalingSession *pss, const SessionDescription& answerDescription) +void RtcSignalingEndpoint::terminateSessionWithDecline(ProxySignalingSession *pssession, const SessionDescription& answerbody) { - SignalingRequest initiatingRequest; - const QByteArray answer = answerDescription.getBytes(); + // Get the dialog associated with + // the supplied signaling session + Dialog *dialog = getDialogBySessionKey(pssession->getSessionId()); + // Check whether the dialog object is null + if (!dialog) + { +#ifdef P2PDEBUG_SLP + qWarning("%s: dialog not found (session=%d)", Q_FUNC_INFO, + pssession->getSessionId()); +#endif + // If so, bail out. + return; + } + + // Get the initiating INVITE signaling request + SignalingRequest initiatingRequest = dialog->getInitialTransaction()->getInitiatingRequest(); + // Get the session offer answer. + const QByteArray answer = answerbody.getBytes(); + // Create the MIME content description ContentDescription cd(ContentType("application/x-msnmsgr-sessionreqbody"), answer); + // Send the 603 DECLINE response. + terminateWithRejection(SignalingResponse::SLPRC_DECLINE, cd, initiatingRequest); - terminateWithRejection(SignalingResponse::SLPRC_DECLINE, cd, initiatingRequest); + // Wait 5 seconds for an acknowledge before terminating the dialog. + // If a timeout occurs, the dialog will terminate anyway. + dialog->terminate(5000); } -void RtcSignalingEndpoint::sendSignalingMessage(const SignalingMessage& message) +void RtcSignalingEndpoint::sendSignalingMessage(SignalingMessage& message, bool priority) { +#ifdef P2PDEBUG_SLP_VERBOSE + qDebug("%s: enter", Q_FUNC_INFO); +#endif + // Get the raw message byte array. + const QByteArray messageData = message.getRawMessageByteArray(); +#ifdef P2PDEBUG_SLP + const QString messageText = QString::fromUtf8(messageData); + qDebug("%s: %s", Q_FUNC_INFO, qPrintable(messageText)); +#endif + // Send the message data via the transport layer. + const quint32 id = transport_->send(messageData, 0, message.getCorrelationId()); + // Set the signaling message id + message.setId(id); +#ifdef P2PDEBUG_SLP + qDebug("%s: trid (%d), priority (%d)", Q_FUNC_INFO, id, priority); +#endif + // Get the dialog associated with this signaling message. + Dialog *dialog = getDialogByCallId(message.getCallId()); + // Set the transaction id + dialog->setCurrentTransactionId(id); + +#ifdef P2PDEBUG_SLP_VERBOSE + qDebug("%s: leave", Q_FUNC_INFO); +#endif } //END @@ -318,6 +461,14 @@ // Handle the direct connection offer request in INVITE response. onDirectConnectionOfferInInviteResponse(request); } + else + { +#ifdef P2PDEBUG_SLP + qDebug("%s: unexpected INVITE media type -- sending error", Q_FUNC_INFO); +#endif + // Send a 500 Internal Error status response message. + rejectWithErrorCode(request, SignalingResponse::SLPRC_INTERNAL_ERROR); + } } else if (request.getMethodType() == QLatin1String("ACK")) @@ -342,32 +493,56 @@ void RtcSignalingEndpoint::onInitialSessionOffer(const SignalingRequest& request) { -#ifdef P2PDEBUG_SLP +#ifdef P2PDEBUG_SLP_VERBOSE qDebug("%s: enter", Q_FUNC_INFO); #endif + // Try to get an existing dialog with the supplied call id + Dialog *dialog = getDialogByCallId(request.getCallId()); + // Check whether the dialog exists + if (dialog) + { +#ifdef P2PDEBUG_SLP + qDebug("%s: got duplicate INVITE offer for established dialog -- ignoring", Q_FUNC_INFO); +#endif + return; + } + + // Create the incoming invite transaction. + Transaction *incomingTransaction = new Transaction(request, false, this); + // Create a new dialog associated with the transaction + dialog = new Dialog(incomingTransaction, this); + // Add the pending dialog to the call map. + addDialogToCallMap(dialog); + // Try to parse the session description SessionDescription sd = Helper::parseSessionOffer(QString::fromUtf8(request.getMessageBody())); if (sd.isNull()) { - // Send a 500 error response. +#ifdef P2PDEBUG_SLP + qDebug("%s: invalid session description (offer) -- sending error", Q_FUNC_INFO); +#endif + // Send a 500 internal error response. rejectWithErrorCode(request, SignalingResponse::SLPRC_INTERNAL_ERROR); + // Wait 5 seconds for an acknowledge before terminating the dialog. + // If a timeout occurs, the dialog will terminate anyway. + dialog->terminate(5000); return; } // Gets the id of the incoming session const quint32 sessionId = sd.getSessionId(); - // Create the incoming invite transaction. - Transaction *incomingTransaction = new Transaction(request, this); + // Set the dialog session key for later lookup + dialog->setSessionKey(sessionId); // Create a new signaling session. ProxySignalingSession *session = new ProxySignalingSession(sessionId, this); // Add the signaling session to the list. sessions_.insert(sessionId, session); - // Handle the incoming session request. + // Handle the incoming session. onSessionReceived(sd, session); -#ifdef P2PDEBUG_SLP +#ifdef P2PDEBUG_SLP_VERBOSE qDebug("%s: leave", Q_FUNC_INFO); #endif } @@ -432,6 +607,12 @@ { onDirectConnectionOfferAccepted(response); } + else + { +#ifdef P2PDEBUG_SLP + qDebug("%s: unexpected 200 OK media type -- ignoring", Q_FUNC_INFO); +#endif + } } else if (responseCode == SignalingResponse::SLPRC_NOT_FOUND) @@ -473,6 +654,12 @@ { onDirectConnectionOfferDeclined(response); } + else + { +#ifdef P2PDEBUG_SLP + qDebug("%s: unexpected media type -- ignoring", Q_FUNC_INFO); +#endif + } } else if (responseCode == SignalingResponse::SLPRC_UNACCEPTABLE) @@ -500,25 +687,8 @@ //END -//BEGIN Transport Event Handling Functions +//BEGIN SendReceiveDataNotifier Event Handling Functions -void RtcSignalingEndpoint::transport_OnInitialConnectionEstablished() -{ - // TODO Implementation -} - -void RtcSignalingEndpoint::transport_OnDisconnected() -{ - // TODO Implementation -} - -void RtcSignalingEndpoint::transport_OnError(const quint32 destination) -{ - // TODO Implementation -} - -//END - void RtcSignalingEndpoint::transport_OnMessageDataReceived(const QByteArray& messageData, const qint32 id, const qint32 correlationId) { #ifdef P2PDEBUG_SLP_VERBOSE @@ -530,30 +700,36 @@ qDebug("%s: %s", Q_FUNC_INFO, qPrintable(messageText)); #endif - // - // Try to parse the signaling layer protocol (slp) message from the raw data received. - // - + // Try to parse the signaling layer protocol (slp) + // message from the raw data received. SignalingMessage *message = Helper::parseSignalingMessage(messageData); + // Check whether the message is valid. if (!message) { + // If not, return. #ifdef P2PDEBUG_SLP qDebug("%s: Unrecognized message, id=%d -- ignoring", Q_FUNC_INFO, id); #endif return; } + // Set the message context information. + message->setId(id); + message->setCorrelationId(correlationId); + // Try to unbox (i.e. cast) the message as a signaling request object. SignalingRequest *request = dynamic_cast<SignalingRequest*>(message); + // Check whether the message is a signaling request if (request) { - // Handle the received slp request. + // If so, handle the received signaling request. onRequestMessage(*request); } - + // try to unbox the message as a signaling response object SignalingResponse *response = dynamic_cast<SignalingResponse*>(message); + // Check whether the message is a signaling response if (response) { - // Handle the received slp response. + // If so, handle the received signaling response. onResponseMessage(*response); } @@ -565,9 +741,208 @@ #endif } +//END + +//BEGIN Dialog Event Handling Functions + +void RtcSignalingEndpoint::dialog_OnEstablish() +{ + // Handles the establishment of a dialog after the + // acceptance of a locally or remotely initiated + // session request. + + Dialog *dialog = qobject_cast<Dialog*>(sender()); + // Get the call id of the dialog + const QUuid callId = dialog->getCallId(); +#ifdef P2PDEBUG_SLP + qDebug("%s: dialog ESTABLISHED, call id = %s", Q_FUNC_INFO, + qPrintable(callId.toString())); +#endif + + // Get the session key associated with the dialog + const quint32 sessionkey = dialog->getSessionKey(); + // Get the signaling session + ProxySignalingSession *pssession = sessions_[sessionkey]; + + // Check whether the signaling session object is not null + if (pssession) + { + // TODO Add the notifier to the transport layer + + // If so, establish the session. + } +} + +void RtcSignalingEndpoint::dialog_OnTerminate() +{ + // Handles the termination of a dialog after receiving a + // BYE request or an error has occurred. + + Dialog *dialog = qobject_cast<Dialog*>(sender()); + // Get the call id of the dialog + const QUuid callId = dialog->getCallId(); +#ifdef P2PDEBUG_SLP + qDebug("%s: dialog TERMINATED, call id = %s", Q_FUNC_INFO, + qPrintable(callId.toString())); +#endif + // Disconnect from the event signal/slot + QObject::disconnect(dialog, 0, this, 0); + + // Get the session key associated with the dialog + const quint32 sessionkey = dialog->getSessionKey(); + // Get the signaling session + ProxySignalingSession *pssession = sessions_[sessionkey]; + + // Check whether the signaling session object is not null + if (pssession) + { + // TODO Remove the notifier from the transport layer + + // If so, terminate the session if not already terminated. + + // Disconnect from the event signal/slot + QObject::disconnect(pssession, 0, this, 0); + // Remove the session from the list of sessions. + sessions_.remove(sessionkey); + + // Delete the session as its lifetime has ended. + Helper::asyncDeleteQObject(pssession); + } + + // Get a readonly list iterator + QListIterator<Transaction*> list(dialog->getTransactions()); + Transaction *transaction; + // Terminate all pending transactions + while (list.hasNext() && list.peekNext()) + { + transaction = list.next(); + if (transaction->isRemotelyInitiated() && Transaction::SLPTS_TERMINATED != transaction->getState()) + { + // Terminate the transaction +// endTransaction(transaction); + } + } + + // Clean up all resources created for the session + cleanupSignalingSessionResources(sessionkey); + + // Remove the dialog from the call map. + removeDialogFromCallMap(dialog->getCallId()); + // Delete the dialog since its lifetime has expired + Helper::asyncDeleteQObject(dialog); +} + +//END + +//BEGIN Dialog Helper Functions + +void RtcSignalingEndpoint::addDialogToCallMap(Dialog *dialog) +{ + // Check whether a dialog with the + // specified call id is not registered + if (dialog && !dialogs_.contains(dialog->getCallId())) + { + // Get the call id of the dialog + const QUuid callId = dialog->getCallId(); +#ifdef P2PDEBUG_SLP + qDebug("%s: call id = %s", Q_FUNC_INFO, qPrintable(callId.toString())); +#endif + // Connect the signal/slot. + QObject::connect(dialog, SIGNAL(established()), this, SLOT(dialog_OnEstablish())); + QObject::connect(dialog, SIGNAL(terminated()), this, SLOT(dialog_OnTerminate())); + // If so, add the new dialog to the call map. + dialogs_.insert(callId, dialog); + } +} + +Dialog * RtcSignalingEndpoint::getDialogByCallId(const QUuid& callId) +{ + Dialog *dialog = 0l; + // Check whether a dialog with the + // specified call id is registered + if (dialogs_.contains(callId)) + { + // If so, return the dialog + dialog = dialogs_[callId]; + } + return dialog; +} + +Dialog * RtcSignalingEndpoint::getDialogBySessionKey(const quint32 sessionkey) +{ + Dialog *dialog = 0l; + // Get the list of all dialogs. + QList<Dialog*> dialogs = dialogs_.values(); + for(qint32 i=0; i < dialogs.count(); ++i) + { + // Check whether the session associated with the current + // dialog has a session id which matchs that of supplied + // session key + if (dialogs[i] && dialogs[i]->getSessionKey() == sessionkey) + { + // If so, the dialog has been found. + dialog = dialogs[i]; + } + } + + return dialog; +} + +void RtcSignalingEndpoint::removeDialogFromCallMap(const QUuid& callId) +{ + // Check whether a dialog with the + // specified call id is registered + if (dialogs_.contains(callId)) + { +#ifdef P2PDEBUG_SLP + qDebug("%s: call id = %s", Q_FUNC_INFO, qPrintable(callId.toString())); +#endif + // If so, remove the dialog from the call map. + dialogs_.remove(callId); + } +} + +//END + +//BEGIN Transport Event Handling Functions + +void RtcSignalingEndpoint::transport_OnInitialConnectionEstablished() +{ + // TODO Implementation +} + +void RtcSignalingEndpoint::transport_OnDisconnected() +{ + // TODO Implementation +} + +void RtcSignalingEndpoint::transport_OnError(const quint32 destination) +{ + // TODO Implementation +} + +//END + void RtcSignalingEndpoint::shutdown() { +#ifdef P2PDEBUG_SLP + qDebug("%s: terminating (%d) dialog(s)", Q_FUNC_INFO, + dialogs_.count()); +#endif + for(qint32 i=0; i < dialogs_.count(); ++i) + { + // Terminate the dialog. + dialogs_.values()[i]->terminate(); + } + // Check whether there are any registered dialogs. + if (dialogs_.count() > 0) + { + // If so, dispose of all the dialogs. + qDeleteAll(dialogs_); + // Clear the dialog list. + dialogs_.clear(); + } } } Modified: trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h =================================================================== --- trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/rtcsignalingendpoint.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -33,9 +33,10 @@ namespace PtpSignaling { +class Dialog; class ProxySignalingSession; typedef QHash<quint32, ProxySignalingSession*> SignalingSessionDictionary; -class Participant; +class Transaction; /** * @brief Represents a real time communications signaling endpoint. @@ -55,20 +56,30 @@ protected: /** @brief Created a new and unique session id. */ quint32 generateNewSessionId(); - /** @brief Called when a new signaling session is received. */ - virtual void onSessionReceived(const SessionDescription& sd, ProxySignalingSession *session) const=0; + /** @brief Adds the supplied dialog to the call map. */ + void addDialogToCallMap(Dialog *dialog); + /** @brief Clean up all resources created for the session. */ + void cleanupSignalingSessionResources(const quint32 sessionkey); /** @brief Creates a request message. */ SignalingRequest buildRequest(const QString& method, const QString& callId); /** @brief Creates a response message. */ SignalingResponse buildResponse(const SignalingRequest& request, const quint16 responseCode); + /** @brief Returns a dialog with the specified call id. */ + Dialog * getDialogByCallId(const QUuid& callId); + /** @brief Returns a dialog associated with the specified session key. */ + Dialog * getDialogBySessionKey(const quint32 sessionkey); /** @brief Gets the response text phrase associated with the specified response code. */ const QString mapResponseCodeToResponseText(const quint16 responseCode); + /** @brief Called when a new signaling session is received. */ + virtual void onSessionReceived(const SessionDescription& sd, ProxySignalingSession *session) const=0; /** @brief Rejects an incoming signaling request with the specified error code.*/ void rejectWithErrorCode(const SignalingRequest& request, const quint16 responseCode); /** @brief Rejects an incoming signaling request with the specified error code.*/ void rejectWithErrorCode(const SignalingRequest& request, const quint16 responseCode, const ContentDescription& contentDescription); + /** @brief Removes the dialog with the specified call id. */ + void removeDialogFromCallMap(const QUuid& callId); /** @brief Sends the specified signaling message. */ - void sendSignalingMessage(const SignalingMessage& message); + void sendSignalingMessage(SignalingMessage& message, bool priority=false); /** @brief Sends a signaling request. */ void sendSignalingRequest(const QString& method, const ContentDescription& contentDescription, const QString& callId); /** @brief Sends a signaling response. */ @@ -76,13 +87,13 @@ /** @brief Terminates a session by rejecting the incoming INVITE request . */ void terminateWithRejection(const quint16 responseCode, const ContentDescription& contentDescription, const SignalingRequest& request); /** @brief Accepts the supplied signaling session with the specified answer. */ - virtual void acceptSessionWithAnswer(ProxySignalingSession *pss, const SessionDescription& answerDescription); + virtual void acceptSessionWithAnswer(ProxySignalingSession *pssession, const SessionDescription& answerbody); /** @brief Establishs the supplied signaling session with the specified offer. */ - virtual void establishSessionWithOffer(ProxySignalingSession *pss, const SessionDescription& offerDescription); + virtual void establishSessionWithOffer(ProxySignalingSession *pssession, const SessionDescription& offerbody); /** @brief Terminates the supplied signaling session with the specified close description. */ - virtual void terminateSession(ProxySignalingSession *pss, const SessionDescription& closeDescription); + virtual void terminateSession(ProxySignalingSession *pssession, const SessionDescription& closebody); /** @brief Terminates the supplied signaling session with the specified answer. */ - virtual void terminateSessionWithDecline(ProxySignalingSession *pss, const SessionDescription& answerDescription); + virtual void terminateSessionWithDecline(ProxySignalingSession *pssession, const SessionDescription& answerbody); public: /** @brief When overriden in a derived class, gets a value indicating whether the endpoint is shutting down. */ @@ -98,6 +109,10 @@ virtual void shutdown(); private Q_SLOTS: + /** @brief Called when a dialog is established. */ + void dialog_OnEstablish(); + /** @brief Called when a dialog terminates. */ + void dialog_OnTerminate(); /** @brief Called when the underlying transport establishes a connection to the remote endpoint for the first time. */ void transport_OnInitialConnectionEstablished(); /** @brief Called when the underlying transport loses its connection to the remote endpoint. */ @@ -154,9 +169,9 @@ private: SignalingSessionDictionary sessions_; - Participant * contact_; - Participant * local_; + QHash<QUuid, Dialog*> dialogs_; RealTimeAddress localTarget_; + QList<Transaction*> pendingTransactions_; QString supportedversion_; quint32 sessionId_; RealTimeAddress sessionTarget_; Modified: trunk/kmess/contrib/msntransport/src/sessiondescription.h =================================================================== --- trunk/kmess/contrib/msntransport/src/sessiondescription.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/sessiondescription.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -28,7 +28,7 @@ { /** - * @brief Represents a data structure which contained the content of a session description. + * @brief Represents a data structure which contained the content of a signaling session description. * * @author Gregg Edghill */ Modified: trunk/kmess/contrib/msntransport/src/signalingmessage.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/signalingmessage.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/signalingmessage.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -62,6 +62,11 @@ return ContentType(QLatin1String("")); } +quint32 SignalingMessage::getCorrelationId() const +{ + return correlationId_; +} + qint32 SignalingMessage::getCSeq() const { if (isHeaderPresent(QLatin1String("CSeq"))) @@ -77,6 +82,11 @@ return getSignalingHeader(QLatin1String("From")); } +quint32 SignalingMessage::getId() const +{ + return id_; +} + SignalingHeader SignalingMessage::getSignalingHeader(const QString& name) const { SignalingHeader header; @@ -151,6 +161,16 @@ return getSignalingHeader(QLatin1String("Via")); } +void SignalingMessage::setCorrelationId(const quint32 id) +{ + correlationId_ = id; +} + +void SignalingMessage::setId(const quint32 id) +{ + id_ = id; +} + void SignalingMessage::setMessageBody(const QByteArray& body) { // Set the message body. Modified: trunk/kmess/contrib/msntransport/src/signalingmessage.h =================================================================== --- trunk/kmess/contrib/msntransport/src/signalingmessage.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/signalingmessage.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -138,10 +138,14 @@ qint32 getContentLength() const; /** @brief Gets the content type of the message body. */ const ContentType getContentType() const; + /** @brief Gets the id of a message this signaling message is associated with. */ + quint32 getCorrelationId() const; /** @brief Get a value indicating the sequence number of the message. */ qint32 getCSeq() const; /** @brief Gets the "From" header of the message. */ const SignalingHeader getFromHeader() const; + /** @brief Gets a value used to uniquely identify the signaling message. */ + quint32 getId() const; /** @brief Gets the signaling header with the specified name. */ SignalingHeader getSignalingHeader(const QString& name) const; /** @brief Gets the signaling headers of the message. */ @@ -158,12 +162,14 @@ const QString getVersion() const; /** @brief Gets the "Via" header of the message. */ const SignalingHeader getViaHeader() const; - - public: /** @brief Add the supplied signaling header to the header list. */ void addSignalingHeader(const SignalingHeader& header); /** @brief Gets a value indicating whether the signaling header with the specified name exists. */ bool isHeaderPresent(const QString& headerName) const; + /** @brief Sets the id of a message this signaling message is associated with. */ + void setCorrelationId(const quint32 id); + /** @brief Sets the id used to uniquely identify the signaling message. */ + void setId(const quint32 id); /** @brief Sets the message body. */ void setMessageBody(const QByteArray& body); /** @brief Sets the signaling header with the specified name and value. */ @@ -174,7 +180,9 @@ void generateDefaultSignalingHeaders(); private: + quint32 correlationId_; QList<SignalingHeader> headers_; + quint32 id_; QByteArray messageBody_; }; // SignalingMessage Modified: trunk/kmess/contrib/msntransport/src/signalingsessionclient.h =================================================================== --- trunk/kmess/contrib/msntransport/src/signalingsessionclient.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/signalingsessionclient.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -40,13 +40,13 @@ protected: /** @brief When overriden in a derived class, accepts the supplied signaling session with the specified answer. */ - virtual void acceptSessionWithAnswer(ProxySignalingSession *pss, const SessionDescription& answerDescription) =0; + virtual void acceptSessionWithAnswer(ProxySignalingSession *pss, const SessionDescription& answerbody) =0; /** @brief When overriden in a derived class, establishs the supplied signaling session with the specified offer. */ - virtual void establishSessionWithOffer(ProxySignalingSession *pss, const SessionDescription& offerDescription) =0; + virtual void establishSessionWithOffer(ProxySignalingSession *pss, const SessionDescription& offerbody) =0; /** @brief When overriden in a derived class, terminates the supplied signaling session with the specified close description. */ - virtual void terminateSession(ProxySignalingSession *pss, const SessionDescription& closeDescription) =0; + virtual void terminateSession(ProxySignalingSession *pss, const SessionDescription& closebody) =0; /** @brief When overriden in a derived class, terminates the supplied signaling session with the specifiec answer. */ - virtual void terminateSessionWithDecline(ProxySignalingSession *pss, const SessionDescription& answerDescription) =0; + virtual void terminateSessionWithDecline(ProxySignalingSession *pss, const SessionDescription& answerbody) =0; friend class ProxySignalingSession; Modified: trunk/kmess/contrib/msntransport/src/signalinguri.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/signalinguri.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/signalinguri.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -24,6 +24,10 @@ namespace PtpSignaling { +SignalingUri::SignalingUri() +{ +} + SignalingUri::SignalingUri(const QString& value) { // Modified: trunk/kmess/contrib/msntransport/src/signalinguri.h =================================================================== --- trunk/kmess/contrib/msntransport/src/signalinguri.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/signalinguri.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -32,6 +32,8 @@ { public: /** @brief Creates a new instance of the class. */ + SignalingUri(); + /** @brief Creates a new instance of the class. */ SignalingUri(const QString& value); /** @brief Creates a new instance of the class. */ SignalingUri(const QString& scheme, const QString& address, const QString& endpointId=QString()); Modified: trunk/kmess/contrib/msntransport/src/transaction.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/transaction.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/transaction.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -27,14 +27,26 @@ { } -Transaction::Transaction(const SignalingRequest& initiatingRequest, QObject *pobject) : QObject(pobject) +Transaction::Transaction(const SignalingRequest& initiatingRequest, bool remotelyInitiated, QObject *pobject) : QObject(pobject) { initiatingRequest_ = initiatingRequest; + remotelyInitiated_ = remotelyInitiated; } Transaction::~Transaction() -{} +{ +} +bool Transaction::isRemotelyInitiated() const +{ + return remotelyInitiated_; +} + +Transaction::SLP_TRANSACTION_STATE Transaction::getState() const +{ + return state_; +} + const SignalingRequest & Transaction::getInitiatingRequest() const { return initiatingRequest_; Modified: trunk/kmess/contrib/msntransport/src/transaction.h =================================================================== --- trunk/kmess/contrib/msntransport/src/transaction.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/transaction.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -38,18 +38,28 @@ Q_OBJECT public: + /** @brief Defines the states of a transaction during its lifecycle. */ + enum SLP_TRANSACTION_STATE { SLPTS_CALLING=0, SLPTS_CONFIRMED=2, SLPTS_COMPLETED=4, SLPTS_TERMINATED=8}; + + public: /** @brief Creates a new instance of the class. */ Transaction(QObject *pobject); /** @brief Creates a new instance of the class. */ - Transaction(const SignalingRequest& initiatingRequest, QObject *pobject); + Transaction(const SignalingRequest& initiatingRequest, bool remotelyInitiated, QObject *pobject); /** @brief Frees resources and performs other cleanup operations. */ ~Transaction(); public: /** @brief Gets the request that was used to initiate the transaction. */ const SignalingRequest & getInitiatingRequest() const; + /** @brief Gets the state of the transaction. */ + SLP_TRANSACTION_STATE getState() const; + /** @brief Gets a value indicating whether the transaction was initiated remotely. */ + bool isRemotelyInitiated() const; private: + bool remotelyInitiated_; + SLP_TRANSACTION_STATE state_; SignalingRequest initiatingRequest_; Q_DISABLE_COPY(Transaction) Modified: trunk/kmess/contrib/msntransport/src/transportimpl.cpp =================================================================== --- trunk/kmess/contrib/msntransport/src/transportimpl.cpp 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/transportimpl.cpp 2010-01-26 07:00:26 UTC (rev 5859) @@ -79,6 +79,11 @@ qDeleteAll(databuffers_); } +bool TransportImpl::isConnected() const +{ + return currentBridgeId_ != DEFAULT_BRIDGE_ID; +} + TransportBridgeList & TransportImpl::getTransportBridges() { return transportBridges_; @@ -549,10 +554,10 @@ // We received a data packet for a specific session // A datagram can be chunked depending on the MTU of the transport bridge the - // datagram was sent on; therefore, we try to reassemble the datagram if necessary + // datagram was sent on; therefore, we try to reconstruct the datagram if necessary // using the data from the packet received. - const QByteArray datagram = reassembleEntireDatagramFrom(packet); + const QByteArray datagram = reconstructEntireDatagramFrom(packet); if (!datagram.isNull()) { @@ -575,7 +580,7 @@ { // We received a data packet for a specific session. // Since TLPPT_NOTIFY_ULP was specified the data received - // should not be reassembled at this layer. The ULP will + // should not be reconstructd at this layer. The ULP will // handle all reconstruction of the data. // Determine whether this is the last packet to be received. @@ -619,7 +624,7 @@ // Get the ID of the transport bridge const quint32 bridgeid = bridge->getId(); #ifdef P2PDEBUG_TLP - qDebug("%s: bridge (%d).", Q_FUNC_INFO, bridgeid); + qDebug("%s: bridge (%d) data send successfull.", Q_FUNC_INFO, bridgeid); #endif Packet *packet = 0l; @@ -732,7 +737,7 @@ // Get the ID of the transport bridge const quint32 bridgeid = bridge->getId(); #ifdef P2PDEBUG_TLP - qDebug("%s: bridge (%d).", Q_FUNC_INFO, bridgeid); + qDebug("%s: bridge (%d) data send failed.", Q_FUNC_INFO, bridgeid); #endif Packet *packet = 0l; @@ -935,7 +940,7 @@ return buffer; } -QByteArray TransportImpl::reassembleEntireDatagramFrom(Packet *packet) +QByteArray TransportImpl::reconstructEntireDatagramFrom(Packet *packet) { QByteArray datagram; // Get the header field of the packet. @@ -943,12 +948,12 @@ // Check whether the entire datagram has been received. if (h.payloadSize < h.blobSize) { - // If not, try to reassemble the datagram + // If not, try to reconstruct the datagram #ifdef P2PDEBUG_TLP qDebug("%s: Received datagram chunk [%lld..%lld], packet (%d)", Q_FUNC_INFO, h.offset, h.offset+h.payloadSize, h.identifier); #endif - // Get the raw data buffer used to reassemble the datagram. + // Get the raw data buffer used to reconstruct the datagram. QBuffer *databuffer = getDatagramBufferBy(h.identifier); // Get the data offset of the data buffer. const quint32 dataoffset = databuffer->pos(); @@ -978,7 +983,7 @@ { // Remove the buffer from the list. databuffers_.remove(h.identifier); - // We assume that the data has been reassembled. + // We assume that the data has been reconstructd. datagram = databuffer->buffer(); // Dispose of the buffer. @@ -990,7 +995,7 @@ else { // Otherwise, the datagram is not chunked and there - // is no need to try to reassemble it. + // is no need to try to reconstruct it. datagram = Helper::readDataFromPacket(packet); } Modified: trunk/kmess/contrib/msntransport/src/transportimpl.h =================================================================== --- trunk/kmess/contrib/msntransport/src/transportimpl.h 2010-01-25 23:53:20 UTC (rev 5858) +++ trunk/kmess/contrib/msntransport/src/transportimpl.h 2010-01-26 07:00:26 UTC (rev 5859) @@ -90,7 +90,7 @@ * ----------------- -------------------- ---------------------------------------------- * DATA ACKNOWLEDGE (ACK) Endpoint B only sends ACK when the entire * data unit has been received. That is, the - * packet fragments have been reassembled + * packet fragments have been reconstructed * if necessary into the original PDU. * * ACKNOWLEDGE (ACK) (nothing) Endpoint B should remove its unACKed packet @@ -136,6 +136,12 @@ public: /** @brief Gets or creates an switchboard (indirect) bridge. */ SwitchboardBridge * getOrCreateSbBridge(); + /** @brief Gets a value indicating whether the transport's underlying bridge is connected. */ + bool isConnected() const; + /** @brief Sends the supplied array of bytes to the specified destination. */ + quint32 send(const QByteArray& datagram, const quint32 dest, const quint32 correlationId, bool isulpdata=false); + /** @brief Sends the supplied data stream to the specified destination. */ + void send(QIODevice *stream, const quint32 dest); private Q_SLOTS: /** @brief Called when an underlying transport bridge connects to its remote endpoint. */ @@ -185,11 +191,7 @@ /** @brief Gets the datagram buffer with the specified id. */ QBuffer * getDatagramBufferBy(const quint32 id); /** @brief Reassembles the entire datagram (blob) received from the supplied packet. */ - QByteArray reassembleEntireDatagramFrom(Packet *packet); - /** @brief Sends the supplied array of bytes to the specified destination. */ - quint32 send(const QByteArray& datagram, const quint32 dest, const quint32 correlationId, bool isulpdata=false); - /** @brief Sends the supplied data stream to the specified destination. */ - void send(QIODevice *stream, const quint32 dest); + QByteArray reconstructEntireDatagramFrom(Packet *packet); /** @brief Sends an authentication key (nonce) to validate the bridge with specified bridge id. */ void sendBridgeAuthenticationKey(const QUuid& key, const quint32 bridgeid); /** @brief Creates a packet that can be used for data or control transmission. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 23:53:27
|
Revision: 5858 http://kmess.svn.sourceforge.net/kmess/?rev=5858&view=rev Author: it_amroth Date: 2010-01-25 23:53:20 +0000 (Mon, 25 Jan 2010) Log Message: ----------- * Fixed a lot of federated and OIM messages signaling. * Fixed another issue in chat ownership of messages. * Improved EmailMessages support code. * Added a check to TextMessage for when there's no formatting in the messages. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/offlinemessage.h trunk/kmess/lib/src/chatfactory.cpp trunk/kmess/lib/src/chatfactory.h trunk/kmess/lib/src/connections/msnnotificationconnection.cpp trunk/kmess/lib/src/connections/msnnotificationconnection.h trunk/kmess/lib/src/messages/offlinemessage.cpp trunk/kmess/lib/src/messages/textmessage.cpp trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/ChangeLog 2010-01-25 23:53:20 UTC (rev 5858) @@ -1,3 +1,12 @@ +2010-01-26 Valerio Pilo <valerio@...> + + * OfflineMessage: Partially rewritten to actually allow being used. + * MsnNotificationConnection: Improved EmailMessages support, fixed creating OIM messages, + fixed OIM/federated messages receiving signaling. + * MsnSession: Fixed signaling for OIM/federated messages receiving and for status events. + * ChatFactory: Same signaling fixes, fixed chat ownership of federated/OIM Messages. + * TextMessage: Added safeguard to avoid problems (or even just warnings). + 2010-01-25 Valerio Pilo <valerio@...> * MsnChat: Fixed a signal, fixed chat ownership of incoming Messages. Modified: trunk/kmess/lib/include/KMess/offlinemessage.h =================================================================== --- trunk/kmess/lib/include/KMess/offlinemessage.h 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/include/KMess/offlinemessage.h 2010-01-25 23:53:20 UTC (rev 5858) @@ -39,20 +39,20 @@ /** * @class OfflineMessage * - * A wink. + * An Offline-IM Message. */ class OfflineMessage : public Message { public: // Public constructors/destructors OfflineMessage(); - OfflineMessage( MsnChat *chat, MsnContact* peer ); + OfflineMessage( KMess::MsnChat* chat, KMess::MsnContact* peer, const QString body ); OfflineMessage( const Message &other ); virtual ~OfflineMessage(); public: // Public methods void identifyPeers( MsnSession *session ); - const QString& message() const; + const QString message() const; const QString& recipient() const; const QString& sender() const; quint32 sequenceNumber() const; Modified: trunk/kmess/lib/src/chatfactory.cpp =================================================================== --- trunk/kmess/lib/src/chatfactory.cpp 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/chatfactory.cpp 2010-01-25 23:53:20 UTC (rev 5858) @@ -105,8 +105,8 @@ // this, SIGNAL( needSwitchboardTokens(KMess::MsnChat*) ) ); connect( chat, SIGNAL( requestSwitchboard(KMess::MsnChat*) ), this, SIGNAL( switchboardRequested(KMess::MsnChat*) ) ); - connect( chat, SIGNAL( messageReceived(KMess::Message&) ), - this, SIGNAL( chatMessageReceived(KMess::Message&) ) ); + connect( chat, SIGNAL( messageReceived(KMess::Message) ), + this, SIGNAL( chatMessageReceived(KMess::Message) ) ); chats_.append( chat ); @@ -133,12 +133,12 @@ * * @param message The message to deliver */ -void ChatFactory::message( Message &message ) +void ChatFactory::message( KMess::Message message ) { if( ! message.isValid() ) { warning() << "Invalid message received! Unable to deliver!"; - warning() << "Message:" << ((void*)&message) << "Peer:" << (message.isValid() ? message.peer() : 0); + warning() << "Message:" << ((void*)&message) << "Peer:" << ((void*)message.peer()); return; } @@ -150,6 +150,7 @@ // There was no private chat yet, create a new one. privateChat = createChat( handle ); } + message.setChat( privateChat ); debug() << "Delivering message to chat..."; Modified: trunk/kmess/lib/src/chatfactory.h =================================================================== --- trunk/kmess/lib/src/chatfactory.h 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/chatfactory.h 2010-01-25 23:53:20 UTC (rev 5858) @@ -18,6 +18,7 @@ #ifndef CHATFACTORY_H #define CHATFACTORY_H +#include <KMess/Message> #include <KMess/NetworkGlobals> @@ -65,7 +66,7 @@ public slots: // Create a new MsnChat object and return it MsnChat *createChat( const QString &handle ); - void message( Message &message ); + void message( KMess::Message message ); private slots: void slotChatDestroyed(); @@ -80,7 +81,7 @@ void needSwitchboardTokens( KMess::MsnChat *chat ); void chatCreated( KMess::MsnChat *chat ); void chatDestroyed( KMess::MsnChat *chat ); - void chatMessageReceived( KMess::Message &message ); + void chatMessageReceived( KMess::Message message ); void switchboardRequested( KMess::MsnChat *chat ); }; Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-25 23:53:20 UTC (rev 5858) @@ -42,11 +42,6 @@ #include <QUrl> #include <QUuid> -#ifdef KMESSDEBUG_NOTIFICATION - #define KMESSDEBUG_NOTIFICATION_GENERAL - #define KMESSDEBUG_NOTIFICATION_AUTH - #define KMESSDEBUG_NOTIFICATION_MESSAGES -#endif // NOTE: NOTIFICATION_HIDE_P2P_SUPPORT was moved to utils/utils.cpp @@ -1000,20 +995,18 @@ || contentType == "text/x-msmsgsinitialemailnotification" || contentType == "text/x-msmsgsoimnotification" ) { - EmailMessage mailMessage( message ); - // Parse these messages the same way, // the x-msmsgsinitialmdatanotification message is an extended version of x-msmsgsoimnotification // description of the fields: http://msnpiki.msnfanatic.com/index.php/MSNP13:Offline_IM // Parse the URL fields (msmsgsinitialmdatanotification messages). - if( mailMessage.hasField( "Post-URL" ) ) + if( message.hasField( "Post-URL" ) ) { - session_->setSessionSetting( "UrlWebmail", mailMessage.field( "Post-URL" ) ); + session_->setSessionSetting( "UrlWebmail", message.field( "Post-URL" ) ); } // Parse the Mail-Data field. - const QString& mailDataSrc( mailMessage.field( "Mail-Data" ) ); + const QString& mailDataSrc( message.field( "Mail-Data" ) ); if( mailDataSrc == "too-large" ) { // After a certain amount of messages, the XML is replaced with "too-large". @@ -1042,27 +1035,25 @@ } else if ( contentType == "text/x-msmsgsemailnotification" ) { - EmailMessage mailMessage( message ); - debug() << "An email was received!" - << "From:" << mailMessage.field( "From" ) - << "- Subject:" << mailMessage.field( "Subject" ) - << "- Folder:" << mailMessage.field( "Dest-Folder" ); + << "From:" << message.field( "From" ) + << "- Subject:" << message.field( "Subject" ) + << "- Folder:" << message.field( "Dest-Folder" ); // If a message delta is to the active folder, emails were moved into it, so use a negative deletion - if ( mailMessage.field( "Dest-Folder" ) == "ACTIVE" ) + if ( message.field( "Dest-Folder" ) == "ACTIVE" ) { // Received in the inbox session_->setEmailCount( 1 ); } - bool isIntoInbox = ( mailMessage.field( "Dest-Folder" ) == "ACTIVE" ); - emit newEmail( InternalUtils::decodeRFC2047String( mailMessage.field( "From" ) ), - InternalUtils::decodeRFC2047String( mailMessage.field( "Subject" ) ), + bool isIntoInbox = ( message.field( "Dest-Folder" ) == "ACTIVE" ); + emit newEmail( InternalUtils::decodeRFC2047String( message.field( "From" ) ), + InternalUtils::decodeRFC2047String( message.field( "Subject" ) ), isIntoInbox, - mailMessage.field( "id" ), - mailMessage.field( "Message-URL" ), - mailMessage.field( "Post-URL" ) ); + message.field( "id" ), + message.field( "Message-URL" ), + message.field( "Post-URL" ) ); } else if( contentType == "text/x-msmsgsactivemailnotification" ) { @@ -2221,15 +2212,13 @@ const QDateTime &date, const QString &body, const QString &runId, int sequenceNum ) { - debug() << "Received an offline IM message " - << "(from=" << from - << " runid=" << runId - << " sequenceNum=" << sequenceNum << ")" << endl; -#ifdef KMESSTEST + debug() << "Received an offline IM message" + << "from" << from + << "(runid=" << runId + << "sequenceNum=" << sequenceNum << ")"; + KMESS_ASSERT( to == session_->getHandle() ); -#else - Q_UNUSED( to ); // Avoid compiler warning -#endif + Q_UNUSED( to ); // Avoid compiler warning when debugging is off if( offlineImService_ == 0 ) { @@ -2258,10 +2247,8 @@ { if( nextOfflineIm->sequenceNum > sequenceNum ) { -#ifdef KMESSDEBUG_NOTIFICATION - debug() << "inserted message '" << date << "', #" << sequenceNum << " " - << "before '" << nextOfflineIm->date << "', #" << nextOfflineIm->sequenceNum << "." << endl; -#endif + debug() << "inserted message" << date << ", #" << sequenceNum + << "before" << nextOfflineIm->date << ", #" << nextOfflineIm->sequenceNum; break; } @@ -2274,8 +2261,7 @@ // Remove from pending list if( pendingOfflineImMessages_.removeAll( messageId ) == 0 ) { - warning() << "Could not remove " - "message '" << messageId << "' from the list!" << endl; + warning() << "Could not remove message" << messageId << "from the list!"; } @@ -2293,7 +2279,7 @@ // All messages received, and sorted, // display the messages in the chat windows. - debug() << "All messages received, displaying messages in chat window."; + debug() << "All messages received, displaying messages in chats."; MsnContact *contact = 0; QString name; @@ -2313,13 +2299,10 @@ } // Send out the chat message - OfflineMessage message ( 0 /* not attached to a chat */, - contact - ); - message.setSender( contact ); - message.setRecipient( session_->self() ); - message.setMessage( offlineIm->body ); + OfflineMessage message( 0 /* not attached to a chat */, contact, offlineIm->body ); + message.setDirection( KMess::DirectionIncoming ); message.setDateTime( offlineIm->date ); + message.setSequenceNumber( offlineIm->sequenceNum ); emit receivedMessage( message ); } Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.h =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.h 2010-01-25 23:53:20 UTC (rev 5858) @@ -327,8 +327,8 @@ signals: - // Signal a chat message, used for offline-im messages - void receivedMessage( Message message ); + // Signal a chat message (used for federated messages and OIM) + void receivedMessage( KMess::Message message ); // Signal that the connection has been made sucessfully void loggedIn(); // Signal that the authentication failed Modified: trunk/kmess/lib/src/messages/offlinemessage.cpp =================================================================== --- trunk/kmess/lib/src/messages/offlinemessage.cpp 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/messages/offlinemessage.cpp 2010-01-25 23:53:20 UTC (rev 5858) @@ -39,13 +39,10 @@ { return new OfflineMessagePrivate( *this ); } - + public: - QString message; ///< The message. QString recipient; ///< Email of the message recipient - MsnContact* recipientContact; ///< Contact who receives the message QString sender; ///< Email of the message sender - MsnContact* senderContact; ///< Contact who sends the message quint32 sequenceNumber; ///< Offline Message transfer sequence number }; }; @@ -66,13 +63,14 @@ * * Use it to create an offline message. */ -OfflineMessage::OfflineMessage( MsnChat* chat, MsnContact* peer ) +OfflineMessage::OfflineMessage( MsnChat* chat, MsnContact* peer, const QString body ) : Message( peer, DirectionOutgoing, chat, ConfirmNever, OfflineMessageType, QString(), new OfflineMessagePrivate ) { K_D(OfflineMessage); - - d->recipientContact = 0; - d->senderContact = 0; + + d->isValid_ = true; + d->body_ = body.toUtf8(); + d->sequenceNumber = 0; } @@ -89,13 +87,10 @@ { return; } - + d_ptr = new OfflineMessagePrivate( *( d_ptr.data() ) ); - + K_D(OfflineMessage); - - d->senderContact = 0; - d->recipientContact = 0; // Offline messages have their body encoded in base64. Message will however decode it for us. @@ -103,6 +98,9 @@ d->recipient = InternalUtils::decodeRFC2047String( field( "To" ) ); d->sequenceNumber = field( "X-OIM-Sequence-Num" ).toUInt(); + + // You must call identifyPeers() to validate the message peers + d->isValid_ = false; } @@ -126,34 +124,36 @@ void OfflineMessage::identifyPeers( MsnSession *session ) { K_D(OfflineMessage); - - if( d->sender.isEmpty() || d->recipient.isEmpty() ) + + d->isValid_ = false; + + if( d->sender.isEmpty() && d->recipient.isEmpty() ) { warning() << "Invalid offline message peers!"; warning() << "Sender:" << d->sender << "recipients:" << d->recipient; return; } - if( d->sender == session->getHandle() ) + const QString sessionHandle( session->getHandle() ); + + if( d->sender == sessionHandle ) { - d->senderContact = 0; - d->recipientContact = session->getContact( d->recipient ); + setPeer( session->getContact( d->recipient ) ); } else - if( d->recipient == session->getHandle() ) + if( d->recipient == sessionHandle ) { - d->recipientContact = 0; - d->senderContact = session->getContact( d->sender ); + setPeer( session->getContact( d->sender ) ); } else { - d->recipientContact = 0; - d->senderContact = 0; - warning() << "Contacts mismatch! The user is neither the sender or the recipient of the message!"; - warning() << "Sender:" << d->sender << "recipients:" << d->recipient; + warning() << "Sender:" << d->sender << "Recipient:" << d->recipient; return; } + + + d->isValid_ = ( d->peer_ != 0 ); } @@ -161,11 +161,11 @@ /** * Get the message the contact sent, or we are about to send. */ -const QString& OfflineMessage::message() const +const QString OfflineMessage::message() const { K_D(OfflineMessage); - - return d->message; + + return QString::fromUtf8( d->body_ ); } @@ -178,7 +178,7 @@ const QString& OfflineMessage::recipient() const { K_D(OfflineMessage); - + return d->recipient; } @@ -192,7 +192,7 @@ const QString& OfflineMessage::sender() const { K_D(OfflineMessage); - + return d->sender; } @@ -206,7 +206,7 @@ quint32 OfflineMessage::sequenceNumber() const { K_D(OfflineMessage); - + return d->sequenceNumber; } @@ -218,8 +218,8 @@ void OfflineMessage::setMessage( const QString &msg ) { K_D(OfflineMessage); - - d->message = msg; + + d->body_ = msg.toUtf8(); } @@ -232,9 +232,13 @@ void OfflineMessage::setRecipient( MsnContact* recipient ) { K_D(OfflineMessage); - + d->recipient = recipient->email(); - d->recipientContact = recipient; + + if( d->direction_ == DirectionOutgoing ) + { + setPeer( recipient ); + } } @@ -247,9 +251,13 @@ void OfflineMessage::setSender( MsnContact *sender ) { K_D(OfflineMessage); - + d->sender = sender->email(); - d->senderContact = sender; + + if( d->direction_ == DirectionIncoming ) + { + setPeer( sender ); + } } @@ -262,7 +270,7 @@ void OfflineMessage::setSequenceNumber( const quint32 number ) { K_D(OfflineMessage); - + d->sequenceNumber = number; } Modified: trunk/kmess/lib/src/messages/textmessage.cpp =================================================================== --- trunk/kmess/lib/src/messages/textmessage.cpp 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/messages/textmessage.cpp 2010-01-25 23:53:20 UTC (rev 5858) @@ -33,12 +33,12 @@ public: TextMessagePrivate() {} TextMessagePrivate( const MessagePrivate &other ) : MessagePrivate( other ) {} - + virtual MessagePrivate *clone() { return new TextMessagePrivate( *this ); } - + public: QColor color; ///< Font color to apply to the message text QFont font; ///< Font and attributes of the message text @@ -55,7 +55,7 @@ : Message( 0, DirectionOutgoing, 0, ConfirmAlways, TextMessageType, "text/plain; charset=UTF-8", new TextMessagePrivate ) { K_D(TextMessage); - + d->color = Qt::black; } @@ -70,7 +70,7 @@ : Message( peer, DirectionOutgoing, chat, ConfirmAlways, TextMessageType, "text/plain; charset=UTF-8", new TextMessagePrivate ) { K_D(TextMessage); - + // Set class properties d->color = Qt::black; } @@ -86,23 +86,28 @@ */ TextMessage::TextMessage( const Message &other ) : Message( other ) -{ +{ if ( other.type() == TextMessageType ) { // nothing to do here. dptr already cloned in Message copy ctor. return; } - + // must create a new TextMessagePrivate and have it copy all of the // previous data from MessagePrivate. d_ptr = new TextMessagePrivate( *( d_ptr.data() ) ); K_D(TextMessage); - + // Set the base class properties d->confirmationMode_ = ConfirmAlways; d->messageType_ = TextMessageType; - + + if( ! hasField( "X-MMS-IM-Format" ) ) + { + return; + } + // Get the font and color from the format string QString family( field( "X-MMS-IM-Format", "FN" ) ); const QString& effects( field( "X-MMS-IM-Format", "EF" ) ); @@ -137,7 +142,7 @@ const QColor& TextMessage::color() const { K_D(TextMessage); - + return d->color; } @@ -155,7 +160,7 @@ const MsnObjectMap& TextMessage::emoticons() const { K_D(TextMessage); - + return d->emoticons; } @@ -169,7 +174,7 @@ const QFont& TextMessage::font() const { K_D(TextMessage); - + return d->font; } @@ -183,7 +188,7 @@ QString TextMessage::message() const { K_D(TextMessage); - + return QString::fromUtf8( d->body_ ); } @@ -198,7 +203,7 @@ const QString& TextMessage::peerName() const { K_D(TextMessage); - + return d->peerName; } @@ -212,7 +217,7 @@ void TextMessage::setColor( const QColor& color ) { K_D(TextMessage); - + d->color = color; } @@ -226,7 +231,7 @@ void TextMessage::setEmoticons( const MsnObjectMap& emoticons ) { K_D(TextMessage); - + d->emoticons = emoticons; } @@ -240,7 +245,7 @@ void TextMessage::setFont( const QFont& font ) { K_D(TextMessage); - + d->font = font; } @@ -254,7 +259,7 @@ void TextMessage::setMessage( const QString& message ) { K_D(TextMessage); - + d->body_ = message.toUtf8(); // Determine if the message is valid @@ -274,7 +279,7 @@ void TextMessage::setPeerName( const QString& peerName ) { K_D(TextMessage); - + if( peerName.isEmpty() ) { debug() << "Cannot set an empty peer name!"; @@ -300,8 +305,8 @@ if ( d->font.underline() ) effects += "U"; if ( d->font.strikeOut() ) effects += "S"; - setField( "X-MMS-IM-Format", "FN=" + QUrl::toPercentEncoding( d->font.family() ) + - "; EF=" + effects + + setField( "X-MMS-IM-Format", "FN=" + QUrl::toPercentEncoding( d->font.family() ) + + "; EF=" + effects + "; CO=" + MsnAlgorithms::convertHtmlColorToMsnColor( d->color.name() ) + "; CS=0" + "; PF=" + QString::number( d->font.pointSize() ) ); Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-25 23:43:38 UTC (rev 5857) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-25 23:53:20 UTC (rev 5858) @@ -103,6 +103,8 @@ this, SIGNAL( groupRemoved(KMess::MsnGroup*) ) ); connect( msnNotificationConnection_, SIGNAL( groupRenamed(KMess::MsnGroup*, QString) ), this, SIGNAL( groupRenamed(KMess::MsnGroup*, QString) ) ); + connect( msnNotificationConnection_, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ), + this, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ) ); // non-chained signals; we do some processing before emitting the // appropriate signal. @@ -113,10 +115,6 @@ connect( msnNotificationConnection_, SIGNAL( changedStatus(KMess::MsnStatus) ), this, SLOT ( slotChangedStatus(KMess::MsnStatus) ) ); - // Not yet implemented - connect( msnNotificationConnection_, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ), - this, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ) ); - // hook up disconnect signal to reset slot of list manager. connect( msnNotificationConnection_, SIGNAL( disconnected() ), listsManager_, SLOT( reset() ) ); @@ -127,9 +125,8 @@ // Connect some signals connect( msnNotificationConnection_, SIGNAL( invitedToChat(QString,QString,quint16,QString,QString) ), chatFactory_, SLOT ( invitedToChat(QString,QString,quint16,QString,QString) ) ); - // TODO: move signal, is not emitted by MsnNotificationConnection anymore - //connect( msnNotificationConnection_, SIGNAL( offlineMessage(ChatMessage) ), - // chatFactory_, SLOT ( offlineMessage(ChatMessage) ) ); + connect( msnNotificationConnection_, SIGNAL( receivedMessage(KMess::Message) ), + chatFactory_, SLOT ( message(KMess::Message) ) ); connect( chatFactory_, SIGNAL( chatCreated(KMess::MsnChat*) ), this, SIGNAL( chatCreated(KMess::MsnChat*) ) ); connect( chatFactory_, SIGNAL( chatDestroyed(KMess::MsnChat*) ), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 23:43:45
|
Revision: 5857 http://kmess.svn.sourceforge.net/kmess/?rev=5857&view=rev Author: it_amroth Date: 2010-01-25 23:43:38 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Added Offline Messages to the message types Chat can display. Modified Paths: -------------- trunk/kmess/src/chat/chat.cpp Modified: trunk/kmess/src/chat/chat.cpp =================================================================== --- trunk/kmess/src/chat/chat.cpp 2010-01-25 22:07:18 UTC (rev 5856) +++ trunk/kmess/src/chat/chat.cpp 2010-01-25 23:43:38 UTC (rev 5857) @@ -1426,9 +1426,12 @@ */ void Chat::slotReceivedMessage( KMess::Message message ) { + kDebug() << "Received a message. Selecting type..."; + switch( message.type() ) { case KMess::TextMessageType: + case KMess::OfflineMessageType: { KMessMessage msg( message, KMessMessage::IncomingText ); displayIncomingMessage( msg ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 22:07:25
|
Revision: 5856 http://kmess.svn.sourceforge.net/kmess/?rev=5856&view=rev Author: it_amroth Date: 2010-01-25 22:07:18 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Fixed chatting. Modified Paths: -------------- trunk/kmess/lib/include/KMess/msnchat.h trunk/kmess/lib/src/msnchat.cpp Modified: trunk/kmess/lib/include/KMess/msnchat.h =================================================================== --- trunk/kmess/lib/include/KMess/msnchat.h 2010-01-25 21:57:14 UTC (rev 5855) +++ trunk/kmess/lib/include/KMess/msnchat.h 2010-01-25 22:07:18 UTC (rev 5856) @@ -140,7 +140,7 @@ /// Ask the Notification connection to initiate a new chat server connection with the contact(s) void requestSwitchboard( KMess::MsnChat *chat ); /// A message was received from a remote end - void messageReceived( KMess::Message& message ); + void messageReceived( KMess::Message message ); // TODO remove: void showWink( const QString&, const QString&, const QString& ); Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-25 21:57:14 UTC (rev 5855) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-25 22:07:18 UTC (rev 5856) @@ -425,6 +425,8 @@ return; } + debug() << "Notifying listeners of a message arrival"; + emit messageReceived( message ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 21:57:27
|
Revision: 5855 http://kmess.svn.sourceforge.net/kmess/?rev=5855&view=rev Author: it_amroth Date: 2010-01-25 21:57:14 +0000 (Mon, 25 Jan 2010) Log Message: ----------- * Fixed the signal to report status events. * Added a new EmailMessage class to parse email and OIM notification messages. * Added check for MPOP support in the Live profile data. * Fixed crash when receiving header-less SOAP messages. * Fixed SOAP dumps debugging statements. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/networkglobals.h trunk/kmess/lib/src/CMakeLists.txt trunk/kmess/lib/src/connections/msnconnection.cpp trunk/kmess/lib/src/connections/msnnotificationconnection.cpp trunk/kmess/lib/src/messages/message.cpp trunk/kmess/lib/src/msnsession.cpp trunk/kmess/lib/src/soap/httpsoapconnection.cpp Added Paths: ----------- trunk/kmess/lib/include/KMess/EmailMessage trunk/kmess/lib/include/KMess/emailmessage.h trunk/kmess/lib/src/messages/emailmessage.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/ChangeLog 2010-01-25 21:57:14 UTC (rev 5855) @@ -2,6 +2,13 @@ * MsnChat: Fixed a signal, fixed chat ownership of incoming Messages. * ChatFactory: Added chat message receiving signal. + * MsnConnection: Fixed the status reporting signal connection. + * EmailMessage: Added. This message can parse the MSN email and OIM notification messages. + * Message: Added support for EmailMessage. + * MsnNotificationConnection: Added support for EmailMessage, added checking for MPOP support + in the Live profile data. + * HttpSoapConnection: Fixed crash when in debug mode, a header-less SOAP message is received; + fixed the preprocessor statements used for debugging. 2010-01-24 Valerio Pilo <valerio@...> Added: trunk/kmess/lib/include/KMess/EmailMessage =================================================================== --- trunk/kmess/lib/include/KMess/EmailMessage (rev 0) +++ trunk/kmess/lib/include/KMess/EmailMessage 2010-01-25 21:57:14 UTC (rev 5855) @@ -0,0 +1 @@ +#include "emailmessage.h" Added: trunk/kmess/lib/include/KMess/emailmessage.h =================================================================== --- trunk/kmess/lib/include/KMess/emailmessage.h (rev 0) +++ trunk/kmess/lib/include/KMess/emailmessage.h 2010-01-25 21:57:14 UTC (rev 5855) @@ -0,0 +1,51 @@ +/*************************************************************************** + emailmessage.h - Message with email data + ------------------- + begin : Mon Jan 25 2010 + copyright : 2010 by Valerio Pilo + email : valerio@... + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 KMESS_EMAILMESSAGE_H +#define KMESS_EMAILMESSAGE_H + +#include <KMess/Message> +#include <KMess/NetworkGlobals> + + + +namespace KMess { + + + + /** + * @class EmailMessage + * + * A message containing email notification information. + */ + class EmailMessage : public Message + { + + public: // Public constructors/destructors + EmailMessage(); + EmailMessage( const Message &other ); + virtual ~EmailMessage(); + + }; + + + +}; // namespace KMess + + + +#endif // KMESS_EMAILMESSAGE_H Modified: trunk/kmess/lib/include/KMess/networkglobals.h =================================================================== --- trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/include/KMess/networkglobals.h 2010-01-25 21:57:14 UTC (rev 5855) @@ -421,7 +421,8 @@ , TypingMessageType ///< A notification message for the "user is typing..." event. , VoiceMessageType ///< A message with a voice recording. , WinkMessageType ///< A message with a wink. -, DataMessageType ///< A data message +, DataMessageType ///< A data message. +, EmailMessageType ///< A message containing email notification data. }; Modified: trunk/kmess/lib/src/CMakeLists.txt =================================================================== --- trunk/kmess/lib/src/CMakeLists.txt 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/CMakeLists.txt 2010-01-25 21:57:14 UTC (rev 5855) @@ -18,6 +18,7 @@ messages/actionmessage.cpp messages/clientcapsmessage.cpp messages/datamessage.cpp + messages/emailmessage.cpp messages/emoticonmessage.cpp messages/inkmessage.cpp messages/message.cpp @@ -73,6 +74,8 @@ ../include/KMess/contactlistmodelitem.h ../include/KMess/DataMessage ../include/KMess/datamessage.h + ../include/KMess/EmailMessage + ../include/KMess/emailmessage.h ../include/KMess/EmoticonMessage ../include/KMess/emoticonmessage.h ../include/KMess/InkMessage Modified: trunk/kmess/lib/src/connections/msnconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnconnection.cpp 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/connections/msnconnection.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -95,8 +95,8 @@ debug() << "Adding SOAP client to list."; // Connect the client's signals - connect( client, SIGNAL( statusEvent(StatusMessageType,StatusMessage,QVariant) ), - this, SIGNAL( statusEvent(StatusMessageType,StatusMessage,QVariant) ) ); + connect( client, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ), + this, SIGNAL( statusEvent(KMess::StatusMessageType,KMess::StatusMessage,QVariant) ) ); // Add to list so it cleans up when the connection closes soapClients_.append( client ); Modified: trunk/kmess/lib/src/connections/msnnotificationconnection.cpp =================================================================== --- trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/connections/msnnotificationconnection.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -18,6 +18,7 @@ #include "libkmessdebug.h" #include "msnnotificationconnection.h" +#include <KMess/EmailMessage> #include <KMess/MsnChat> #include <KMess/MsnContact> #include <KMess/MsnGroup> @@ -742,7 +743,7 @@ { logoutEverywhereElse(); } - + // Notify observers that the server is connected emit loggedIn(); } @@ -883,7 +884,7 @@ MsnContact *contact = session_->getContact( handle ); contact->setStatus( OfflineStatus ); - + // signal that the contact went offline listsManager_->model()->contactUpdate( contact, false ); emit contactOffline( contact ); @@ -943,7 +944,7 @@ contact->setFriendlyName( friendlyName ); contact->setCapabilities( capabilities ); contact->setMsnObject( msnObject ); - + listsManager_->model()->contactUpdate( contact, false ); emit contactOnline( contact, true ); } @@ -985,25 +986,34 @@ settings[ "LanguageCode" ] = message.field( "lang_preference" ); settings[ "PreferredEmail" ] = message.field( "preferredEmail" ); settings[ "SessionId" ] = message.field( "sid" ); + settings[ "Country" ] = message.field( "country" ); settings[ "EmailEnabled" ] = message.field( "EmailEnabled" ) == "1"; session_->setSessionSettings( settings ); + + // NOTE: When the server says we shouldn't support MPOP, we could choose not to obey.. + if( message.field( "MPOPEnabled" ) == "0" ) + { + session_->setLogonMode( LogonSingle ); + } } - else if ( contentType == "text/x-msmsgsinitialmdatanotification" - || contentType == "text/x-msmsgsinitialemailnotification" - || contentType == "text/x-msmsgsoimnotification" ) + else if( contentType == "text/x-msmsgsinitialmdatanotification" + || contentType == "text/x-msmsgsinitialemailnotification" + || contentType == "text/x-msmsgsoimnotification" ) { + EmailMessage mailMessage( message ); + // Parse these messages the same way, // the x-msmsgsinitialmdatanotification message is an extended version of x-msmsgsoimnotification // description of the fields: http://msnpiki.msnfanatic.com/index.php/MSNP13:Offline_IM // Parse the URL fields (msmsgsinitialmdatanotification messages). - if( message.hasField( "Post-URL" ) ) + if( mailMessage.hasField( "Post-URL" ) ) { - session_->setSessionSetting( "UrlWebmail", message.field( "Post-URL" ) ); + session_->setSessionSetting( "UrlWebmail", mailMessage.field( "Post-URL" ) ); } // Parse the Mail-Data field. - const QString& mailDataSrc( message.field( "Mail-Data" ) ); + const QString& mailDataSrc( mailMessage.field( "Mail-Data" ) ); if( mailDataSrc == "too-large" ) { // After a certain amount of messages, the XML is replaced with "too-large". @@ -1017,10 +1027,13 @@ else { // Mail-Data was received directly in the message. + QString error; QDomDocument mailData; - if( ! mailData.setContent( message.field( "Mail-Data" ) ) ) + int errorLine = 0, errorColumn = 0; + if( ! mailData.setContent( mailDataSrc, false /*NamespaceProcessing*/, &error, &errorLine, &errorColumn ) ) { warning() << "Could not parse XML Mail-Data field!"; + warning() << "XML error:" << error << "at line" << errorLine << "column" << errorColumn; return; } @@ -1029,27 +1042,29 @@ } else if ( contentType == "text/x-msmsgsemailnotification" ) { + EmailMessage mailMessage( message ); + debug() << "An email was received!" - << "From:" << message.field( "From" ) - << "- Subject:" << message.field( "Subject" ) - << "- Folder:" << message.field( "Dest-Folder" ); + << "From:" << mailMessage.field( "From" ) + << "- Subject:" << mailMessage.field( "Subject" ) + << "- Folder:" << mailMessage.field( "Dest-Folder" ); // If a message delta is to the active folder, emails were moved into it, so use a negative deletion - if ( message.field( "Dest-Folder" ) == "ACTIVE" ) + if ( mailMessage.field( "Dest-Folder" ) == "ACTIVE" ) { // Received in the inbox session_->setEmailCount( 1 ); } - bool isIntoInbox = ( message.field( "Dest-Folder" ) == "ACTIVE" ); - emit newEmail( InternalUtils::decodeRFC2047String( message.field( "From" ) ), - InternalUtils::decodeRFC2047String( message.field( "Subject" ) ), + bool isIntoInbox = ( mailMessage.field( "Dest-Folder" ) == "ACTIVE" ); + emit newEmail( InternalUtils::decodeRFC2047String( mailMessage.field( "From" ) ), + InternalUtils::decodeRFC2047String( mailMessage.field( "Subject" ) ), isIntoInbox, - message.field( "id" ), - message.field( "Message-URL" ), - message.field( "Post-URL" ) ); + mailMessage.field( "id" ), + mailMessage.field( "Message-URL" ), + mailMessage.field( "Post-URL" ) ); } - else if ( contentType == "text/x-msmsgsactivemailnotification" ) + else if( contentType == "text/x-msmsgsactivemailnotification" ) { int messageDelta = message.field( "Message-Delta" ).toInt(); @@ -1157,13 +1172,13 @@ // Update contact status. MsnContact *contact = session_->getContact( idString ); MsnStatus lastStatus = contact->status(); - + contact->setStatus( status ); contact->setFriendlyName( friendlyName ); #warning extendedCapabilities ignored for now contact->setCapabilities( capabilities ); contact->setMsnObject( msnObject ); - + if ( lastStatus == OfflineStatus ) { // contact has gone online @@ -1317,16 +1332,16 @@ QDomNodeList endpointData = root.elementsByTagName( "EndpointData" ); QDomNodeList privEndpoint = root.elementsByTagName( "PrivateEndpointData" ); QList<MPOPEndpoint *> endpoints; - + for( int i = 0; i < endpointData.count(); i++ ) { // firstly: does the contact QDomElement node = endpointData.at( i ).toElement(); QDomElement privNode = privEndpoint.at( i ).toElement(); - + QString id = node.attribute( "id" ); QString caps = node.firstChildElement( "Capabilities" ).toElement().text(); - + // now get the private endpoint data. QString name = privNode.namedItem( "EpName" ).toElement().text(); QString idle = privNode.namedItem( "Idle" ).toElement().text(); @@ -1334,12 +1349,12 @@ #warning TODO: MPOP: Idle, ClientType, State. endpoints.append( new MPOPEndpoint( contact, QUuid( id ), name ) ); - + } - + // old endpoints will be deleted, new ones added, existing ones updated. contact->setEndpoints( endpoints ); - + // Append current media if set. if( currentMedia.length() > 0 ) { @@ -2071,7 +2086,7 @@ xml = "<EndpointData>" "<Capabilities>" + InternalUtils::getCapabilitiesString() + "</Capabilities>" "</EndpointData>"; - + sendCommand( "UUX", QString(), xml ); xml = "<PrivateEndpointData>" @@ -2507,7 +2522,7 @@ // inform the user the add was successful. emit contactAdded( contact ); - + // Check if the user has requested that contact is putted into groups if( ! groupsId.isEmpty() ) { @@ -2534,7 +2549,7 @@ KMESS_ASSERT( listsManager_ ); listsManager_->contactAddToGroup( contactId, groupId ); - + // inform the user emit contactAddedToGroup( listsManager_->contact( contactId ), listsManager_->group( groupId ) ); } @@ -2563,7 +2578,7 @@ // Remove it from our FL. putRml( handle, MSN_LIST_FRIEND ); - + listsManager_->contactRemove( contactId ); // signal successful removal @@ -2593,7 +2608,7 @@ QListIterator< QHash<QString,QVariant> > contact( contacts ); int lists; - + // Cycle for each contact while( contact.hasNext() ) { @@ -2610,7 +2625,7 @@ // add to contact list model listsManager_->contactAdd( handle, friendlyName, lists, groupsList, contactId ); - + MsnContact *contact = listsManager_->contact( handle ); KMESS_NULL( contact ); } @@ -2628,7 +2643,7 @@ listsManager_->contactAdd( handle, handle, lists, QStringList(), QString() ); } } - + // Allow some time until the next message is received if( loginTimer_.isActive() ) { @@ -2705,10 +2720,10 @@ void MsnNotificationConnection::slotGroupRemoved( const QString &id ) { MsnGroup *group = listsManager_->group( id ); - + // last chance for the app to use the MsnGroup reference. emit groupRemoved( group ); - + // because it gets deleted in here. listsManager_->groupRemove( id ); } Added: trunk/kmess/lib/src/messages/emailmessage.cpp =================================================================== --- trunk/kmess/lib/src/messages/emailmessage.cpp (rev 0) +++ trunk/kmess/lib/src/messages/emailmessage.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -0,0 +1,78 @@ +/*************************************************************************** + emailmessage.cpp - Message with email data + ------------------- + begin : Mon Jan 25 2010 + copyright : 2010 by Valerio Pilo + email : valerio@... + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "libkmessdebug.h" + +#include <KMess/EmailMessage> + +using namespace KMess; + + + +/** + * Default constructor. + */ +EmailMessage::EmailMessage() +: Message( 0, DirectionOutgoing, 0, ConfirmNever, EmailMessageType ) +{ +} + + + +/** + * Copy constructor from a plain Message. + * + * @param other Message to clone + */ +EmailMessage::EmailMessage( const Message &other ) +: Message( other ) +{ + if ( other.type() == EmailMessageType ) + { + // nothing to do here. dptr already cloned in Message copy ctor. + return; + } + + K_D(Message); + + // Set the base class properties + d->confirmationMode_ = ConfirmAlways; + d->messageType_ = EmailMessageType; + + // The body contains more MIME headers, so parse it as if it were a new + // message; this copies the headers in the body into the message header + // data. With this, the fields can be accessed by using the field() + // method. + bool ok; + d->parseMessage( d->body_, ok ); + + if( ok ) + { + d->body_.clear(); + } +} + + + +/** + * Destructor. + */ +EmailMessage::~EmailMessage() +{ +} + + Modified: trunk/kmess/lib/src/messages/message.cpp =================================================================== --- trunk/kmess/lib/src/messages/message.cpp 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/messages/message.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -22,6 +22,7 @@ #include <KMess/ClientCapsMessage> #include <KMess/EmoticonMessage> #include <KMess/InkMessage> +#include <KMess/EmailMessage> #include <KMess/NudgeMessage> #include <KMess/OfflineMessage> #include <KMess/PtpDataMessage> @@ -431,7 +432,7 @@ else if( mimeType == "text/x-keepalive" ) { - debug() << "Message is a keepalive message, ignoring it"; + debug() << "Message is a keepalive message"; } else if( mimeType == "application/x-msnmsgrp2p" ) @@ -440,7 +441,21 @@ return PtpDataMessage( tempMessage ); } else + if( mimeType == "text/x-msmsgsinitialmdatanotification" + || mimeType == "text/x-msmsgsinitialemailnotification" + || mimeType == "text/x-msmsgsactivemailnotification" + || mimeType == "text/x-msmsgsoimnotification" ) { + debug() << "Message is an email or OIM data message"; + return EmailMessage( tempMessage ); + } + else + if( mimeType == "text/x-msmsgsprofile" ) + { + debug() << "Message contains a Messenger profile's data, returning as a simple Message"; + } + else + { debug() << "Message is of unknown type!"; } Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -164,6 +164,8 @@ sessionSettings_[ "EmailCount" ] = 0; // Localization code of this account. It's the locale which the Live site uses with this account sessionSettings_[ "LanguageCode" ] = QString(); + // Country name registered with this account. + sessionSettings_[ "Country" ] = QString(); // The machine's local IP address sessionSettings_[ "LocalIp" ] = QString(); // The logon mode Modified: trunk/kmess/lib/src/soap/httpsoapconnection.cpp =================================================================== --- trunk/kmess/lib/src/soap/httpsoapconnection.cpp 2010-01-25 12:13:09 UTC (rev 5854) +++ trunk/kmess/lib/src/soap/httpsoapconnection.cpp 2010-01-25 21:57:14 UTC (rev 5855) @@ -34,10 +34,8 @@ using namespace KMess; -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION - #define KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - #define KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP -#endif +// Enable to view the HTTP SOAP requests and responses formatted in the debugging output +#define KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMPS /** @@ -351,7 +349,7 @@ KMESS_NET_SENT( this, contents ); #endif -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMPS debug() << "Request contents:"; debug() << contents; #endif @@ -435,12 +433,12 @@ << reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ) << " from" << replyUrl; -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMPS debug() << "Reply contents:"; // Create the document with the content of SOAP reply to indent it QDomDocument document; - document.setContent( replyContents ); + document.setContent( replyContents ); debug() << document.toString(); #endif @@ -502,9 +500,13 @@ { const QUrl& originalUrl( currentResponse->getEndPoint() ); const QString& originalHost( originalUrl.host() ); - QString preferredHostName( XmlFunctions::getNodeValue( currentResponse->getHeader(), - "ServiceHeader/PreferredHostName" ) ); + QString preferredHostName; + if( ! currentResponse->getHeader().isNull() ) + { + XmlFunctions::getNodeValue( currentResponse->getHeader(), "ServiceHeader/PreferredHostName" ); + } + // Verify if the server is suggesting us to use another server if( ! preferredHostName.isEmpty() && ! redirections_.contains( originalHost ) ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 12:43:07
|
Revision: 5854 http://kmess.svn.sourceforge.net/kmess/?rev=5854&view=rev Author: it_amroth Date: 2010-01-25 12:13:09 +0000 (Mon, 25 Jan 2010) Log Message: ----------- * Fixed some signals. * Made notifications to work again. Modified Paths: -------------- trunk/kmess/ChangeLog trunk/kmess/src/chat/chat.cpp trunk/kmess/src/chat/chat.h trunk/kmess/src/chat/chatmaster.cpp trunk/kmess/src/chat/chatmaster.h trunk/kmess/src/chat/chatwindow.cpp trunk/kmess/src/kmessapplication.cpp trunk/kmess/src/notification/chatnotification.cpp trunk/kmess/src/notification/chatnotification.h trunk/kmess/src/notification/contactstatusnotification.cpp trunk/kmess/src/notification/notificationmanager.cpp Modified: trunk/kmess/ChangeLog =================================================================== --- trunk/kmess/ChangeLog 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/ChangeLog 2010-01-25 12:13:09 UTC (rev 5854) @@ -1,3 +1,6 @@ +2010-01-25 (Valerio) + * Fixed some signals. + * Made notifications to work again. 2010-01-24 (Ruben) * Improved Accountsmanager and Applicationstyle UI's. Modified: trunk/kmess/src/chat/chat.cpp =================================================================== --- trunk/kmess/src/chat/chat.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/chat/chat.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -171,10 +171,10 @@ connect( contact, SIGNAL( contactOffline( KMess::MsnContact * ) ), this, SLOT ( slotContactChangedStatus( KMess::MsnContact * ) ) ); - + connect( contact, SIGNAL( contactOnline( KMess::MsnContact * ) ), this, SLOT ( slotContactChangedStatus( KMess::MsnContact * ) ) ); - + connect( contact, SIGNAL( changedStatus( KMess::MsnContact * ) ), this, SLOT ( slotContactChangedStatus( KMess::MsnContact * ) ) ); @@ -228,7 +228,7 @@ KMessMessage presence( KMessMessage::Presence, getMsnChat(), contact ); presence.setMessage( message ); - + showMessage( presence ); } @@ -709,12 +709,12 @@ imageMimeType = "image/gif"; break; } - + QString html( "<img src=\"data:" + imageMimeType + ";base64," + Qt::escape( inkEncodedData ) + "\">" ); KMessMessage msg( KMessMessage::Ink, getMsnChat(), message.peer() ); msg.setMessage( html ); - + displayIncomingMessage( msg ); } @@ -732,9 +732,9 @@ KMessMessage message( KMessMessage::Nudge, getMsnChat(), contact ); message.setMessage( i18n( "%1 has sent you a nudge!", friendlyName ) ); - + displayIncomingMessage( message ); - + // Emit the new message signal so that the user will receive a notification emit gotChatMessage( message, this ); @@ -972,7 +972,7 @@ QFont( Account::connectedAccount->getSettingFont( "FontUser" ) ), QColor( Account::connectedAccount->getSetting( "FontUserColor" ).toString() ) ); - + showMessage( KMessMessage( msg, KMessMessage::OutgoingText ) ); } @@ -1075,21 +1075,21 @@ #warning TODO: finish wiring MsnChat ( warnings, send fail/succeed? ) connect( msnChat_, SIGNAL( showWink( const QString&,const QString&, const QString& ) ), this, SLOT ( showWink( const QString&, const QString&, const QString& ) ) ); - + connect( msnChat_, SIGNAL( contactJoined( KMess::MsnContact * ) ), this, SLOT ( contactJoined( KMess::MsnContact * ) ) ); - + connect( msnChat_, SIGNAL( contactLeft( KMess::MsnContact *, bool ) ), this, SLOT ( contactLeft( KMess::MsnContact *, bool ) ) ); - + connect( msnChat_, SIGNAL( messageReceived( KMess::Message ) ), this, SLOT ( slotReceivedMessage( KMess::Message ) ) ); - - connect( msnChat_, SIGNAL( sendingFailed( KMess::Message ) ), + + connect( msnChat_, SIGNAL( sendingFailed( KMess::Message,QString ) ), this, SLOT ( slotSendingFailed( KMess::Message ) ) ); - - connect( msnChat_, SIGNAL( chatWarning( KMess::Message, KMess::MsnContact * ) ), - this, SLOT ( showWarning( KMess::Message, KMess::MsnContact * ) ) ); + + connect( msnChat_, SIGNAL( chatWarning( KMess::Message, KMess::MsnContact* ) ), + this, SLOT ( showWarning( KMess::Message, KMess::MsnContact* ) ) ); } @@ -1406,10 +1406,10 @@ return; } - + KMessMessage presence( KMessMessage::Presence, getMsnChat(), contact ); presence.setMessage( message ); - + showMessage( presence ); } @@ -1418,7 +1418,7 @@ /** * Called when a message is received from the chat. We must determine what type of message it is and respond accordingly. * - * From here, if it requires further processing the message is passed to one of the + * From here, if it requires further processing the message is passed to one of the * received*Message helper methods. Then it is sent to displayReceivedMessage for final * processing and display to the user. * @@ -1440,7 +1440,7 @@ receivedInkMessage( KMess::InkMessage( message ) ); break; } - + case KMess::NudgeMessageType: receivedNudgeMessage( message.peer() ); break; @@ -1464,7 +1464,7 @@ QString friendlyName; Contact contact( message.peer() ); - + #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Showing a sending failure notice."; #endif @@ -1479,7 +1479,7 @@ } else { - + friendlyName = contact->getFriendlyName( STRING_CLEANED_ESCAPED ); } @@ -1644,7 +1644,7 @@ KMessMessage msg( KMessMessage::Nudge, getMsnChat(), globalSession->self() ); msg.setMessage( messageText ); - + // Display message msnChat_->sendNudge(); @@ -1688,7 +1688,7 @@ KMessMessage presence( KMessMessage::Presence, getMsnChat(), contact ); presence.setMessage( i18n( "%1 is currently offline. Any messages you send will be delivered the next time he or she logs in.", Contact( contact ).getFriendlyName( STRING_CLEANED_ESCAPED ) ) ); - + showMessage( presence ); } } Modified: trunk/kmess/src/chat/chat.h =================================================================== --- trunk/kmess/src/chat/chat.h 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/chat/chat.h 2010-01-25 12:13:09 UTC (rev 5854) @@ -116,7 +116,7 @@ void startChat(); public slots: - + // Change the switchboard connection used by the chat window. void setMsnChat( KMess::MsnChat *newChat ); // Send a nudge @@ -148,7 +148,7 @@ // A contact left the chat void contactLeft ( KMess::MsnContact *contact, bool isChatIdle ); // A contact is typing - void contactTyping( KMess::MsnContact *contact, bool forceExpiration = false ); + void contactTyping( KMess::MsnContact *contact = 0, bool forceExpiration = false ); // A warning from the switchboard has been received, display it void showWarning( KMess::ChatWarningType type, KMess::MsnContact *contact ); // Display a message to notify of a contact status change Modified: trunk/kmess/src/chat/chatmaster.cpp =================================================================== --- trunk/kmess/src/chat/chatmaster.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/chat/chatmaster.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -304,6 +304,32 @@ +// Return the chat for the given MsnChat +Chat* ChatMaster::getChat( KMess::MsnChat *chat ) +{ + if( chatWindows_.isEmpty() ) + { + return 0; + } + + foreach( ChatWindow *chatWindow, chatWindows_ ) + { + QList<Chat*> chats( chatWindow->getChats() ); + + foreach( Chat *currentChat, chats ) + { + if( currentChat->getMsnChat() == chat ) + { + return currentChat; + } + } + } + + return 0; +} + + + // Return the window for the given chat ChatWindow *ChatMaster::getChatWindow( Chat *chat ) { @@ -686,16 +712,6 @@ } // Connect the chat's request signals - connect( newChat, SIGNAL( gotChatMessage(ChatMessage,Chat*) ), - this, SIGNAL( newChatMessage(ChatMessage,Chat*) ) ); - connect( newChat, SIGNAL( appCommand(QString,QString,QString) ), - this, SLOT ( slotDeliverAppCommand(QString,QString,QString) ) ); - connect( newChat, SIGNAL( requestFileTransfer(QString,QString) ), - this, SLOT ( startFileTransfer(QString,QString) ) ); - connect( newChat, SIGNAL( requestNetMeeting(QString) ), - this, SLOT ( startNetMeeting(QString) ) ); - connect( newChat, SIGNAL( requestWebcamTransfer(QString) ), - this, SLOT ( startWebcamTransfer(QString) ) ); connect( newChat, SIGNAL( closing(Chat*) ), this, SLOT ( slotChatClosing(Chat*) ) ); connect( this, SIGNAL( updateApplicationMessage(QString,QString) ), Modified: trunk/kmess/src/chat/chatmaster.h =================================================================== --- trunk/kmess/src/chat/chatmaster.h 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/chat/chatmaster.h 2010-01-25 12:13:09 UTC (rev 5854) @@ -61,6 +61,8 @@ ChatMaster(QObject *parent = 0); // The destructor virtual ~ChatMaster(); + // Return the chat for the given MsnChat + Chat* getChat( KMess::MsnChat *chat ); public slots: // Public slots // The connection has been established @@ -124,8 +126,6 @@ int chatTabbingMode_; signals: // Public signals - // Signal the presence of a new incoming chat message - void newChatMessage( const ChatMessage &message, Chat *chatWindow ); // Signal for ChatMessageView to replace an application's accept/reject/cancel links with another text void updateApplicationMessage( const QString &messageId, const QString &newMessage ); // Signal a reconnect request. Modified: trunk/kmess/src/chat/chatwindow.cpp =================================================================== --- trunk/kmess/src/chat/chatwindow.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/chat/chatwindow.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -264,8 +264,8 @@ this, SLOT ( slotUpdateChatInfo() ) ); connect( newChat, SIGNAL( gotNudge() ), this, SLOT ( slotGotNudge() ) ); - connect( newChat, SIGNAL( gotChatMessage(KMess::TextMessage,Chat*) ), - this, SLOT ( slotGotChatMessage(KMess::TextMessage,Chat*) ) ); + connect( newChat, SIGNAL( gotChatMessage(KMess::TextMessage&,Chat*) ), + this, SLOT ( slotGotChatMessage(KMess::TextMessage&,Chat*) ) ); connect( newChat, SIGNAL( gotTypingMessage(Chat*) ), this, SLOT ( slotGotTypingMessage(Chat*) ) ); @@ -759,7 +759,7 @@ return false; } - + if ( event->type() == QEvent::KeyPress ) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>( event ); @@ -769,7 +769,7 @@ return true; } } - + // Only manage events for the editors from now on (the event filter code // is complex enough as it is now...) if( obj != messageEdit_ @@ -1227,7 +1227,7 @@ else if( command == "me" ) { const QString message( "* " + Account::connectedAccount->getFriendlyName() + " " + arguments.join( " " ) ); - + KMessMessage output( KMessMessage::OutgoingText, getCurrentChat()->getMsnChat(), globalSession->self() ); output.setMessage( message ); getCurrentChat()->showMessage( output ); @@ -1551,7 +1551,7 @@ KMessMessage msg( KMessMessage::Ink, getCurrentChat()->getMsnChat(), globalSession->self() ); msg.setMessage( text ); - + getCurrentChat()->showMessage( msg ); // Clear and reset the state of the send button Modified: trunk/kmess/src/kmessapplication.cpp =================================================================== --- trunk/kmess/src/kmessapplication.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/kmessapplication.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -441,9 +441,9 @@ // Create the current session instance globalSession = new KMess::MsnSession(); - + // set local endpoint name. - + globalSession->localEndpoint()->setName( KMESS_VERSION ); kDebug() << globalSession->localEndpoint()->name() << globalSession->localEndpoint()->guid(); @@ -502,9 +502,6 @@ // TODO: remove reconnect() from MsnSession? connect( chatMaster_, SIGNAL(reconnect()), globalSession, SIGNAL(reconnect()) ); - // TODO: connect this correctly to MsnChat - connect( chatMaster_, SIGNAL( newChatMessage(ChatMessage,Chat*) ), globalSession, SIGNAL(newChatMessage(ChatMessage,Chat*) ) ); - connect( globalSession, SIGNAL( connecting() ), chatMaster_, SLOT( connecting() ) ); connect( globalSession, SIGNAL( loggedIn() ), Modified: trunk/kmess/src/notification/chatnotification.cpp =================================================================== --- trunk/kmess/src/notification/chatnotification.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/notification/chatnotification.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -19,13 +19,24 @@ #include "chatnotification.h" #include "../chat/chat.h" +#include "../chat/chatmaster.h" #include "../chat/chatwindow.h" #include "../contact/contactextension.h" +#include "../kmessdebug.h" #include "../kmessglobal.h" +#include "../kmessapplication.h" #include "notificationmanager.h" +#include <KMess/Message> +#include <KMess/InkMessage> +#include <KMess/NudgeMessage> +#include <KMess/OfflineMessage> #include <KMess/TextMessage> +#include <KMess/TypingMessage> +#include <KMess/VoiceMessage> +#include <KMess/WinkMessage> #include <KMess/MsnContact> +#include <KMess/NetworkGlobals> #include <QPixmap> @@ -62,7 +73,7 @@ { case NotificationManager::BUTTON_VIEW_MESSAGE: #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Raising chat with" << settings.contact->getHandle(); + kDebug() << "Raising chat with" << settings.contact->email(); #endif emit raiseChat( static_cast<Chat*>( settings.widget ), true ); break; @@ -85,10 +96,10 @@ // Notify the user about this event (a contact has contacted the user) -void ChatNotification::notify( KMess::TextMessage *message, Chat *chat ) +void ChatNotification::notify( KMess::Message& message ) { // End if the event is coming from us instead of from a contact - if( ! message->isIncoming() ) + if( ! message.isIncoming() ) { #ifdef KMESSDEBUG_CHATNOTIFICATION kDebug() << "Not displaying a popup for an outgoing message."; @@ -96,18 +107,23 @@ return; } + KMess::MsnChat* msnChat = message.chat(); + Chat* chat = KMessApplication::instance()->chatMaster()->getChat( msnChat ); + // Check the chat pointer, we need it if( ! chat ) { #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Invalid pointer to chat window."; + kDebug() << "Invalid pointer to chat! MsnChat:" << ((void*)msnChat) << "Chat:" << ((void*)chat); #endif return; } + ChatWindow *window = chat->getChatWindow(); + // Verify if the chat is active, and if so don't notify anything - if( KWindowSystem::activeWindow() == chat->getChatWindow()->winId() - && chat == chat->getChatWindow()->getCurrentChat() ) + if( KWindowSystem::activeWindow() == window->winId() + && chat == window->getCurrentChat() ) { #ifdef KMESSDEBUG_CHATNOTIFICATION kDebug() << "Window is active, skipping."; @@ -115,50 +131,83 @@ return; } - - QString text; - int messageType = message->type(); - QString body( message->contents() ); - const QString &handle = message->peer()->id(); - - // TODO: Check this code. - - KMess::MsnContact *contact = globalSession->getContact( handle ); - if( contact != 0 ) + Contact contact( message.peer() ); + if( contact.isValid() && contact->getExtension() ) { - if( Contact ( contact )->getExtension()->getDisableNotifications() ) + if( contact.getExtension()->getDisableNotifications() ) { - kDebug() << "The contact: " << handle << " has the notification disabled, skip it"; + kDebug() << "Contact" << message.peer()->email() << "has notification disabled, skip it."; return; } } - const QString& friendlyName( Contact( contact )->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + QString text; + KMessMessage newMessage( message, KMessMessage::IncomingText ); + const QString& friendlyName( contact.getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + switch( message.type() ) + { + case KMess::InkMessageType: + { + text = i18n( "<html><i><b>%1</b> has sent you an handwritten message!</i></html>", friendlyName ); + break; + } + + case KMess::OfflineMessageType: + { + KMess::OfflineMessage offlineMessage( message ); + text = i18n( "<html><i><b>%1</b> has sent you an offline message:</i><br/>%2</html>", friendlyName, offlineMessage.message() ); + break; + } + + case KMess::TextMessageType: + { + // Truncate the message so it doesn't make the balloon too big + text = newMessage.message(); + if( text.length() > MAX_BALLOON_MESSAGE_SIZE ) + { + text.truncate( MAX_BALLOON_MESSAGE_SIZE ); + text += "..."; + } + + // Parse the emoticons in the message + text = RichTextParser::instance()->parseMsnString( text, + ( RichTextParser::FormattingOptions ) + ( RichTextParser::PARSE_EMOTICONS + | RichTextParser::EMOTICONS_SMALL ) ); + + text = i18n( "<html><i><b>%1</b> said:</i><br/>%2</html>", friendlyName, text ); + break; + } + + case KMess::NudgeMessageType: + { + text = i18n( "<html><b>%1</b> has sent you a nudge!</html>", friendlyName ); + break; + } + + case KMess::VoiceMessageType: + { + text = i18n( "<html><b>%1</b> has sent you a voice message!</html>", friendlyName ); + break; + } + + case KMess::WinkMessageType: + { + text = i18n( "<html><b>%1</b> has sent you a wink!</html>", friendlyName ); + break; + } + + default: + // Other messages may be KMess specific messages: don't notify anything #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Contact" << handle; + kDebug() << "Not a displayable message, skipping."; #endif - - // Truncate the message so it doesn't make the balloon too big - if( body.length() > MAX_BALLOON_MESSAGE_SIZE ) - { - body.truncate( MAX_BALLOON_MESSAGE_SIZE ); - body += " ..."; + return; } - // Parse the emoticons in the message -#warning todo +#warning TODO: Add back all notification messages #if 0 - if( ! message.hasHtmlBody() ) - { -#endif - body = RichTextParser::instance()->parseMsnString( body, - ( RichTextParser::FormattingOptions ) ( RichTextParser::PARSE_EMOTICONS | RichTextParser::EMOTICONS_SMALL ) ); - //} - - // Set the balloon text to a generic message, which will be overridden with more useful messages, if available -#warning TODO: Chat notifications -#if 0 switch( messageType ) { case ChatMessage::TYPE_PRESENCE: @@ -251,13 +300,16 @@ default: break; } +#endif QString eventName; - if( message.getContentsClass() == ChatMessage::CONTENT_NOTIFICATION_NUDGE ) + if( newMessage.specificType() == KMessMessage::Nudge ) { eventName = "nudge"; } - else if( messageType == ChatMessage::TYPE_INCOMING && chat->isChatFirstMessage() ) + else if( chat->isChatFirstMessage() + && ( newMessage.specificType() == KMessMessage::IncomingText + || newMessage.specificType() == KMessMessage::OfflineIncoming ) ) { eventName = "chat start"; } @@ -269,11 +321,10 @@ NotificationManager::EventSettings settings; settings.sender = this; settings.widget = chat; - settings.contact = contact; + settings.contact = message.peer(); settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_VIEW_MESSAGE; manager_->notify( eventName, text, settings ); -#endif } Modified: trunk/kmess/src/notification/chatnotification.h =================================================================== --- trunk/kmess/src/notification/chatnotification.h 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/notification/chatnotification.h 2010-01-25 12:13:09 UTC (rev 5854) @@ -30,7 +30,7 @@ namespace KMess { - class TextMessage; + class Message; } /** @@ -55,7 +55,7 @@ public slots: // Notify the user about this event (a contact has contacted the user) - void notify( KMess::TextMessage *message, Chat *chatWindow ); + void notify( KMess::Message &message ); private slots: // Execute the action triggered in a notification Modified: trunk/kmess/src/notification/contactstatusnotification.cpp =================================================================== --- trunk/kmess/src/notification/contactstatusnotification.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/notification/contactstatusnotification.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -129,9 +129,9 @@ void ContactStatusNotification::notify( KMess::MsnContact *c, bool isInitialStatus ) { Contact contact( c ); - if( contact.isValid() ) + if( ! contact.isValid() ) { - kWarning() << "Contact is null!"; + kWarning() << "Contact is not valid!"; return; } Modified: trunk/kmess/src/notification/notificationmanager.cpp =================================================================== --- trunk/kmess/src/notification/notificationmanager.cpp 2010-01-25 12:10:33 UTC (rev 5853) +++ trunk/kmess/src/notification/notificationmanager.cpp 2010-01-25 12:13:09 UTC (rev 5854) @@ -70,8 +70,8 @@ #endif // Connect the chat messages notification signals - connect( globalSession, SIGNAL( newChatMessage(ChatMessage,Chat*) ), - chatNotification_, SLOT ( notify(ChatMessage,Chat*) ) ); + connect( globalSession, SIGNAL( chatMessageReceived(KMess::Message&) ), + chatNotification_, SLOT ( notify(KMess::Message&) ) ); // TODO: why is there a "raiseChat" on globalSession? connect( chatNotification_, SIGNAL( raiseChat(Chat*,bool) ), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 12:10:43
|
Revision: 5853 http://kmess.svn.sourceforge.net/kmess/?rev=5853&view=rev Author: it_amroth Date: 2010-01-25 12:10:33 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Added a chat message receiving signal, set MsnChat owner of new incoming Messages. Modified Paths: -------------- trunk/kmess/lib/ChangeLog trunk/kmess/lib/include/KMess/msnchat.h trunk/kmess/lib/src/chatfactory.cpp trunk/kmess/lib/src/msnchat.cpp trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/ChangeLog =================================================================== --- trunk/kmess/lib/ChangeLog 2010-01-25 10:18:22 UTC (rev 5852) +++ trunk/kmess/lib/ChangeLog 2010-01-25 12:10:33 UTC (rev 5853) @@ -1,6 +1,7 @@ 2010-01-25 Valerio Pilo <valerio@...> - * MsnChat: Fixed a signal. + * MsnChat: Fixed a signal, fixed chat ownership of incoming Messages. + * ChatFactory: Added chat message receiving signal. 2010-01-24 Valerio Pilo <valerio@...> Modified: trunk/kmess/lib/include/KMess/msnchat.h =================================================================== --- trunk/kmess/lib/include/KMess/msnchat.h 2010-01-25 10:18:22 UTC (rev 5852) +++ trunk/kmess/lib/include/KMess/msnchat.h 2010-01-25 12:10:33 UTC (rev 5853) @@ -140,7 +140,7 @@ /// Ask the Notification connection to initiate a new chat server connection with the contact(s) void requestSwitchboard( KMess::MsnChat *chat ); /// A message was received from a remote end - void messageReceived( KMess::Message ); + void messageReceived( KMess::Message& message ); // TODO remove: void showWink( const QString&, const QString&, const QString& ); Modified: trunk/kmess/lib/src/chatfactory.cpp =================================================================== --- trunk/kmess/lib/src/chatfactory.cpp 2010-01-25 10:18:22 UTC (rev 5852) +++ trunk/kmess/lib/src/chatfactory.cpp 2010-01-25 12:10:33 UTC (rev 5853) @@ -105,6 +105,8 @@ // this, SIGNAL( needSwitchboardTokens(KMess::MsnChat*) ) ); connect( chat, SIGNAL( requestSwitchboard(KMess::MsnChat*) ), this, SIGNAL( switchboardRequested(KMess::MsnChat*) ) ); + connect( chat, SIGNAL( messageReceived(KMess::Message&) ), + this, SIGNAL( chatMessageReceived(KMess::Message&) ) ); chats_.append( chat ); @@ -149,6 +151,8 @@ privateChat = createChat( handle ); } + debug() << "Delivering message to chat..."; + privateChat->gotMessage( message ); emit chatMessageReceived( message ); Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-25 10:18:22 UTC (rev 5852) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-25 12:10:33 UTC (rev 5853) @@ -400,6 +400,8 @@ void MsnChat::gotMessage( Message message ) { + message.setChat( this ); + if ( message.type() == PtpDataMessageType ) { PtpDataMessage datamessage(message); Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-25 10:18:22 UTC (rev 5852) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-25 12:10:33 UTC (rev 5853) @@ -134,8 +134,8 @@ this, SIGNAL( chatCreated(KMess::MsnChat*) ) ); connect( chatFactory_, SIGNAL( chatDestroyed(KMess::MsnChat*) ), this, SIGNAL( chatDestroyed(KMess::MsnChat*) ) ); - connect( chatFactory_, SIGNAL(chatMessageReceived(KMess::Message&) ), - this, SIGNAL(chatMessageReceived(KMess::Message&) ) ); + connect( chatFactory_, SIGNAL(chatMessageReceived(KMess::Message&) ), + this, SIGNAL(chatMessageReceived(KMess::Message&) ) ); connect( chatFactory_, SIGNAL( switchboardRequested(KMess::MsnChat* ) ), msnNotificationConnection_, SLOT ( inviteToChat(KMess::MsnChat* ) ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <it_amroth@us...> - 2010-01-25 10:18:29
|
Revision: 5852 http://kmess.svn.sourceforge.net/kmess/?rev=5852&view=rev Author: it_amroth Date: 2010-01-25 10:18:22 +0000 (Mon, 25 Jan 2010) Log Message: ----------- Had to comment out Gregg's last commit, it is not working. Modified Paths: -------------- trunk/kmess/lib/src/msnchat.cpp trunk/kmess/lib/src/msnsession.cpp Modified: trunk/kmess/lib/src/msnchat.cpp =================================================================== --- trunk/kmess/lib/src/msnchat.cpp 2010-01-25 10:00:27 UTC (rev 5851) +++ trunk/kmess/lib/src/msnchat.cpp 2010-01-25 10:18:22 UTC (rev 5852) @@ -47,6 +47,7 @@ using namespace KMess; +/* #include <Ptp/Platform> #include <Ptp/TransportImpl> #include <Ptp/SlpPeerToPeerEndpoint> @@ -54,6 +55,7 @@ using namespace PtpSignaling; using namespace PtpTransport; +*/ /** * @brief The constructor @@ -410,13 +412,14 @@ debug() << "Got message not for us; destination=" << destination; return; } - +/* RtcSignalingEndpoint *endpoint = PtpCollaboration::Platform::instance()->getOrCreateEndpoint(datamessage.peer()->email()); TransportImpl *transport = endpoint->getTransport(); SwitchboardBridge * sbbridge = transport->getOrCreateSbBridge(); sbbridge->fireDataReceived(datamessage.rawData()); +*/ return; } @@ -449,7 +452,7 @@ void MsnChat::switchboard_OnDataSendFailed(const quint32 acknumber) { qDebug() << Q_FUNC_INFO << "cookie=" << acknumber << endl; - +/* // FIXME Does handle contains email@...;{endpoint id} // for mpop support?? QString handle = firstContact(); @@ -460,11 +463,13 @@ SwitchboardBridge * sbbridge = transport->getOrCreateSbBridge(); sbbridge->fireDataSendFailed(acknumber); + */ } void MsnChat::switchboard_OnDataSent(const quint32 acknumber) { qDebug() << Q_FUNC_INFO << "cookie=" << acknumber << endl; + /* QString handle = firstContact(); qDebug() << Q_FUNC_INFO << "notifying " << handle; RtcSignalingEndpoint *endpoint = @@ -473,6 +478,7 @@ SwitchboardBridge * sbbridge = transport->getOrCreateSbBridge(); sbbridge->fireDataSent(acknumber); + */ } #warning showMsnObject - wait for P2P stack. @@ -1289,7 +1295,7 @@ void MsnChat::slotSwitchboardClosed() { const QString handle = participants_.first(); - +/* RtcSignalingEndpoint *endpoint = PtpCollaboration::Platform::instance()->getOrCreateEndpoint(handle); TransportImpl *transport = endpoint->getTransport(); @@ -1299,6 +1305,7 @@ qDebug() << Q_FUNC_INFO << "ssbridge should disconnect." << endl; // Disconnect the switchboard bridge. sbbridge->disconnect(); +*/ // If there are still contacts, it means contactLeft() was not initiated, // and the user closed the chat window earlier. @@ -1521,7 +1528,7 @@ // Inform the contact about our version sendClientCaps(); - +/* const QString address = handle.section(";", 0, 0); const QString email = session_->self()->email(); if (address != email) @@ -1537,7 +1544,7 @@ // Connect the switchboard bridge. sbbridge->connect(); } - +*/ if( pendingMessages_.count() > 0 ) { // Send all pending mime messages, unless there are @@ -1611,7 +1618,7 @@ // close the switchboard connection. switchboard_->closeConnection(); } - +/* const QString address = handle.section(";", 0, 0); const QString email = session_->self()->email(); if (address != email) @@ -1626,7 +1633,7 @@ // Disconnect the switchboard bridge. sbbridge->disconnect(); } - +*/ emit contactLeft( session_->getContact( handle ), isChatIdle ); } Modified: trunk/kmess/lib/src/msnsession.cpp =================================================================== --- trunk/kmess/lib/src/msnsession.cpp 2010-01-25 10:00:27 UTC (rev 5851) +++ trunk/kmess/lib/src/msnsession.cpp 2010-01-25 10:18:22 UTC (rev 5852) @@ -46,8 +46,10 @@ using namespace KMess; +/* #include "Ptp/Platform" using namespace PtpCollaboration; +*/ // The constructor MsnSession::MsnSession() @@ -219,9 +221,9 @@ // Parameter needed to update the user info on the Roaming Service sessionSettings_[ "ProfileResourceId" ] = QString(); } - + // set our local endpoint. - localEndpoint_ = new MPOPEndpoint( self(), QUuid( getSessionSettingString( "MachineGUID" ) ), "libkmess-msn" ); + localEndpoint_ = new MPOPEndpoint( self(), QUuid( getSessionSettingString( "MachineGUID" ) ), "libkmess-msn" ); } @@ -248,7 +250,7 @@ delete msnNotificationConnection_; msnNotificationConnection_ = 0; - Platform::instance()->dispose(); +// Platform::instance()->dispose(); debug() << "DESTROYED"; } @@ -1001,7 +1003,7 @@ void MsnSession::logOut() const { debug() << "Logging out locally and closing server connection"; - + msnNotificationConnection_->closeConnection(); } @@ -1015,7 +1017,7 @@ void MsnSession::logOutEverywhere() const { debug() << "Logging out from all endpoints and closing server connection."; - + // yes, WLM really does send "gtfo" in the body of this command. msnNotificationConnection_->sendUUN( self()->email(), 8, "gtfo" ); @@ -1030,7 +1032,7 @@ void MsnSession::logOutFrom( MPOPEndpoint *endpoint ) { debug() << "Logging out from endpoint: " << endpoint; - + QString handle = self()->email() + ";" + endpoint->guid(); // again, yes, it really does say this in the body. @@ -1159,7 +1161,7 @@ { localEndpoint_->setGuid( QUuid( value.toString() ) ); } - + setSessionSettings( list ); } @@ -1307,17 +1309,19 @@ void MsnSession::mns_OnLoggedIn() { +/* QHash<QString, QVariant> settings; settings.insert("localUserAddress", getSessionSettingString("AccountHandle")); settings.insert("localEndpointId", getSessionSettingString("MachineGUID")); Platform::instance()->startup(settings); +*/ } void MsnSession::mns_OnLoggedOut() { - Platform::instance()->shutdown(); +// Platform::instance()->shutdown(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |