summaryrefslogtreecommitdiff
path: root/protocols/Gadu-Gadu/src/links.cpp
blob: 7c84a58e561200f6da596efea8501f4440c33f32 (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
////////////////////////////////////////////////////////////////////////////////
// Gadu-Gadu Plugin for Miranda IM
//
// Copyright (c) 2009-2012 Bartosz Białek
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
////////////////////////////////////////////////////////////////////////////////

#include "gg.h"
#include "m_assocmgr.h"

//////////////////////////////////////////////////////////
// File Association Manager support

#define GGS_PARSELINK "GG/ParseLink"
#define GGS_MENUCHOOSE "GG/MenuChoose"

static int hInstanceMenu;

static INT_PTR gg_menuchoose(WPARAM wParam, LPARAM lParam)
{
	if (lParam)
		*(void**)lParam = (void*)wParam;

	return 0;
}

static INT_PTR gg_parselink(WPARAM, LPARAM lParam)
{
	char *arg = (char*)lParam;

	if (CMPlugin::g_arInstances.getCount() == 0)
		return 0;

	if (arg == nullptr)
		return 1;

	arg = strchr(arg, ':');

	if (arg == nullptr)
		return 1;

	for (++arg; *arg == '/'; ++arg);
	uin_t uin = atoi(arg);

	if (!uin)
		return 1;

	GaduProto *gg = nullptr;
	int items = 0;
	for (auto &it : CMPlugin::g_arInstances) {
		gg = it;
		if (it->m_iStatus > ID_STATUS_OFFLINE) {
			++items;
			Menu_ModifyItem(it->hInstanceMenuItem, nullptr, Skin_LoadProtoIcon(it->m_szModuleName, it->m_iStatus));
		}
		else Menu_ShowItem(it->hInstanceMenuItem, false);
	}

	if (items > 1) {
		POINT pt;
		GetCursorPos(&pt);

		HMENU hMenu = CreatePopupMenu();
		Menu_Build(hMenu, hInstanceMenu);
		int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, g_clistApi.hwndContactList, nullptr);
		DestroyMenu(hMenu);

		if (cmd)
			Menu_ProcessCommandById(cmd, (LPARAM)&gg);
	}

	if (gg == nullptr)
		return 0;

	MCONTACT hContact = gg->getcontact(uin, 1, 0, nullptr);
	if (hContact != NULL)
		CallService(MS_MSG_SENDMESSAGE, hContact, 0);

	return 0;
}

void gg_links_instancemenu_init()
{
	CreateServiceFunction(GGS_MENUCHOOSE, gg_menuchoose);
	hInstanceMenu = Menu_AddObject("GGAccountChooser", LPGEN("Gadu-Gadu account chooser"), nullptr, GGS_MENUCHOOSE);

	CMenuItem mi(&g_plugin);
	mi.name.a = "Cancel";
	mi.position = 9999999;
	mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_DELETE);
	Menu_AddItem(hInstanceMenu, &mi, nullptr);
}

void gg_links_init()
{
	if (ServiceExists(MS_ASSOCMGR_ADDNEWURLTYPE)) {
		CreateServiceFunction(GGS_PARSELINK, gg_parselink);
		AssocMgr_AddNewUrlTypeW("gg:", TranslateT("Gadu-Gadu Link Protocol"), g_plugin.getInst(), IDI_GG, GGS_PARSELINK, 0);
	}
}

void GaduProto::links_instance_init()
{
	if (ServiceExists(MS_ASSOCMGR_ADDNEWURLTYPE)) {
		CMenuItem mi(&g_plugin);
		mi.flags = CMIF_UNICODE;
		mi.position = CMPlugin::g_arInstances.getCount();
		mi.name.w = m_tszUserName;
		hInstanceMenuItem = Menu_AddItem(hInstanceMenu, &mi, this);
	}
}