From eabafdf4b42139ff85a8c8212cd0a9d287171e73 Mon Sep 17 00:00:00 2001 From: Szymon Tokarz Date: Tue, 11 Nov 2014 01:04:07 +0000 Subject: Sametime protocol: - Add more options to client major/minor version settings, add gui combobox (db settings ClientVersionMajor, ClientVersionMinor used and still works if set from db) Enables connect to more modern servers - More ClientIDs on combobox list. - Better list of error codes, now translateable. - Merge some 3rd party patches to meanwhile lib. https://gist.github.com/jricesterenator/c67dfbdd0887f7ecc26a https://github.com/mrcsparker/meanwhile/commit/e2299d3c70a3351ab148f4febdebceb71f7b526d https://github.com/mrcsparker/meanwhile/commit/2e68651f13aebeab9e71312e59da204d3d72092c git-svn-id: http://svn.miranda-ng.org/main/trunk@10949 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Sametime/docs/readme.txt | 10 +- protocols/Sametime/res/resource.rc | 6 +- protocols/Sametime/src/meanwhile/src/channel.c | 2 - protocols/Sametime/src/meanwhile/src/error.c | 266 ++++++++++++++++++--- protocols/Sametime/src/meanwhile/src/mw_debug.c | 2 +- protocols/Sametime/src/meanwhile/src/mw_error.h | 34 ++- protocols/Sametime/src/meanwhile/src/mw_message.h | 2 +- .../Sametime/src/meanwhile/src/mw_srvc_conf.h | 2 +- protocols/Sametime/src/meanwhile/src/mw_srvc_dir.h | 1 - .../Sametime/src/meanwhile/src/mw_srvc_place.h | 2 +- .../Sametime/src/meanwhile/src/mw_srvc_resolve.h | 1 - protocols/Sametime/src/meanwhile/src/mw_st_list.h | 1 - protocols/Sametime/src/meanwhile/src/mw_util.h | 2 - protocols/Sametime/src/meanwhile/src/session.c | 2 + protocols/Sametime/src/meanwhile/src/srvc_aware.c | 2 - protocols/Sametime/src/meanwhile/src/srvc_conf.c | 2 - protocols/Sametime/src/meanwhile/src/srvc_dir.c | 2 +- protocols/Sametime/src/meanwhile/src/srvc_ft.c | 2 +- protocols/Sametime/src/meanwhile/src/srvc_im.c | 1 - protocols/Sametime/src/meanwhile/src/srvc_place.c | 2 - .../Sametime/src/meanwhile/src/srvc_resolve.c | 2 +- protocols/Sametime/src/meanwhile/src/srvc_store.c | 2 +- protocols/Sametime/src/meanwhile/src/st_list.c | 8 +- protocols/Sametime/src/messaging.cpp | 4 +- protocols/Sametime/src/options.cpp | 123 ++++++++-- protocols/Sametime/src/resource.h | 2 +- protocols/Sametime/src/sametime.h | 3 +- protocols/Sametime/src/sametime_proto.h | 1 + protocols/Sametime/src/sametime_session.cpp | 17 +- protocols/Sametime/src/utils.cpp | 16 ++ 30 files changed, 416 insertions(+), 106 deletions(-) (limited to 'protocols/Sametime') diff --git a/protocols/Sametime/docs/readme.txt b/protocols/Sametime/docs/readme.txt index 779b498ad6..7d087ad784 100644 --- a/protocols/Sametime/docs/readme.txt +++ b/protocols/Sametime/docs/readme.txt @@ -14,6 +14,14 @@ http://meanwhile.sourceforge.net/ +DOCUMENTATION + +Sametime (TM) Community - Client Protocol. Basic RFC. +http://meanwhile.sourceforge.net/docs/draft-houri-sametime-community-client-00.txt + + + + KNOWN ISSUES 1) @@ -42,7 +50,7 @@ TESTING SERVER ENVIRONMENT https://apps.ce.collabserv.com/manage/account/public/trial/showCreateTrialAccount?country=PL&ibm-continue=Continue see: http://www.wissel.net/blog/d6plinks/SHWL-84KE8U - +Use at least Sametime 8 client version diff --git a/protocols/Sametime/res/resource.rc b/protocols/Sametime/res/resource.rc index b0b55f294c..4a0a15c241 100644 --- a/protocols/Sametime/res/resource.rc +++ b/protocols/Sametime/res/resource.rc @@ -38,11 +38,11 @@ BEGIN EDITTEXT IDC_ED_SNAME,70,57,85,14,ES_AUTOHSCROLL RTEXT "Port:",IDC_STATIC,10,81,54,8 EDITTEXT IDC_ED_PORT,70,77,36,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER - GROUPBOX "Client ID",IDC_STATIC,7,98,153,44 + GROUPBOX "Client ID and version",IDC_STATIC,7,98,153,44 COMBOBOX IDC_CMB_CLIENT,10,109,110,107,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_ED_CLIENTID,126,109,29,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Use old client version",IDC_CHK_OLDDEFAULTVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,127,145,11 - GROUPBOX "Error display",IDC_STATIC,7,143,153,53 + COMBOBOX IDC_CMB_CLIENTVN,10,127,146,11,CBS_DROPDOWNLIST | CBS_SORT | WS_TABSTOP + GROUPBOX "Error display",IDC_STATIC,7,143,153,53 CONTROL "Use message boxes",IDC_RAD_ERRMB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10,156,145,10 CONTROL "Use popups",IDC_RAD_ERRPOP,"Button",BS_AUTORADIOBUTTON,10,169,145,10 CONTROL "Use system tray balloons",IDC_RAD_ERRBAL,"Button",BS_AUTORADIOBUTTON,10,182,145,10 diff --git a/protocols/Sametime/src/meanwhile/src/channel.c b/protocols/Sametime/src/meanwhile/src/channel.c index a9dc2836be..07334c18e7 100644 --- a/protocols/Sametime/src/meanwhile/src/channel.c +++ b/protocols/Sametime/src/meanwhile/src/channel.c @@ -19,8 +19,6 @@ */ #include -#include -#include #include #include "mw_channel.h" diff --git a/protocols/Sametime/src/meanwhile/src/error.c b/protocols/Sametime/src/meanwhile/src/error.c index 23c9559802..6005eddbd1 100644 --- a/protocols/Sametime/src/meanwhile/src/error.c +++ b/protocols/Sametime/src/meanwhile/src/error.c @@ -37,6 +37,9 @@ case val: \ m = str; \ break; +/// Miranda NG development start +// LPGEN - don't want depend meanwhile from miranda headers, but want to have translatable strings +#define LPGEN(s) s char* mwError(guint32 code) { const char *m; @@ -44,47 +47,106 @@ char* mwError(guint32 code) { switch(code) { /* 8.3.1.1 General error/success codes */ - CASE(ERR_SUCCESS, "Success"); - CASE(ERR_FAILURE, "General failure"); - CASE(ERR_REQUEST_DELAY, "Request delayed"); - CASE(ERR_REQUEST_INVALID, "Request is invalid"); - CASE(ERR_NOT_AUTHORIZED, "Not authorized"); - CASE(ERR_NO_USER, "User is not online"); - CASE(ERR_CHANNEL_NO_SUPPORT, "Requested channel is not supported"); - CASE(ERR_CHANNEL_EXISTS, "Requested channel already exists"); - CASE(ERR_SERVICE_NO_SUPPORT, "Requested service is not supported"); - CASE(ERR_PROTOCOL_NO_SUPPORT, "Requested protocol is not supported"); - CASE(ERR_VERSION_NO_SUPPORT, "Version is not supported"); - CASE(ERR_USER_SKETCHY, "User is invalid or not trusted"); - CASE(ERR_ALREADY_INITIALIZED, "Already initialized"); - CASE(ERR_ENCRYPT_NO_SUPPORT, "Encryption method not supported"); - CASE(ERR_NO_COMMON_ENCRYPT, "No common encryption method"); - + CASE(ERR_SUCCESS, LPGEN("Success")); + CASE(ERR_FAILURE, LPGEN("General failure")); + CASE(ERR_REQUEST_DELAY, LPGEN("Request delayed")); + CASE(ERR_REQUEST_INVALID, LPGEN("Request is invalid")); + CASE(ERR_NOT_LOGGED_IN, LPGEN("Not logged in")); + CASE(ERR_NOT_AUTHORIZED, LPGEN("Not authorized")); + CASE(ERR_ABORT, LPGEN("Operation aborted")); + CASE(ERR_NO_ELEMENT, LPGEN("No element")); + CASE(ERR_NO_USER, LPGEN("User is not online")); + CASE(ERR_BAD_DATA, LPGEN("Invalid data")); + CASE(ERR_NOT_IMPLEMENTED, LPGEN("Not implemented")); + CASE(ERR_UNKNOWN_ERROR, LPGEN("Unknown error")); + CASE(ERR_STARVING, LPGEN("Not enough resources")); + CASE(ERR_CHANNEL_NO_SUPPORT, LPGEN("Requested channel is not supported")); + CASE(ERR_CHANNEL_EXISTS, LPGEN("Requested channel already exists")); + CASE(ERR_SERVICE_NO_SUPPORT, LPGEN("Requested service is not supported")); + CASE(ERR_PROTOCOL_NO_SUPPORT, LPGEN("Requested protocol is not supported")); + CASE(ERR_PROTOCOL_NO_SUPPORT2, LPGEN("Requested protocol is not supported")); + CASE(ERR_VERSION_NO_SUPPORT, LPGEN("Version is not supported")); + CASE(ERR_USER_SKETCHY, LPGEN("User is invalid or not trusted")); + CASE(ERR_ALREADY_INITIALIZED, LPGEN("Already initialized")); + CASE(ERR_NOT_OWNER, LPGEN("Not an owner")); + CASE(ERR_TOKEN_INVALID, LPGEN("Invalid token")); + CASE(ERR_TOKEN_EXPIRED, LPGEN("Token expired")); + CASE(ERR_TOKEN_IP_MISMATCH, LPGEN("Token mismatch")); + CASE(ERR_PORT_IN_USE, LPGEN("Port in use")); + CASE(ERR_NETWORK_DEAD, LPGEN("Network error")); + CASE(ERR_NO_MASTER_CHANNEL, LPGEN("Master channel error")); + CASE(ERR_ALREADY_SUBSCRIBED, LPGEN("Already subscribed")); + CASE(ERR_NOT_SUBSCRIBED, LPGEN("Not subscribed")); + CASE(ERR_ENCRYPT_NO_SUPPORT, LPGEN("Encryption method not supported")); + CASE(ERR_ENCRYPT_UNINITIALIZED, LPGEN("Encryption not initialized")); + CASE(ERR_ENCRYPT_UNACCEPTABLE, LPGEN("Encryption too low")); + CASE(ERR_ENCRYPT_INVALID, LPGEN("Invalid encrypted data")); + CASE(ERR_NO_COMMON_ENCRYPT, LPGEN("No common encryption method")); + CASE(ERR_CHANNEL_DESTROYED, LPGEN("Channel destroyed")); + CASE(ERR_CHANNEL_REDIRECTED, LPGEN("Channel redirected")); + CASE(ERR_INCORRECT_ENTRY, LPGEN("Incorrect entry")); + /* 8.3.1.2 Connection/disconnection errors */ - CASE(VERSION_MISMATCH, "Version mismatch"); - CASE(FAT_MESSAGE, "Message is too large"); - CASE(CONNECTION_BROKEN, "Connection broken"); - CASE(CONNECTION_ABORTED, "Connection aborted"); - CASE(CONNECTION_REFUSED, "Connection refused"); - CASE(CONNECTION_RESET, "Connection reset"); - CASE(CONNECTION_TIMED, "Connection timed out"); - CASE(CONNECTION_CLOSED, "Connection closed"); - CASE(INCORRECT_LOGIN, "Incorrect Username/Password"); - CASE(VERIFICATION_DOWN, "Login verification down or unavailable"); - CASE(GUEST_IN_USE, "The guest name is currently being used"); - CASE(MULTI_SERVER_LOGIN, "Login to two different servers concurrently"); - CASE(MULTI_SERVER_LOGIN2, "Login to two different servers concurrently"); - CASE(SERVER_BROKEN, "Server misconfiguration"); + CASE(VERSION_MISMATCH, LPGEN("Version mismatch")); + CASE(INSUF_BUFFER, LPGEN("Not enough buffers memory")); + CASE(NOT_IN_USE, LPGEN("Not in use")); + CASE(INSUF_SOCKET, LPGEN("Not enough sockets")); + CASE(HARDWARE_ERROR, LPGEN("Hardware error")); + CASE(NETWORK_DOWN, LPGEN("Network error")); + CASE(HOST_DOWN, LPGEN("Host error")); + CASE(HOST_UNREACHABLE, LPGEN("Host unreachable")); + CASE(TCPIP_ERROR, LPGEN("Internet protocol error")); + CASE(FAT_MESSAGE, LPGEN("Message is too large")); + CASE(PROXY_ERROR, LPGEN("Proxy error")); + CASE(SERVER_FULL, LPGEN("Server full")); + CASE(SERVER_NORESPOND, LPGEN("Server not responding")); + CASE(CANT_CONNECT, LPGEN("Connection error")); + CASE(USER_REMOVED, LPGEN("User removed")); + CASE(PROTOCOL_ERROR, LPGEN("Sametime protocol error")); + CASE(USER_RESTRICTED, LPGEN("User restricted")); + CASE(INCORRECT_LOGIN, LPGEN("Incorrect Username/Password")); + CASE(ENCRYPT_MISMATCH, LPGEN("Encryption mismatch")); + CASE(USER_UNREGISTERED, LPGEN("User unregistered")); + CASE(VERIFICATION_DOWN, LPGEN("Login verification down or unavailable")); + CASE(USER_TOO_IDLE, LPGEN("User too idle")); + CASE(GUEST_IN_USE, LPGEN("The guest name is currently being used")); + CASE(USER_EXISTS, LPGEN("User exists")); + CASE(USER_RE_LOGIN, LPGEN("User relogin")); + CASE(BAD_NAME, LPGEN("Bad name")); + CASE(REG_MODE_NS, LPGEN("Registration error")); + CASE(WRONG_USER_PRIV, LPGEN("Privilage error")); + CASE(NEED_EMAIL, LPGEN("Need email")); + CASE(DNS_ERROR, LPGEN("DNS error")); + CASE(DNS_FATAL_ERROR, LPGEN("DNS fatal error")); + CASE(DNS_NOT_FOUND, LPGEN("DNS not found")); + CASE(CONNECTION_BROKEN, LPGEN("Connection broken")); + CASE(CONNECTION_ABORTED, LPGEN("Connection aborted")); + CASE(CONNECTION_REFUSED, LPGEN("Connection refused")); + CASE(CONNECTION_RESET, LPGEN("Connection reset")); + CASE(CONNECTION_TIMED, LPGEN("Connection timed out")); + CASE(CONNECTION_CLOSED, LPGEN("Connection closed")); + CASE(MULTI_SERVER_LOGIN, LPGEN("Login to two different servers concurrently (1)")); + CASE(MULTI_SERVER_LOGIN2, LPGEN("Login to two different servers concurrently (2)")); + CASE(MULTI_LOGIN_COMP, LPGEN("Already logged on, disconnected")); + CASE(MUTLI_LOGIN_ALREADY, LPGEN("Already logged on")); + CASE(SERVER_BROKEN, LPGEN("Server misconfiguration")); + CASE(SERVER_PATH_OLD, LPGEN("Server needs upgrade")); + CASE(APPLET_LOGOUT, LPGEN("Applet Logout")); /* 8.3.1.3 Client error codes */ - CASE(ERR_CLIENT_USER_GONE, "User is not online"); - CASE(ERR_CLIENT_USER_DND, "User is in Do Not Disturb mode"); - CASE(ERR_CLIENT_USER_ELSEWHERE, "Already logged in elsewhere"); + CASE(ERR_CLIENT_USER_GONE, LPGEN("User is not online")); + CASE(ERR_CLIENT_USER_DND, LPGEN("User is in Do Not Disturb mode")); + CASE(ERR_CLIENT_USER_ELSEWHERE, LPGEN("Already logged in elsewhere")); /* 8.3.1.4 IM error codes */ - CASE(ERR_IM_COULDNT_REGISTER, "Cannot register a reserved type"); - CASE(ERR_IM_ALREADY_REGISTERED, "Requested type is already registered"); - CASE(ERR_IM_NOT_REGISTERED, "Requested type is not registered"); + CASE(ERR_IM_COULDNT_REGISTER, LPGEN("Cannot register a reserved type")); + CASE(ERR_IM_ALREADY_REGISTERED, LPGEN("Requested type is already registered")); + CASE(ERR_IM_NOT_REGISTERED, LPGEN("Requested type is not registered")); + + /* 8.3.1.5 Resolve error codes */ + CASE(ERR_RESOLVE_NOTCOMPLETED, LPGEN("Resolve not completed")); + CASE(ERR_RESOLVE_NAMENOTUNIQUE, LPGEN("Resolve name not unique")); + CASE(ERR_RESOLVE_NAMENOTRESOLVABLE, LPGEN("Resolve name not resolvable")); default: m = err_to_str(code); @@ -93,5 +155,137 @@ char* mwError(guint32 code) { return g_strdup(m); } +char* mwErrorDesc(guint32 code) { + const char *m; + + switch (code) { + + /* 8.3.1.1 General error/success codes */ + CASE(ERR_SUCCESS, LPGEN("Operation succeeded")); + CASE(ERR_FAILURE, LPGEN("Operation failed")); + CASE(ERR_REQUEST_DELAY, LPGEN("Request accepted but will be served later")); + CASE(ERR_REQUEST_INVALID, LPGEN("Request is invalid due to invalid state or parameters ")); + CASE(ERR_NOT_LOGGED_IN, LPGEN("Not logged in to community")); + CASE(ERR_NOT_AUTHORIZED, LPGEN("Unauthorized to perform an action or access a resource")); + CASE(ERR_ABORT, LPGEN("Operation has been aborted")); + CASE(ERR_NO_ELEMENT, LPGEN("The element is non-existent")); + CASE(ERR_NO_USER, LPGEN("The user is non-existent")); + CASE(ERR_BAD_DATA, LPGEN("The data are invalid or corrupted")); + CASE(ERR_NOT_IMPLEMENTED, LPGEN("The requested feature is not implemented")); + CASE(ERR_UNKNOWN_ERROR, LPGEN("Unknown error")); + CASE(ERR_STARVING, LPGEN("Not enough resources to perform the operation")); + CASE(ERR_CHANNEL_NO_SUPPORT, LPGEN("The requested channel is not supported")); + CASE(ERR_CHANNEL_EXISTS, LPGEN("The requested channel already exists")); + CASE(ERR_SERVICE_NO_SUPPORT, LPGEN("The requested service is not supported")); + CASE(ERR_PROTOCOL_NO_SUPPORT, LPGEN("The requested protocol is not supported (1)")); + CASE(ERR_PROTOCOL_NO_SUPPORT2, LPGEN("The requested protocol is not supported (2)")); + CASE(ERR_VERSION_NO_SUPPORT, LPGEN("The version is not supported")); + CASE(ERR_USER_SKETCHY, LPGEN("User is invalid or not trusted")); + CASE(ERR_ALREADY_INITIALIZED, LPGEN("Already initialized")); + CASE(ERR_NOT_OWNER, LPGEN("Not an owner of the requested resource")); + CASE(ERR_TOKEN_INVALID, LPGEN("Invalid token")); + CASE(ERR_TOKEN_EXPIRED, LPGEN("Token has expired")); + CASE(ERR_TOKEN_IP_MISMATCH, LPGEN("Token IP mismatch")); + CASE(ERR_PORT_IN_USE, LPGEN("WK port is in use")); + CASE(ERR_NETWORK_DEAD, LPGEN("Low-level network error occurred")); + CASE(ERR_NO_MASTER_CHANNEL, LPGEN("No master channel exists")); + CASE(ERR_ALREADY_SUBSCRIBED, LPGEN("Already subscribed to object(s) or event(s)")); + CASE(ERR_NOT_SUBSCRIBED, LPGEN("Not subscribed to object(s) or event(s)")); + CASE(ERR_ENCRYPT_NO_SUPPORT, LPGEN("Encryption is not supported or failed unexpectedly")); + CASE(ERR_ENCRYPT_UNINITIALIZED, LPGEN("Encryption mechanism has not been initialized yet")); + CASE(ERR_ENCRYPT_UNACCEPTABLE, LPGEN("The requested encryption level is unacceptably low")); + CASE(ERR_ENCRYPT_INVALID, LPGEN("The encryption data passed are invalid or or corrupted")); + CASE(ERR_NO_COMMON_ENCRYPT, LPGEN("There is no common encryption method")); + CASE(ERR_CHANNEL_DESTROYED, LPGEN("The channel is destroyed after a recommendation is made connect elsewhere")); + CASE(ERR_CHANNEL_REDIRECTED, LPGEN("The channel has been redirected to another destination")); + CASE(ERR_INCORRECT_ENTRY, LPGEN("Incorrect entry for server in cluster document")); + + /* 8.3.1.3 Client error codes */ + CASE(VERSION_MISMATCH, LPGEN("Versions don't match")); + CASE(INSUF_BUFFER, LPGEN("Not enough resources for connection (buffers)")); + CASE(NOT_IN_USE, LPGEN("Not in use")); + CASE(INSUF_SOCKET, LPGEN("Not enough resources for connection (socket id)")); + CASE(HARDWARE_ERROR, LPGEN("Hardware error occurred")); + CASE(NETWORK_DOWN, LPGEN("Network down")); + CASE(HOST_DOWN, LPGEN("Host down")); + CASE(HOST_UNREACHABLE, LPGEN("Host unreachable")); + CASE(TCPIP_ERROR, LPGEN("TCP/IP protocol error")); + CASE(FAT_MESSAGE, LPGEN("The message is too large")); + CASE(PROXY_ERROR, LPGEN("Proxy error")); + CASE(SERVER_FULL, LPGEN("Server is full")); + CASE(SERVER_NORESPOND, LPGEN("Server is not responding")); + CASE(CANT_CONNECT, LPGEN("Cannot connect")); + CASE(USER_REMOVED, LPGEN("User has been removed from the server")); + CASE(PROTOCOL_ERROR, LPGEN("Virtual Places protocol error")); + CASE(USER_RESTRICTED, LPGEN("Cannot connect because user has been restricted")); + CASE(INCORRECT_LOGIN, LPGEN("Incorrect login")); + CASE(ENCRYPT_MISMATCH, LPGEN("Encryption mismatch")); + CASE(USER_UNREGISTERED, LPGEN("User is unregistered")); + CASE(VERIFICATION_DOWN, LPGEN("Verification service down")); + CASE(USER_TOO_IDLE, LPGEN("User has been idle for too long")); + CASE(GUEST_IN_USE, LPGEN("The guest name is currently being used")); + CASE(USER_EXISTS, LPGEN("The user is already signed on")); + CASE(USER_RE_LOGIN, LPGEN("The user has signed on again")); + CASE(BAD_NAME, LPGEN("The name cannot be used")); + CASE(REG_MODE_NS, LPGEN("The registration mode is not supported")); + CASE(WRONG_USER_PRIV, LPGEN("User does not have appropriate privilege level")); + CASE(NEED_EMAIL, LPGEN("Email address must be used")); + CASE(DNS_ERROR, LPGEN("Error in DNS")); + CASE(DNS_FATAL_ERROR, LPGEN("Fatal error in DNS")); + CASE(DNS_NOT_FOUND, LPGEN("Server name not found")); + CASE(CONNECTION_BROKEN, LPGEN("The connection has been broken")); + CASE(CONNECTION_ABORTED, LPGEN("An established connection was aborted by the software in the host machine")); + CASE(CONNECTION_REFUSED, LPGEN("The connection has been refused")); + CASE(CONNECTION_RESET, LPGEN("The connection has been reset")); + CASE(CONNECTION_TIMED, LPGEN("The connection has timed out")); + CASE(CONNECTION_CLOSED, LPGEN("The connection has been closed")); + CASE(MULTI_SERVER_LOGIN, LPGEN("Disconnected due to login in two Sametime servers concurrently (1)")); + CASE(MULTI_SERVER_LOGIN2, LPGEN("Disconnected due to login in two Sametime servers concurrently (2)")); + CASE(MULTI_LOGIN_COMP, LPGEN("Disconnected due to login from another computer.")); + CASE(MUTLI_LOGIN_ALREADY, LPGEN("Unable to log in because you are already logged on from another computer")); + CASE(SERVER_BROKEN, LPGEN("Unable to log in because the server is eother unreachable, or not configured properly.")); + CASE(SERVER_PATH_OLD, LPGEN("Unable to log in to home Sametime server through the requested server, since your home server needs to be upgraded.")); + CASE(APPLET_LOGOUT, LPGEN("The applet was logged out with this reason. Perform relogin and you will return to the former state.")); + + /* 8.3.1.3 Client error codes */ + CASE(ERR_CLIENT_USER_GONE, LPGEN("The user is not online")); + CASE(ERR_CLIENT_USER_DND, LPGEN("The user is in do not disturb mode")); + CASE(ERR_CLIENT_USER_ELSEWHERE, LPGEN("Can not login because already logged in with a different user name (Java only)")); + + /* 8.3.1.4 IM error codes */ + CASE(ERR_IM_COULDNT_REGISTER, LPGEN("Cannot register a reserved type")); + CASE(ERR_IM_ALREADY_REGISTERED, LPGEN("The requested type is already registered")); + CASE(ERR_IM_NOT_REGISTERED, LPGEN("The requested type is not registered")); + + /* 8.3.1.5 Resolve error codes */ + CASE(ERR_RESOLVE_NOTCOMPLETED, LPGEN("The resolve process was not completed, but a partial response is available")); + CASE(ERR_RESOLVE_NAMENOTUNIQUE, LPGEN("The name was found, but is not unique (request was for unique only)")); + CASE(ERR_RESOLVE_NAMENOTRESOLVABLE, LPGEN("The name is not resolvable due to its format, for example an Internet email address")); + + default: + m = LPGEN("Unknown error code"); + break; + } + + return g_strdup(m); +} + +struct mwReturnCodeDesc *mwGetReturnCodeDesc(guint32 code) { + struct mwReturnCodeDesc *rcDesc = g_new(struct mwReturnCodeDesc, 1); + + if (code & ERR_FAILURE) + rcDesc->type = mwReturnCodeError; + else + rcDesc->type = mwReturnCodeInfo; + + rcDesc->codeString = g_strdup(err_to_str(code)); + rcDesc->name = mwError(code); + rcDesc->description = mwErrorDesc(code); + + return rcDesc; +} +/// Miranda NG development end + + #undef CASE diff --git a/protocols/Sametime/src/meanwhile/src/mw_debug.c b/protocols/Sametime/src/meanwhile/src/mw_debug.c index cf47a38e38..d22d2876eb 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_debug.c +++ b/protocols/Sametime/src/meanwhile/src/mw_debug.c @@ -19,7 +19,7 @@ */ -#include +#include #include "mw_debug.h" diff --git a/protocols/Sametime/src/meanwhile/src/mw_error.h b/protocols/Sametime/src/meanwhile/src/mw_error.h index 6345358561..e53cc0c996 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_error.h +++ b/protocols/Sametime/src/meanwhile/src/mw_error.h @@ -40,6 +40,22 @@ extern "C" { #endif +/// Miranda NG development start +enum mwReturnCodeType { + mwReturnCodeInfo = 0x1000, + mwReturnCodeError = 0x2000 +}; + +struct mwReturnCodeDesc { + guint16 type; /**< @see mwReturnCodeType */ + char *codeString; /**< return code hex as string */ + char *name; /**< return code name */ + char *description; /**< return code description */ +}; + +struct mwReturnCodeDesc *mwGetReturnCodeDesc(guint32 code); +/// Miranda NG development end + /** reference to a new string appropriate for the given error code.*/ char* mwError(guint32 code); @@ -87,7 +103,11 @@ enum ERR_GENERAL { ERR_ENCRYPT_INVALID = 0x80000020, ERR_NO_COMMON_ENCRYPT = 0x80000021, ERR_CHANNEL_DESTROYED = 0x80000022, - ERR_CHANNEL_REDIRECTED = 0x80000023 + /// Miranda NG development start + //ERR_CHANNEL_REDIRECTED = 0x80000023 + ERR_CHANNEL_REDIRECTED = 0x00000023, + ERR_INCORRECT_ENTRY = 0x80000239 + /// Miranda NG development end }; @@ -166,6 +186,18 @@ enum ERR_IM { }; +/// Miranda NG development start +/* 8.3.1.5 Resolve error codes */ + +/** @enum ERR_RESOLVE +Resolve error codes */ +enum ERR_RESOLVE { + ERR_RESOLVE_NOTCOMPLETED = 0x00010000, + ERR_RESOLVE_NAMENOTUNIQUE = 0x80020000, + ERR_RESOLVE_NAMENOTRESOLVABLE = 0x80030000 +}; +/// Miranda NG development end + #ifdef __cplusplus } #endif diff --git a/protocols/Sametime/src/meanwhile/src/mw_message.h b/protocols/Sametime/src/meanwhile/src/mw_message.h index 8402b8b7ee..a825ec271b 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_message.h +++ b/protocols/Sametime/src/meanwhile/src/mw_message.h @@ -22,7 +22,7 @@ #define _MW_MESSAGE_H -#include +#include #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/mw_srvc_conf.h b/protocols/Sametime/src/meanwhile/src/mw_srvc_conf.h index 1447fd3830..ea162e6e73 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_srvc_conf.h +++ b/protocols/Sametime/src/meanwhile/src/mw_srvc_conf.h @@ -22,7 +22,7 @@ #define _MW_SRVC_CONF_H -#include +#include #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/mw_srvc_dir.h b/protocols/Sametime/src/meanwhile/src/mw_srvc_dir.h index b9230bbf08..c45e850232 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_srvc_dir.h +++ b/protocols/Sametime/src/meanwhile/src/mw_srvc_dir.h @@ -22,7 +22,6 @@ #include -#include #ifdef __cplusplus diff --git a/protocols/Sametime/src/meanwhile/src/mw_srvc_place.h b/protocols/Sametime/src/meanwhile/src/mw_srvc_place.h index e17aa711c5..bba97b61e9 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_srvc_place.h +++ b/protocols/Sametime/src/meanwhile/src/mw_srvc_place.h @@ -22,7 +22,7 @@ #define _MW_SRVC_PLACE_H -#include +#include #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/mw_srvc_resolve.h b/protocols/Sametime/src/meanwhile/src/mw_srvc_resolve.h index 436b20a5d5..5429640a1e 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_srvc_resolve.h +++ b/protocols/Sametime/src/meanwhile/src/mw_srvc_resolve.h @@ -23,7 +23,6 @@ #include -#include #ifdef __cplusplus diff --git a/protocols/Sametime/src/meanwhile/src/mw_st_list.h b/protocols/Sametime/src/meanwhile/src/mw_st_list.h index 39e1cbf84b..d54de15bac 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_st_list.h +++ b/protocols/Sametime/src/meanwhile/src/mw_st_list.h @@ -30,7 +30,6 @@ #include -#include #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/mw_util.h b/protocols/Sametime/src/meanwhile/src/mw_util.h index b8e0b7e968..a94b85131f 100644 --- a/protocols/Sametime/src/meanwhile/src/mw_util.h +++ b/protocols/Sametime/src/meanwhile/src/mw_util.h @@ -23,8 +23,6 @@ #include -#include -#include #define map_guint_new() \ diff --git a/protocols/Sametime/src/meanwhile/src/session.c b/protocols/Sametime/src/meanwhile/src/session.c index 6c116b7a58..d02d3a09bd 100644 --- a/protocols/Sametime/src/meanwhile/src/session.c +++ b/protocols/Sametime/src/meanwhile/src/session.c @@ -450,6 +450,8 @@ static void HANDSHAKE_ACK_recv(struct mwSession *s, property_set(s, mwSession_SERVER_VER_MAJOR, GPOINTER(msg->major), NULL); property_set(s, mwSession_SERVER_VER_MINOR, GPOINTER(msg->minor), NULL); + g_message("Sametime server version (major/minor): 0x%x / 0x%x", msg->major, msg->minor); + /* compose the login message */ log = (struct mwMsgLogin *) mwMessage_new(mwMessage_LOGIN); log->login_type = GUINT(property_get(s, mwSession_CLIENT_TYPE_ID)); diff --git a/protocols/Sametime/src/meanwhile/src/srvc_aware.c b/protocols/Sametime/src/meanwhile/src/srvc_aware.c index 8c11be229f..8c399b9832 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_aware.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_aware.c @@ -19,8 +19,6 @@ */ #include -#include -#include #include #include "mw_channel.h" diff --git a/protocols/Sametime/src/meanwhile/src/srvc_conf.c b/protocols/Sametime/src/meanwhile/src/srvc_conf.c index f302a706f8..46d12fd849 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_conf.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_conf.c @@ -19,8 +19,6 @@ */ #include -#include -#include #include #include diff --git a/protocols/Sametime/src/meanwhile/src/srvc_dir.c b/protocols/Sametime/src/meanwhile/src/srvc_dir.c index 1505f69c53..be944429cf 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_dir.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_dir.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +#include #include "mw_channel.h" #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/srvc_ft.c b/protocols/Sametime/src/meanwhile/src/srvc_ft.c index 38479e3452..df623e5181 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_ft.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_ft.c @@ -19,7 +19,7 @@ */ -#include +#include #include "mw_channel.h" #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/srvc_im.c b/protocols/Sametime/src/meanwhile/src/srvc_im.c index b03991d3b9..c200487812 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_im.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_im.c @@ -19,7 +19,6 @@ */ #include -#include #include #include "mw_channel.h" diff --git a/protocols/Sametime/src/meanwhile/src/srvc_place.c b/protocols/Sametime/src/meanwhile/src/srvc_place.c index 5029dffbb8..d07e886bc9 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_place.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_place.c @@ -19,8 +19,6 @@ */ #include -#include -#include #include #include diff --git a/protocols/Sametime/src/meanwhile/src/srvc_resolve.c b/protocols/Sametime/src/meanwhile/src/srvc_resolve.c index bb4c536be8..3a282291cc 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_resolve.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_resolve.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +#include #include "mw_channel.h" #include "mw_common.h" diff --git a/protocols/Sametime/src/meanwhile/src/srvc_store.c b/protocols/Sametime/src/meanwhile/src/srvc_store.c index f537195e08..edfd0281ef 100644 --- a/protocols/Sametime/src/meanwhile/src/srvc_store.c +++ b/protocols/Sametime/src/meanwhile/src/srvc_store.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +#include #include "mw_channel.h" #include "mw_debug.h" diff --git a/protocols/Sametime/src/meanwhile/src/st_list.c b/protocols/Sametime/src/meanwhile/src/st_list.c index 949696a4a1..186d5a39a3 100644 --- a/protocols/Sametime/src/meanwhile/src/st_list.c +++ b/protocols/Sametime/src/meanwhile/src/st_list.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include "mw_debug.h" #include "mw_util.h" @@ -662,7 +662,9 @@ void mwSametimeList_get(struct mwGetBuffer *b, struct mwSametimeList *l) { g_return_if_fail(b != NULL); mwString_get(b, &str); - list_get(str, l); - g_free(str); + if (str) { + list_get(str, l); + g_free(str); + } } diff --git a/protocols/Sametime/src/messaging.cpp b/protocols/Sametime/src/messaging.cpp index a82a574f82..55f49ea16f 100644 --- a/protocols/Sametime/src/messaging.cpp +++ b/protocols/Sametime/src/messaging.cpp @@ -49,9 +49,7 @@ void mwIm_conversation_closed(mwConversation* conv, guint32 err) proto->debugLog(_T("mwIm_conversation_closed() start err=[%d]"), err); if (err & ERR_FAILURE && err != CONNECTION_RESET) { - char* msg = mwError(err); - proto->showPopup(TranslateTS(_A2T(msg)), SAMETIME_POPUP_ERROR); - g_free(msg); + proto->showPopup(err); if (err == ERR_NO_COMMON_ENCRYPT && !(proto->options.encrypt_session)) proto->showPopup(TranslateT("No common encryption method. Try to enable encryption in protocol options."), SAMETIME_POPUP_INFO); } diff --git a/protocols/Sametime/src/options.cpp b/protocols/Sametime/src/options.cpp index fccb78c0e5..0b97f27906 100644 --- a/protocols/Sametime/src/options.cpp +++ b/protocols/Sametime/src/options.cpp @@ -4,18 +4,22 @@ #define DEFAULT_ID (0x1800) -#define NUM_IDS 20 +#define NUM_IDS 24 TCHAR* client_names[NUM_IDS] = { _T("Official Binary Library"), _T("Official Java Applet"), _T("Official Binary Application"), _T("Official Java Application"), - _T("Notes v6.5"), - _T("Notes v7.0"), + _T("Notes 6.5"), + _T("Notes 7.0"), + _T("Notes 8.0 Basic"), + _T("Notes 8.5.2"), + _T("Sametime Connect 8.0"), + _T("Sametime Connect 8.5.2"), _T("ICT"), _T("NotesBuddy"), - _T("NotesBuddy v4.15"), + _T("NotesBuddy 4.15"), _T("Sanity"), _T("Perl"), _T("PMR Alert"), @@ -35,6 +39,10 @@ int client_ids[NUM_IDS] = { 0x1003, 0x1200, 0x1210, + 0x1215, + 0x1240, + 0x1306, + 0x130D, 0x1300, 0x1400, 0x1405, @@ -51,6 +59,36 @@ int client_ids[NUM_IDS] = { 0xFFFF }; + +#define DEFAULT_CV_MAJOR (0x001e) +#define DEFAULT_CV_MINOR (0x1f4b) + +#define NUM_CVS 5 + +TCHAR* CV_names[NUM_CVS] = { + _T("Sametime (Use old client version)"), + _T("Sametime (Miranda default)"), + _T("Sametime 8"), + _T("Sametime 8.5.1"), + _T("Sametime 8.5.2") +}; +int CV_major[NUM_CVS] = { + MW_PROTOCOL_VERSION_MAJOR, + 0x001e, + 0x001e, + 0x001e, + 0x001e +}; +int CV_minor[NUM_CVS] = { + MW_PROTOCOL_VERSION_MINOR, + 0x196f, + 0x1f4b, + 0x213f, + 0x2149 +}; + + + static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { CSametimeProto* proto = (CSametimeProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); @@ -84,7 +122,6 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA CheckDlgButton(hwndDlg, IDC_CHK_GETSERVERCONTACTS, proto->options.get_server_contacts ? TRUE : FALSE); CheckDlgButton(hwndDlg, IDC_CHK_ADDCONTACTS, proto->options.add_contacts ? TRUE : FALSE); CheckDlgButton(hwndDlg, IDC_CHK_IDLEAWAY, proto->options.idle_as_away ? TRUE : FALSE); - CheckDlgButton(hwndDlg, IDC_CHK_OLDDEFAULTVER, proto->options.use_old_default_client_ver ? TRUE : FALSE); SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENT, CB_RESETCONTENT, 0, 0); int pos = 0; @@ -109,6 +146,20 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA SetDlgItemInt(hwndDlg, IDC_ED_CLIENTID, proto->options.client_id, FALSE); } + + SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_RESETCONTENT, 0, 0); + pos = 0; + + for (int i = 0; i < NUM_CVS; i++) { + pos = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_ADDSTRING, -1, (LPARAM)CV_names[i]); + SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_SETITEMDATA, pos, i); + if (CV_major[i] == proto->options.client_versionMajor && CV_minor[i] == proto->options.client_versionMinor) { + found = true; + SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_SETCURSEL, pos, 0); + } + } + + if (!ServiceExists(MS_POPUP_ADDPOPUPT)) { HWND hw = GetDlgItem(hwndDlg, IDC_RAD_ERRPOP); EnableWindow(hw, FALSE); @@ -138,19 +189,30 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); if (HIWORD(wParam) == CBN_SELCHANGE) { - int sel = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENT, CB_GETCURSEL, 0, 0); - int id = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENT, CB_GETITEMDATA, sel, 0); - bool custom = (id == client_ids[sizeof(client_ids) / sizeof(int)-1]); + switch (LOWORD(wParam)) { + case IDC_CMB_CLIENT: + { + int sel = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENT, CB_GETCURSEL, 0, 0); + int id = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENT, CB_GETITEMDATA, sel, 0); + bool custom = (id == client_ids[sizeof(client_ids) / sizeof(int)-1]); - if (!custom) - SetDlgItemInt(hwndDlg, IDC_ED_CLIENTID, id, FALSE); - else - SetDlgItemInt(hwndDlg, IDC_ED_CLIENTID, DEFAULT_ID, FALSE); + if (!custom) + SetDlgItemInt(hwndDlg, IDC_ED_CLIENTID, id, FALSE); + else + SetDlgItemInt(hwndDlg, IDC_ED_CLIENTID, DEFAULT_ID, FALSE); - HWND hw = GetDlgItem(hwndDlg, IDC_ED_CLIENTID); - EnableWindow(hw, custom); + HWND hw = GetDlgItem(hwndDlg, IDC_ED_CLIENTID); + EnableWindow(hw, custom); - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + return TRUE; + } + case IDC_CMB_CLIENTVN: + { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + return TRUE; + } + } } if (HIWORD(wParam) == BN_CLICKED) { @@ -204,7 +266,6 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA case IDC_CHK_USERCP: case IDC_CHK_ADDCONTACTS: case IDC_CHK_IDLEAWAY: - case IDC_CHK_OLDDEFAULTVER: case IDC_RAD_ENC: case IDC_RAD_NOENC: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); @@ -258,6 +319,11 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA } else proto->options.client_id = id; + sel = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_GETCURSEL, 0, 0); + int CVpos = SendDlgItemMessage(hwndDlg, IDC_CMB_CLIENTVN, CB_GETITEMDATA, sel, 0); + proto->options.client_versionMajor = CV_major[CVpos]; + proto->options.client_versionMinor = CV_minor[CVpos]; + if (IsDlgButtonChecked(hwndDlg, IDC_RAD_ERRMB)) proto->options.err_method = ED_MB; else if (IsDlgButtonChecked(hwndDlg, IDC_RAD_ERRBAL)) proto->options.err_method = ED_BAL; else if (IsDlgButtonChecked(hwndDlg, IDC_RAD_ERRPOP)) proto->options.err_method = ED_POP; @@ -266,8 +332,6 @@ static INT_PTR CALLBACK DlgProcOptNet(HWND hwndDlg, UINT msg, WPARAM wParam, LPA proto->options.encrypt_session = (IsDlgButtonChecked(hwndDlg, IDC_RAD_ENC) != FALSE); proto->options.idle_as_away = (IsDlgButtonChecked(hwndDlg, IDC_CHK_IDLEAWAY) != FALSE); - proto->options.use_old_default_client_ver = (IsDlgButtonChecked(hwndDlg, IDC_CHK_OLDDEFAULTVER) != FALSE); - proto->SaveOptions(); return TRUE; @@ -316,7 +380,22 @@ void CSametimeProto::LoadOptions() options.encrypt_session = (db_get_b(0, m_szModuleName, "EncryptSession", 0) == 1); options.client_id = db_get_dw(0, m_szModuleName, "ClientID", DEFAULT_ID); - options.use_old_default_client_ver = (db_get_b(0, m_szModuleName, "UseOldClientVer", 0) == 1); + options.client_versionMajor = db_get_dw(0, m_szModuleName, "ClientVersionMajor", DEFAULT_CV_MAJOR); + DWORD defaultCVMinor; + if (db_get_b(0, m_szModuleName, "UseOldClientVer", 0) == 1){ + // if sb have checked old deprecated option 'Use old client version' respect it + defaultCVMinor = 0x001d; + } else { + defaultCVMinor = DEFAULT_CV_MINOR; + } + options.client_versionMinor = db_get_dw(0, m_szModuleName, "ClientVersionMinor", defaultCVMinor); + + // one time options conversion + if (db_get_b(0, m_szModuleName, "UseOldClientVer", -1) != -1){ + db_unset(0, m_szModuleName, "UseOldClientVer"); + db_set_dw(0, m_szModuleName, "ClientVersionMajor", options.client_versionMajor); + db_set_dw(0, m_szModuleName, "ClientVersionMinor", options.client_versionMinor); + } options.get_server_contacts = (db_get_b(0, m_szModuleName, "GetServerContacts", 1) == 1); options.add_contacts = (db_get_b(0, m_szModuleName, "AutoAddContacts", 0) == 1); @@ -333,7 +412,7 @@ void CSametimeProto::LoadOptions() if (options.err_method == ED_BAL && !ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) options.err_method = ED_MB; debugLog(_T("LoadOptions() loaded: ServerName:len=[%d], id:len=[%d], pword:len=[%d]"), options.server_name == NULL ? -1 : strlen(options.server_name), options.id == NULL ? -1 : strlen(options.id), options.pword == NULL ? -1 : strlen(options.pword)); - debugLog(_T("LoadOptions() loaded: port=[%d], encrypt_session=[%d], client_id=[%d], use_old_default_client_ver=[%d]"), options.port, options.encrypt_session, options.client_id, options.use_old_default_client_ver); + debugLog(_T("LoadOptions() loaded: port=[%d], encrypt_session=[%d], ClientID=[%d], ClientVersionMajor=[%d], ClientVersionMinor=[%d]"), options.port, options.encrypt_session, options.client_id, options.client_versionMajor, options.client_versionMinor); debugLog(_T("LoadOptions() loaded: get_server_contacts=[%d], add_contacts=[%d], idle_as_away=[%d], err_method=[%d]"), options.get_server_contacts, options.add_contacts, options.idle_as_away, options.err_method); } @@ -349,11 +428,11 @@ void CSametimeProto::SaveOptions() db_set_dw(0, m_szModuleName, "ServerPort", options.port); db_set_b(0, m_szModuleName, "GetServerContacts", options.get_server_contacts ? 1 : 0); db_set_dw(0, m_szModuleName, "ClientID", options.client_id); + db_set_dw(0, m_szModuleName, "ClientVersionMajor", options.client_versionMajor); + db_set_dw(0, m_szModuleName, "ClientVersionMinor", options.client_versionMinor); db_set_b(0, m_szModuleName, "ErrorDisplay", options.err_method); db_set_b(0, m_szModuleName, "AutoAddContacts", options.add_contacts ? 1 : 0); db_set_b(0, m_szModuleName, "EncryptSession", options.encrypt_session ? 1 : 0); db_set_b(0, m_szModuleName, "IdleAsAway", options.idle_as_away ? 1 : 0); - - db_set_b(0, m_szModuleName, "UseOldClientVer", options.use_old_default_client_ver ? 1 : 0); } diff --git a/protocols/Sametime/src/resource.h b/protocols/Sametime/src/resource.h index 3ca8cba566..761b400d0d 100644 --- a/protocols/Sametime/src/resource.h +++ b/protocols/Sametime/src/resource.h @@ -24,12 +24,12 @@ #define IDC_CHK_ADDCONTACTS 1008 #define IDC_CHK_IDLEAWAY 1009 #define IDC_CMB_CLIENT 1010 +#define IDC_CMB_CLIENTVN 1016 #define IDC_ED_CLIENTID 1011 #define IDC_RAD_ERRMB 1012 #define IDC_RAD_ERRPOP 1013 #define IDC_RAD_ERRBAL 1014 #define IDC_RAD_ANSI 1015 -#define IDC_CHK_OLDDEFAULTVER 1016 #define IDC_RAD_UTF8 1017 #define IDC_CHK_USERCP 1018 #define IDC_RAD_OEM 1019 diff --git a/protocols/Sametime/src/sametime.h b/protocols/Sametime/src/sametime.h index 7554a5d78d..d1a6f96a1a 100644 --- a/protocols/Sametime/src/sametime.h +++ b/protocols/Sametime/src/sametime.h @@ -62,11 +62,12 @@ typedef struct Options_tag { int port; bool get_server_contacts; int client_id; + int client_versionMajor; + int client_versionMinor; ErrorDisplay err_method; bool add_contacts; bool encrypt_session; bool idle_as_away; - bool use_old_default_client_ver; } SametimeOptions; typedef struct { diff --git a/protocols/Sametime/src/sametime_proto.h b/protocols/Sametime/src/sametime_proto.h index fd4e3a43c8..67c036fbf1 100644 --- a/protocols/Sametime/src/sametime_proto.h +++ b/protocols/Sametime/src/sametime_proto.h @@ -149,6 +149,7 @@ struct CSametimeProto : public PROTO // utils.cpp void showPopup(const TCHAR* msg, SametimePopupEnum flag); + void showPopup(guint32 code); void RegisterPopups(); void UnregisterPopups(); void RegisterGLibLogger(); diff --git a/protocols/Sametime/src/sametime_session.cpp b/protocols/Sametime/src/sametime_session.cpp index 5abc64a675..64b5894f28 100644 --- a/protocols/Sametime/src/sametime_session.cpp +++ b/protocols/Sametime/src/sametime_session.cpp @@ -69,14 +69,9 @@ void CSametimeProto::InitMeanwhileServices() mwSession_setProperty(session, mwSession_AUTH_PASSWORD, options.pword, NULL); mwSession_setProperty(session, mwSession_CLIENT_TYPE_ID, (void*)options.client_id, NULL); - if (options.use_old_default_client_ver) { - mwSession_setProperty(session, mwSession_CLIENT_VER_MAJOR, GUINT_TO_POINTER(db_get_w(0, m_szModuleName, "ClientVersionMajor", MW_PROTOCOL_VERSION_MAJOR)), 0); - mwSession_setProperty(session, mwSession_CLIENT_VER_MINOR, GUINT_TO_POINTER(db_get_w(0, m_szModuleName, "ClientVersionMinor", MW_PROTOCOL_VERSION_MINOR)), 0); - } - else { - mwSession_setProperty(session, mwSession_CLIENT_VER_MAJOR, GUINT_TO_POINTER(db_get_w(0, m_szModuleName, "ClientVersionMajor", 0x001e)), 0); - mwSession_setProperty(session, mwSession_CLIENT_VER_MINOR, GUINT_TO_POINTER(db_get_w(0, m_szModuleName, "ClientVersionMinor", 0x196f)), 0); - } + mwSession_setProperty(session, mwSession_CLIENT_VER_MAJOR, (void*)options.client_versionMajor, NULL); + mwSession_setProperty(session, mwSession_CLIENT_VER_MINOR, (void*)options.client_versionMinor, NULL); + } void CSametimeProto::DeinitMeanwhileServices() @@ -111,11 +106,7 @@ void __cdecl SessionStateChange(mwSession* session, mwSessionState state, gpoint case mwSession_STOPPING: if ((int)info) {// & ERR_FAILURE) { - char *msg = mwError((int)info); - TCHAR *msgT = mir_utf8decodeT(msg); - proto->showPopup(TranslateTS(msgT), SAMETIME_POPUP_ERROR); - mir_free(msgT); - g_free(msg); + proto->showPopup((int)info); } proto->SessionStopping(); break; diff --git a/protocols/Sametime/src/utils.cpp b/protocols/Sametime/src/utils.cpp index 6c8964e8a0..eeccb5a661 100644 --- a/protocols/Sametime/src/utils.cpp +++ b/protocols/Sametime/src/utils.cpp @@ -138,6 +138,22 @@ void CSametimeProto::showPopup(const TCHAR* msg, SametimePopupEnum flag) CallFunctionAsync(sttMainThreadCallback, puData); } +void CSametimeProto::showPopup(guint32 code) +{ + struct mwReturnCodeDesc *rcDesc = mwGetReturnCodeDesc(code); + + SametimePopupEnum flag = (rcDesc->type == mwReturnCodeError ? SAMETIME_POPUP_ERROR : SAMETIME_POPUP_INFO); + TCHAR buff[512]; + mir_sntprintf(buff, SIZEOF(buff), TranslateT("%s\n\nSametime error %S\n%s"), TranslateTS(_A2T(rcDesc->name)), rcDesc->codeString, TranslateTS(_A2T(rcDesc->description))); + + showPopup(buff, flag); + debugLog(buff); + + g_free(rcDesc->codeString); + g_free(rcDesc->name); + g_free(rcDesc->description); + g_free(rcDesc); +} void LogFromGLib(const gchar* log_domain, GLogLevelFlags log_level, const gchar* message, gpointer user_data) { -- cgit v1.2.3