diff options
Diffstat (limited to 'plugins/variables/parse_metacontacts.cpp')
-rw-r--r-- | plugins/variables/parse_metacontacts.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/plugins/variables/parse_metacontacts.cpp b/plugins/variables/parse_metacontacts.cpp new file mode 100644 index 0000000000..a01142b39c --- /dev/null +++ b/plugins/variables/parse_metacontacts.cpp @@ -0,0 +1,218 @@ +/*
+ Variables Plugin for Miranda-IM (www.miranda-im.org)
+ Copyright 2003-2006 P. Boon
+
+ 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 "variables.h"
+#include "parse_metacontacts.h"
+#include "contact.h"
+
+#include "sdk/m_metacontacts.h"
+
+static TCHAR *parseGetParent(ARGUMENTSINFO *ai)
+{
+ if (ai->argc != 2)
+ return NULL;
+
+ HANDLE hContact = NULL;
+
+ CONTACTSINFO ci = { 0 };
+ ci.cbSize = sizeof(ci);
+ ci.tszContact = ai->targv[1];
+ ci.flags = 0xFFFFFFFF ^ (CI_TCHAR == 0 ? CI_UNICODE : 0);
+ int count = getContactFromString( &ci );
+ if ( count == 1 && ci.hContacts != NULL ) {
+ hContact = ci.hContacts[0];
+ free(ci.hContacts);
+ }
+ else {
+ if (ci.hContacts != NULL)
+ free(ci.hContacts);
+ return NULL;
+ }
+
+ hContact = (HANDLE)CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0);
+ if (hContact == NULL)
+ return NULL;
+
+ TCHAR* res = NULL;
+ TCHAR* szUniqueID = NULL;
+ char* szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if ( szProto != NULL )
+ szUniqueID = getContactInfoT(CNF_UNIQUEID, hContact, 1);
+
+ if ( szUniqueID == NULL ) {
+ szProto = PROTOID_HANDLE;
+ szUniqueID = itot((int)hContact);
+ if ( szProto == NULL || szUniqueID == NULL )
+ return NULL;
+ }
+
+ res = ( TCHAR* )malloc((strlen(szProto) + _tcslen(szUniqueID) + 4)*sizeof(TCHAR));
+ if (res == NULL) {
+ free(szUniqueID);
+ return NULL;
+ }
+
+ TCHAR* tszProto;
+ #ifdef UNICODE
+ tszProto = a2u(szProto);
+ #else
+ tszProto = _strdup(szProto);
+ #endif
+
+ if ( tszProto != NULL && szUniqueID != NULL ) {
+ wsprintf(res, _T("<%s:%s>"), tszProto, szUniqueID);
+ free(szUniqueID);
+ free(tszProto);
+ }
+
+ return res;
+}
+
+static TCHAR *parseGetDefault(ARGUMENTSINFO *ai)
+{
+ if (ai->argc != 2)
+ return NULL;
+
+ HANDLE hContact = NULL;
+
+ CONTACTSINFO ci = { 0 };
+ ci.cbSize = sizeof(ci);
+ ci.tszContact = ai->targv[1];
+ ci.flags = 0xFFFFFFFF ^ (CI_TCHAR == 0 ? CI_UNICODE : 0);
+ int count = getContactFromString( &ci );
+ if ( count == 1 && ci.hContacts != NULL ) {
+ hContact = ci.hContacts[0];
+ free(ci.hContacts);
+ }
+ else {
+ if (ci.hContacts != NULL)
+ free(ci.hContacts);
+ return NULL;
+ }
+
+ hContact = (HANDLE)CallService(MS_MC_GETDEFAULTCONTACT, (WPARAM)hContact, 0);
+ if ( hContact == NULL )
+ return NULL;
+
+ TCHAR* res = NULL;
+ TCHAR* szUniqueID = NULL;
+ char* szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto != NULL)
+ szUniqueID = getContactInfoT(CNF_UNIQUEID, hContact, 1);
+
+ if (szUniqueID == NULL) {
+ szProto = PROTOID_HANDLE;
+ szUniqueID = itot((int)hContact);
+ if ( szProto == NULL || szUniqueID == NULL )
+ return NULL;
+ }
+
+ res = ( TCHAR* )malloc((strlen(szProto) + _tcslen(szUniqueID) + 4)*sizeof(TCHAR));
+ if (res == NULL) {
+ free(szUniqueID);
+ return NULL;
+ }
+
+ TCHAR* tszProto;
+ #ifdef UNICODE
+ tszProto = a2u(szProto);
+ #else
+ tszProto = _strdup(szProto);
+ #endif
+
+ if ( tszProto != NULL && szUniqueID != NULL ) {
+ wsprintf(res, _T("<%s:%s>"), tszProto, szUniqueID);
+ free(szUniqueID);
+ free(tszProto);
+ }
+
+ return res;
+}
+
+static TCHAR *parseGetMostOnline(ARGUMENTSINFO *ai)
+{
+ if (ai->argc != 2)
+ return NULL;
+
+ HANDLE hContact = NULL;
+
+ CONTACTSINFO ci = { 0 };
+ ci.cbSize = sizeof(ci);
+ ci.tszContact = ai->targv[1];
+ ci.flags = 0xFFFFFFFF ^ (CI_TCHAR == 0 ? CI_UNICODE : 0);
+ int count = getContactFromString( &ci );
+ if ( count == 1 && ci.hContacts != NULL ) {
+ hContact = ci.hContacts[0];
+ free( ci.hContacts );
+ }
+ else {
+ if ( ci.hContacts != NULL )
+ free( ci.hContacts );
+ return NULL;
+ }
+
+ hContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT, (WPARAM)hContact, 0);
+ if (hContact == NULL)
+ return NULL;
+
+ TCHAR* res = NULL;
+ TCHAR* szUniqueID = NULL;
+ char* szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto != NULL)
+ szUniqueID = getContactInfoT(CNF_UNIQUEID, hContact, 1);
+
+ if (szUniqueID == NULL) {
+ szProto = PROTOID_HANDLE;
+ szUniqueID = itot((int)hContact);
+ if ( szProto == NULL || szUniqueID == NULL )
+ return NULL;
+ }
+
+ res = ( TCHAR* )malloc((strlen(szProto) + _tcslen(szUniqueID) + 4)*sizeof(TCHAR));
+ if (res == NULL) {
+ free(szUniqueID);
+ return NULL;
+ }
+
+ TCHAR* tszProto;
+ #ifdef UNICODE
+ tszProto = a2u(szProto);
+ #else
+ tszProto = _strdup(szProto);
+ #endif
+
+ if ( tszProto != NULL && szUniqueID != NULL ) {
+ wsprintf(res, _T("<%s:%s>"), tszProto, szUniqueID);
+ free(szUniqueID);
+ free(tszProto);
+ }
+
+ return res;
+}
+
+int registerMetaContactsTokens()
+{
+ if ( ServiceExists( MS_MC_GETPROTOCOLNAME )) {
+ registerIntToken( _T(MC_GETPARENT), parseGetParent, TRF_FUNCTION, "MetaContacts\t(x)\tget parent metacontact of contact x");
+ registerIntToken( _T(MC_GETDEFAULT), parseGetDefault, TRF_FUNCTION, "MetaContacts\t(x)\tget default subcontact x");
+ registerIntToken( _T(MC_GETMOSTONLINE), parseGetMostOnline, TRF_FUNCTION, "MetaContacts\t(x)\tget the 'most online' subcontact x");
+ }
+
+ return 0;
+}
|