#include "common.h" #include "filter.h" #include "options.h" #include "conv.h" int FilterSendMessage(WPARAM wParam, LPARAM lParam) { CCSDATA *ccs = (CCSDATA *) lParam; char *old_message = (char *)ccs->lParam; char *buf = 0; if(options.html) { if(ccs->wParam & PREF_UNICODE) { wchar_t *messagew = (wchar_t *)&old_message[strlen(old_message)+1]; wchar_t* smsg=strip_carrots(messagew); wchar_t* html_msg=bbcodes_to_html(smsg); delete[] smsg; buf=(char *)malloc(wcslen(html_msg)*3+3); WideCharToMultiByte( CP_ACP, 0,html_msg, -1,buf,wcslen(html_msg)+1, NULL, NULL); memcpy(&buf[strlen(buf)+1],html_msg,lstrlen(buf)*2+2); delete[] html_msg; } else { char* smsg=strip_carrots(old_message); char* html_msg=bbcodes_to_html(smsg); delete[] smsg; buf = strdup(html_msg); delete[] html_msg; } ccs->lParam = (LPARAM)buf; } int ret = CallService(MS_PROTO_CHAINSEND, wParam, lParam); ccs->lParam = (LPARAM)old_message; if(buf) free(buf); return ret; } int FilterSendMessageW(WPARAM wParam, LPARAM lParam) { CCSDATA *ccs = (CCSDATA *) lParam; ccs->wParam |= PREF_UNICODE; return FilterSendMessage(wParam, lParam); } int FilterRecvMessage(WPARAM wParam, LPARAM lParam) { CCSDATA *ccs = (CCSDATA *) lParam; PROTORECVEVENT *pre = (PROTORECVEVENT *) ccs->lParam; char *old_message = pre->szMessage; char* buf = 0; if(ccs->wParam & PREF_UNICODE) { wchar_t *messagew = (wchar_t *)&old_message[strlen(old_message)+1]; //LOG("Recieved a unicode message."); wchar_t* wbuf=(wchar_t*)&pre->szMessage[lstrlen(pre->szMessage)+1]; wchar_t* st_wbuf; if(options.bbcodes) { //LOG("Converting from html to bbcodes then stripping leftover html.(U)"); wchar_t* bbuf=html_to_bbcodes(wbuf); st_wbuf=strip_html(bbuf); delete[] bbuf; } else { //LOG("Stripping html.(U)"); st_wbuf=strip_html(wbuf); } //delete[] pre->szMessage; not necessary - done in server.cpp buf=(char *)malloc(wcslen(st_wbuf)*3+3); WideCharToMultiByte( CP_ACP, 0,st_wbuf, -1,buf,wcslen(st_wbuf)+1, NULL, NULL); memcpy(&buf[strlen(buf)+1],st_wbuf,lstrlen(buf)*2+2); delete[] st_wbuf; pre->szMessage = buf; } else { //LOG("Recieved a non-unicode message."); if(options.bbcodes) { //LOG("Converting from html to bbcodes then stripping leftover html."); char* bbuf=html_to_bbcodes(pre->szMessage); buf=strip_html(bbuf); delete[] bbuf; } else { //LOG("Stripping html."); buf=strip_html(pre->szMessage); } pre->szMessage = buf; } int ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam); pre->szMessage = old_message; if(buf) free(buf); return ret; } int NewContact(WPARAM wParam, LPARAM lParam) { // add filter HANDLE hContact = (HANDLE)wParam; CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact, ( LPARAM )MODULE ); return 0; } void RegisterFilter() { PROTOCOLDESCRIPTOR pd = {0}; pd.cbSize = sizeof(pd); pd.szName = MODULE "Filter"; // TODO: modify this to reflect the purpose of your plugin pd.type = PROTOTYPE_FILTER; CallService(MS_PROTO_REGISTERMODULE,0,(LPARAM)&pd); } HANDLE hEventNewContact; #define NUM_FILTER_SERVICES 3 HANDLE hServices[NUM_FILTER_SERVICES]; void AddFilterToContacts() { // this adds us as a filter to all existing and new contacts // TODO: modify this (and the NewContact function above) to include only the contacts required HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); while ( hContact != NULL ) { CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact, ( LPARAM )(MODULE "Filter")); hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); } hEventNewContact = HookEvent(ME_DB_CONTACT_ADDED, NewContact); } void CreateFilterServices() { // create our services int i = 0; hServices[i++] = CreateProtoServiceFunction(MODULE "Filter", PSS_MESSAGE, FilterSendMessage); hServices[i++] = CreateProtoServiceFunction(MODULE "Filter", PSS_MESSAGE"W", FilterSendMessageW); hServices[i++] = CreateProtoServiceFunction(MODULE "Filter", PSR_MESSAGE, FilterRecvMessage); // remember to modify the NUM_FILTER_SERVICES #define above if you add more services! } void DeinitFilter() { UnhookEvent(hEventNewContact); for(int i = 0; i < NUM_FILTER_SERVICES; i++) DestroyServiceFunction(hServices[i]); }