📄 eventhandler.cpp
字号:
/*
* 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.
*
* Jabber
* Copyright (C) 2004 Xie Tian Lu http://sabber.jabberstudio.org/
*/
#include "SabberAppUi.h"
#include "eventhandler.h"
#include "xmlnodeutil.h"
#include "roster.h"
#include "ftrans.h"
#include "osdlg.h"
#include <Sabber.rsg>
#define STR_DEFAULT_GROUP "Unfiled"
#define M_RETRIVE_UI() Globaldata* gdata = ( Globaldata* )j->global; \
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
int jabber_parse_send_list( char* str, char* list[], int begin, int end )
{
int idx;
char* sub;
if ( !str )
return begin;
for ( idx = begin; idx < end; idx++ ) {
sub = strstr( str, ";" );
if ( !sub )
break;
list[ idx ] = sub + 1;
str = sub;
}
return idx;
}
void jconn_state_handler ( jconn j, int state )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
pUi->SetCurState( state );
}
int jabber_err_event_handler( jconn j, jpacket p )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
char* result = xmlnode2str( p->x );
if ( !p )
return 0;
//get error code
xmlnode c = xmlnode_get_tag( p->x, "error" );
char* estr;
int ecode;
if ( c ) {
estr = xmlnode_get_attrib( c, "code" );
if ( estr )
ecode = atoi( estr );
//char* cont = xmlnode_get_tag_data( c );
}
switch(ecode){
case 407:
//pUi->UnRegisterMsn();
//pUi->LogonMsn();
break;
case 406:
//SYS_TRACE1(0,"Not Acceptable!");
break;
case 408:
//SYS_TRACE1(0,"Request Timeout!");
break;
case 404:
//SYS_TRACE1(0,"User Not Found!");
break;
case 502:
//SYS_TRACE1(0,"Remote Server Error!");
break;
default:
break;
}
if ( !p->iqns )
return 0;
if ( 0 == strcmp( p->iqns, NS_AUTH ) )
{
pUi->LogonFailed();
}
else if ( 0 == strcmp( NS_REGISTER, p->iqns ) )
{
char* xml = xmlnode2str(p->x);
char* from = xmlnode_get_attrib( p->x, "from" );
pUi->RegisterFailed();
}
return 0;
}
int jabber_subscribe_handler( jconn j, jpacket p )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
char* from = xmlnode_get_attrib( p->x, "from" );
//Subscribe From Others;
if (ShowQueryDialogL(from, R_BUF_SUBSCRIBE_FROM_OTHERS)){
jabr_response_subscribe( j, from, 1 );
char jid[30];
strcpy(jid,from);
char nick[30];
strcpy(nick,jid);
char* c;
if ( c=strstr(nick,"@") )
*c=0;
//jabr_subscribe_friend(j, from, 1 );
jabr_set_item( j, jid, nick, STR_DEFAULT_GROUP );
xmlnode getroster;
getroster = jutil_iqnew(JPACKET__GET, NS_ROSTER);
jab_send(j,getroster);
}else{
jabr_response_subscribe( j, from, 0 );
}
return 0;
}
int jabber_set_event_handler( jconn j, jpacket p )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
char* xml = xmlnode2str( p->x );
if ( !p || !p->iqns )
return 0;
if ( 0 == strcmp( NS_ROSTER, p->iqns ) ) {
xmlnode x = xmlnode_find_subitem( p->x, "item" );
while ( x ) {
char* jid = xmlnode_get_attrib( x, "jid" );
char* nick = xmlnode_get_attrib( x, "name" );
char* subs = xmlnode_get_attrib( x, "subscription" );
char* group = 0;
xmlnode c = xmlnode_get_tag( x, "group" );
if ( c )
group = xmlnode_get_data( c );
pUi->RecvRoster( jid, nick, group, subs );
x = xmlnode_get_nextsibling( x );
}
}
return 0;
}
int jabber_result_event_handler( jconn j, jpacket p)
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
int state = pUi->GetCurState();
char* xml = xmlnode2str( p->x );
if ( state == JCONN_STATE_ON )
{
pUi->GetAuthorized();
}
else if ( state == CON_STATE_ADDITEM )
{
pUi->ChangePresence( CS_ONLINE );
}
else if( state == CON_STATE_REMOVEITEM )
{
pUi->ChangePresence( CS_ONLINE );
}
else if( p && p->iqns && 0 == strcmp( NS_ROSTER, p->iqns ) )
{
xmlnode x = xmlnode_find_subitem( p->x, "item" );
char* xml = xmlnode2str( p->x );
while ( x ) {
char* jid = xmlnode_get_attrib( x, "jid" );
char* nick = xmlnode_get_attrib( x, "name" );
char* subs = xmlnode_get_attrib( x, "subscription" );
char* group = 0;
xmlnode c = xmlnode_get_tag( x, "group" );
if ( c )
group = xmlnode_get_data( c );
pUi->RecvRoster( jid, nick, group, subs );
x = xmlnode_get_nextsibling( x );
}
}
else if ( p && p->iqns && 0 == strcmp( NS_REGISTER, p->iqns ) )
{
}
return 0;
}
void jabber_none_event_handler( jconn j, jpacket p )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
char* from = xmlnode_get_attrib( p->x, "from" );
char* to = xmlnode_get_attrib( p->x, "to" );
char* list = xmlnode_get_attrib( p->x, "list" );
xmlnode x = xmlnode_get_tag ( p->x, "body");
char* body = xmlnode_get_data( x );
switch ( p->type ) {
case JPACKET_MESSAGE:
if ( from ) {
}
break;
}
}
void jconn_packet_handler( jconn j, jpacket p )
{
Globaldata* gdata = ( Globaldata* )j->global;
CSabberAppUi* pUi = ( CSabberAppUi* )gdata->_ui;
char* xml = xmlnode2str( p->x );
switch ( jpacket_subtype( p ) )
{
case JPACKET__CHAT:
{
// in future version, multi to field will be supported
char* from = xmlnode_get_attrib( p->x, "from" );
char* to = xmlnode_get_attrib( p->x, "to" );
xmlnode x = xmlnode_get_tag ( p->x, "body" );
char* body = xmlnode_get_data ( x );
pUi->RecvMsg( body, from, to );
}
break;
case JPACKET__RESULT:
{
jabber_result_event_handler( j, p );
}
break;
case JPACKET__UNKNOWN:
break;
case JPACKET__NONE:
jabber_none_event_handler( j, p );
break;
case JPACKET__ERROR:
{
if ( pUi->GetCurState() == JCONN_STATE_AUTH )
{
pUi->SetCurState( CON_STATE_DISCONNECTED );
}
else
{
//char* body = jpacket_get_body( p );
jabber_err_event_handler( j, p );
}
}
break;
case JPACKET__GROUPCHAT:
break;
case JPACKET__GET:
jabber_set_event_handler( j, p );
break;
case JPACKET__SET:
jabber_set_event_handler( j, p );
break;
case JPACKET__SUBSCRIBE:
{
jabber_subscribe_handler( j, p );
}
break;
case JPACKET__SUBSCRIBED:
break;
case JPACKET__UNSUBSCRIBE:
break;
case JPACKET__UNSUBSCRIBED:
break;
case JPACKET__AVAILABLE:
{
char* from = xmlnode_get_attrib( p->x, "from" );
xmlnode x = xmlnode_get_tag( p->x, "show" );
char* show = xmlnode_get_data( x );
x = xmlnode_get_tag( p->x, "status" );
char* status = xmlnode_get_data( x );
pUi->RecvPresence( from, show, status );
}
break;
case JPACKET__UNAVAILABLE:
{
char* from = xmlnode_get_attrib( p->x, "from" );
pUi->RecvPresence( from, 0, 0, 0 );
}
break;
case JPACKET__PROBE:
break;
case JPACKET__HEADLINE:
break;
default:
break;
}
//jpacket_reset( p );
xmlnode_free( j->current );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -