diff options
Diffstat (limited to 'mBot/src/mbot/functions/mb_contact.cpp')
-rw-r--r-- | mBot/src/mbot/functions/mb_contact.cpp | 518 |
1 files changed, 518 insertions, 0 deletions
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 |