summaryrefslogtreecommitdiff
path: root/otr/menu.cpp
blob: 026f0fec38fc33dfbf690f2ce56612e2f947d18e (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
#include "common.h"
#include "menu.h"
#include "options.h"
#include "utils.h"

HANDLE hMenuBuildEvent, hStartItem, hStopItem;

void FixMenuIcons() {
	// fix menu icons
	CLISTMENUITEM menu = {0};
	menu.cbSize=sizeof(menu);
	menu.flags = CMIM_ICON;

	menu.hIcon = hLockIcon;
	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&menu);
	menu.hIcon = hUnlockIcon;
	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&menu);
}

int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) {
	HANDLE hContact = (HANDLE)wParam;
	
	CLISTMENUITEM mi = {0};
	mi.cbSize = sizeof(mi);
	mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE;
	
	char *proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
	char *uname = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0);
	WORD pol = CONTACT_DEFAULT_POLICY;
	
	if(!proto || !uname || DBGetContactSettingByte(hContact, proto, "ChatRoom", 0) == 1) {
		goto hide_all;
	}
	
	if(strcmp(proto, "MetaContacts") == 0) {
		// make menu act as per most online subcontact
		hContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT, (WPARAM)hContact, 0);
		if(!hContact)
			goto hide_all;
		uname = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0);
		proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
	}

	pol = DBGetContactSettingWord(hContact, MODULE, "Policy", CONTACT_DEFAULT_POLICY);
	if(pol == CONTACT_DEFAULT_POLICY) pol = options.default_policy;
	
	if(pol == OTRL_POLICY_NEVER || pol == OTRL_POLICY_ALWAYS) {
		goto hide_all;
	}

	{
		ConnContext *context = otrl_context_find(otr_user_state, uname, MODULE, proto, FALSE, 0, 0, 0);	
		bool encrypted = context && context->msgstate != OTRL_MSGSTATE_PLAINTEXT;
		if(encrypted) {
			CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
			mi.flags |= CMIF_HIDDEN;
			CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
		} else {
			if(pol == OTRL_POLICY_MANUAL_MOD) {
				CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
				mi.flags |= CMIF_HIDDEN;
				CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
			} else { // should only be 'opportunistic'
				goto hide_all;
			}
		}	
	}
	
	return 0;

hide_all:
	mi.flags |= CMIF_HIDDEN;
	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
	return 0;
}

void InitMenu() {
	CLISTMENUITEM mi = {0};
	mi.cbSize = sizeof(mi);
	mi.flags = CMIF_NOTOFFLINE;
	mi.position = -400000;

	mi.pszName = Translate("Stop OTR");
	mi.pszService = MS_OTR_MENUSTOP;
	mi.hIcon = hUnlockIcon;

	hStopItem = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);

	mi.pszName = Translate("Start OTR");
	mi.pszService = MS_OTR_MENUSTART;
	mi.hIcon = hLockIcon;

	hStartItem = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);

	hMenuBuildEvent = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu);

}

void DeinitMenu() {
}