1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include "common.h"
#include "filter.h"
#include "options.h"
#include "conv.h"
int FilterSendMessage(WPARAM wParam, LPARAM lParam) {
CCSDATA *ccs = (CCSDATA *) lParam;
char *message = (char *)ccs->lParam;
// TODO: process 'message' and/or 'messagew' below
if(ccs->wParam & PREF_UNICODE) {
wchar_t *messagew = (wchar_t *)&message[strlen(message)+1];
} else {
}
return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
}
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;
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]);
}
|