From 98d0faa2eeddfe260bd337c69b00734b7cff2375 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sat, 26 Nov 2011 15:54:11 +0000 Subject: added mBot git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@217 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- mBot/src/mbot/functions/mb_contact.cpp | 518 +++++++++++++++++++++++++++++++++ 1 file changed, 518 insertions(+) create mode 100644 mBot/src/mbot/functions/mb_contact.cpp (limited to 'mBot/src/mbot/functions/mb_contact.cpp') diff --git a/mBot/src/mbot/functions/mb_contact.cpp b/mBot/src/mbot/functions/mb_contact.cpp new file mode 100644 index 0000000..6156936 --- /dev/null +++ b/mBot/src/mbot/functions/mb_contact.cpp @@ -0,0 +1,518 @@ +/* + +Miranda Scripting Plugin for Miranda-IM +Copyright 2004-2006 Piotr Pawluczuk (www.pawluczuk.info) + +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 "../functions.h" + +ZEND_FUNCTION(mb_CIsOnList) +{ + long cid=0; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || cid==0){ + PHP_FALSE_AND_ERROR; + } + RETURN_LONG(DBGetContactSettingByte((HANDLE)cid,"CList","NotOnList",0)==FALSE); +} + +ZEND_FUNCTION(mb_CSendTypingInfo) +{ + long cid=0; + char on=0; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lb",&cid,&on) == FAILURE || cid==0){ + PHP_FALSE_AND_ERROR; + } + + RETURN_LONG(CallContactService((HANDLE)cid,PSS_USERISTYPING,(WPARAM)cid,on)==0); +} + +ZEND_FUNCTION(mb_CGetStatus) +{ + long cid = 0; + char* proto = NULL; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || !cid){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + proto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)cid,0); + if(!proto){ + RETURN_FALSE; + } + + cid = DBGetContactSettingWord((HANDLE)cid,proto,"Status",0); + RETURN_LONG(cid); +} + +ZEND_FUNCTION(mb_CGetProto) +{ + long cid = 0; + char* proto = NULL; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || !cid){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + proto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)cid,0); + if(proto){ + RETURN_STRING(proto,1); + }else{ + RETURN_FALSE; + } +} + +ZEND_FUNCTION(mb_CDelete) +{ + long cid=0; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || !cid) + { + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + RETURN_LONG(CallService(MS_DB_CONTACT_DELETE,(WPARAM)cid,0)==0); +} + +ZEND_FUNCTION(mb_CGetDisplayName) +{ + long cid=0; + char* tmp=NULL; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || !cid) + { + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + tmp = (char*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)cid,0); + if(tmp){ + RETURN_STRING(tmp,1); + }else{ + RETURN_FALSE; + } +} + +ZEND_FUNCTION(mb_CGetAwayMsg) +{ + long cid=0; + zval *cb; + char *proto; + mb_event* mbe = (mb_event*)(((sPHPENV*)SG(server_context))->c_param); + sACKSync* ack; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz",&cid,&cb)==FAILURE || cid==0 || cb->type != IS_STRING){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + if(!zend_is_callable(cb,0,NULL)){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + if(!(proto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,cid,0))){ + RETURN_FALSE; + } + + ack = (sACKSync*)my_malloc(sizeof(sACKSync)); + if(!ack){RETURN_FALSE} + memset(ack,0,sizeof(sACKSync)); + + if(!(ack->php = mbe->php))goto Error; + sman_incref(ack->php); + + ack->lType = ACKTYPE_AWAYMSG; + ack->hContact = (HANDLE)cid; + + strncpy(ack->pszFunction,cb->value.str.val,sizeof(ack->pszFunction)-1); + strncpy(ack->pszProtocol,proto,15); + + if(!g_slist.Add(ack)){goto Error;} + + ack->hProcess = (HANDLE)CallContactService((HANDLE)cid,PSS_GETAWAYMSG,0,0); + if(!ack->hProcess){ + g_slist.Del(ack); + goto Error; + } + RETURN_LONG(1); +Error: + if(ack->php)sman_decref(ack->php); + if(ack)my_memfree(ack); + RETURN_FALSE; +} + +int xx_enumcsettings(const char *szSetting,LPARAM lParam) +{ + cutMemf* mf = (cutMemf*)lParam; + if(*szSetting){ + mf->write((void*)szSetting, strlen(szSetting)+1); + } + return 0; +} + +ZEND_FUNCTION(mb_CSettingEnum) +{ + DBCONTACTENUMSETTINGS ecs = {0}; + cutMemf mf; + long cid=0,ml=0; + char* mod=NULL; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls",&cid,&mod,&ml) == FAILURE || !mod || !ml){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + if(!mf.create(2048)){ + RETURN_FALSE; + } + + ecs.pfnEnumProc = xx_enumcsettings; + ecs.szModule = mod; + ecs.lParam = (LPARAM)&mf; + + if(CallService(MS_DB_CONTACT_ENUMSETTINGS,cid,(LPARAM)&ecs)!=0){ + RETURN_FALSE; + } + mf.putc(0); + if(array_init(return_value)==FAILURE){ + RETURN_FALSE; + } + + mod = (char*)mf.getdata(); + ml = 0; + while(*mod) + { + add_index_string(return_value,ml,mod,1); + mod = mod + strlen(mod) + 1; + ml++; + } + mf.close(); + return; +} + +ZEND_FUNCTION(mb_CSetApparentMode) +{ + long cid=0,mode=0; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll",&cid,&mode) == FAILURE || !cid){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + RETURN_LONG(CallContactService((HANDLE)cid,PSS_SETAPPARENTMODE,mode,0)==0); +} +ZEND_FUNCTION(mb_CAddNew) +{ + RETURN_LONG(CallService(MS_DB_CONTACT_ADD,0,0)); +} +ZEND_FUNCTION(mb_CAddAuth) +{ + long aid=0; + DBEVENTINFO dbei={0}; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&aid) == FAILURE || !aid){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + dbei.cbSize = sizeof(dbei); + + if(CallService(MS_DB_EVENT_GET,(WPARAM)aid,(LPARAM)&dbei)!=0){ + RETURN_FALSE; + } + RETURN_LONG(CallProtoService(dbei.szModule,PS_ADDTOLISTBYEVENT,0,(LPARAM)aid)); +} +ZEND_FUNCTION(mb_CAddSearch) +{ + //MBT_SRESULT + mb_event* mbe = (mb_event*)(((sPHPENV*)SG(server_context))->c_param); + if(mbe->event != MBT_CALLBACK || mbe->t3 != MBE_SRESULT) + { + //PHPWARN(); + RETURN_FALSE; + } + else + { + PROTOSEARCHRESULT* sr = (PROTOSEARCHRESULT*)mbe->p3; + ACKDATA* ack = (ACKDATA*)mbe->p2; + + RETURN_LONG(CallProtoService(ack->szModule,PS_ADDTOLIST,0,(LPARAM)sr)); + } +} +ZEND_FUNCTION(mb_CGetInfo) +{ + long cid=0,cf=0; + CONTACTINFO ci={0}; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll",&cid,&cf) == FAILURE || !cid){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + if(cf < 1 || cf > 17){ + RETURN_FALSE; + } + + ci.cbSize = sizeof(ci); + ci.dwFlag = (BYTE)((0xFF)& cf); + ci.hContact = (HANDLE)cid; + ci.szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)cid,0); + + cid = CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci); + + if(cid == 0) + { + if(ci.type == CNFT_ASCIIZ){ + RETURN_STRING(ci.pszVal,1); + }else if(ci.type == CNFT_BYTE){ + RETURN_LONG(ci.bVal); + }else if(ci.type == CNFT_WORD){ + RETURN_LONG(ci.wVal); + }else{ + RETURN_LONG(ci.dVal); + } + + if(cf >= 16) + { + MM_INTERFACE mmi={0}; + mmi.cbSize = sizeof(mmi); + CallService(MS_SYSTEM_GET_MMI,0,(LPARAM)&mmi); + mmi.mmi_free((void*)ci.pszVal); + } + return; + }else{ + RETURN_FALSE; + } +} +ZEND_FUNCTION(mb_CGetUIN) +{ + long cid = 0; + char* proto = NULL; + char* uin = NULL; + DBVARIANT dbv; + DBCONTACTGETSETTING cgs; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || cid==0){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + proto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)cid,0); + if(!proto){ + RETURN_FALSE; + } + uin = (char*)CallProtoService(proto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); + if(!uin){ + RETURN_FALSE; + } + + cgs.szModule=proto; + cgs.szSetting=uin; + cgs.pValue=&dbv; + if(CallService(MS_DB_CONTACT_GETSETTING,(WPARAM)cid,(LPARAM)&cgs)){ + RETURN_FALSE; + } + + if(dbv.type==DBVT_BYTE){ + RETVAL_LONG(dbv.bVal); + }else if(dbv.type==DBVT_WORD){ + RETVAL_LONG(dbv.wVal); + }else if(dbv.type==DBVT_DWORD){ + RETVAL_LONG(dbv.dVal); + }else if(dbv.type==DBVT_ASCIIZ){ + RETVAL_STRING(dbv.pszVal,1); + }else if(dbv.type==DBVT_BLOB){ + RETVAL_STRINGL((char*)dbv.pbVal,dbv.cpbVal,1) + }else{ + RETVAL_FALSE; + } + DBFreeVariant(&dbv); + return; +} + +ZEND_FUNCTION(mb_CSettingGet) +{ + char* setting = NULL; + char* module = NULL; + long cid=0,sl=0,ml=0; + DBVARIANT dbv; + DBCONTACTGETSETTING cgs; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss",&cid,&module,&ml,&setting,&sl) == FAILURE || !sl || !ml){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + cgs.szModule=module; + cgs.szSetting=setting; + cgs.pValue=&dbv; + + if(CallService(MS_DB_CONTACT_GETSETTING,(WPARAM)cid,(LPARAM)&cgs)){ + RETURN_FALSE; + } + + if(dbv.type==DBVT_BYTE){ + RETVAL_LONG(dbv.bVal); + }else if(dbv.type==DBVT_WORD){ + RETVAL_LONG(dbv.wVal); + }else if(dbv.type==DBVT_DWORD){ + RETVAL_LONG(dbv.dVal); + }else if(dbv.type==DBVT_ASCIIZ){ + RETVAL_STRING(dbv.pszVal,1); + }else if(dbv.type==DBVT_BLOB){ + RETVAL_STRINGL((char*)dbv.pbVal,dbv.cpbVal,1) + }else{ + RETVAL_FALSE; + } + DBFreeVariant(&dbv); +} +ZEND_FUNCTION(mb_CSettingDel) +{ + char* setting = NULL; + char* module = NULL; + long cid=0,sl=0,ml=0; + DBVARIANT dbv={0}; + DBCONTACTGETSETTING cgs; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss",&cid,&module,&ml,&setting,&sl) == FAILURE || !sl || !ml){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + }else{ + //MBT_CSCHANGED + mb_event* mbe = (mb_event*)(((sPHPENV*)SG(server_context))->c_param); + if(mbe->event == MBT_CSCHANGED && strcmp(setting,"Status")==0){ + RETURN_FALSE; + } + } + + cgs.szModule=module; + cgs.szSetting=setting; + cgs.pValue=&dbv; + + RETURN_LONG(DBDeleteContactSetting((HANDLE)cid,module,setting)==0); +} + + +ZEND_FUNCTION(mb_CSettingSet) +{ + char* setting = NULL; + char* module = NULL; + char* value = NULL; + char buf[32]={0}; + long cid=0,sl=0,ml=0,vl=0; + DBVARIANT dbv ={0}; + DBCONTACTGETSETTING cgs; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsss",&cid,&module,&ml,&setting,&sl,&value,&vl) == FAILURE || + !sl || !ml || !value){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + }else{ + //MBT_CSCHANGED + mb_event* mbe = (mb_event*)(((sPHPENV*)SG(server_context))->c_param); + if(mbe->event == MBT_CSCHANGED && strcmp(setting,"Status")==0){ + RETURN_FALSE; + } + } + + + cgs.szModule = module; + cgs.szSetting = setting; + cgs.pValue = &dbv; + + dbv.type = DBVT_ASCIIZ; + dbv.pszVal = (char*)buf; + dbv.cchVal = sizeof(buf); + + if(CallService(MS_DB_CONTACT_GETSETTINGSTATIC,(WPARAM)cid,(LPARAM)&cgs)){ + RETURN_FALSE; + } + + if(dbv.type==DBVT_BYTE){ + RETVAL_LONG(DBWriteContactSettingByte((HANDLE)cid,module,setting,(BYTE)(strtoul(value,NULL,0)&0xff))==FALSE); + }else if(dbv.type==DBVT_WORD){ + RETVAL_LONG(DBWriteContactSettingWord((HANDLE)cid,module,setting,(WORD)(strtoul(value,NULL,0)&0xffff))==FALSE); + }else if(dbv.type==DBVT_DWORD){ + RETVAL_LONG(DBWriteContactSettingDword((HANDLE)cid,module,setting,(DWORD)(strtoul(value,NULL,0)))==FALSE); + }else if(dbv.type==DBVT_ASCIIZ){ + RETVAL_LONG(DBWriteContactSettingString((HANDLE)cid,module,setting,value)==FALSE) + }else if(dbv.type==DBVT_BLOB){ + DBCONTACTWRITESETTING cws; + cws.szModule=module; + cws.szSetting = mbot_replace_with_our_own(setting); + cws.value.type=DBVT_BLOB; + cws.value.pbVal=(BYTE*)value; + cws.value.cpbVal = (WORD)(vl&0x00ffff); + RETVAL_LONG(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)cid,(LPARAM)&cws)==FALSE); + }else{ + RETVAL_FALSE; + } +} + +ZEND_FUNCTION(mb_CSettingAdd) +{ + char* setting = NULL; + char* module = NULL; + char* value = NULL; + char buf[32]={0}; + long cid=0,sl=0,ml=0,vl=0,type=0; + DBVARIANT dbv ={0}; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lslss",&cid,&module,&ml,&type,&setting,&sl,&value,&vl) == FAILURE || + !sl || !ml || !value){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + }else{ + //MBT_CSCHANGED + mb_event* mbe = (mb_event*)(((sPHPENV*)SG(server_context))->c_param); + if(mbe->event == MBT_CSCHANGED && strcmp(setting,"Status")==0){ + RETURN_FALSE; + } + } + + if(type==DBVT_BYTE){ + RETVAL_LONG(DBWriteContactSettingByte((HANDLE)cid,module,setting,(BYTE)(strtoul(value,NULL,0)&0xff))==FALSE); + }else if(type==DBVT_WORD){ + RETVAL_LONG(DBWriteContactSettingWord((HANDLE)cid,module,setting,(WORD)(strtoul(value,NULL,0)&0xffff))==FALSE); + }else if(type==DBVT_DWORD){ + RETVAL_LONG(DBWriteContactSettingDword((HANDLE)cid,module,setting,(DWORD)(strtoul(value,NULL,0)))==FALSE); + }else if(type==DBVT_ASCIIZ){ + RETVAL_LONG(DBWriteContactSettingString((HANDLE)cid,module,setting,value)==FALSE) + }else if(type==DBVT_BLOB){ + DBCONTACTWRITESETTING cws; + cws.szModule=module; + cws.szSetting = mbot_replace_with_our_own(setting); + cws.value.type=DBVT_BLOB; + cws.value.pbVal=(BYTE*)value; + cws.value.cpbVal = (WORD)(vl&0x00ffff); + RETVAL_LONG(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)cid,(LPARAM)&cws)==FALSE); + }else{ + RETVAL_FALSE; + } +} + +ZEND_FUNCTION(mb_CFindFirst) +{ + long cid = CallService(MS_DB_CONTACT_FINDFIRST,0,0); + RETURN_LONG(cid); +} +ZEND_FUNCTION(mb_CFindNext) +{ + long cid = 0; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&cid) == FAILURE || cid==NULL){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + cid = CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)cid,0); + RETURN_LONG(cid); +} +ZEND_FUNCTION(mb_CFindByUIN) +{ + char* proto=NULL; + long pl=0; + zval* uin; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz",&proto,&pl,&uin) == FAILURE || !pl){ + PHP_FALSE_AND_WARNS(PHP_WARN_INVALID_PARAMS); + } + + if(uin->type == IS_STRING){ + RETURN_LONG((long)help_find_by_uin(proto,uin->value.str.val,0)); + }else if(uin->type == IS_LONG){ + RETURN_LONG((long)help_find_by_uin(proto,(const char*)uin->value.lval,1)); + }else{ + RETURN_FALSE; + } +} \ No newline at end of file -- cgit v1.2.3