summaryrefslogtreecommitdiff
path: root/nohtml/filter.cpp
blob: 4d3ed77a69728b076bc109cb37e30978ee85d78d (plain)
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]);
}