summaryrefslogtreecommitdiff
path: root/plugins/SecureIM/src/splitmsg.cpp
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-07-23 13:49:28 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-07-23 13:49:28 +0000
commita9580df150d799246eaecbf3c1fb5cecf9f8ab49 (patch)
treece046b1cd432d65718c9f6af80521d533ce6d4ca /plugins/SecureIM/src/splitmsg.cpp
parent60338d55bb73d0c45b6e092703c4bb88a3c49755 (diff)
SecureIM, SeenPlugin, SendSS, Sessions: changed folder structure
git-svn-id: http://svn.miranda-ng.org/main/trunk@1122 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/SecureIM/src/splitmsg.cpp')
-rw-r--r--plugins/SecureIM/src/splitmsg.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/SecureIM/src/splitmsg.cpp b/plugins/SecureIM/src/splitmsg.cpp
new file mode 100644
index 0000000000..ca4f0635cf
--- /dev/null
+++ b/plugins/SecureIM/src/splitmsg.cpp
@@ -0,0 +1,124 @@
+#include "commonheaders.h"
+
+
+// разбивает сообщение szMsg на части длиной iLen, возвращает строку вида PARTzPARTzz
+LPSTR splitMsg(LPSTR szMsg, int iLen) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("split: msg: -----\n%s\n-----\n",szMsg);
+#endif
+ int len = (int)strlen(szMsg);
+ LPSTR out = (LPSTR) mir_alloc(len*2);
+ LPSTR buf = out;
+
+ WORD msg_id = DBGetContactSettingWord(0, szModuleName, "msgid", 0) + 1;
+ DBWriteContactSettingWord(0, szModuleName, "msgid", msg_id);
+
+ int part_all = (len+iLen-1)/iLen;
+ for(int part_num=0; part_num<part_all; part_num++) {
+ int sz = (len>iLen)?iLen:len;
+ mir_snprintf(buf,32,"%s%04X%02X%02X",SIG_SECP,msg_id,part_num,part_all);
+ memcpy(buf+LEN_SECP+8,szMsg,sz);
+ *(buf+LEN_SECP+8+sz) = '\0';
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("split: part: %s",buf);
+#endif
+ buf += LEN_SECP+8+sz+1;
+ szMsg += sz;
+ len -= sz;
+ }
+ *buf = '\0';
+ return out;
+}
+
+
+// собираем сообщение из частей, части храним в структуре у контакта
+LPSTR combineMessage(pUinKey ptr, LPSTR szMsg) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: part: %s",szMsg);
+#endif
+ int msg_id,part_num,part_all;
+ sscanf(szMsg,"%4X%2X%2X",&msg_id,&part_num,&part_all);
+ //
+ pPM ppm = NULL, pm = ptr->msgPart;
+ if ( !ptr->msgPart ) {
+ pm = ptr->msgPart = new partitionMessage;
+ memset(pm,0,sizeof(partitionMessage));
+ pm->id = msg_id;
+ pm->message = new LPSTR[part_all];
+ memset(pm->message,0,sizeof(LPSTR)*part_all);
+ }
+ else
+ while(pm) {
+ if ( pm->id == msg_id ) break;
+ ppm = pm; pm = pm->nextMessage;
+ }
+ if (!pm) { // nothing to found
+ pm = ppm->nextMessage = new partitionMessage;
+ memset(pm,0,sizeof(partitionMessage));
+ pm->id = msg_id;
+ pm->message = new LPSTR[part_all];
+ memset(pm->message,0,sizeof(LPSTR)*part_all);
+ }
+ pm->message[part_num] = new char[strlen(szMsg)];
+ strcpy(pm->message[part_num],szMsg+8);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: save part: %s",pm->message[part_num]);
+#endif
+ int len=0,i;
+ for ( i=0; i<part_all; i++ ) {
+ if(pm->message[i]==NULL) break;
+ len+=(int)strlen(pm->message[i]);
+ }
+ if ( i==part_all ) { // combine message
+ SAFE_FREE(ptr->tmp);
+ ptr->tmp = (LPSTR) mir_alloc(len+1); *(ptr->tmp)='\0';
+ for ( i=0; i<part_all; i++ ) {
+ strcat(ptr->tmp,pm->message[i]);
+ delete pm->message[i];
+ }
+ delete pm->message;
+ if(ppm) ppm->nextMessage = pm->nextMessage;
+ else ptr->msgPart = pm->nextMessage;
+ delete pm;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: all parts: -----\n%s\n-----\n", ptr->tmp);
+#endif
+ // собрали одно сообщение
+ return ptr->tmp;
+ }
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: not all parts");
+#endif
+ // еще не собрали
+ return NULL;
+}
+
+
+// отправляет сообщение, если надо то разбивает на части
+int splitMessageSend(pUinKey ptr, LPSTR szMsg) {
+
+ int ret;
+ int len = (int)strlen(szMsg);
+ int par = (getContactStatus(ptr->hContact)==ID_STATUS_OFFLINE)?ptr->proto->split_off:ptr->proto->split_on;
+ if ( par && len>par ) {
+ LPSTR msg = splitMsg(szMsg,par);
+ LPSTR buf = msg;
+ while( *buf ) {
+ len = (int)strlen(buf);
+ LPSTR tmp = mir_strdup(buf);
+ ret = CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)tmp);
+ mir_free(tmp);
+ buf += len+1;
+ }
+ SAFE_FREE(msg);
+ }
+ else {
+ ret = CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)szMsg);
+ }
+ return ret;
+}
+
+
+// EOF