From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Yahoo/links.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 protocols/Yahoo/links.cpp (limited to 'protocols/Yahoo/links.cpp') diff --git a/protocols/Yahoo/links.cpp b/protocols/Yahoo/links.cpp new file mode 100644 index 0000000000..8af33e94b3 --- /dev/null +++ b/protocols/Yahoo/links.cpp @@ -0,0 +1,184 @@ +/* + * $Id: services.c 5376 2007-05-07 16:13:18Z gena01 $ + * + * myYahoo Miranda Plugin + * + * Authors: Gennady Feldman (aka Gena01) + * Laurent Marechal (aka Peorth) + * + * This code is under GPL and is based on AIM, MSN and Miranda source code. + * I want to thank Robert Rainwater and George Hazan for their code and support + * and for answering some of my questions during development of this plugin. + */ + +#include "yahoo.h" + +#include "m_addcontact.h" +#include "m_message.h" +#include "m_assocmgr.h" + +#include "resource.h" + +static HANDLE hServiceParseLink; + +static int SingleHexToDecimal(TCHAR c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return -1; +} + +static void url_decode(TCHAR* str) +{ + TCHAR* s = str, *d = str; + + while(*s) + { + if (*s == '%') + { + int digit1 = SingleHexToDecimal(s[1]); + if (digit1 != -1) + { + int digit2 = SingleHexToDecimal(s[2]); + if (digit2 != -1) + { + s += 3; + *d++ = (TCHAR)((digit1 << 4) | digit2); + continue; + } + } + } + *d++ = *s++; + } + + *d = 0; +} + +static char* get_buddy(TCHAR ** arg) +{ + TCHAR *buf = *arg; + + TCHAR *tok = _tcschr(buf, '&'); /* first token */ + if (tok) *tok = 0; + + if (!buf[0]) return NULL; + url_decode(buf); + + *arg = tok ? tok + 1 : NULL; + + return mir_t2a(buf); +} + + +/* + add user: ymsgr:addfriend?ID + send message: ymsgr:sendim?ID&m=MESSAGE + add chatroom: ymsgr:chat?ROOM +*/ +static INT_PTR ServiceParseYmsgrLink(WPARAM wParam, LPARAM lParam) +{ + TCHAR *arg = (TCHAR*)lParam; + if (arg == NULL) return 1; /* sanity check */ + + /* skip leading prefix */ + arg = _tcschr(arg, ':'); + if (arg == NULL) return 1; /* parse failed */ + + for (++arg; *arg == '/'; ++arg) {} + + if (g_instances.getCount() == 0) return 0; + + CYahooProto *proto = g_instances[0]; + for (int i = 0; i < g_instances.getCount(); ++i) + { + if (g_instances[i]->m_iStatus > ID_STATUS_OFFLINE) + { + proto = g_instances[i]; + break; + } + } + if (!proto) return 1; + + /* add a contact to the list */ + if (!_tcsnicmp(arg, _T("addfriend?"), 10)) + { + arg += 10; + + char *id = get_buddy(&arg); + if (!id) return 1; + + if (proto->getbuddyH(id) == NULL) /* does not yet check if id is current user */ + { + ADDCONTACTSTRUCT acs = {0}; + PROTOSEARCHRESULT psr = {0}; + + acs.handleType = HANDLE_SEARCHRESULT; + acs.szProto = proto->m_szModuleName; + acs.psr = &psr; + + psr.cbSize = sizeof(PROTOSEARCHRESULT); + psr.id = (TCHAR*)id; + CallService(MS_ADDCONTACT_SHOW, 0, (LPARAM)&acs); + } + + mir_free(id); + return 0; + } + /* send a message to a contact */ + else if (!_tcsnicmp(arg, _T("sendim?"), 7)) + { + arg += 7; + + char *id = get_buddy(&arg); + if (!id) return 1; + + TCHAR *msg = NULL; + + while (arg) + { + if (!_tcsnicmp(arg, _T("m="), 2)) + { + msg = arg + 2; + url_decode(msg); + break; + } + + arg = _tcschr(arg + 1, '&'); /* first token */ + if (arg) *arg = 0; + } + + HANDLE hContact = proto->add_buddy(id, id, 0, PALF_TEMPORARY); /* ensure contact is on list */ + if (hContact) + CallService(MS_MSG_SENDMESSAGET, (WPARAM)hContact, (LPARAM)msg); + + mir_free(id); + return 0; + } + /* open a chatroom */ + else if (!_tcsnicmp(arg, _T("chat?"), 5)) + { + arg += 5; + +// char *id = get_buddy(&arg); +// if (!id) return 1; + + /* not yet implemented (rm contains name of chatroom)*/ + return 0; + } + return 1; /* parse failed */ +} + +void YmsgrLinksInit(void) +{ + static const char szService[] = "YAHOO/ParseYmsgrLink"; + + hServiceParseLink = CreateServiceFunction(szService, ServiceParseYmsgrLink); + AssocMgr_AddNewUrlTypeT("ymsgr:", TranslateT("YAHOO Link Protocol"), hInstance, IDI_YAHOO, szService, 0); +} + +void YmsgrLinksUninit(void) +{ + DestroyServiceFunction(hServiceParseLink); + CallService(MS_ASSOCMGR_REMOVEURLTYPE, 0, (LPARAM)"ymsgr:"); +} -- cgit v1.2.3