diff options
Diffstat (limited to 'plugins/SMS/src/SMS_svc.cpp')
-rw-r--r-- | plugins/SMS/src/SMS_svc.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/plugins/SMS/src/SMS_svc.cpp b/plugins/SMS/src/SMS_svc.cpp new file mode 100644 index 0000000000..489f9f4dbd --- /dev/null +++ b/plugins/SMS/src/SMS_svc.cpp @@ -0,0 +1,241 @@ +#include "common.h"
+
+
+
+int LoadServices(void)
+{
+ CHAR szServiceFunction[MAX_PATH],*pszServiceFunctionName;
+
+ CopyMemory(szServiceFunction,PROTOCOL_NAMEA,PROTOCOL_NAME_SIZE);
+ pszServiceFunctionName=szServiceFunction+PROTOCOL_NAME_LEN;
+
+ // Service creation
+ for (SIZE_T i=0;i<SIZEOF(siPluginServices);i++)
+ {
+ CopyMemory(pszServiceFunctionName,siPluginServices[i].lpszName,(lstrlenA(siPluginServices[i].lpszName)+1));
+ CreateServiceFunction(szServiceFunction,(MIRANDASERVICE)siPluginServices[i].lpFunc);
+ }
+return(0);
+}
+
+
+int LoadModules(void)
+{
+ ssSMSSettings.hHookOptInitialize=HookEvent(ME_OPT_INITIALISE,OptInitialise);
+ ssSMSSettings.hHookRebuildCMenu=HookEvent(ME_CLIST_PREBUILDCONTACTMENU,SmsRebuildContactMenu);
+ ssSMSSettings.hHookProtoAck=HookEvent(ME_PROTO_ACK,handleAckSMS);
+ ssSMSSettings.hHookDbAdd=HookEvent(ME_DB_EVENT_ADDED,handleNewMessage);
+ ssSMSSettings.hHookAccListChanged=HookEvent(ME_PROTO_ACCLISTCHANGED,RefreshAccountList);
+
+
+ CLISTMENUITEM mi={0};
+ CHAR szServiceFunction[MAX_PATH];
+
+ mir_snprintf(szServiceFunction,sizeof(szServiceFunction),"%s%s",PROTOCOL_NAMEA,SMS_SEND);
+
+ mi.cbSize=sizeof(mi);
+ mi.position=300050000;
+ mi.hIcon=LoadSkinnedIcon(SKINICON_OTHER_SMS);
+ mi.ptszName=SMS_SEND_STR;
+ mi.pszService=szServiceFunction;
+ mi.flags=(CMIF_UNICODE);
+ Menu_AddMainMenuItem(&mi);
+
+ mi.position=-2000070000;
+ mi.hIcon=LoadSkinnedIcon(SKINICON_OTHER_SMS);
+ mi.ptszName=SMS_SEND_CM_STR;
+ mi.pszService=szServiceFunction;
+ mi.flags=(CMIF_UNICODE);
+ ssSMSSettings.hContactMenuItems[0]=Menu_AddContactMenuItem(&mi);
+
+ SkinAddNewSoundEx("RecvSMSMsg",PROTOCOL_NAMEA,Translate("Incoming SMS Message"));
+ SkinAddNewSoundEx("RecvSMSConfirmation",PROTOCOL_NAMEA,Translate("Incoming SMS Confirmation"));
+
+
+ RefreshAccountList(NULL,NULL);
+
+ RestoreUnreadMessageAlerts();
+
+return(0);
+}
+
+
+void UnloadModules()
+{
+ // Main menu destroy
+ //CListDestroyMenu(gdiMenuItems,SIZEOF(gdiMenuItems));
+ //ZeroMemory(masMraSettings.hMainMenuItems,sizeof(masMraSettings.hMainMenuItems));
+
+ // Contact menu destroy
+ //CListDestroyMenu(gdiContactMenuItems,(SIZEOF(gdiContactMenuItems) - ((masMraSettings.heNudgeReceived==NULL)? 0:1)));
+ //ZeroMemory(masMraSettings.hContactMenuItems,sizeof(masMraSettings.hContactMenuItems));
+
+ if (ssSMSSettings.hHookAccListChanged) {UnhookEvent(ssSMSSettings.hHookAccListChanged); ssSMSSettings.hHookAccListChanged=NULL;}
+ if (ssSMSSettings.hHookDbAdd) {UnhookEvent(ssSMSSettings.hHookDbAdd); ssSMSSettings.hHookDbAdd=NULL;}
+ if (ssSMSSettings.hHookProtoAck) {UnhookEvent(ssSMSSettings.hHookProtoAck); ssSMSSettings.hHookProtoAck=NULL;}
+ if (ssSMSSettings.hHookRebuildCMenu) {UnhookEvent(ssSMSSettings.hHookRebuildCMenu); ssSMSSettings.hHookRebuildCMenu=NULL;}
+ if (ssSMSSettings.hHookOptInitialize) {UnhookEvent(ssSMSSettings.hHookOptInitialize); ssSMSSettings.hHookOptInitialize=NULL;}
+
+ //IconsUnLoad();
+
+}
+
+
+void UnloadServices()
+{
+ CHAR szServiceFunction[MAX_PATH],*pszServiceFunctionName;
+
+ CopyMemory(szServiceFunction,PROTOCOL_NAMEA,PROTOCOL_NAME_SIZE);
+ pszServiceFunctionName=szServiceFunction+PROTOCOL_NAME_LEN;
+
+ // destroy plugin services
+ for (SIZE_T i=0;i<SIZEOF(siPluginServices);i++)
+ {
+ CopyMemory(pszServiceFunctionName,siPluginServices[i].lpszName,(lstrlenA(siPluginServices[i].lpszName)+1));
+ DestroyServiceFunction(szServiceFunction);
+ }
+}
+
+
+
+int SmsRebuildContactMenu(WPARAM wParam,LPARAM lParam)
+{
+ CListShowMenuItem(ssSMSSettings.hContactMenuItems[0],(BOOL)GetContactPhonesCount((HANDLE)wParam));
+return(0);
+}
+
+
+//This function called when user clicked Menu.
+int SendSMSMenuCommand(WPARAM wParam,LPARAM lParam)
+{
+ HWND hwndSendSms;
+
+ if (wParam)
+ {// user clicked on the "SMS Message" on one of the users
+ hwndSendSms=SendSMSWindowIsOtherInstanceHContact((HANDLE)wParam);
+ if (hwndSendSms)
+ {
+ SetFocus(hwndSendSms);
+ }else{
+ hwndSendSms=SendSMSWindowAdd((HANDLE)wParam);
+ }
+ }else{// user clicked on the "SMS Send" in the Main Menu
+ hwndSendSms=SendSMSWindowAdd(NULL);
+ EnableWindow(GetDlgItem(hwndSendSms,IDC_NAME),TRUE);
+ EnableWindow(GetDlgItem(hwndSendSms,IDC_SAVENUMBER),FALSE);
+
+ for(HANDLE hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))
+ {
+ if (GetContactPhonesCount(hContact))
+ {
+ SEND_DLG_ITEM_MESSAGEW(hwndSendSms,IDC_NAME,CB_ADDSTRING,0,(LPARAM)GetContactNameW(hContact));
+ SendSMSWindowSMSContactAdd(hwndSendSms,hContact);
+ }
+ }
+ }
+return(0);
+}
+
+
+//This function used to popup a read SMS window after the user clicked on the received SMS message.
+int ReadMsgSMS(WPARAM wParam,LPARAM lParam)
+{
+ int iRet=1;
+ DBEVENTINFO dbei={0};
+
+ dbei.cbSize=sizeof(dbei);
+ if ((dbei.cbBlob=CallService(MS_DB_EVENT_GETBLOBSIZE,(WPARAM)((CLISTEVENT*)lParam)->hDbEvent,0))!=-1)
+ {
+ dbei.pBlob=(PBYTE)MEMALLOC(dbei.cbBlob);
+ if (dbei.pBlob)
+ {
+ if (CallService(MS_DB_EVENT_GET,(WPARAM)((CLISTEVENT*)lParam)->hDbEvent,(LPARAM)&dbei)==0)
+ if (dbei.eventType==ICQEVENTTYPE_SMS || dbei.eventType==ICQEVENTTYPE_SMSCONFIRMATION)
+ if (dbei.cbBlob>MIN_SMS_DBEVENT_LEN)
+ {
+ if (RecvSMSWindowAdd(((CLISTEVENT*)lParam)->hContact,ICQEVENTTYPE_SMS,NULL,0,(LPSTR)dbei.pBlob,dbei.cbBlob))
+ {
+ CallService(MS_DB_EVENT_MARKREAD,(WPARAM)((CLISTEVENT*)lParam)->hContact,(LPARAM)((CLISTEVENT*)lParam)->hDbEvent);
+ iRet=0;
+ }
+ }
+ MEMFREE(dbei.pBlob);
+ }
+ }
+return(iRet);
+}
+
+//This function used to popup a read SMS window after the user clicked on the received SMS confirmation.
+int ReadAckSMS(WPARAM wParam,LPARAM lParam)
+{
+ int iRet=1;
+ DBEVENTINFO dbei={0};
+
+ dbei.cbSize=sizeof(dbei);
+ if ((dbei.cbBlob=CallService(MS_DB_EVENT_GETBLOBSIZE,(WPARAM)((CLISTEVENT*)lParam)->hDbEvent,0))!=-1)
+ {
+ dbei.pBlob=(PBYTE)MEMALLOC(dbei.cbBlob);
+ if (dbei.pBlob)
+ {
+ if (CallService(MS_DB_EVENT_GET,(WPARAM)((CLISTEVENT*)lParam)->hDbEvent,(LPARAM)&dbei)==0)
+ if (dbei.eventType==ICQEVENTTYPE_SMS || dbei.eventType==ICQEVENTTYPE_SMSCONFIRMATION)
+ if (dbei.cbBlob>MIN_SMS_DBEVENT_LEN)
+ {
+ if (RecvSMSWindowAdd(((CLISTEVENT*)lParam)->hContact,ICQEVENTTYPE_SMSCONFIRMATION,NULL,0,(LPSTR)dbei.pBlob,dbei.cbBlob))
+ {
+ CallService(MS_DB_EVENT_DELETE,(WPARAM)((CLISTEVENT*)lParam)->hContact,(LPARAM)((CLISTEVENT*)lParam)->hDbEvent);
+ iRet=0;
+ }
+ }
+ MEMFREE(dbei.pBlob);
+ }
+ }
+return(iRet);
+}
+
+void RestoreUnreadMessageAlerts(void)
+{
+ DBEVENTINFO dbei={0};
+ HANDLE hDbEvent,hContact;
+
+ dbei.cbSize=sizeof(dbei);
+ for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))
+ for(hDbEvent=(HANDLE)CallService(MS_DB_EVENT_FINDFIRSTUNREAD,(WPARAM)hContact,0);hDbEvent!=NULL;hDbEvent=(HANDLE)CallService(MS_DB_EVENT_FINDNEXT,(WPARAM)hDbEvent,0))
+ {
+ dbei.cbBlob=0;
+ if (CallService(MS_DB_EVENT_GET,(WPARAM)hDbEvent,(LPARAM)&dbei)==0)
+ if ((dbei.flags&(DBEF_SENT|DBEF_READ))==0 && ((dbei.eventType==ICQEVENTTYPE_SMS) || (dbei.eventType==ICQEVENTTYPE_SMSCONFIRMATION)))
+ if (dbei.cbBlob>MIN_SMS_DBEVENT_LEN)
+ {
+ handleNewMessage((WPARAM)hContact,(LPARAM)hDbEvent);
+ }
+ }
+
+ hContact=NULL;
+ for(hDbEvent=(HANDLE)CallService(MS_DB_EVENT_FINDFIRSTUNREAD,(WPARAM)hContact,0);hDbEvent!=NULL;hDbEvent=(HANDLE)CallService(MS_DB_EVENT_FINDNEXT,(WPARAM)hDbEvent,0))
+ {
+ dbei.cbBlob=0;
+ if (CallService(MS_DB_EVENT_GET,(WPARAM)hDbEvent,(LPARAM)&dbei)==0)
+ if ((dbei.flags&(DBEF_SENT|DBEF_READ))==0 && ((dbei.eventType==ICQEVENTTYPE_SMS) || (dbei.eventType==ICQEVENTTYPE_SMSCONFIRMATION)))
+ if (dbei.cbBlob>MIN_SMS_DBEVENT_LEN)
+ {
+ handleNewMessage((WPARAM)hContact,(LPARAM)hDbEvent);
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|