⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventhandler.cpp

📁 Simple Jabber Client for Symbian Platform
💻 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 + -