# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1265065806 -7200 # Node ID d0f3a028347adffe6a49a8440a161482ec6819e3 Revision: 201003 Kit: 201005 diff -r 000000000000 -r d0f3a028347a group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: constant declaration class + * + * +*/ +// Project configuration file for dbus + +// Project platforms +PRJ_PLATFORMS +WINSCW ARMV5 + + +// Project exports +PRJ_EXPORTS + +// MMP files for project components +PRJ_MMPFILES +#include "../opensrv_plat/group/bld.inf" +#include "../loudmouth/group/bld.inf" +#include "../libtelepathy/group/bld.inf" +#include "../telepathygabble/group/bld.inf" +#include "../isolationserver/group/bld.inf" + + +PRJ_TESTMMPFILES + diff -r 000000000000 -r d0f3a028347a isolationserver/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +/* +* ============================================================================ +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include + +PRJ_PLATFORMS +WINSCW ARMV5 + + +PRJ_EXPORTS +../rom/isoserver.iby CORE_MW_LAYER_IBY_EXPORT_PATH(isoserver.iby) + +PRJ_MMPFILES + + +#include "../messagequeue/group/bld.inf" +#include "../isoserver/group/bld.inf" + + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/install/isolationserver.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/install/isolationserver.pkg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,60 @@ +; +; ============================================================================ +; Name : isoserver.iby +; Part of : isolation server. +; Version : %version: % +; +; Copyright © 2007-2008 Nokia. All rights reserved. +; All rights reserved. +; Redistribution and use in source and binary forms, with or without modification, +; are permitted provided that the following conditions are met: +; Redistributions of source code must retain the above copyright notice, this list +; of conditions and the following disclaimer.Redistributions in binary form must +; reproduce the above copyright notice, this list of conditions and the following +; disclaimer in the documentation and/or other materials provided with the distribution. +; Neither the name of the Nokia Corporation nor the names of its contributors may be used +; to endorse or promote products derived from this software without specific prior written +; permission. +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +; SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +; OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; ============================================================================ +; Template version: 1.0 +; + + + +;Language - standard language definitions +&EN + +; standard SIS file header +#{"MessageQueueClient"},(0xA0001320),1,0,0 + +;Localised Vendor name +%{"Vendor-EN"} + +;Unique Vendor name +:"Vendor" + +;Supports Series 60 v 3.0 +[0x101F7961], 0, 0, 0, {"S60ProductID"} + +;Files to install +"\epoc32\release\armv5\urel\messagequeueclient.exe" -"!:\sys\bin\messagequeueclient.exe" +"\epoc32\release\armv5\urel\messagequeuelibrary.dll" -"!:\sys\bin\messagequeuelibrary.dll" + +"\epoc32\data\z\private\10003a3f\import\apps\opencmessagequeueclient_reg.rsc" -"!:\private\10003a3f\import\apps\opencmessagequeueclient_reg.rsc" + +;required for application to be covered by backup/restore facility +;"backup_registration.xml" -"c:\private\0xA0001320\backup_registration.xml" + +"\epoc32\release\armv5\urel\isoserver.exe" - "!:\sys\bin\isoserver.exe" + +"\epoc32\release\armv5\urel\opencstringutilitieslibex.dll" - "!:\sys\bin\opencstringutilitieslibex.dll" + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/data/isoServer_reg.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/data/isoServer_reg.rss Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* +* ============================================================================ +* Name : isoServer_reg.rss +* Part of : isolation server. +* Version : %version: 2 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include + +UID2 KUidAppRegistrationResourceFile +UID3 0xA0001320 + +RESOURCE APP_REGISTRATION_INFO + { + app_file="OpenCMessageQueueClient"; + + embeddability=KAppNotEmbeddable; + newfile=KAppDoesNotSupportNewFile; + } + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* +* ============================================================================ +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +PRJ_PLATFORMS +WINSCW ARMV5 + +#include + +PRJ_EXPORTS + +PRJ_MMPFILES +isoserver.mmp + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/group/isoserver.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/group/isoserver.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,77 @@ +/* +* ============================================================================ +* +* Copyright © 2007-2008 Nokia and/or its subsidiary/subsidiaries. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ +#include +TARGET isoserver.exe +TARGETTYPE EXE +UID 0x100039CE 0x2001241A //0x100039CE + +CAPABILITY All -Tcb + +VENDORID VID_DEFAULT +EPOCSTACKSIZE 0x13880 // 0x11170 0x15F90 + +VERSION 10.0 + +SOURCEPATH ../src +SOURCE isoservermain.c +SOURCE isoconnectionmanager.c +SOURCE isofetchcontactlist.c +SOURCE isoim.c +SOURCE isoutils.c +SOURCE isomodifycontactlist.c +SOURCE isopresence.c +SOURCE isosearch.c +SOURCE isogetsearchkeys.c +SOURCE isoavtar.c +MACRO SYMBIAN +USERINCLUDE ../inc + +EPOCALLOWDLLDATA + +USERINCLUDE ../../../libtelepathy/inc +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE + +STATICLIBRARY libcrt0.lib +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libglib.lib +LIBRARY libgthread.lib +LIBRARY libdbus-glib.lib +LIBRARY libtelepathy.lib +LIBRARY libgobject.lib +LIBRARY libdbus.lib +LIBRARY libpthread.lib +LIBRARY opencmessagequeuelibrary.lib + +LANG SC + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isoavtar.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isoavtar.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,115 @@ +/* +* ============================================================================ +* Name : isoconnectionmanager.h +* Part of : isolation server. +* Version : %version: 5 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +/*! +* \def To avoid multiple inclusion of header +*/ + +#ifndef __ISOAVTAR_H__ +#define __ISOAVTAR_H__ + +#include +#include + +#include "isoservermain.h" +#include "msg_enums.h" + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-props-iface.h" +#include "tp-conn-iface-avatars-gen.h" +#include "tp-interfaces.h" +G_BEGIN_DECLS + +/*! \file +* This file has interfaces for avtar implimentation. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + + +/*! \brief callback for updating own avtar. This function + * sends response to client + * + * \param proxy : unused + * \param avatar_sha1: token string + * \param error : error if any + * \param message : message header + * \return : void + */ +void update_avtar_cb(DBusGProxy *proxy, char* avatar_sha1, + GError* error, + gpointer message); + + +/*! \brief sends avtar of the client to n/w server thru' gabble + * calls tp_conn_iface_avatars_set_avatar_async to set avatar + * + * \param avtarcontent : avatar image content + * \param mimetype : mime type + * \param msghdr request header that will be passed back to client + * + * \return : error code on failure, 0 on success + */ +gint send_avtar( GArray* avtarcontent , char * mimetype , message_hdr_req *msg_hdr ); + +/*! \brief callback for clearing own avtar. This function + * sends response to client + * + * \param proxy : unused + * \param error : error if any + * \param userdata : message header + * \return : void + */ +void clear_avtar_cb( DBusGProxy *proxy, GError* error, gpointer userdata ); + +/*! \brief clears the self avtar + * + * \param msghdr request header that will be passed back to client + * + * \return : error code on failure, 0 on success + */ +gint clear_avatar( message_hdr_req *msg_hdr ); + +/*! \brief clears the self avtar + * \param rmsg : message buffer to be parsed + * \param msg_struct : request header + * \param result : message buffer length + * \param avtarcontent : pointer to the avatar image data + * + * \return : error code on failure, 0 on success + */ +gint update_own_avatar(char* rmsg,message_hdr_resp* msg_struct,gint result, GArray** avtarcontent); + +G_END_DECLS + + +#endif //__ISOAVTAR_H__ diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isoconnectionmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isoconnectionmanager.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,171 @@ +/* +* ============================================================================ +* Name : isoconnectionmanager.h +* Part of : isolation server. +* Version : %version: 9 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* \def To avoid multiple inclusion of header +*/ + +#ifndef __ICONNECTIONMANAGER_H__ +#define __ICONNECTIONMANAGER_H__ + +#include +#include +#include "isoservermain.h" +# include "msg_enums.h" + +#ifdef __WINSCW__ +/*! \remark Should LOGIN_ARG_COUNT this be hardcoded ? +*/ +#define LOGIN_ARG_COUNT 12 +#else +#define LOGIN_ARG_COUNT 10 +#endif + +/*! \file +* Connection related interfaces. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + +/*! \typedef struct login_struct typedefed to login_struct +*/ +typedef struct login_struct login_struct; + +/*! \struct login_struct isoconnectionmanager.h + * \brief Buffer recieved from client for login request is parsed and the + * arguments are put into this structure + * \param hdr_req header request + * \param strs array of strings( which are arguments for login ) + */ +struct login_struct + { + message_hdr_req* hdr_req; + char *strs[LOGIN_ARG_COUNT]; + }; + +/*! \brief This does things after login is successful. Now it sets the isConnected + * variable to ETrue + */ +void action_logedin( ) ; + +/*! \brief This function is registered in action_login for statuschanged signal. + * This function is called by telepathygabble when the status of the user changes + * Once user is connected this function registers for NewChannel signal with telepathygabble + * client is also informed of the status change.. + * + * \param proxy + * \param status status of the user ( connected/connecting/disconnected ) + * \param reason reason for status change(server disconnected/ user requested etc.,) + * \param user_data message header request + * + * \return : Boolean True on success, false on failure + */ + +static gboolean status_changed_cb(DBusGProxy *proxy, + guint status, guint reason, + gpointer user_data) ; + +/*! \brief new_channel_handler is registered as a callback for any new + * channels craetion request, in function status_changed_cb after status is changed + * to log in. new_channel_handler creates channel and also registers for the signals + * MembersChanged for contact related channels and Recieved and SendError for IM + * related channels. + * + * \param proxy unused + * \param object_path object path of the channel + * \param channel_type used to get a new channel + * \param handle_type used to get a new channel, channel handle type + * \param handle used to get a new channel, channel handle + * \param suppress_handler unused + * \param user_data unused + * + * \return void + */ + +static void new_channel_handler( DBusGProxy *proxy, const char *object_path, + const char *channel_type, guint handle_type, + guint handle, gboolean suppress_handler, + gpointer user_data ) ; + + +/*! \brief Is called after logout.. Any cleanup operations to + * be performed here. Setting conn_stat to disconnected, cleaning up + * of resources is done + */ +void action_logedout() ; + +/*! \brief Callback for the logout + * + * \param proxy : unused + * \param error : unused + * \param userdata : unused + * \return : void + */ +void logout_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + +/*! \brief requests for closing of session. Also closes the search channel. + * \remark should not close the search channel + * + * Request for log - out + * \param pc - message which has the request header + * \return : MEM_ALLOCATION_ERROR or 0 + */ +int action_logout( char* pc ) ; + +/*! \brief validates params, gets a dbus, creates a connection manager, + * and connection. Registers for the statuschange + * + * \param ls_hdr login struct + * \return Errors if invalid param or getting dbus, conn mgr or conn fails else 0 + */ +gint action_login( login_struct* ls_hdr ) ; + +/*! \brief parses the message buffer and validates the parameters. The values are written + * to ls_hdr + * + * \param aMsgBuffer - buf to be parsed + * \param ls_hdr - login_struct struct to which values are written + * \param msg_len - no. of bytes in the message buffer aMsgBuffer + * + */ +gint parse_for_login( gchar* aMsgBuffer, login_struct** ls_hdr, int msg_len ) ; + +/*! \brief Calls parse_for_login to parse and validate the arguments + * And then calls action_login for to do actual login + * + * \param aMsgBuf message buffer + * \param msg_len - len of the message + */ +gint action_parse_login( char* aMsgBuf, int msg_len ) ; + + + +#endif //__ICONNECTIONMANAGER_H__ + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isofetchcontactlist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isofetchcontactlist.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,159 @@ + +/* ============================================================================ +* Name : isofetchcontactlist.h +* Part of : isolation server. +* Version : %version: 9 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + + +/*! +* \def To avoid multiple inclusion of header +*/ +#ifndef __IFETCHCONTACTLIST_H__ +#define __IFETCHCONTACTLIST_H__ + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include "isoim.h" + +/*! \file +* Interfaces for fetching of contacts. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + +/*! \enum channel_type + * type of the channel + */ +enum channel_type + { + ESubscribe_Channel, + EPublish_Channel + }; + +/*! \brief This function is called as a callback to get the contact names from + * contact handles. Contact names are sent to client in multiple packets of + * size MAX_MSG_SIZE + * + * \param proxy unused + * \param handles_names 2D array of contact names + * \param error error if any + * \param userdata msg_type + */ +static void inspect_handles_cb( DBusGProxy *proxy,char **handles_names, + GError *error, gpointer userdata ) ; + + +/*! \brief This function is called if there are 0 contacts or there was an error + * + * \param contact_type : Type of the contacts + * \param err : err if any, 0 otherwise + */ +static gint send_fetch_contacts_error( gint contact_type , gint err ); + +/*! \brief This function is a callback for request for the contacts + * in local pending contatct list from server. This is + * only called for publish channel members. fetch_contacts is called + * to get the contact names from the handles. If there are no conatcts in + * the list it calls send_fetch_contacts_error else requests for the contact names + * from the contact handles + * + * \param proxy unused + * \param current_members array of handles of current contatcs + * \param local_pending_members unused + * \param remote_pending_members array of handles of remote pending contatcs + * \param error error if any + * \param userdata unused + */ +static void get_roster_local_member_cb( DBusGProxy *proxy,GArray* current_members, + GArray* local_pending_members, GArray* remote_pending_members, + GError *error, gpointer userdata ); + +/*! \brief Requests the server to get contact names from the handles + * The contact names are returned in inspect_handles_cb. From there + * contacts are sent to client + * + * \param contact_mem : handles to contact members + * \param msg_type : type of the message, which wil be passed to cb + * \return Errors if any, else 0 + */ + +static gint fetch_contacts( GArray* contact_mem, gint* msg_type ) ; + +/*! \brief This function is a callback for request for the contacts + * in msg_type(subscribe or publish) contatct list from server. This is + * only called for subscribe channel members. fetch_contacts is called + * to get the contact names from the handles. If there are no conatcts in + * the list it calls send_fetch_contacts_error else requests for the contacts + * from the handles + * + * \param proxy unused + * \param current_members array of handles of current contatcs + * \param local_pending_members unused + * \param remote_pending_members array of handles of remote pending contatcs + * \param error error if any + * \param userdata unused + */ +static void get_roster_member_cb( DBusGProxy *proxy,GArray* current_members, + GArray* local_pending_members, GArray* remote_pending_members, + GError *error, gpointer userdata ) ; + + +/*! \brief this function requests for the contacts in its contatct list from server + * + * \param type of the contacts channel( publish, subscribe ) + */ +void request_roster( enum channel_type type ); + +/*! \brief Sends contacts to the client. Contact names are sent to client in multiple + * packets of size less than or equal to MAX_MSG_SIZE. Contact will be sent as a whole. + * A single contact will not be sent in two consecutive packets + * + * \param members : Contacts to be sent to client + * \param mem_count : no. of contacts + * \param contact_type : type of the contact + * \return error code.. + */ +gint send_contacts_to_client( gchar** members, gint mem_count, gint contact_type ) ; + + +/*! \brief Fetches the cached contacts stored in telepathy gabble + * This is as good as fetching the contacts + */ +void fetch_cached_contacts(); + +#endif //__IFETCHCONTACTLIST_H__ \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isogetsearchkeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isogetsearchkeys.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,54 @@ +/* +* ============================================================================ +* Name : isogetsearchkeys.h +* Part of : isolation server. +* Version : %version: 5 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +*! +* /def To avoid multiple inclusion of header +*/ +#ifndef __ISOGETSEARCHKEYS_H__ +#define __ISOGETSEARCHKEYS_H__ + +/* +*! /def For message_hdr_req +*/ +#include "msg_enums.h" + +/* +*! /brief Function to get the search keys(fields on which to +* search ) supported by server +* +* /param hdr_req message header request +* +* /return gint MEM_ALLOCATION_ERROR +*/ + +gint get_search_keys( message_hdr_resp* hdr_req ); + +#endif //__ISOGETSEARCHKEYS_H__ diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isoim.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isoim.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,264 @@ +/* +* ============================================================================ +* Name : isoim.h +* Part of : isolation server instant messaing componenet. +* Version : %version: 14 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ + +#ifndef _ISOIM_H_ +#define _ISOIM_H_ + +#include +#include + +#include "isoservermain.h" +#include "msg_enums.h" + +/*! /file + * Interfaces for the send / recieve of messages. + * client anywhere in the documentation refers to anyone + * using the isoserver + */ + +/*! /typedef struct send_msg_struct typedefed to send_msg_struct. + */ +typedef struct send_msg_struct send_msg_struct; + +/*! /struct send_msg_struct isoim.h + * /brief This struct is used to pass multiple pointers as userdata to callbacks + * + * /var hdr_req header request + * /var msg character string(message) + */ +struct send_msg_struct + { + message_hdr_req* hdr_req; + char *msg; + }; + +/*! /typedef struct _Received_UserData typedefed to Received_UserData. + */ +typedef struct _Received_UserData Received_UserData; + +/*! /struct Received_UserData isoim.h + * /brief This struct is used to pass multiple pointers as userdata to callbacks + * + * /var message_body message + * /var proxy proxy This is used for acknowledging the recieved message + * /var message_id This is used for acknowledging the recieved message + */ +struct _Received_UserData + { + gchar *message_body; + DBusGProxy *proxy; + guint message_id; + }; + +/*! /typedef struct send_error_struct typedefed to send_error_struct. + */ +typedef struct send_error_struct send_error_struct; + +/*! /struct send_error_struct isoim.h + * /brief This struct is used to pass multiple pointers as userdata to callbacks + * + * /var hdr_resp response header + * /var msg_type + * /var timestamp + * /var msg_body + */ +struct send_error_struct + { + message_hdr_resp hdr_resp; + guint msg_type; + guint timestamp; + gchar* msg_body; + }; + +/*! /brief requests the handles for the contacts to which message should be sent. + * request_handles_cb is registered as a callback. necessary data to be sent is + * passed as userdata + * + * /param msghdr request header that will be passed back to client + * /param contact_id all contacts + * /param message + * /param no_cntcts no. of contacts the msg shld be sent to + * /return : error code on failure, 0 on success + */ +void send_message( send_msg_struct* msg_hdr, const gchar **contact_id ) ; + +/*! /brief handles for contacts are recieved and text channel created (if already + * there same is used) message is sent to those contacts. + * + * + * /param proxy unused + * /param handles contact handles + * /param error error if any in getting the handles for contact + * /param userdata Has request header and message to be sent to reciever + * The request header is used for mapping of response to correct request + * + */ +void request_handles_cb( DBusGProxy *proxy, GArray *handles, GError* error, + gpointer userdata ) ; + + +/*! /brief parse the params for send and validates them + * + * /param aMsgBuffer message buffer to be parsed + * /param aContactId pointer to an array of strings, After this function this + * arg wil have the contacts to which message should be sent to + * /param aSendMsg message to be sent + * /param len : msg_len no. of bytes in aMsgBuffer + * /param contact_count : no. of contacts + * /return returns error code on failure, or 0 + */ +int parse_for_send( gchar* aMsgBuffer, gchar*** aContactId, + gchar** aSendMsg, gint msg_len, gint* contact_count ) ; + + +/*! /brief calls parse_for_send to parse the parameters, and calls + * send_message for sending the message + * + * /param buf : message buffer to be parsed + * /param len : msg_len no. of bytes in msg_buf + * + * /return gint : parse error code if any + */ +int action_parse_send( gchar* buf, gint msg_len ) ; + +/*! /brief Function to check if the channel is already present in the maintained hash + * text_channels_find_func. + * + * /param key unused + * /param text_channel hash table element + * /param contact_handle to be searched item + * /return boolean + */ +gboolean text_channels_find_func( gchar *key, + TpChan *text_channel, + guint *contact_handle ); + +/*! /brief Once the send request is sent to n/w server this callback is called + * + * /param proxy unused + * /param error n/w error if any + * /param userdata message header from which a response is formed + * /return void + */ +void sendreply_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) ; + +/*! /brief This function is called by tg to as a response to request for the + * handles from the text channel. If there is no error, sent message( + * which has failed ) with its deatils is then sent to client + * + * /param proxy unused + * /param handles_names contac names (sender name) + * /param error error if any + * /param userdata send_error_struct + * /return void + */ +static void inspect_handles_for_error_cb( DBusGProxy *proxy,char **handles_names, + GError *error, gpointer userdata ); + +/*! /brief This function on registered for "senderror" signal is called when the message + * sending is failed. Calls tp_conn_inspect_handles_async to get the contact name + * from text channel + * + * /param proxy : unused + * /param error : error code + * /param timestamp : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param message_type : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param message_body : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param user_data text_chan from where to get the contatc name of reciepien + * /return void + */ +static void senderror_cb ( DBusGProxy *proxy, + guint error, + guint timestamp, + guint message_type, + gchar *message_body, + gpointer user_data ); + +/*! /brief called as a callback to acknowledge the msg ack. + * + * /param proxy unused + * /param error error if any + * /param userdata unused + * /return void + */ +void msg_ack_pending_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) ; + +/*! /brief This function is a callback for to get the contact name from handles. + * This function acknowledges the recieved message and send that to client(adap) + * + * /param proxy unused + * /param handles_names 2D array of message sender(one contact ended with a NULL string) + * /param error error if any + * /param userdata Received_UserData that has message body, response header etc., + * /return void + */ +static void getting_sender_cb( DBusGProxy *proxy,char **handles_names, + GError *error, gpointer userdata ) ; + +/*! /brief when a message is recieved this function is called by + * telepathygabble(by emitting signal). This function then requests tg + * to get the contact names corresponding to handles. + * + * /param proxy sent to getting_sender_cb as param in userdata + * /param timestamp unused + * /param handles_names + * /param message_type unused + * /param message_flags unused + * /param message_body recieved message + * /param userdata unused + */ +void receivedMessage_cb ( DBusGProxy *proxy, + guint message_id, + guint timestamp, + guint from_handle, + guint message_type, + guint message_flags, + gchar *message_body, + gpointer user_data ); +/*! /brief whenevr a new channel handler for text is created, this function is called. This + * function also registers that channel for Received and SendError signals. Also the pending + * messages are also retrieved in this function + * + * /param tp_chan new channel created + */ +void text_channel_init ( TpChan *text_chan ); + +/*! /brief called by getting_sender_cb to send the recieved message to client + * + * /param msg message recieved + * /param sender message from whom recieved + */ +int send_message_to_client( const gchar *msg , const gchar *sender); + +#endif \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isomodifycontactlist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isomodifycontactlist.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,159 @@ + +/* ============================================================================ +* Name : isomodifycontacts.h +* Part of : isolation server. +* Version : %version: 7 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ +#ifndef __ISOADDCONTACTS_H__ +#define __ISOADDCONTACTS_H__ + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include "isoim.h" + +/*! /file + * Interfaces for the maintainence of the contact list. + * client anywhere in the documentation refers to anyone + * using the isoserver + */ + +/*! + * /brief This function is called by message_send_recv function in isoservermain.c if message type + * is EReject_Contact_Request, EAccept_Contact_Request, EAdd_Contact_Request and EDelete_Contact_Request. + * Contacts added/removed to/from list. This function parses the message buffer, + * validates for the arguments and calls modify_contact_list to add/remove contacts + * + * /param buf : buffer to be parsed + * /param buf_len : buffer length + * /return : error code if any, 0 on success + */ +gint action_parse_modify_contact_list( gchar* buf, gint buf_len ) ; + +/*! + * /brief gets the handles for contacts. Handles are returned in request_modify_contact_list_handles_cb + * callback which is an arg for the async request to get handles. + * + * /param msg_hdr : The header and message passed to callbacks + * /param contact_id : contact ids whose handles to be returned + * /param no_cntcts : total no. of contacts to be added + * /return : error code if any, handle on success + */ +guint get_handles_for_contacts ( send_msg_struct* msg_hdr, + const gchar **contact_id, gint no_cntcts ); + +/*! + * /brief Handles are returned in this callback. Which will then actually do modify + * the contact list based on the request type(add/remove/accept/reject) + * modify_contact_list_cb is registered as the callback. + * + * /param proxy : unused + * /param handles : handles of the contacts + * /param error : error if any + * /param message : userdata(send_msg_struct) passed back + * /return : error code if any, handle on success + */ +void request_modify_contact_list_handles_cb( DBusGProxy *proxy, GArray *handles, + GError* error, gpointer message ); + +/*! + * /brief Calls get_handles_for_contacts to get the handles for contact. + * + * /param msg_hdr : message request header passed to callbacks + * /param contact_id : contact ids to be added + * /param message : messgae if any + * /param no_cntcts : no of contacts to be added + * /return void + */ +gint modify_contact_list ( send_msg_struct* msg_hdr, const gchar **contact_ids, + gint no_cntcts ); + +/*! + * /brief called as callback for request for modify contact list + * This function then sends the result to client + * + * /param proxy unused + * /param error Error if any + * /param userdata request message header + * /return void + */ +void modify_contact_list_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + +/*! + * /brief The contact names corresponding to the contact handles that are changed + * are passed to the client + * /param proxy + * /param handles_name + * /param error + * /param userdata + * /return void + */ +static void rosters_changed_contacts_cb( DBusGProxy *proxy, + gchar **handles_names, GError *error, gpointer userdata ); + + +/*! /brief Whenever contact list is changed by others( someone trying to add this user + * or someone rejecting the add request etc., ) this callback registered as a signal + * is called with the handles of the changed contacts. rosters_changed_contacts_cb is + * passed as callback to get the contact name of the changed handles + * + * /param group_iface unused + * /param message unused + * /param added List of contacts that are recently added + * /param removed List of contacts that were recently removed + * /param local_pending List of contacts that are locally pending for approval + * /param remote_pending List of contacts that are remotely pending for approval + * /param actor unused + * /param reason unused + * /param userdata unused + * /return void + */ +void roster_members_changed_cb ( DBusGProxy *group_iface, + gchar *message, + GArray *added, + GArray *removed, + GArray *local_pending, + GArray *remote_pending, + guint actor, + guint reason, + gpointer userdata ); + + + +#endif //__ISOADDCONTACTS_H__ \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isopresence.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isopresence.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,338 @@ +/* ============================================================================ +* Name : isopresence.h +* Part of : isolation server. +* Version : %version: 7 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ + +#ifndef __ISOPRESENCE_H__ +#define __ISOPRESENCE_H__ +#include +#include + +#include "isoservermain.h" +#include "msg_enums.h" + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-props-iface.h" +#include "tp-interfaces.h" +#include "tp-conn-iface-presence-gen.h" + +G_BEGIN_DECLS + +/*! /file +* This file has interfaces for presence implimentation. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + +/*! /typedef struct presence_msg_struct typedefed to presence_msg_struct + */ +typedef struct presence_msg_struct presence_msg_struct; + +/*! /struct presence_msg_struct isopresence + * /brief + * + * /var hdr_req header request + * /var useravailability availability, presence + * /var statustext status text + */ +struct presence_msg_struct + { + message_hdr_req* hdr_req; + char *useravailability; + char *statustext; + }; + + +#define TELEPATHY_TYPE_PRESENCE (telepathy_presence_get_type ()) +#define TELEPATHY_PRESENCE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TELEPATHY_TYPE_PRESENCE, TelepathyPresence)) +#define TELEPATHY_PRESENCE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TELEPATHY_TYPE_PRESENCE, TelepathyPresenceClass)) +#define TELEPATHY_IS_PRESENCE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TELEPATHY_TYPE_PRESENCE)) +#define TELEPATHY_IS_PRESENCE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TELEPATHY_TYPE_PRESENCE)) +#define TELEPATHY_PRESENCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TELEPATHY_TYPE_PRESENCE, TelepathyPresenceClass)) + +/*! /typedef struct _TelepathyPresence typedefed to TelepathyPresence + */ +typedef struct _TelepathyPresence TelepathyPresence; + +/*! /typedef struct _TelepathyPresenceClass typedefed to TelepathyPresenceClass + */ +typedef struct _TelepathyPresenceClass TelepathyPresenceClass; + +/*! /struct _TelepathyPresence isopresence.h + * /var parent + */ +struct _TelepathyPresence { + GObject parent; +}; + +/*! /struct _TelepathyPresenceClass isopresence.h + * /var parent_class + */ +struct _TelepathyPresenceClass { + GObjectClass parent_class; +}; + +/*! /typedef struct _TelepathyPresenceClass typedefed to TelepathyPresenceClass + */ + +/*! /enum presence states of the user + */ +typedef enum { + TELEPATHY_PRESENCE_STATE_AVAILABLE, + TELEPATHY_PRESENCE_STATE_BUSY, + TELEPATHY_PRESENCE_STATE_AWAY, + TELEPATHY_PRESENCE_STATE_EXT_AWAY, + TELEPATHY_PRESENCE_STATE_HIDDEN, /* When you appear offline to others */ + TELEPATHY_PRESENCE_STATE_UNAVAILABLE, +} TelepathyPresenceState; + +GType telepathy_presence_get_type (void) G_GNUC_CONST; + +/*! /brief create a presence object instance + * /return created presence object instance + */ +TelepathyPresence * +telepathy_presence_new (void); + +/*! /brief get the presence state value + * + * /param presence : presence object + * /return state : state as set in presence object + */ +TelepathyPresenceState +telepathy_presence_get_state (TelepathyPresence *presence); + + +/*! /brief get the presence status value + * + * /param presence : presence object + * /return state : status as set in presence object + */ +const gchar * +telepathy_presence_get_status (TelepathyPresence *presence); + +/*! /brief set the presence state value in presence gobject + * + * /param presence : presence object + * /param state : state + * /return : void + */ +void +telepathy_presence_set_state (TelepathyPresence *presence, + TelepathyPresenceState state); + +/*! /brief set the presence status text value in presence gobject + * + * /param presence : presence object + * /param state : status + * /return : void + */ +void +telepathy_presence_set_status (TelepathyPresence *presence, + const gchar *status); + +/*! /brief converts presence state value from enum to string + * /param presence_state : presence state enum value + * /return : presence state string value + */ +const gchar * +telepathy_presence_state_to_str (TelepathyPresenceState presence_state); + + +/*! /brief converts presence state value from string to enum + * + * /param str : presence state string value + * /return : presence state enum value + */ +TelepathyPresenceState +telepathy_telepathy_presence_state_from_str (const gchar *str); + +/*! /brief Registered as a signal for presence updates of + * other users. This function will be called whenevr a contact + * to whom this user has subscribed for presence changes his + * presence state or status message. + * + * /param proxy : unused + * /param handle_hash : hash table containing presence information + * as hash value, contact handle as key + * /return : void + */ +void +telepathy_presence_handler(DBusGProxy *proxy, + GHashTable *handle_hash); + +/*! /brief updates own presence to the n/w server. update_status_cb + * is registered for the callback + * + * /param pres_iface : presence interface + * /param presence : presence object + * /param msg_hdr : presence info list to send presence_msg_struct + * has state, status etc., + * /return : void + */ +void +telepathy_contacts_send_presence (DBusGProxy *pres_iface, + TelepathyPresence *presence, + presence_msg_struct* msg_hdr ); + +/*! /brief This function will be called for presence of each contact + * key has got the state and value status + * + * /param key : hash table key ie presence state + * /param value : hash table value ie presence information + * /param presence : user data + * /remark presence object is logically unused ? + * + * /return : void + */ +static void +telepathy_presences_foreach (gpointer *key, + gpointer *value, + TelepathyPresence **presence); + + +/*! /brief This function will be called for each contact. Contact name is + * got from the contcat handle, telepathy_presences_foreach is called + * to get the presence from value of the hash table + * + * @param key : hash table key ie contact handle id + * @param value : hash table value ie presence + * @return : void + */ +static void +telepathy_presence_handle_foreach (gpointer *key, + gpointer *value); + + +/*! /brief callback for updating own presence. This function + * sends response to client + * + * /param proxy : unused + * /param error : error if any + * /param message : message header + * /return : void + */ +void +update_status_cb(DBusGProxy *proxy, + GError* error, + gpointer message); + + +/*! /brief Sends presence of conatct to the client. Forms + * the proper presence message format and sends that to client + * + * /param : availability user availability + * /param : text custom status message set by user + * /return : error code on failure, 0 on success + */ +int +send_presence_to_client( const gchar *availability, + const gchar *text ); + +/*! /brief sends presence of the client to n/w server thru' gabble + * calls telepathy_contacts_send_presence to send presence + * + * /param msghdr request header that will be passed back to client + * /param message_type_err unused + * /remark please remove this unused variable(why was this added?) + * + * /return : error code on failure, 0 on success + */ +void +send_presence( presence_msg_struct* msg_hdr, + gint message_type_err ) ; + + +/*! /brief parses the message buffer. aPresenceStatus and aStatustext + * pointers updated + * + * /param aMsgBuffer message buffer + * /param aPresenceStatus after call to this function it will + * have the presence status to be updated + * /param aStatustext after call to this function it will + * have the status text to be updated + * + * /param msg_len : msg_len no. of bytes in msg_buf + * /return returns error code on failure, or 0 + */ +int +parse_for_presence( gchar* aMsgBuffer, + gchar** aPresenceStatus, + gchar** aStatustext, + gint msg_len ) ; + +/*! /brief Parses the message from client and sends the presence + * to n/w server. A err is returned if there is any parse error + * or out of memory condition + * + * /param buf : buffer to be parsed + * /param buf_len : buffer length + * /return : error code if any, 0 on success + */ +int +action_parse_presence( gchar* buf, + gint buf_len ) ; + +/*! /brief GObject finalize funtion +* +* /param object object to be finalized +*/ +static void presence_finalize (GObject *object); + +/*! /brief GObject get property funtion +* +* /param object Gobject +* /param param_id +* /param value +* /param pspec +*/ +static void presence_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); + +/*! /brief GObject set property funtion +* +* /param object Gobject +* /param param_id +* /param value +* /param pspec +*/ +static void presence_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +G_END_DECLS + + +#endif //__ISOPRESENCE_H__ \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isosearch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isosearch.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,86 @@ +/* +* ============================================================================ +* Name : isosearch.h +* Part of : isolation server. +* Version : %version: 8 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ +#ifndef __ISOSEARCH_H__ +#define __ISOSEARCH_H__ + +/*! /file +* Header file for search feature implimentation. The interfaces mentioned are +* the only those which are used(extern) by functions in other files. Functions which +* are locally used in isosearch.c are not added here. And those functions are forward +* declared. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + +/* +! /This header has definitions for glib types +*/ +#include + +/* +! /This header has definitions for DBusGProxy +*/ +#include + + +/* +! /brief This function is called by message_send_recv function in isoservermain.c if message type +* is ESearch. This function parses the rmsg, validates the parameter passed, if parameters are +* correct a search performed for them. else INVALID_PARAMETERES error is returned +* +* /param rmsg message buffer to be parsed +* /param rmsg_len the length of the rmsg +* /remark rmsg_len is not strlen(rmsg) +* /return returns error code or 0 on success +*/ +gint action_parse_search( gchar* rmsg, gint rmsg_len ); + + + +/* +! /brief This function is called as a callback when a search channel is closed +* /remark This function should have been a static function in isosearch.c +* A work around has been done to make multiple search requests. +* +* /param proxy unused variable +* /param error Error if any +* /param user_data callback data +* /return void +*/ +void search_chan_closed_cb ( DBusGProxy *proxy, + GError *error, + gpointer user_data + ); + +#endif //__ISOSEARCH_H__ diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isoservermain.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isoservermain.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,195 @@ +/* +* ============================================================================ +* Name : isoservermain.h +* Part of : isolation server. +* Version : %version: 18 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ +#ifndef __ISO_SERVER_H_ +#define __ISO_SERVER_H_ + +#include +#include +#include +#include + + +#include "tp-chan-type-text-gen.h" +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-conn-gen.h" +#include "tp-props-iface.h" +#include "tp-interfaces.h" +#include "tp-conn-iface-presence-gen.h" + +#include "msg_enums.h" + +/*! /file +* Header file for the isolation server main. This file has implimentations +* to recieve messages from client and delegate the requests to other +* funtions based on the message type. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ + +enum connection_status + { + connecting = -1, + connected, + disconnected, + disconnecting, + not_connected + }; +/*! /typedef struct userConnection typedefed to userConnection +*/ +typedef struct userConnection userConnection; + +/*! /struct userConnection isoservermain.h +* /brief There is only one object of this struct. This struct represents +* one login session. This strcut has all the necessary data members to +* maintain a session. +* +* /var conn telepathy connection object +* /var connmgr telepathy connection manager object +* /var dbusCon D-Bus +* +* /var isConnected Boolean : If loged in +* +* /var current_members_names : 2D char array having the current members list +* /var local_pending_names : 2D char array having the locally pending members list +* /var remote_pending_names : 2D char array having the remotely pending members list +* +* /var group_iface_subscribe : Interface to subscribe list +* /var group_iface_publish : Interface to publish list +* /var group_iface_known : Interface to known list +* +* /var connmgr_bus : connection manager bus +* +* /var text_channels : open text(chat) channels +* +* /var pres_iface : Interface for presence +* +* /var search_chan : channel for search +* /var search_hdr_req : request header for search +* +*/ +struct userConnection + { + TpConn* conn; + DBusGConnection* dbusConn; + TpConnMgr* connmgr; + enum connection_status conn_stat; + + gchar** current_members_names; + gchar** local_pending_names; + gchar** remote_pending_names; + + + DBusGProxy *group_iface_subscribe; + DBusGProxy *group_iface_publish; + DBusGProxy *group_iface_known; + + gchar* connmgr_bus; + + GHashTable *text_channels; + + TpPropsIface *pres_iface; + + TpChan *search_chan; + message_hdr_req* search_hdr_req; + + gboolean logout_flag; + }; + +/*! /typedef struct globalMainloop to globalMainloop +*/ +typedef struct globalMainloop globalMainloop; + +/*! /struct globalMainloop isoservermain.h +* /brief Has a pointer to the mainloop. This mainloop runs in a +* thread created by the main thread(isoserver.exe). This loop +* listens to the event from telepathygabble +* +* /var mainloop pointer to the mainloop +*/ +struct globalMainloop + { + GMainLoop* mainloop; + }; + +/*! /var mainloop_struct global variable for mainloop +* /brief This variable can not be put into userConnection as the life +* time of a mainloop is not related to per login session +*/ +extern globalMainloop mainloop_struct; + +/*! /var globalCon represents one login session +*/ +extern userConnection globalCon; + +/*! /brief This message reads message type from the message buffer +* passed as argument +* +* /var pc message buffer +* +* /return pointer to message header response which has the message type +*/ +message_hdr_resp* read_message_type( gchar* pc ) ; + +/*! /brief This is an entry point to the thread. isoserver.exe +* creates a thread which runs a mainloop. mainloop is passed as +* argument to the thread entry function. This mainloop which is +* run in the thread listens for the events from telepathygabble +* +* /var data unused param +*/ +gpointer thread_entry( gpointer data ) ; + +/*! /brief If there are any parse error, this function is called to +* dispatch the error to client. +* +* /param msg_struct The response header to be sent +* /param err Error +*/ +gint send_error( message_hdr_resp* msg_struct, gint err ); + +/*! /brief This function waits for the requests from the client. +* Requests are parsed, validated and appropriate actions taken. +* A new thread is created when login happens. This function runs +* a while loop which is only quit when a kill request is recieved +* from the client. +* +* /remark should this thread be created before login? +* /remark when is the mainloop quit ? (Should that be after logout or +* after getting a kill request from the client) +*/ +int message_send_recv() ; + +#endif //__ISO_SERVER_H_ diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/inc/isoutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/inc/isoutils.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,114 @@ + +/* ============================================================================ +* Name : isoutils.h +* Part of : isolation server. +* Version : %version: 8 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! +* /def To avoid multiple inclusion of header +*/ +#ifndef __ISOUTILS_H__ +#define __ISOUTILS_H__ + +/* +*! /file +* Header file for the isolation utilities. +* client anywhere in the documentation refers to anyone +* using the isoserver +*/ +#include "msg_enums.h" + + +/* + * ! /brief Function for to log the messages. Ultimately uses fprintf and putc to + * write to file. This function takes variable no of arguments. + * + * /param fmt format specifier. + * /return void + */ +void iso_logger ( gchar* fmt, ... ); + +/* +*! /brief parses a buffer into an array of strings. Message buffer +* test.ximp@gmail.com/0ximp.telepathy@gmail.com/0/0 +* ^ ^ +* contact1------------|contact2-----------------| +* str will have contact1 for 1st time, contact2 on 2nd call +* +* /param message buffer : Buffer to be parsed +* /param str : str will have pointer to a string +* /param len : Len returns the number of bytes read +* /param msg_len : no. of bytes in msg_buf +* /return gint : error if any on failure, else no. of strings read from buffer +*/ +gint parse_a_string( gchar* msg_buf, gchar** str, gint* len, gint msg_len ); + +/* +*! +* /brief parses a buffer into an array of strings +* +* /param message buffer : Buffer to be parsed +* /param arr_str : Parsed strings are returned in this array of strings +* /param len : Len returns the number of bytes read +* /param len : msg_len no. of bytes in msg_buf +* /param cntidscount : no. of contacts +* /return gint : error if any on failure, else no. of strings read from buffer +* example +* test.ximp@gmail.com/0ximp.telepathy@gmail.com/0/0 +* ^ ^ ^ ^ +* contact1------------|contact2-----------------|-| +* is parsed into +* arr_str[0] = test.ximp@gmail.com/0 +* arr_str[1] = ximp.telepathy@gmail.com/0 +*/ +gint parse_into_array_of_strings( gchar* msg_buf, + gchar*** arr_str, gint* len, gint msg_len, + gint* cntidscount ) ; + +/* + *! /brief Frees the memory allocated to the array of string and to the message + * + * /param contactid : array of string to be freed. + * /param contacts_count : no of contacts + * /param sendmsg : msg to be freed + */ +void free_msg_args( gchar** contactid, gint contacts_count, gchar* sendmsg ); + + +/* + *! /brief Send the response for the porcessing of request to the client + * + * /param hdr_req : message request header + * /param error : error code + * /param response : whether the processing of request successful + * + */ +gint send_response_to_client( message_hdr_req* hdr_req, gint error, + gboolean response ); + +#endif //__ISOUTILS_H__ + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isoavtar.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isoavtar.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,308 @@ +/* +* ============================================================================ +* Name : isoconnectionmanager.c +* Part of : isolation server. +* Version : %version: 6 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#include "tp-conn.h" +#include "isoavtar.h" +#include "stdio.h" +#include "isoservermain.h" +#include "msgliterals.h" +#include "msgqlib.h" +#include "msg_enums.h" +#include "isoutils.h" + + +#include +#include + +/* + * ! \file + * Implements the functions in isoavtar.h + */ + + +/*! \brief callback for updating own avtar. This function + * sends response to client + * + * \param proxy : unused + * \param avatar_sha1: token string + * \param error : error if any + * \param message : message header + * \return : void + */ +void update_avtar_cb(DBusGProxy *proxy, char* avatar_sha1, GError* error, gpointer userdata) + { + + int err = 0; + //user data is of type message_hdr_req + message_hdr_req* msg_hdr = ( message_hdr_req* ) userdata; + // create the msg queue + + iso_logger( "%s", "In - update_avtar_cb\n" ); + UNUSED_FORMAL_PARAM(proxy); + + //msg_hdr should never be NULL + + if ( NULL != error ) + { + //There was some error + //send the response for the msg_hdr request to client + + iso_logger( "%s", "error in update_avtar_cb" ); + err = send_response_to_client( msg_hdr, error->code, 0 ); + g_error_free(error); + } + else + { + //If the set avatar was successful then send the msg_hdr alongwith the avatar sha1 to client + // : sending the avatar sha1 + + iso_logger( "%s %s", "avatar sha1 is : ", avatar_sha1 ); + err = send_response_to_client( msg_hdr, 0, 1 ); + free ( avatar_sha1 ); + } + + if ( err < 0 ) + { + // failed to deliver + iso_logger( "%s", "failed to deliver\n" ); + } + free( msg_hdr ); + + iso_logger( "%s", "Out - update_avtar_cb\n" ); + + } + +/*! \brief sends avtar of the client to n/w server thru' gabble + * calls tp_conn_iface_avatars_set_avatar_async to set avatar + * + * \param avtarcontent : avatar image content + * \param mimetype : mime type + * \param msghdr request header that will be passed back to client + * + * \return : error code on failure, 0 on success + */ +gint send_avtar( GArray* avtarcontent , char * mimetype , message_hdr_req *msg_hdr ) + { + + gint error = 0; + DBusGProxy* avatar_face = NULL; + message_hdr_req *hdr_req = NULL; + iso_logger( "%s", "In - send_avtar\n" ); + + //Allocate the memory for header req and initialize that to 0 + hdr_req = ( message_hdr_req* ) calloc ( sizeof( message_hdr_req ), 1 ); + if ( NULL == hdr_req ) + { + return MEM_ALLOCATION_ERROR; + } + //msg_hdr can never be NULL.. handled in the case + memcpy( hdr_req, msg_hdr, sizeof( message_hdr_req ) ); + + //Registering for signal to be done at different loation + /*dbus_g_proxy_connect_signal (DBUS_G_PROXY(globalCon.conn), "AvatarUpdated", + G_CALLBACK (avatar_updated_signal), + NULL, NULL); */ + //get the interface + avatar_face = tp_conn_get_interface ( + globalCon.conn, TELEPATHY_CONN_IFACE_AVATAR_QUARK); + + if ( avatar_face ) + { + //make call to the lib telepathy to set the avatar. update_avtar_cb is registered as the callback + tp_conn_iface_avatars_set_avatar_async (avatar_face, avtarcontent, mimetype, update_avtar_cb, (gpointer)hdr_req); + } + else { + error = TP_AVATAR_IFACE_ERROR; + } + + iso_logger( "%s", "Out - send_avtar\n" ); + return error; + } + +/*! \brief callback for clearing own avtar. This function + * sends response to client + * + * \param proxy : unused + * \param error : error if any + * \param userdata : message header + * \return : void + */ +void clear_avtar_cb( DBusGProxy *proxy, GError* error, gpointer userdata ) + { + + int err = 0; + //user data is of type message_hdr_req + message_hdr_req* msg_hdr = ( message_hdr_req* ) userdata; + + iso_logger( "%s", "In - clear_avtar_cb\n" ); + UNUSED_FORMAL_PARAM(proxy); + + //msg_hdr should never be NULL + + if ( NULL != error ) + { + //There was some error + //send the response for the msg_hdr request to client + + iso_logger( "%s", "error in clear_avtar_cb" ); + err = send_response_to_client( msg_hdr, error->code, 0 ); + g_error_free(error); + } + else + { + err = send_response_to_client( msg_hdr, 0, 1 ); + } + + if ( err < 0 ) + { + // failed to deliver + iso_logger( "%s", "failed to deliver\n" ); + } + free( msg_hdr ); + iso_logger( "%s", "Out - clear_avtar_cb\n" ); + + } +/*! \brief clears the self avtar + * + * \param msghdr request header that will be passed back to client + * + * \return : error code on failure, 0 on success + */ +gint clear_avatar( message_hdr_req *msg_hdr ) + { + gint error = 0; + DBusGProxy* avatar_face = NULL; + message_hdr_req *hdr_req = NULL; + iso_logger( "%s", "In - clear_avtar\n" ); + + //Allocate the memory for header req and initialize that to 0 + hdr_req = ( message_hdr_req* ) calloc ( sizeof( message_hdr_req ), 1 ); + if ( NULL == hdr_req ) + { + return MEM_ALLOCATION_ERROR; + } + //msg_hdr can never be NULL.. handled in the case + memcpy( hdr_req, msg_hdr, sizeof( message_hdr_req ) ); + + //get the interface + avatar_face = tp_conn_get_interface ( + globalCon.conn, TELEPATHY_CONN_IFACE_AVATAR_QUARK); + + if ( avatar_face ) + { + tp_conn_iface_avatars_clear_avatar_async(avatar_face, clear_avtar_cb, (gpointer)hdr_req); + } + else { + error = TP_AVATAR_IFACE_ERROR; + } + + iso_logger( "%s", "Out - clear_avtar\n" ); + + return error; + + } +/*! \brief clears the self avtar + * \param rmsg : message buffer to be parsed + * \param msg_struct : request header + * \param result : message buffer length + * \param avtarcontent : pointer to the avatar image data + * + * \return : error code on failure, 0 on success + */ +gint update_own_avatar(char* rmsg,message_hdr_resp* msg_struct,gint result, GArray** avtarcontent) + { + int len = 0; + int err = 0; + static gboolean fetch_avatar_data = 0; + static gchar *mimetype = NULL; + + + iso_logger( "%s", "In - EUpdateOwnAvtar\n" ); + + if(!fetch_avatar_data) + { + //parse mime type + //calculating len for request header + //skip the msg_hdr part + + len += sizeof( message_hdr_req ); + + *avtarcontent = g_array_new ( FALSE, FALSE, sizeof ( gchar ) ); + if ( NULL == *avtarcontent ) + { + return MEM_ALLOCATION_ERROR; + } + + // reading a mimetype from buffer + err = parse_a_string( rmsg, &mimetype, &len, result ); + + if ( err < 0 ) + { + goto oom; + } + + fetch_avatar_data = 1; + } + else + { + len = sizeof( message_hdr_req ); + } + + + g_array_append_vals( *avtarcontent, rmsg + len, result - len ); + + + if(! msg_struct->hdr_req.continue_flag ) + { + err = send_avtar( *avtarcontent, mimetype, &(msg_struct->hdr_req) ); + + fetch_avatar_data = 0; //reset the value so that if set avatar requested for + //falling of to goto oom + + } + else { + //Continue flag is set and read the data again return 0 + return 0; + } + + oom: + //Free the memory if err or operation complete ( sent to libeteleapthy) + if ( *avtarcontent ) + { + g_array_free( *avtarcontent, (*avtarcontent)->len ); + *avtarcontent = NULL; + } + if( mimetype ) + { + free ( mimetype ); + } + return err; + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isoconnectionmanager.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isoconnectionmanager.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,829 @@ +/* +* ============================================================================ +* Name : isoconnectionmanager.c +* Part of : isolation server. +* Version : %version: 24 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + + +#include +#include +#include +#include +#include +#include + +#include "isoconnectionmanager.h" +#include "isomodifycontactlist.h" //For roster_members_changed_cb +#include "isoutils.h" //for loger and othr func +#include "isofetchcontactlist.h" //For request_roster + +#include "msgliterals.h" +#include "isoservermain.h" +#include "isopresence.h" +#include "isosearch.h" +#include "msg_enums.h" + +enum disconnect_reason + { + EConnection_Status_Reason_None_Specified = 0, + EConnection_Status_Reason_Requested, + EConnection_Status_Reason_Network_Error, + EConnection_Status_Reason_Authentication_Failed, + }; +//userConnection globalCon; + +/*! \file +* Impliments the functions in isoconnectionmanager.h +*/ + +/*! \brief Documented in the header file +*/ +static void check_conn_properties(TpConn *conn) +{ + TpPropsIface *pres_iface; + + pres_iface = TELEPATHY_PROPS_IFACE (tp_conn_get_interface ( + conn, TELEPATHY_CONN_IFACE_PRESENCE_QUARK)); + if (pres_iface != NULL) + { + globalCon.pres_iface = pres_iface; + dbus_g_proxy_connect_signal(DBUS_G_PROXY(pres_iface), + "PresenceUpdate", + G_CALLBACK(telepathy_presence_handler), + NULL, NULL); + } + else + { + g_warning ("The connection object does not support " TP_IFACE_PROPERTIES); + } +} + +/*! \brief This function is registered in action_login for statuschanged signal. + * This function is called by telepathygabble when the status of the user changes + * Once user is connected this function registers for NewChannel signal with telepathygabble + * client is also informed of the status change.. + * + * \param proxy + * \param status status of the user ( connected/connecting/disconnected ) + * \param reason reason for status change(server disconnected/ user requested etc.,) + * \param user_data message header request + * + * \return : Boolean True on success, false on failure + */ + +static gboolean status_changed_cb(DBusGProxy *proxy, + guint status, guint reason, + gpointer user_data) + { + + + int err = 0; + + message_hdr_req* hdr_req = ( message_hdr_req* )user_data; + // create the msg queue + iso_logger( "%s", "In - status_changed_cb\n" ); + + //switch to the connection status + switch ( status ) + { + case EConnected: + { + //Connected.. + iso_logger( "%s", "connected\n" ); + //Get connection interfaces + check_conn_properties(TELEPATHY_CONN(proxy)); + //Connect to the signal for new channels + dbus_g_proxy_connect_signal( DBUS_G_PROXY( globalCon.conn ), "NewChannel", + G_CALLBACK( new_channel_handler ), + NULL, NULL ); + //send response to client.. + err = send_response_to_client( hdr_req, reason, 1 ); + //hdr_req would be freed here + //Disconnect the previous signal for connected + //This is to pass the diff msg hdr as cb userdata for disconnect + /*dbus_g_proxy_disconnect_signal( DBUS_G_PROXY( globalCon.conn ), StatusChangedStr, + G_CALLBACK( status_changed_cb ), + hdr_req );*/ + + globalCon.conn_stat = connected; + break; + } + case EConnecting: + {//Connecting.. + iso_logger( "%s", "connecting\n" ); + //already done after creating the thread + //globalCon.conn_stat = connecting; + break; + } + case ENotConnected: + { + //DisConnected.... + //Set the reason for disconnection + iso_logger( "%s : %d : %s : %d", "disconnected and reason is", reason, "state is ", globalCon.conn_stat ); + //reset the flag to not connected + + //should here be not_connected != globalCon.conn_stat && disconnected != globalCon.conn_stat + //and all login errors should set the conn_stat to disconnected + if ( not_connected != globalCon.conn_stat && disconnected != globalCon.conn_stat ) + { + int success = 1; + int error = 0; + + action_logedout(); + + //switch for the reason of logout + switch ( reason ) + { + //set appropriate message types and error if any + case EConnection_Status_Reason_None_Specified: + if ( connecting == globalCon.conn_stat ) + { + //not yet connected and user has cancelled the a/p + hdr_req->message_type = ELogin_Request; + error = ELOGIN_NONE_SPECIFIED; + success = 0; + } + else { + //connected and user has cancelled the a/p + //state is going to be not connected as fr these cases ossadaptation is + //going to send handle request terminated signal + hdr_req->message_type = EUserEndGprs; + + } + + break; + case EConnection_Status_Reason_Requested: + hdr_req->message_type = ELogout_Request; + + break; + case EConnection_Status_Reason_Network_Error: + if ( connecting == globalCon.conn_stat ) + { + //not yet connected and user has cancelled the a/p + hdr_req->message_type = ELogin_Request; + error = ELOGIN_NETWORK_ERROR; + success = 0; + } + else { + //state is going to be not connected as fr these cases ossadaptation is + //going to send handle request terminated signal + hdr_req->message_type = EServer_DisConnect_Request; + + } + + break; + case EConnection_Status_Reason_Authentication_Failed: + hdr_req->message_type = ELogin_Request; + error = ELOGIN_AUTHENTICATION; + success = 0; + + break; + default: + hdr_req->message_type = ELogin_Request; + error = ELOGIN_AUTHORIZATION; + success = 0; + + break; + + } + //to set to no more requests allowed + globalCon.conn_stat = not_connected; + + err = send_response_to_client( hdr_req, error, success ); + + } + + break; + } + default: + { + break; + } + + } + + if ( 0 != err ) + { + //failed + return ERROR; + } + iso_logger( "%s", "out - status_changed_cb\n" ); + return TRUE; + } + +/*! \brief new_channel_handler is registered as a callback for any new + * channels craetion request, in function status_changed_cb after status is changed + * to log in. new_channel_handler creates channel and also registers for the signals + * MembersChanged for contact related channels and Recieved and SendError for IM + * related channels. + * + * \param proxy unused + * \param object_path object path of the channel + * \param channel_type used to get a new channel + * \param handle_type used to get a new channel, channel handle type + * \param handle used to get a new channel, channel handle + * \param suppress_handler unused + * \param user_data unused + * + * \return void + */ +static void new_channel_handler( DBusGProxy *proxy, const char *object_path, + const gchar *g_channel_type, guint handle_type, + guint handle, gboolean suppress_handler, + gpointer user_data ) + { + + TpChan *new_chan = NULL; + UNUSED_FORMAL_PARAM(proxy); + UNUSED_FORMAL_PARAM(suppress_handler); + UNUSED_FORMAL_PARAM(user_data); + iso_logger( "%s", "In - new_channel_handler\n" ); + + //create new channel + new_chan = tp_chan_new( globalCon.dbusConn, + globalCon.connmgr_bus, object_path, + g_channel_type, handle_type, handle ); + + if ( !new_chan ) + { + return ; + } + + + if ( strcmp( g_channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && ( g_strrstr(object_path, "RosterChannel/known" ) ) ) + { + //channel type is contact rosters.. + //request for the roster + + globalCon.group_iface_known = + tp_chan_get_interface( new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + //register for the members changed signal + dbus_g_proxy_connect_signal (globalCon.group_iface_known, "MembersChanged", + G_CALLBACK (roster_members_changed_cb), + NULL, NULL); + + } + else if ( strcmp( g_channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && ( g_strrstr(object_path, "RosterChannel/publish" ) ) ) + { + //channel type is contact rosters.. + //request for the roster + + globalCon.group_iface_publish = + tp_chan_get_interface( new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + //register for the members changed signal + dbus_g_proxy_connect_signal (globalCon.group_iface_publish, "MembersChanged", + G_CALLBACK (roster_members_changed_cb), + NULL, NULL); + + request_roster( EPublish_Channel ); + } + else if ( strcmp( g_channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && (g_strrstr(object_path, "RosterChannel/subscribe") ) ) + + { + //roster fetch should be done using subscribe, as it will give + //current and remote pending members in differnet arrays, that can be sued on ui side + //local pending members can be fetched only using "RosterChannel/publish",that can be fetched if required + + globalCon.group_iface_subscribe = + tp_chan_get_interface( new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + + + //register for the members changed signal + dbus_g_proxy_connect_signal (globalCon.group_iface_subscribe, "MembersChanged", + G_CALLBACK (roster_members_changed_cb), + NULL, NULL); + request_roster( ESubscribe_Channel ); + + + } + + //recieve message channel handlers + else if ( ( strcmp( g_channel_type, TP_IFACE_CHANNEL_TYPE_TEXT ) == 0 ) ) + { + //recieve message + if ( globalCon.text_channels == NULL ) + { + globalCon.text_channels = g_hash_table_new_full( g_str_hash, + g_str_equal, + ( GDestroyNotify ) g_free, + ( GDestroyNotify ) g_object_unref ); + } + if ( globalCon.text_channels ) + { + g_hash_table_insert( globalCon.text_channels, + g_strdup( object_path ), new_chan ); + } + + iso_logger( "b4 text_channel_init" ); + //check for new_chan objects for text channel should be loaclly stored/freed + text_channel_init( new_chan ); + } + iso_logger( "%s", "Out - new_channel_handler\n" ); + } + + +/*! \brief Is called after logout.. Any cleanup operations to + * be performed here. Setting isConnected to EFalse, cleaning up + * of resources is done + */ +void action_logedout() + { + + iso_logger( "%s", "In - action_logedout\n" ); + //not quiting the main loop + //release the connection manager + if ( globalCon.connmgr ) + { + g_object_unref ( globalCon.connmgr ); + globalCon.connmgr = NULL; + } + //release the dbus connection + if ( globalCon.dbusConn ) + { + dbus_g_connection_unref ( globalCon.dbusConn ); + globalCon.dbusConn = NULL; + } + //release the connection object + if ( globalCon.conn ) + { + g_object_unref ( globalCon.conn ); + globalCon.conn = NULL; + } + //release the text channels + if ( globalCon.text_channels ) + { + g_hash_table_destroy( globalCon.text_channels ); + globalCon.text_channels = NULL; + } + //release the subscribe interface + if ( globalCon.group_iface_subscribe ) + { + g_object_unref ( globalCon.group_iface_subscribe ); + globalCon.group_iface_subscribe = NULL; + } + //release the publish interface + if ( globalCon.group_iface_publish ) + { + g_object_unref ( globalCon.group_iface_publish ); + globalCon.group_iface_publish = NULL; + } + //release the known interface + if ( globalCon.group_iface_known ) + { + g_object_unref ( globalCon.group_iface_known ); + globalCon.group_iface_known = NULL; + } + + iso_logger( "%s", "Out - action_logedout\n" ); + } + +/*! \brief Callback for the logout + * + * \param proxy : unused + * \param error : unused + * \param userdata : unused + * \return : void + */ +void logout_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) + { + + iso_logger( "%s", "In - logout_cb\n" ); + UNUSED_FORMAL_PARAM(proxy); + UNUSED_FORMAL_PARAM(error); + UNUSED_FORMAL_PARAM(userdata); + iso_logger( "%s", "Out - logout_cb\n" ); + } + +/*! \brief requests for closing of session. Also closes the search channel. + * \remark should not close the search channel + * + * Request for log - out + * \param pc - message which has the request header + * \return : MEM_ALLOCATION_ERROR or 0 + */ +int action_logout( char* pc ) + { + + TpConn* conn = globalCon.conn; + message_hdr_req *msg_hdr = NULL; + + iso_logger( "%s", "In - action_logout\n" ); + + if( globalCon.search_chan ) + { + tp_chan_close_async( DBUS_G_PROXY( globalCon.search_chan ), search_chan_closed_cb, NULL ); + } + + //allocate memory and check for errors + msg_hdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + if ( NULL == msg_hdr ) + { + return MEM_ALLOCATION_ERROR; + } + //intialize the memory to 0s + memset( msg_hdr, '\0', sizeof( message_hdr_req ) ); + //read message header from buffer + memcpy( msg_hdr, pc, sizeof( message_hdr_req ) ); + + //disconnect in async way as glib signal is not workin + tp_conn_disconnect_async( DBUS_G_PROXY( conn ), logout_cb, msg_hdr ); + iso_logger( "%s", "Out - action_logout\n" ); + + return 0; + } + +/*! \brief validates params, gets a dbus, creates a connection manager, + * and connection. Registers for the statuschange + * + * \param ls_hdr login struct + * \return Errors if invalid param or getting dbus, conn mgr or conn fails else 0 + */ +gint action_login( login_struct* ls_hdr ) + { + + DBusGConnection *connection = NULL; + TpConnMgr *connmgr = NULL; + TpConn *conn = NULL; + GError *error = NULL; + + gchar* def1 = NULL; + char* def2 = NULL; + char* def3 = NULL; + + gchar* def4 = NULL; + guint def5 = 0; + gboolean def6 = 0; + + #ifdef __WINSCW__ + gchar* def8 = NULL; + guint def9 = 0; + #endif + + //Build hash table + GHashTable *connection_parameters = NULL; + //initalize the Gvalues + GValue *value1 = g_new0(GValue, 1); + GValue *value2 = g_new0(GValue, 1); + GValue *value3 = g_new0(GValue, 1); + GValue *value4 = g_new0(GValue, 1); + GValue *value5 = g_new0(GValue, 1); + GValue *value6 = g_new0(GValue, 1); + + #ifdef __WINSCW__ + GValue *value9 = g_new0(GValue, 1); + GValue *value10 = g_new0(GValue, 1); + #endif + + //log message + iso_logger( "%s", "In - action_login\n" ); + + //Check if all the mandatory settings are there + if ( NULL == ls_hdr->strs[0] || NULL == ls_hdr->strs[1] || NULL == ls_hdr->strs[2] + || NULL == ls_hdr->strs[4] || NULL == ls_hdr->strs[5] || + NULL == ls_hdr->strs[7] || NULL == ls_hdr->strs[8] || NULL == ls_hdr->strs[9] ) + { + return INVALID_PARAMETERES; + } + //Only for winscw + #ifdef __WINSCW__ + if ( NULL == ls_hdr->strs[10] || NULL == ls_hdr->strs[11] ) + { + return INVALID_PARAMETERES; + } + #endif + + //0 is username + def1 = g_strdup( ls_hdr->strs[0] ); + //1 is passwd + def2 = g_strdup( ls_hdr->strs[1] ) ; + //2 is server addr + def3 = g_strdup( ls_hdr->strs[2] ) ; + if ( NULL != ls_hdr->strs[3] ) + { + //3 is resource + def4 = g_strdup( ls_hdr->strs[3] ) ; + } + else + { + //Fix required from lalitha + //Is this manadatory? or Can this be NULL + def4 = g_strdup( TestId ); + } + //4 is ssl + def5 = atoi( ls_hdr->strs[4] ); + //5 is server port + def6 = atoi( ls_hdr->strs[5] ); + //6 is IapId is not used + //def7 = g_strdup( ls_hdr->strs[6] ) ; + + iso_logger( "username is %s", ls_hdr->strs[0] ); + iso_logger( "server is %s", ls_hdr->strs[2] ); + iso_logger( "resource is %s", ls_hdr->strs[3] ); + iso_logger( "ssl is %s", ls_hdr->strs[4] ); + iso_logger( "server port is %s", ls_hdr->strs[5] ); + iso_logger( "connmgr bus is %s", ls_hdr->strs[7] ); + iso_logger( "connmgr path is %s", ls_hdr->strs[8] ); + iso_logger( "protocol is %s", ls_hdr->strs[9] ); + + + globalCon.connmgr_bus = strdup( ls_hdr->strs[7]); + + if ( NULL == globalCon.connmgr_bus ) + { + return MEM_ALLOCATION_ERROR; + } + + #ifdef __WINSCW__ + //7 is ProxyServer + def8 = g_strdup( ls_hdr->strs[10] ) ; + //proxy port + def9 = atoi( ls_hdr->strs[11] ); + #endif + + //Get DBus - do not change the order of following calls to + //dbus, g_hash_table_new + + + connection = dbus_g_bus_get( DBUS_BUS_SESSION , &error); + + //DBus Connection is NULL + //return with error + if ( connection == NULL ) + { + if ( error ) + { + g_error_free(error); + } + iso_logger( "failed in connection == NULL " ); + return DBUS_CONNECTION_ERROR; + } + /* printf("connected to DBus with connection %p\n", connection);*/ + globalCon.dbusConn = connection; + + //Get connection manager + connmgr = tp_connmgr_new(connection, ls_hdr->strs[7], ls_hdr->strs[8],TP_IFACE_CONN_MGR_INTERFACE); + if ( connmgr == NULL ) + { + iso_logger( "failed in tp_connmgr_new" ); + //Free already allocated resources + //return with error + dbus_g_connection_unref ( globalCon.dbusConn ); + globalCon.dbusConn = NULL; + return TP_CONNMGR_ERROR; + } + + //Create values for hash table + connection_parameters = g_hash_table_new( g_str_hash, g_str_equal ); + if ( NULL == connection_parameters ) + { + //Free already allocated resources + //return with error + g_object_unref (connmgr); + connmgr = NULL; + dbus_g_connection_unref ( globalCon.dbusConn ); + globalCon.dbusConn = NULL; + iso_logger( "failed in g_hash_table_new" ); + return TP_HASHTABLE_ERROR; + } + + //Add AccountStr values to hash table + g_value_init( value1, G_TYPE_STRING ); + g_value_set_string ( value1, def1 ); + g_hash_table_insert( connection_parameters, ( gpointer ) AccountStr, value1 ); + + //Add PasswdStr values to hash table + g_value_init( value2, G_TYPE_STRING ); + g_value_set_string ( value2, def2 ); + g_hash_table_insert( connection_parameters, ( gpointer ) PasswdStr, value2 ); + //Add ServerStr values to hash table + g_value_init(value3, G_TYPE_STRING); + g_value_set_string (value3, def3); + g_hash_table_insert( connection_parameters, ( gpointer ) ServerStr, value3 ); + //Add ResourceStr values to hash table + if ( NULL != def4 ) + { + //This is not mandatory settings item + //so check for NULL value before useing it.. + g_value_init( value4, G_TYPE_STRING ); + g_value_set_string ( value4, def4 ); + g_hash_table_insert( connection_parameters, ( gpointer ) ResourceStr, value4 ); + } + + //Add PortStr values to hash table + g_value_init(value5, G_TYPE_UINT); + g_value_set_uint (value5, def6); + g_hash_table_insert(connection_parameters, ( gpointer ) PortStr, value5); + //Add OldsslStr values to hash table + g_value_init(value6, G_TYPE_BOOLEAN); + g_value_set_boolean (value6, def5); + g_hash_table_insert(connection_parameters, ( gpointer ) OldsslStr, value6 ); + //Settings Only for emulator + #ifdef __WINSCW__ + //Add proxy server values to hash table + g_value_init(value9, G_TYPE_STRING); + g_value_set_string (value9, def8); + g_hash_table_insert(connection_parameters, "https-proxy-server", value9); + + //Add proxy port values to hash table + g_value_init(value10, G_TYPE_UINT); + g_value_set_uint (value10, def9); + g_hash_table_insert(connection_parameters, "https-proxy-port", value10); + #endif + + + //Get connection from connection manager - i.e., Login + conn = tp_connmgr_new_connection( connmgr,connection_parameters, ls_hdr->strs[9] ); + + if ( !conn ) + { + iso_logger( "failed in tp_connmgr_new_connection" ); + //Free already allocated resources + //return with error + g_object_unref (connmgr); + connmgr = NULL; + dbus_g_connection_unref ( globalCon.dbusConn ); + globalCon.dbusConn = NULL; + + g_hash_table_destroy( connection_parameters ); + return TP_CONNECTION_ERROR; + } + + + //register for StatusChanged callback - login / logout + dbus_g_proxy_connect_signal( DBUS_G_PROXY( conn ), StatusChangedStr, + G_CALLBACK( status_changed_cb ), + ls_hdr->hdr_req, NULL ); + //Assign to global variable struct + globalCon.conn = conn; + globalCon.connmgr = connmgr; + globalCon.dbusConn = connection; + //Free + g_hash_table_destroy( connection_parameters ); + iso_logger( "%s", "Out - action_login\n" ); + + return 0; + } + +/*! \brief parses the message buffer and validates the parameters. The values are written + * to ls_hdr + * + * \param aMsgBuffer - buf to be parsed + * \param ls_hdr - login_struct struct to which values are written + * \param msg_len - no. of bytes in the message buffer aMsgBuffer + * + */ + +gint parse_for_login( gchar* msg_buffer, login_struct** msg_struct, int msg_len ) + { + + char* bufPtr = NULL; + gint index = 0; + gint arg_count = 0; + gint str_len = 0; + char *str1 = NULL; + + message_hdr_req *msg_hdr = NULL; + + iso_logger( "%s","In - parse_for_login\n" ); + //Reading of the message_hdr_req is done twice.. + //should be changed to read once.. + //Allocate memory and check for the error + msg_hdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + if ( NULL == msg_hdr ) + { + return MEM_ALLOCATION_ERROR; + } + //initalize memory to zero + memset( msg_hdr, '\0', sizeof( message_hdr_req ) ); + memcpy( msg_hdr, msg_buffer, sizeof( message_hdr_req ) ); + //ownership of msg_hdr is transefred to msg_struct + ( *msg_struct )->hdr_req = msg_hdr; + + bufPtr = msg_buffer + sizeof( message_hdr_req ); + + //validating each arg and copying it.. + + while ( arg_count < LOGIN_ARG_COUNT ) + { + //Get one string + while( index + str_len < msg_len && '\0' != *( bufPtr + index + str_len ) ) + { + str_len++; + //Check if max param len no. of chars already read.. + //if so return with error + if ( MAX_PARAM_LEN == index + str_len ) + { + return INVALID_PARAMETERES; + } + } + //str_len == 0, means one setting attrib missing.. + //Assign that to NULL..and continue + if ( 0 == str_len ) + { + ( *msg_struct )->strs[arg_count] = NULL; + //Increment the no of args read by one + arg_count++; + index++; + continue; + } + //ownership of these strs is transfered to msg_struct + //Allocate memory and check for the error + str1 = ( char* ) malloc ( str_len + 1 ); + if ( NULL == str1 ) + { + return MEM_ALLOCATION_ERROR; + } + //Copy the string from buffer + //copy '\0' as well + memcpy( str1, bufPtr + index, str_len + 1 ); + //Assign to the array + ( *msg_struct )->strs[arg_count] = str1; + //Skip the '\0' already read.. + index += str_len + 1; + //reset the str_len to read next char + str_len = 0; + //Increment the no of args read by one + arg_count++; + + } + iso_logger( "%s", "Out - parse_for_login\n" ); + return 0; + } +/*! \brief Calls parse_for_login to parse and validate the arguments + * And then calls action_login for to do actual login + * + * \param aMsgBuf message buffer + * \param msg_len - len of the message + */ +gint action_parse_login( char* aMsgBuf, int msg_len ) + { + + gint message_type_err = 0; + login_struct* message_struct; + gint arg_count = 0; + + iso_logger( "%s", "In - action_parse_login\n" ); + //Allocate memory and check for errors + message_struct = ( login_struct* ) malloc( sizeof ( login_struct ) ); + if ( NULL == message_struct ) + { + return MEM_ALLOCATION_ERROR; + } + //intialize memory to 0s + memset ( message_struct, '\0', sizeof ( login_struct ) ); + + //Parse the message into login parameters + message_type_err = parse_for_login( aMsgBuf, &message_struct, msg_len ); + //If no error in parsing do a login + if ( !message_type_err ) + { + //parse passed + message_type_err = action_login( message_struct ); + + } + //check if the pointer is not pointing to NULL + //And free the memory + for( arg_count = 0; arg_count < LOGIN_ARG_COUNT; arg_count++ ) + { + if ( NULL != message_struct->strs[arg_count] ) + { + free ( message_struct->strs[arg_count] ); + } + } + free ( message_struct ); + iso_logger( "%s", "Out - action_parse_login\n" ); + return message_type_err; + } + + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isofetchcontactlist.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isofetchcontactlist.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,644 @@ +/* +* ============================================================================ +* Name : isofetchcontactlist.h +* Part of : isolation server. +* Version : %version: 17 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#include +#include +#include +#include + +#include +#include + +#include "isofetchcontactlist.h" +#include "isoutils.h" +#include "msg_enums.h" +#include "msgliterals.h" + +const guint KMaxContactFetchCount = 500; + +static guint cur_mem_len; +static guint local_mem_len; +static guint remote_mem_len; + +static gint cur_last_index = 0; +static gint local_last_index = 0; +static gint remote_last_index = 0; + + +/*! \brief This function is called as a callback to get the contact names from + * contact handles. Contact names are sent to client in multiple packets of + * size MAX_MSG_SIZE + * + * \param proxy unused + * \param handles_names 2D array of contact names + * \param error error if any + * \param userdata msg_type + */ +static void inspect_handles_cb( DBusGProxy *proxy,char **handles_names, + GError *error, gpointer userdata ) + { + guint i; + gint err = 0; + gint* msg_type = ( gint* ) userdata; + + gchar** members = NULL; + guint* mem_count = 0; + gint* last_index = NULL; + + + iso_logger( "%s", "in -- inspect_handles_cb" ); + + if ( !handles_names || error ) + { + //Handles error + iso_logger( "%s", "handle names error" ); + free ( msg_type ); + g_error_free(error); + return; + } + UNUSED_FORMAL_PARAM(proxy); + //Switch to the type of the message + //and get corresponding pointers to members and pointer to last index + switch ( *msg_type ) + { + case ECurrent_Member_Contacts: + members = globalCon.current_members_names; + mem_count = &cur_mem_len; + last_index = &cur_last_index; + iso_logger( "%s count %d", "current members", mem_count ); + break; + case ELocal_Pending_Contacts: + members = globalCon.local_pending_names; + mem_count = &local_mem_len; + last_index = &local_last_index; + iso_logger( "%s count %d", "local members", mem_count ); + break; + case ERemote_Pending_Contacts: + members = globalCon.remote_pending_names; + mem_count = &remote_mem_len; + last_index = &remote_last_index; + iso_logger( "%s count %d", "remote members", mem_count ); + break; + + default : + //Error in msg_type + //Wrong message type + //quit from here + free ( msg_type ); + return; + } + + + //Add the contacts to the global member + for( i=0; handles_names[i]; i++ ) + { + iso_logger( "members %s ",handles_names[i] ); + members[*last_index] = handles_names[i]; + (*last_index)++; + } + + iso_logger( "last index is %d", *last_index ); + //If all the contacts are fetched send them to client + if ( *mem_count == *last_index ) + { + //send all contacts to client + err = send_contacts_to_client( members, *mem_count, *msg_type ); + *last_index = 0; + if ( err ) + { + //How to handle the error? + for ( i = 0; i < *mem_count; i++ ) + { + free ( members[i] ); + } + iso_logger( "%s", "There was error in send_contacts_to_client" ); + free ( msg_type ); + *mem_count = 0; + return; + } + *mem_count = 0; + + } + free ( msg_type ); + iso_logger( "%s", "out -- inspect_handles_cb" ); + } + +/*! \brief This function is called if there are 0 contacts or there was an error + * + * \param contact_type : Type of the contacts + * \param err : err if any, 0 otherwise + */ +static gint send_fetch_contacts_error( gint contact_type , gint err ) + { + + int result = 0; + int pri = MSG_PRI_NORMAL; + int timeout1 = TIME_OUT; + message_hdr_resp* msg_struct = NULL; + //control is here coz.. there are no contacts in list + + msg_struct = ( message_hdr_resp* ) malloc ( sizeof( message_hdr_resp ) ); + if ( NULL == msg_struct ) + { + return MEM_ALLOCATION_ERROR; + } + //initalize memory to zero + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + //create the header response + msg_struct->hdr_req.message_type = contact_type; + msg_struct->hdr_req.protocol_id = 0; + msg_struct->hdr_req.session_id = 0; + msg_struct->hdr_req.request_id = 0; + //Set error types and continue flag + if ( err < 0 ) + { + //There was some error, pass on the mapped error + //to client + msg_struct->error_type = err; + msg_struct->response = 0; + } + else + { + msg_struct->error_type = 0; + msg_struct->response = 1; + } + msg_struct->continue_flag = 0; + //send the message to client that there are no contacts in the list + result = MsgQSend( RESPONSE_QUEUE, ( char* )msg_struct, sizeof( message_hdr_resp ), + pri, timeout1, &err ); + + free ( msg_struct ); + + if ( result < 0 ) + { + // failed to deliever + return MSG_Q_SEND_FAILED; + } + return 0; + } + +/*! \brief This function is a callback for request for the contacts + * in local pending contatct list from server. This is + * only called for publish channel members. fetch_contacts is called + * to get the contact names from the handles. If there are no conatcts in + * the list it calls send_fetch_contacts_error else requests for the contact names + * from the contact handles + * + * \param proxy unused + * \param current_members array of handles of current contatcs + * \param local_pending_members unused + * \param remote_pending_members array of handles of remote pending contatcs + * \param error error if any + * \param userdata unused + */ +static void get_roster_local_member_cb( DBusGProxy *proxy,GArray* current_members, + GArray* local_pending_members, GArray* remote_pending_members, + GError *error, gpointer userdata ) + { + + gint err = 0; + gint* msg_type = ( gint* ) malloc ( sizeof ( gint ) ); + + iso_logger( "%s", "in -- get_roster_member_cb_local" ); + UNUSED_FORMAL_PARAM(proxy); + UNUSED_FORMAL_PARAM(remote_pending_members); + UNUSED_FORMAL_PARAM(userdata); + UNUSED_FORMAL_PARAM(current_members); + if ( NULL != error ) + { + //err in fetching contacts, send failed + //map the error code to isoserver + err = error->code; + //Send that there are no contacts in the local pending + send_fetch_contacts_error( EFetch_Contacts_Error, err ); + return; + } + //store the no. of lccal pending contacts + local_mem_len = local_pending_members->len; + + if ( !local_last_index && local_mem_len ) + { + //Is this the first time to be here.. + //allocate memory + globalCon.local_pending_names = g_new0 ( char *, local_mem_len + 1); + if ( NULL == globalCon.local_pending_names ) + { + return ; + //err? + } + } + //ownership of this pointer is trnasfered to fetch_contacts + *msg_type = ELocal_Pending_Contacts; + //Fetch the contacts given the handles + err = fetch_contacts( local_pending_members, msg_type ); + if ( err < 0 ) + { + return; + } + + iso_logger( "%s", "out -- get_roster_member_cb_local" ); + } + +/*! \brief Requests the server to get contact names from the handles + * The contact names are returned in inspect_handles_cb. From there + * contacts are sent to client + * + * \param contact_mem : handles to contact members + * \param msg_type : type of the message, which wil be passed to cb + * \return Errors if any, else 0 + */ +static gint fetch_contacts( GArray* contact_mem, gint* msg_type ) + { + + guint fetch_count=0; + guint fetch_loop_count=0; + GArray* fetch_members = NULL; + + DBusGProxyCall* call_id = NULL; + TpConn* conn = globalCon.conn; + + gint i = 0; + + //allocate memory for the contacts to be fetched + fetch_members = g_array_new (FALSE, FALSE, sizeof (guint32)); + if ( NULL == fetch_members ) + { + free ( msg_type ); + return MEM_ALLOCATION_ERROR; + //err? + } + + //check if there are contacts to be retrived + if ( contact_mem && contact_mem->len > 0 ) + { + + fetch_count = 0; + + //Divide contacts into a 'n' no. of groups .. n is calculated as below.. + fetch_loop_count = ( contact_mem->len ) / KMaxContactFetchCount + ( + ( contact_mem->len % KMaxContactFetchCount ) ? 1 : 0 ); + + //Get the contacts in terms of fetch_count + for ( i=0; ilen <= KMaxContactFetchCount ) + ? contact_mem->len : KMaxContactFetchCount; + //Fetch the contacts + g_array_append_vals (fetch_members,contact_mem->data,fetch_count); + g_array_remove_range(contact_mem,0,fetch_count); + //For the given handles contacts will be fetched in inspect_handles_cb + call_id = tp_conn_inspect_handles_async( DBUS_G_PROXY(conn), + TP_CONN_HANDLE_TYPE_CONTACT ,fetch_members, + inspect_handles_cb, msg_type ); + //If call_id is null return from here.. + if ( NULL == call_id ) + { + free ( msg_type ); + g_array_free( fetch_members, TRUE ); + return MEM_ALLOCATION_ERROR; + } + + } + } + else if ( contact_mem && contact_mem->len == 0 ) + { + gint err = 0; + //There are no contacts for this type(cur or local or remote) of contacts + //Send that to client + err = send_fetch_contacts_error( *msg_type, 0 ); + free ( msg_type ); + if ( err < 0 ) + { + //Free the msg_type.. Ownership was transfered to this function + + g_array_free( fetch_members, TRUE ); + return err; + } + + } + //msg_type is either freed in else part or is freed in inspect_handles_cb + //no need to free here + g_array_free( fetch_members, TRUE ); + //Should the fetch_contacts be deleted? + return 0; + } + +/*! \brief This function is a callback for request for the contacts + * in msg_type(subscribe or publish) contatct list from server. This is + * only called for subscribe channel members. fetch_contacts is called + * to get the contact names from the handles. If there are no conatcts in + * the list it calls send_fetch_contacts_error else requests for the contacts + * from the handles + * + * \param proxy unused + * \param current_members array of handles of current contatcs + * \param local_pending_members unused + * \param remote_pending_members array of handles of remote pending contatcs + * \param error error if any + * \param userdata unused + */ +static void get_roster_member_cb( DBusGProxy *proxy,GArray* current_members, + GArray* local_pending_members, GArray* remote_pending_members, + GError *error, gpointer userdata ) + { + + int err = 0; + + guint j = 0; + + iso_logger( "%s", "in -- get_roster_member_cb" ); + UNUSED_FORMAL_PARAM(proxy); + UNUSED_FORMAL_PARAM(userdata); + UNUSED_FORMAL_PARAM(local_pending_members); + if ( NULL != error ) + { + //err in fetching contacts, send failed + //map the error code to isoserver + err = error->code; + send_fetch_contacts_error( EFetch_Contacts_Error, err ); + return; + } + //store the no. of current members + cur_mem_len = current_members->len; + //store the no. of remote members + remote_mem_len = remote_pending_members->len; + + + if ( !cur_last_index && cur_mem_len ) + { + //Is this the first time to be here.. + //allocate memory + globalCon.current_members_names = g_new0 ( char *, cur_mem_len + 1); + if ( NULL == globalCon.current_members_names ) + { + return ; + //err? + } + } + + if ( !remote_last_index && remote_mem_len ) + { + //Is this the first time to be here.. + //allocate memory + globalCon.remote_pending_names = g_new0 ( char *, remote_mem_len + 1); + if ( NULL == globalCon.remote_pending_names ) + { + return ; + //err? + } + } + + + //loop thru : 2 for current and remote + for ( j = 0; j < 2; j++ ) + { + //This msg_type is sent to inspect_handles_cb + //Where it wil be deleeted + gint* msg_type = ( gint* ) malloc ( sizeof ( gint ) ); + GArray* contact_mem = NULL; + switch ( j ) + { + + case 0 : + //ask for the current members first + *msg_type = ECurrent_Member_Contacts; + contact_mem = current_members; + break; + + case 1 : + //ask for remote pending contacts + *msg_type = ERemote_Pending_Contacts; + contact_mem = remote_pending_members; + break; + + default: + break; + } + //Fetch the contacts given the handles + //ownership of msg_type is transfered to fetch_contacts + err = fetch_contacts( contact_mem, msg_type ); + if ( err < 0 ) + { + //There was some error + //return from here + return; + } + + } + + iso_logger( "%s","out -- get_roster_member_cb" ); + } + + +/*! \brief this function requests for the contacts in its contatct list from server + * + * \param type of the contacts channel( publish, subscribe ) + */ +void request_roster( enum channel_type type ) + { + + DBusGProxyCall* call_id = NULL; + + + iso_logger( "%s", "in -- request_roster" ); + + //With the interface get the contacts + //Request for all of the contacts in subscribe channel( remote and current + //members ) + if ( ESubscribe_Channel == type ) + { + call_id = tp_chan_iface_group_get_all_members_async( globalCon.group_iface_subscribe, + get_roster_member_cb, NULL ); + //If call_id is NULL return from here.. + if ( NULL == call_id ) + { + return ; + } + } + else if ( EPublish_Channel == type ) + { + //Request for all of the contacts in publish channel + call_id = tp_chan_iface_group_get_all_members_async( globalCon.group_iface_publish, + get_roster_local_member_cb, NULL ); + //If call_id is NULL return from here.. + if ( NULL == call_id ) + { + return ; + } + } + + iso_logger( "%s", "out -- request_roster" ); + } + +/*! \brief Sends contacts to the client. Contact names are sent to client in multiple + * packets of size less than or equal to MAX_MSG_SIZE. Contact will be sent as a whole. + * A single contact will not be sent in two consecutive packets + * + * \param members : Contacts to be sent to client + * \param mem_count : no. of contacts + * \param contact_type : type of the contact + * \return error code.. + */ +gint send_contacts_to_client( gchar** members, gint mem_count, + gint contact_type ) + { + int result = 0; + int pri = MSG_PRI_NORMAL; + int timeout1 = TIME_OUT; + int err = 0; + + char* memBuf = NULL; + int i = 0; + int one_msg_size = sizeof ( message_hdr_resp ); + int mem_len = 0; + message_hdr_resp* msg_struct = NULL; + + iso_logger( "%s", "in -- send_contacts_to_client" ); + + //allocate memory and check for the returned value + msg_struct = ( message_hdr_resp* ) malloc ( sizeof( message_hdr_resp ) ); + if ( NULL == msg_struct ) + { + return MEM_ALLOCATION_ERROR; + } + + memBuf = ( gchar* ) malloc( MAX_MSG_SIZE ); + if ( NULL == memBuf ) + { + // ? + free ( msg_struct ); + return MEM_ALLOCATION_ERROR; + } + + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + //create the response header with type contact fetch + msg_struct->hdr_req.message_type = contact_type; + msg_struct->hdr_req.protocol_id = 0; + msg_struct->hdr_req.session_id = 0; + msg_struct->hdr_req.request_id = 0; + + memset( memBuf, '\0', MAX_MSG_SIZE ); + //sending the req to server + + //assuming that one contact size will not be + //greater than max_msg_size + for ( i = 0; i <= mem_count - 1; i++ ) + { + mem_len = strlen ( members[i] ) + 1; + //check if this contact fits in the current message + //to be sent to client + //one_msg_size is used to navigate thru' the buffer + if ( one_msg_size + mem_len < MAX_MSG_SIZE ) + { + strcpy( memBuf + one_msg_size, members[i] ); + one_msg_size += mem_len; + //if i == mem_count - 1 no need to continue + //Control should fall off(i.e., contacts fit in + //this message ) + if ( i < mem_count - 1 ) + { + continue; + } + //If falling off mem_len should be reset because + //it has been already added to one_msg_size + mem_len = 0; + } + msg_struct->error_type = 0; + msg_struct->response = 1; + //if i == mem_count - 1 and all contacts fits in this message + //to be sent to server + if ( i == mem_count - 1 && one_msg_size + mem_len < MAX_MSG_SIZE ) + { + msg_struct->continue_flag = 0; + } + else + { + msg_struct->continue_flag = 1; + } + if ( i == mem_count - 1 && one_msg_size + mem_len > MAX_MSG_SIZE ) + { + //One more contact is there (in which case i == mem_count - 1)) + //And that can't be sent because of limitation of + //message size.. + //so iterate one more time + i--; + } + //Append '\0' to mark the end.. + one_msg_size++; + *( memBuf + one_msg_size ) = '\0'; + memcpy( memBuf, msg_struct, sizeof( message_hdr_resp ) ); + //send to the client + result = MsgQSend( RESPONSE_QUEUE, memBuf, one_msg_size, pri, + timeout1, &err ); + + + if ( result < 0 ) + { + free ( memBuf ); + iso_logger( "%s", "in -- send_contacts_to_client MSG_Q_SEND_FAILED" ); + // failed to deliever + //free the allocated memory + free ( msg_struct ); + + return MSG_Q_SEND_FAILED; + } + + memset( memBuf , '\0', MAX_MSG_SIZE ); + //reset the one_msg_size for new message to be sent + one_msg_size = sizeof ( message_hdr_resp ); + + } + //free the buffer + free ( memBuf ); + + free ( msg_struct ); + //Should the members be freed here? + for ( i = 0; i < mem_count; i++ ) + { + iso_logger( "freeing contact %s", members[i] ); + free ( members[i] ); + } + iso_logger( "%s", "out -- send_contacts_to_client" ); + + return 0; + } + +/*! \brief Documented in the header file +*/ +void fetch_cached_contacts() + { + + request_roster( EPublish_Channel ); + request_roster( ESubscribe_Channel ); + + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isogetsearchkeys.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isogetsearchkeys.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,318 @@ +/* +* ============================================================================ +* Name : isogetsearchkeys.c +* Part of : isolation server. +* Version : %version: 7 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! \file +* Impliments the functions in isosearch.h +*/ + +/*! \def For malloc +*/ +#include + +/*! \def For string operations +*/ +#include + + +/*! \def For search related declarations +*/ +#include "isosearch.h" + +/*! \def For globalCon +*/ +#include "isoservermain.h" + +/*! \def For tp_chan_type_search_async +*/ +#include "tp-chan-type-search-gen.h" + +/*! \def For MSG_PRI_NORMAL +*/ +#include "msgqlib.h" + +/*! \def For message_hdr_req +*/ +#include "isoutils.h" + +/*! \def For RESPONSE_QUEUE +*/ +#include "msgliterals.h" + +#include "isogetsearchkeys.h" + +/*! \struct key_value_struct isoserach.h +* \brief This struct is used for to form the msg buffer that will be sent to client +* \var msg As the key/value pairs are read those will be appended to msg +* \var len is the no. of bytes appended to msg +*/ +struct key_value_struct + { + gchar* msg; + gint len; + }; + +/*! \typedef struct key_value_struct to key_value_struct +*/ +typedef struct key_value_struct key_value_struct; + +/*! \struct get_search_keys_cb_struct isosearch.h +* \brief This struct bundles multiple(two ?) pointers to be passed +* to getsearch keys callback +* \var search_chan which should be closed when search keys are recieved +* \var hdr_req message header request +*/ +struct get_search_keys_cb_struct + { + TpChan* search_chan; + message_hdr_req* hdr_req; + }; + +/*! \typedef struct get_search_keys_cb_struct to get_search_keys_cb_struct +*/ +typedef struct get_search_keys_cb_struct get_search_keys_cb_struct; + + +static void getsearchkeys_cb( DBusGProxy *proxy, gchar *instr, + gchar **keys, GError *error, gpointer userdata ); + +/*! \brief get_search_keys_reply is called as a callback to get_search_keys +* This function creates a new channel and requests telepathy for the +* search keys +* +* \param userdata message header request +* +* \remark calling tp_conn_new_channel results into esock_client 8 panic +* Instead of calling function tp_conn_new_channel which makes a +* a call to tp_conn_request_channel, tp_conn_request_channel_async is +* called directly. +*/ + +static void get_search_keys_reply( DBusGProxy *proxy, char *chan_object_path, + GError *error, gpointer user_data ) + { + + + TpChan *search_chan = NULL; + DBusGProxy *search_iface = NULL; + get_search_keys_cb_struct* chan_struct = NULL; + message_hdr_resp* hdr_req = ( message_hdr_resp* )user_data; + + UNUSED_FORMAL_PARAM( proxy ); + iso_logger( "in get_search_keys" ); + + if ( error ) + { + send_response_to_client( (message_hdr_req*)hdr_req, error->code, 0 ); + free ( hdr_req ); + return; + } + + //Create new channel for the search + search_chan = tp_chan_new( globalCon.dbusConn, globalCon.connmgr_bus, chan_object_path, + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, TP_CONN_HANDLE_TYPE_NONE, 0 ); + + + if ( NULL == search_chan ) + { + free ( hdr_req ); + return ; + } + //Get chan interface + search_iface = tp_chan_get_interface( search_chan, + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + + if ( NULL == search_iface ) + { + tp_chan_close_async( DBUS_G_PROXY( search_chan ), + search_chan_closed_cb, NULL ); + free ( hdr_req ); + return ; + } + + chan_struct = ( get_search_keys_cb_struct* ) malloc ( + sizeof ( get_search_keys_cb_struct ) ); + + chan_struct->search_chan = search_chan; + chan_struct->hdr_req = ( message_hdr_req* ) malloc ( + sizeof( message_hdr_req ) ); + if ( NULL == chan_struct->hdr_req ) + { + tp_chan_close_async( DBUS_G_PROXY( search_chan ), + search_chan_closed_cb, NULL ); + free ( hdr_req ); + return ; + } + //memset( chan_struct->hdr_req, ) + memcpy( chan_struct->hdr_req, hdr_req, sizeof( message_hdr_req ) ); + + + //Ownership of search_chan and chan_struct->hdr_req, + //chan_struct is passed to getsearchkeys_cb + free ( hdr_req ); + + tp_chan_type_search_get_search_keys_async( search_iface, + getsearchkeys_cb, chan_struct ); + + iso_logger( "out get_search_keys" ); + + + } + +/*! \brief Function to get the search keys(fields on which to +* search ) supported by server +* +* \param hdr_req message header request +* +* \return gint MEM_ALLOCATION_ERROR +*/ +gint get_search_keys( message_hdr_resp* hdr_req ) + { + + message_hdr_resp* hdr_resp = ( message_hdr_resp* ) + malloc ( sizeof ( message_hdr_resp ) ); + + if ( NULL == hdr_resp ) + { + return MEM_ALLOCATION_ERROR; + } + + memcpy( hdr_resp, hdr_req, sizeof ( message_hdr_resp ) ); + //ownership hdr_resp transfered + tp_conn_request_channel_async( DBUS_G_PROXY( globalCon.conn ), + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, + TP_CONN_HANDLE_TYPE_NONE, 0, TRUE, + get_search_keys_reply, (gpointer)hdr_resp ) ; + + return 0; + } + + +/*! \brief This is a callback to get_search_keys. The search keys +* are sent to the requested client +* +* \param proxy unused +* \param instr instruction on search keys +* \param keys 2D string array of search keys supported by server +* \param error Error from server, if any +* \param userdata get_search_keys_cb_struct +*/ + +static void getsearchkeys_cb( DBusGProxy *proxy, gchar *instr, + gchar **keys, GError *error, gpointer userdata ) + { + + get_search_keys_cb_struct * search_struct = ( + get_search_keys_cb_struct* )userdata; + + message_hdr_resp hdr_resp; + gchar* msg = NULL; + gint i = 0; + gint len = 0; + + gint pri = MSG_PRI_NORMAL; + gint result = 0; + gint timeout = NO_WAIT; + gint err = 0; + + + UNUSED_FORMAL_PARAM( proxy ); + UNUSED_FORMAL_PARAM( instr ); + iso_logger( "in getsearchkeys_cb" ); + + + tp_chan_close_async( DBUS_G_PROXY( search_struct->search_chan ), + search_chan_closed_cb, NULL ); + + if ( error ) + { + send_response_to_client( search_struct->hdr_req, error->code, 0 ); + + free ( search_struct->hdr_req ); + free ( search_struct ); + + return; + } + + //Create the response header to be sent to client + //Copy the message header request + hdr_resp.hdr_req.message_type = ESearch_Get_Keys; + hdr_resp.hdr_req.protocol_id = search_struct->hdr_req->protocol_id; + hdr_resp.hdr_req.request_id = search_struct->hdr_req->request_id; + hdr_resp.hdr_req.session_id = search_struct->hdr_req->session_id; + //set continue flag + hdr_resp.continue_flag = 0; + hdr_resp.error_type = 0; + hdr_resp.response = 1; + + free ( search_struct->hdr_req ); + free ( search_struct ); + + //Allocate memory for the message and set memory to '\0' + msg = ( gchar* ) malloc ( MAX_PARAM_LEN ); + if ( NULL == msg ) + { + iso_logger( "malloc error @ pairs.msg" ); + return ; + } + memset( msg, '\0', MAX_PARAM_LEN ); + len = 0; + //Copy the response + memcpy( msg, &hdr_resp, sizeof ( message_hdr_resp ) ); + len += sizeof( message_hdr_resp ); + + + iso_logger( "Get search keys : Keys are" ); + + while ( keys[i] ) + { + strcpy( msg + len, keys[i] ); + iso_logger( "Key %d : %s", i, keys[i] ); + len += strlen( keys[i] ) + 1; + i++; + } + + iso_logger( "Get search keys : Keys End" ); + + //End the message with a '\0' + len++; + msg[len] = '\0'; + //Send the message to client + result = MsgQSend( RESPONSE_QUEUE, msg, len, + pri, timeout, &err ); + + + + if ( result ) + { + + } + + iso_logger( "out getsearchkeys_cb" ); + + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isoim.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isoim.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,874 @@ +/* +* ============================================================================ +* Name : isoim.c +* Part of : isolation server instant messaing componenet. +* Version : %version: bh1cfmsg#28 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include "tp-conn-gen.h" +#include +#include +#include + +#include "isoim.h" +#include "isoutils.h" + +#include "msgliterals.h" +#include "msg_enums.h" + +/*! \file +* Impliments the functions in isoim.h +*/ + +/*! /brief requests the handles for the contacts to which message should be sent. + * request_handles_cb is registered as a callback. necessary data to be sent is + * passed as userdata + * + * /param msghdr request header that will be passed back to client + * /param contact_id all contacts + * /param message + * /param no_cntcts no. of contacts the msg shld be sent to + * /return : error code on failure, 0 on success + */ +void send_message( send_msg_struct* msg_hdr, + const gchar **contact_id ) + { + + //request for the handles to contact + tp_conn_request_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT, + contact_id,request_handles_cb, ( gpointer ) msg_hdr ); + } + + +/*! /brief handles for contacts are recieved and text channel created (if already + * there same is used) message is sent to those contacts. + * + * + * /param proxy unused + * /param handles contact handles + * /param error error if any in getting the handles for contact + * /param userdata Has request header and message to be sent to reciever + * The request header is used for mapping of response to correct request + * + */ +void request_handles_cb(DBusGProxy *proxy, GArray *handles, GError* error, gpointer message) + { + TpChan* text_chan = NULL; //for send msg + guint contact_handle; + DBusGProxy *text_iface = NULL; + send_msg_struct* msg_hdr = ( send_msg_struct* ) message; + + UNUSED_FORMAL_PARAM(proxy); + //There was error in requesting handles to the contacts + if ( error ) + { + iso_logger( "%s", error->message); + + iso_logger( "err code: %d ", error->code ); + //Send error to client + //What happens if + send_response_to_client( msg_hdr->hdr_req, error->code, 0 ); + g_error_free(error); + return; + } + + contact_handle = g_array_index( handles, guint, 0 ); + //get the text channel for the contact handle + text_chan = g_hash_table_find( globalCon.text_channels, + (GHRFunc) text_channels_find_func, + &contact_handle); + + iso_logger( "text_chan : %d ", text_chan ); + + //create a text channel + if ( text_chan == NULL ) + { + + text_chan = tp_conn_new_channel( globalCon.dbusConn,globalCon.conn,globalCon.connmgr_bus,TP_IFACE_CHANNEL_TYPE_TEXT, + TP_CONN_HANDLE_TYPE_CONTACT,contact_handle, TRUE ); + + if(!text_chan) + { + send_response_to_client( msg_hdr->hdr_req, NOT_CONNECTED , 0 ); + g_error_free(error); + return; + } + + iso_logger( "%s", dbus_g_proxy_get_path(DBUS_G_PROXY(text_chan))); + g_hash_table_insert( globalCon.text_channels,g_strdup(dbus_g_proxy_get_path(DBUS_G_PROXY(text_chan))),text_chan); + } + + //get interface.. + text_iface = tp_chan_get_interface( text_chan,TELEPATHY_CHAN_IFACE_TEXT_QUARK ); + + + + if ( NULL == text_iface ) + { + free( msg_hdr->msg ); + free( msg_hdr->hdr_req ); + free( msg_hdr ); + + //Free proxy ? + return ; + } + + //send async + tp_chan_type_text_send_async( text_iface, TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + ( const char * )msg_hdr->msg,sendreply_cb, msg_hdr->hdr_req ); // see if any user date should be passed + + + iso_logger( "Message being sent is %s", msg_hdr->msg ); + + free( msg_hdr->msg ); + free( msg_hdr ); + + iso_logger( "%s", "tp_chan_type_text_send_async after\n"); + } + +/*! /brief parse the params for send and validates them + * + * /param aMsgBuffer message buffer to be parsed + * /param aContactId pointer to an array of strings, After this function this + * arg wil have the contacts to which message should be sent to + * /param aSendMsg message to be sent + * /param len : msg_len no. of bytes in aMsgBuffer + * /param contact_count : no. of contacts + * /return returns error code on failure, or 0 + */ +gint parse_for_send( gchar* msg_buf, gchar*** contact_ids, + gchar** send_msg, gint msg_len, gint* contact_count ) + { + gchar* users = NULL; + + gint len = 0; + gint err = 0; + + iso_logger( "%s", "In - parse_for_send\n" ); + //skip the msg_hdr part + len += sizeof( message_hdr_req ); + //example send message - message header omitted.. + //test.ximp@gmail.com\0ximp.telepathy@gmail.com\0\0hi, how r u?\0 + // ^ ^ ^ ^ + //contact1------------|contact2-----------------|-|message------| + + //gets the contacts, returns no. of contacts on success + //error code on error + err = parse_into_array_of_strings( msg_buf, contact_ids, &len, msg_len, + contact_count ); + if ( err < 0 ) + { + //An error has occured, so propagate to next level + return err; + } + + + /* + Will never come here.. coz it has been already handled in + parse_into_array_of_strings + if ( *contact_count > MAX_MSG_RECEIPIENTS ) + { + return INVALID_PARAMETERES; + }*/ + //reset the userlen + + //parse for the message.. + err = parse_a_string( msg_buf, &users, &len, msg_len ); + + if ( err < 0 ) + { + return err; + } + //set the pointer to send message + *send_msg = users; + + iso_logger( "%s", "Out - parse_for_send\n" ); + //return the no. of contacts to be sent to + return 0; + } +/*! /brief calls parse_for_send to parse the parameters, and calls + * send_message for sending the message + * + * /param buf : message buffer to be parsed + * /param len : msg_len no. of bytes in msg_buf + * + * /return gint : parse error code if any + */ +int action_parse_send( gchar* buf, gint msg_len ) + { + gchar** contactid = NULL; + gchar* sendmsg = NULL; + message_hdr_req *msg_hdr = NULL; + gint meesage_type_err = 0; + //It is very imp to initailize the contact_count to 0 here + gint contact_count = 0; + send_msg_struct* msg_struct = NULL; + //parse contacts, message.. + iso_logger( "%s", "In - action_parse_send\n" ); + meesage_type_err = parse_for_send( buf, + &contactid,&sendmsg, msg_len, &contact_count ); + + //if <= 0 there is some error in the message formation + if ( contact_count > 0 && meesage_type_err == 0 ) + { + + //send message + msg_hdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + if ( NULL == msg_hdr ) + { + //free resources allocated for this operation + free_msg_args( contactid, contact_count, sendmsg ); + return MEM_ALLOCATION_ERROR; + } + memset( msg_hdr, '\0', sizeof( message_hdr_req ) ); + //read message header from buffer + memcpy( msg_hdr, buf, sizeof( message_hdr_req ) ); + + //fill the contacts and message into a struct + msg_struct = ( send_msg_struct* ) malloc ( sizeof ( send_msg_struct ) ); + if ( NULL == msg_struct ) + { + free ( msg_hdr ); + free_msg_args( contactid, contact_count, sendmsg ); + return MEM_ALLOCATION_ERROR; + } + msg_struct->hdr_req = msg_hdr; + msg_struct->msg = sendmsg; + //msg_struct is sent callback... which should be feed there.. + send_message( msg_struct, + ( const gchar** ) contactid ); + } + else + { + //there was some error, free resources allocated for this operation + free_msg_args( contactid, contact_count, sendmsg ); + } + + iso_logger( "%s", "Out - action_parse_send\n" ); + //return error on failure, or no. of contacts message sent to on success + return meesage_type_err; + + } + +/*! /brief Function to check if the channel is already present in the maintained hash + * text_channels_find_func. + * + * /param key unused + * /param text_channel hash table element + * /param contact_handle to be searched item + * /return boolean + */ +gboolean text_channels_find_func( gchar *key, + TpChan *text_channel, + guint *contact_handle ) + { + iso_logger( "%s", "In - text_channels_find_func\n" ); + //Check for the handles + UNUSED_FORMAL_PARAM(key); + if ( ( text_channel->handle == *contact_handle ) ) + return TRUE; + + return FALSE; + } + +/*! /brief Once the send request is sent to n/w server this callback is called + * + * /param proxy unused + * /param error n/w error if any + * /param userdata message header from which a response is formed + * /return void + */ +void sendreply_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) + { + int err = 0; + + message_hdr_req* msg_hdr = ( message_hdr_req* ) userdata; + // create the msg queue + //user data is of type message_hdr_req + iso_logger( "%s", "In - sendreply_cb\n" ); + UNUSED_FORMAL_PARAM(proxy); + if ( NULL != error ) + { + //There was some error + //send the response for the msg_hdr request to client + err = send_response_to_client( msg_hdr, error->code, 0 ); + //free the message + g_error_free(error); + + } + else + { + //send the response for the msg_hdr request to client + err = send_response_to_client( msg_hdr, 0, 1 ); + } + //Free the header recved as callback userdata + free( msg_hdr ); + + if ( err < 0 ) + { + // failed to delievered + return ; + } + iso_logger( "%s", "Out - sendreply_cb\n" ); + } + +/*! /brief This function is called by tg to as a response to request for the + * handles from the text channel. If there is no error, sent message( + * which has failed ) with its deatils is then sent to client + * + * /param proxy unused + * /param handles_names contac names (sender name) + * /param error error if any + * /param userdata send_error_struct + * /return void + */ +static void inspect_handles_for_error_cb( DBusGProxy *proxy,char **handles_names, + GError *error, gpointer userdata ) + { + + gint pri = MSG_PRI_NORMAL; + gint result = 0; + gint timeout = NO_WAIT; + gint err = 0; + + send_error_struct* msg_struct = ( send_error_struct* ) userdata; + gchar* rmsg = NULL; + gint index = 0; + gint len = 0; + UNUSED_FORMAL_PARAM(proxy); + iso_logger( "%s", "In - inspect_handles_for_error_cb" ); + if ( !handles_names || error || NULL == handles_names[0] ) + { + if ( error ) + { + g_error_free( error ); + } + //Free the userdata passed to the callback + if ( NULL != msg_struct ) + { + if ( msg_struct->msg_body ) + { + g_free( msg_struct->msg_body ); + } + g_free( msg_struct ); + } + return; + } + //Allocate the memory and check for NULL + rmsg = ( gchar* ) malloc ( MAX_MSG_SIZE ); + if ( NULL == rmsg ) + { + goto mem_clean; + } + //set memory to 0 + memset( rmsg, '\0', MAX_MSG_SIZE ); + //copy the header + //the response header, message type(from libtp), timestamp + memcpy( rmsg + index, msg_struct, sizeof( message_hdr_resp ) + + 2 * sizeof( guint ) ); + + index += sizeof( message_hdr_resp ) + 2 * sizeof( guint ); + + //Copy the name to whom message was sent + len = strlen( handles_names[0] ); + strcpy( rmsg + index, handles_names[0] ); + index += len + 1; + + //Copy the message body + if ( msg_struct->msg_body ) + { + len = strlen( msg_struct->msg_body ); + strcpy( rmsg + index, msg_struct->msg_body ); + index += len + 1; + } + rmsg[index++] = '\0'; + //Header format + //msgHdr|msg_type|timestamp|reciepient_name\0sent_msg\0 + // ^ ^ ^ + // | | | + //no dilimeter here nul nul + //send to the client + result = MsgQSend( RESPONSE_QUEUE, rmsg, index, + pri, timeout, &err ); + iso_logger( "%s", "After MsgQSend" ); +//If memory allocation for rmsg has failed control comes +//here +mem_clean: + + for ( len = 0; handles_names[len]; len++ ) + { + free ( handles_names[len] ); + } + + if ( msg_struct->msg_body ) + { + g_free( msg_struct->msg_body ); + } + g_free( msg_struct ); + + if ( result < 0 ) + { + //Failed to deliver the message + iso_logger( "%s", "Failed to deliver the message to client" ); + return; + } + iso_logger( "%s", "Out - inspect_handles_for_error_cb" ); + + } + +/*! /brief This function on registered for "senderror" signal is called when the message + * sending is failed. Calls tp_conn_inspect_handles_async to get the contact name + * from text channel + * + * /param proxy : unused + * /param error : error code + * /param timestamp : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param message_type : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param message_body : sent to inspect_handles_for_error_cb thru' send_error_struct + * /param user_data text_chan from where to get the contatc name of reciepien + * /return void + */ +static void senderror_cb ( DBusGProxy *proxy, + guint error, + guint timestamp, + guint message_type, + gchar *message_body, + gpointer user_data ) + { + + TpChan *text_chan = ( TpChan * ) user_data; + send_error_struct* msg_struct = NULL; + GArray* fetch_members = NULL; + DBusGProxyCall* call_id = NULL; + + //Logs + iso_logger( "%s", "In - SendError_cb\n" ); + iso_logger( "error is %d", error ); + iso_logger( "error is %d", message_type ); + iso_logger( "error is %d", timestamp ); + iso_logger( "error is %s", message_body ); + UNUSED_FORMAL_PARAM(proxy); + //Allocate memory and check for NULL + //This msg_struct is passed to callback.. + //So not deleting here.. ownership is transfered + msg_struct = ( send_error_struct* ) malloc ( sizeof( send_error_struct ) ); + + if ( NULL == text_chan || NULL == msg_struct ) + { + return; + } + //Set the values to NULL + memset( msg_struct, '\0', sizeof( send_error_struct ) ); + //Message type is send error + msg_struct->hdr_resp.hdr_req.message_type = ESend_Error; + //other values are set to 0 + msg_struct->hdr_resp.hdr_req.protocol_id = 0; + msg_struct->hdr_resp.hdr_req.session_id = 0; + msg_struct->hdr_resp.hdr_req.request_id = 0; + + //Message is sent as single entity.. + //Message is not long enough to be broken into + msg_struct->hdr_resp.continue_flag = 0; + msg_struct->hdr_resp.response = 0; + + //Set the error type + msg_struct->hdr_resp.error_type = error; + //Set the values from libtelepathy + msg_struct->msg_type = message_type; + msg_struct->timestamp = timestamp; + //Not checking for NULL here.. + //I feel it is ok to send without the message + //Taken care of this in inspect_handles_for_error_cb + msg_struct->msg_body = strdup( message_body ); + + //Create an array of handles to get the handle name + fetch_members = g_array_new ( FALSE, FALSE, sizeof ( guint32 ) ); + g_array_append_val( fetch_members, text_chan->handle ); + //Call libtp function to get the contact name for the handle + //msg_struct is passed to inspect handles call back to be passed to + //client as error + call_id = tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,fetch_members, + inspect_handles_for_error_cb, msg_struct ); + + g_array_free( fetch_members, TRUE ); + if ( NULL == call_id ) + { + return ; + } + + iso_logger( "%s", "Out - SendError_cb" ); + + } + + + + +/*! /brief called as a callback to acknowledge the msg ack. + * + * /param proxy unused + * /param error error if any + * /param userdata unused + * /return void + */ +static void msg_ack_pending_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) + + { + gchar *str = "Inside msg_ack_pending_cb"; + UNUSED_FORMAL_PARAM(proxy); + UNUSED_FORMAL_PARAM(userdata); + if ( error ) + { + //If there was error, ignore it and free the memory + g_error_free(error); + } + + iso_logger( str ); + } + + + +/*! /brief This function is a callback for to get the contact name from handles. + * This function acknowledges the recieved message and send that to client(adap) + * + * /param proxy unused + * /param handles_names 2D array of message sender(one contact ended with a NULL string) + * /param error error if any + * /param userdata Received_UserData that has message body, response header etc., + * /return void + */ +static void getting_sender_cb( DBusGProxy *proxy,char **handles_names, GError *error, gpointer userdata ) + { + + gchar *str = "Inside getting_sender_cb"; + GArray *message_ids; + gint result = 0; + Received_UserData *user_data = ( Received_UserData* )userdata; + iso_logger( "%s", str ); + UNUSED_FORMAL_PARAM(proxy); + if ( !handles_names || error ) + { + if ( error ) + { + //If there was error, ignore it and free the memory + g_error_free(error); + } + //Free the userdata passed to the callback + g_free( user_data->message_body ); + g_free( user_data ); + iso_logger( "%s", "handle names error" ); + return; + } + + message_ids = g_array_new ( FALSE, FALSE, sizeof ( guint ) ); + if ( NULL == message_ids ) + { + //Free the userdata passed to the callback + g_free( user_data->message_body ); + g_free( user_data ); + return ; + } + g_array_append_val ( message_ids, user_data->message_id ); + //Acknowledge that message has been recieved + tp_chan_type_text_acknowledge_pending_messages_async( user_data->proxy, message_ids, + msg_ack_pending_cb, NULL ); + //Send to the client the messgae and the sender name + result = send_message_to_client( user_data->message_body , *handles_names ); + + if ( 0 > result ) + { + return; + } + + iso_logger( "%s", "getting_sender_cb" ); + iso_logger( "%s", user_data->message_body ); + + //Free the messgae ids array + g_array_free ( message_ids, TRUE ); + //free the recieved data + g_free( user_data->message_body ); + g_free( user_data ); + + + } + + + + +/*! /brief when a message is recieved this function is called by + * telepathygabble(by emitting signal). This function then requests tg + * to get the contact names corresponding to handles. + * + * /param proxy sent to getting_sender_cb as param in userdata + * /param timestamp unused + * /param handles_names + * /param message_type unused + * /param message_flags unused + * /param message_body recieved message + * /param userdata unused + */ +void receivedMessage_cb ( DBusGProxy *proxy, + guint message_id, + guint timestamp, + guint from_handle, + guint message_type, + guint message_flags, + gchar *message_body, + gpointer user_data ) + { + GArray *handles = NULL; + Received_UserData *recv_userdata = NULL; + + iso_logger( "%s", "receivedMessage_cb:" ); + UNUSED_FORMAL_PARAM(timestamp); + UNUSED_FORMAL_PARAM(message_type); + UNUSED_FORMAL_PARAM(message_flags); + UNUSED_FORMAL_PARAM(user_data); + //Allocate memory and initalize the structure + recv_userdata = g_new ( Received_UserData, 1 ); + if ( NULL == recv_userdata ) + { + + free ( message_body ); + return ; + } + //TBD : Check if this assignment works.. + //previously it was strdup of message_body + recv_userdata->message_body = strdup( message_body ); + recv_userdata->message_id = message_id; + recv_userdata->proxy = proxy; + + //logs + iso_logger( "%s", message_body ); + //allocate memory for the handles + handles = g_array_new ( FALSE, FALSE, sizeof ( guint32 ) ); + if ( NULL == handles ) + { + //free previously allocated struct + g_free( recv_userdata->message_body ); + g_free( recv_userdata ); + return ; + } + + g_array_append_val ( handles, from_handle ); + //get the sender name corresponding to the handles + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,handles, + getting_sender_cb,recv_userdata ); + //free handles + g_array_free ( handles, TRUE ); + + } + + +/*! /brief whenevr a new channel handler for text is created, this function is called. This + * function also registers that channel for Received and SendError signals. Also the pending + * messages are also retrieved in this function + * + * /param tp_chan new channel created + */ + void text_channel_init( TpChan *text_chan ) + { + + GPtrArray *messages_list ; + guint i = 0; + GArray *message_ids; + DBusGProxy *text_iface; + GArray *handles = NULL; + Received_UserData *recv_userdata = NULL; + + + iso_logger( "%s", "inside text_channel_init" ); + //text_chan has been checked for NULL in the callee function + text_iface = tp_chan_get_interface( text_chan , + TELEPATHY_CHAN_IFACE_TEXT_QUARK ); + + message_ids = g_array_new ( FALSE, TRUE, sizeof ( guint ) ); + + handles = g_array_new ( FALSE, FALSE, sizeof ( guint32 ) ); + //If memory allocation fialure, return from here + if ( !text_iface || !message_ids || !handles ) + { + return ; + } + + tp_chan_type_text_list_pending_messages( text_iface, + FALSE, + &messages_list, + NULL ); + //For all the pending messages get the sender name + //and send to client the sender name and recv msg + for ( i = 0; i < messages_list->len ; i++ ) + { + guint message_id; + guint from_handle; + const gchar *message_body; + GValueArray *message_struct; + + message_struct = ( GValueArray * ) g_ptr_array_index ( messages_list, i ); + + //Not all the fields used currently + //Ignoring the unused fields + message_id = g_value_get_uint( g_value_array_get_nth( message_struct, 0 ) ); + //get the handle to sender + from_handle = g_value_get_uint(g_value_array_get_nth( message_struct, 2 ) ); + //Get the message body + message_body = g_value_get_string( g_value_array_get_nth( message_struct, 5 ) ); + + iso_logger ( "%s", message_body ); + + g_array_append_val( handles, from_handle ); + //Allocate memory for the recv data + recv_userdata = g_new( Received_UserData, 1 ); + if ( !recv_userdata ) + { + break; //Break from the loop + } + //Set all the necessary fields + recv_userdata->message_body = g_strdup( message_body ); + recv_userdata->message_id = message_id; + recv_userdata->proxy = text_iface; + //get the name for the sender handle + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,handles, + getting_sender_cb, recv_userdata ); + + g_array_append_val ( message_ids, message_id ); + + //To reuse the array, remove the 1 that was inserted + g_array_remove_range( handles, 0, handles->len ); + + } + iso_logger ( "%s", "before ack pending msg"); + //acknowledge the recved messages + tp_chan_type_text_acknowledge_pending_messages( text_iface, message_ids, + NULL ); + + iso_logger ( "%s", "after ack pending msg" ); + + //Listen to Received signal + dbus_g_proxy_connect_signal( text_iface, "Received", + G_CALLBACK( receivedMessage_cb ), + NULL, NULL ); + + //Register for the senderror signal + dbus_g_proxy_connect_signal( text_iface, "SendError", + G_CALLBACK( senderror_cb ), + text_chan, NULL ); + + //Should the messages_list be freed? + g_array_free( message_ids, TRUE ); + g_array_free( handles, TRUE ); + + + } + + + + + /*! /brief called by getting_sender_cb to send the recieved message to client + * + * /param msg message recieved + * /param sender message from whom recieved + */ +gint send_message_to_client( const gchar *msg , const gchar *sender ) + + { + gint len=0; + gint pri = MSG_PRI_NORMAL; + gchar *rmsg = NULL; + gint index = 0; + gint err; + message_hdr_resp* msg_resp = NULL; + gint result; + gint timeout = NO_WAIT; + + msg_resp = ( message_hdr_resp* ) malloc ( sizeof( message_hdr_resp ) ); + if ( NULL == msg_resp ) + { + return MEM_ALLOCATION_ERROR; + } + //Allocate memory and initialze to 0 + rmsg = ( gchar* ) malloc ( MAX_MSG_SIZE ); + if ( NULL == rmsg ) + { + free ( msg_resp ); + return MEM_ALLOCATION_ERROR; + } + + //Initialze the memory to 0 + memset( msg_resp, '\0', sizeof( message_hdr_resp ) ); + //Set the message type to EText_Message_Receive and set other fields + //to default values + msg_resp->hdr_req.message_type = EText_Message_Receive; + msg_resp->hdr_req.protocol_id = 1; + msg_resp->hdr_req.session_id = 1; + msg_resp->hdr_req.request_id =1; + //Set the respone as success and error is 0 + msg_resp->response = 1; + msg_resp->error_type = 0; + + memset( rmsg, '\0', MAX_MSG_SIZE ); + //copy the header + memcpy( rmsg, msg_resp, sizeof( message_hdr_resp ) ); + index += sizeof( message_hdr_resp ); + + //copy the sender + //putting sender in message queue + len = strlen(sender); + strcpy( rmsg + index, sender ); + index += len + 1; + + //putting message body + len = strlen(msg); + strcpy( rmsg + index, msg ); + index += len + 1; + + //Header format + //msgHdr|sender_name\0recved_msg\0 + // ^ ^ ^ + // | | | + //no dilimeter here nul nul + //send to the client + result = MsgQSend( RESPONSE_QUEUE, rmsg, index, + pri, timeout, &err ); + free ( rmsg ); + + free ( msg_resp ); + + if ( result < 0 ) + { + return MSG_Q_SEND_FAILED; + } + + iso_logger( "%s", "message is:\n" ); + return TRUE; + } + +// end of files + + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isomodifycontactlist.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isomodifycontactlist.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,497 @@ +/* +* ============================================================================ +* Name : isomodifycontacts.h +* Part of : isolation server. +* Version : %version: 16 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ +#include +#include +#include +#include +#include "msgliterals.h" +#include "isomodifycontactlist.h" +#include "isoutils.h" +#include "isofetchcontactlist.h" //For send_contact_to_client func + +/*! \file +* Impliments the functions in isomodifycontactlist.h +*/ + +/*! + * /brief This function is called by message_send_recv function in isoservermain.c if message type + * is EReject_Contact_Request, EAccept_Contact_Request, EAdd_Contact_Request and EDelete_Contact_Request. + * Contacts added/removed to/from list. This function parses the message buffer, + * validates for the arguments and calls modify_contact_list to add/remove contacts + * + * /param buf : buffer to be parsed + * /param buf_len : buffer length + * /return : error code if any, 0 on success + */ +gint action_parse_modify_contact_list( gchar* buf, gint buf_len ) + { + gchar** contactid = NULL; + gchar* msg = NULL; + gint meesage_type_err = 0; + gint len = 0; + gint contact_count = 0; + + //parse contacts, message.. + iso_logger( "%s", "In - action_parse_modify_contact_list" ); + len += sizeof( message_hdr_req ); + //example send message - message header omitted.. + //test.ximp@gmail.com\0ximp.telepathy@gmail.com\0\0I would like to add u!\0 + // ^ ^ ^ ^ + //contact1------------|contact2-----------------|-|message----------------| + //Till Message part is parsed by the following function + meesage_type_err = parse_into_array_of_strings( buf, &contactid, &len, buf_len, &contact_count ); + if ( meesage_type_err < 0 ) + { + gchar* msg = NULL; + //An error has occured, so propagate to next level + free_msg_args( contactid, contact_count, msg ); + //got error, print to file + return meesage_type_err; + } + + //Parse the message + //message is optional.. so check if message has been sent + if ( len < buf_len ) + { + + gint err = 0; + + // iso_logger( "%x", len ); + // iso_logger( "%f", len ); + + //parse for the message.. + err = parse_a_string( buf, &msg, &len, buf_len ); + + if ( err < 0 ) + { + //return err; + //ignoring the error.. + //as message is not that important + msg = NULL; + } + } + //If there is atleast one contact to add + if ( contact_count > 0 ) + { + //Add the header and message to the msg struct + //this struct will be used in the callbacks + send_msg_struct* msg_struct = NULL; + msg_struct = ( send_msg_struct* ) malloc( sizeof( send_msg_struct ) ); + if ( NULL == msg_struct ) + { + //An error has occured, so propagate to next level + free_msg_args( contactid, contact_count, msg ); + return MEM_ALLOCATION_ERROR; + } + //allocate memory and check for the returned value + msg_struct->hdr_req = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + if ( NULL == msg_struct->hdr_req ) + { + //An error has occured, so propagate to next level + free_msg_args( contactid, contact_count, msg ); + free ( msg_struct ); + return MEM_ALLOCATION_ERROR; + } + //initalize to 0... + memset( msg_struct->hdr_req, '\0', sizeof( message_hdr_req ) ); + //read message header from buffer + memcpy( msg_struct->hdr_req, buf, sizeof( message_hdr_req ) ); + //message, msg can be NULL as well + msg_struct->msg = msg; + + meesage_type_err = modify_contact_list( msg_struct, + ( const char** )contactid, meesage_type_err ); + if ( meesage_type_err < 0 ) + { + //Do cleanup here + //delete contact_ids and message + //An error has occured, so propagate to next level + free_msg_args( contactid, contact_count, msg ); + free ( msg_struct->hdr_req ); + free ( msg_struct ); + return meesage_type_err; + } + } + + iso_logger( "%s", "In - action_parse_modify_contact_list" ); + + return meesage_type_err; + } + + +/*! + * /brief gets the handles for contacts. Handles are returned in request_modify_contact_list_handles_cb + * callback which is an arg for the async request to get handles. + * + * /param msg_hdr : The header and message passed to callbacks + * /param contact_id : contact ids whose handles to be returned + * /param no_cntcts : total no. of contacts to be added + * /return : error code if any, handle on success + */ +guint get_handles_for_contacts ( send_msg_struct* msg_hdr, const gchar **contact_id, + gint no_cntcts ) + { + + iso_logger( "%s", "in -- get_handles_for_contacts" ); + + //check for the return value if 0 is ok or should some negative value to be passed + g_return_val_if_fail (contact_id != NULL, 0); + + //Send request to get the handles for the contacts.. + //handles will be returned in request_addcontacts_handles_cb + tp_conn_request_handles_async( DBUS_G_PROXY(globalCon.conn), + TP_CONN_HANDLE_TYPE_CONTACT, contact_id, + request_modify_contact_list_handles_cb, ( gpointer )msg_hdr ); + + iso_logger( "%s", "in -- get_handles_for_contacts" ); + //no of contacts is returned on successful completion of getting handles + return no_cntcts; + } + + +/*! + * /brief Handles are returned in this callback. Which will then actually do modify + * the contact list based on the request type(add/remove/accept/reject) + * modify_contact_list_cb is registered as the callback. + * + * /param proxy : unused + * /param handles : handles of the contacts + * /param error : error if any + * /param message : userdata(send_msg_struct) passed back + * /return : error code if any, handle on success + */ +void request_modify_contact_list_handles_cb( DBusGProxy *proxy, GArray *handles, + GError* error, gpointer message ) + { + send_msg_struct* msg_hdr = ( send_msg_struct* ) message; + UNUSED_FORMAL_PARAM(proxy); + iso_logger( "%s", "in -- request_modify_contact_list_handles_cb" ); + + if ( !handles || error ) + { + send_response_to_client( msg_hdr->hdr_req, error->code, 0 ); + + if ( error ) + { + g_error_free(error); + } + free ( msg_hdr->msg ); + free ( msg_hdr->hdr_req ); + free ( msg_hdr ); + iso_logger( "%s", "handle got is invalid" ); + return; + } + + //Check if the request is to add contact or delete contact + if ( EAdd_Contact_Request == msg_hdr->hdr_req->message_type ) + { + //got the handles for contacts now send request to add those contacts + tp_chan_iface_group_add_members_async ( globalCon.group_iface_subscribe, handles, + msg_hdr->msg, modify_contact_list_cb, msg_hdr->hdr_req ); + } + else if ( EDelete_Contact_Request == msg_hdr->hdr_req->message_type ) + { + //got the handles for contacts now send request to delete those contacts + tp_chan_iface_group_remove_members_async ( globalCon.group_iface_known, handles, + msg_hdr->msg, modify_contact_list_cb, msg_hdr->hdr_req ); + } + else if ( EAccept_Contact_Request == msg_hdr->hdr_req->message_type ) + { + //got the handles for contacts now send request to add those contacts + tp_chan_iface_group_add_members_async ( globalCon.group_iface_publish, handles, + msg_hdr->msg, modify_contact_list_cb, msg_hdr->hdr_req ); + } + else if ( EReject_Contact_Request == msg_hdr->hdr_req->message_type ) + { + //got the handles for contacts now send request to delete those contacts + tp_chan_iface_group_remove_members_async ( globalCon.group_iface_publish, handles, + msg_hdr->msg, modify_contact_list_cb, msg_hdr->hdr_req ); + } + + //free handles + g_array_free ( handles, TRUE ); + //free header + //hdr_req not to be freed, it is freed by modify_contact_list_cb + free ( msg_hdr->msg ); + free ( msg_hdr ); + iso_logger( "%s", "out -- request_modify_contact_list_handles_cb" ); + } + +/*! + * /brief Calls get_handles_for_contacts to get the handles for contact. + * + * /param msg_hdr : message request header passed to callbacks + * /param contact_id : contact ids to be added + * /param message : messgae if any + * /param no_cntcts : no of contacts to be added + * /return void + */ +gint modify_contact_list ( send_msg_struct* msg_hdr, const gchar **contact_ids, + gint no_cntcts ) + { + + guint err = 0; + + iso_logger( "%s", "in -- modify_contact_list" ); + + //g_array_append_val ( handles, handle ); + //gets the handles for contacts + //Handles are returned in request_addcontacts_handles_cb callback + err = get_handles_for_contacts( msg_hdr, contact_ids, no_cntcts ); + + iso_logger( "%s", "Out -- -- modify_contact_list" ); + + return err; + + + } + +/*! + * /brief called as callback for request for modify contact list + * This function then sends the result to client + * + * /param proxy unused + * /param error Error if any + * /param userdata request message header + * /return void + */ +void modify_contact_list_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) + { + + int err = 0; + //user data is of type message_hdr_req + message_hdr_req *msg_hdr = ( message_hdr_req * )userdata; + UNUSED_FORMAL_PARAM(proxy); + iso_logger( "%s", "In - modify_contact_list_cb\n" ); + //Check if there is any error + if ( NULL != error ) + { + //Failed to add contact: + iso_logger ( "%s", "Failed to modify contact: \n" ); + + err = send_response_to_client( msg_hdr, error->code, 0 ); + g_error_free(error); + } + else + { + //Contact added successfully: + iso_logger ( "%s", "Contact modify successfully:" ); + err = send_response_to_client( msg_hdr, 0, 1 ); + } + //free the msg hdr + free( msg_hdr ); + + if ( err < 0 ) + { + // failed to delievered + return ; + } + iso_logger( "%s", "out -- modify_contact_list_cb" ); + } + + +/*! + * /brief The contact names corresponding to the contact handles that are changed + * are passed to the client + * /param proxy + * /param handles_name + * /param error + * /param userdata + * /return void + */ +static void rosters_changed_contacts_cb( DBusGProxy *proxy, + gchar **handles_names, GError *error, gpointer userdata ) + { + gint i = 0; + gchar* member = NULL; + gint mem_count = 0; + + gint* msg_type = ( gint* ) userdata; + + iso_logger( "%s", "In -- rosters_changed_contacts_cb" ); + UNUSED_FORMAL_PARAM(proxy); + if ( !handles_names || error ) + { + if ( error ) + { + g_error_free(error); + } + free ( msg_type ); + iso_logger( "%s", "handle names error" ); + return; + } + + //read all the contacts + //The handles_names will have NULL as it last elemnt in the array + for ( i = 0; handles_names[i]; i++ ) + { + member = handles_names[i]; + iso_logger( "This member : %s is trying to add you", + member ); + mem_count++; + } + //code to send the added contact to client + if ( mem_count ) + { + gint err = 0; + err = send_contacts_to_client( handles_names, mem_count, *msg_type ); + if ( err ) + { + //How to handle the error? + for ( i = 0; i < mem_count; i++ ) + { + free ( handles_names[i] ); + } + iso_logger( "%s", "There was error in send_contacts_to_client" ); + free ( msg_type ); + return; + } + } + + free ( msg_type ); + + iso_logger( "%s", "Out -- rosters_changed_contacts_cb" ); + + } + +/*! /brief Whenever contact list is changed by others( someone trying to add this user + * or someone rejecting the add request etc., ) this callback registered as a signal + * is called with the handles of the changed contacts. rosters_changed_contacts_cb is + * passed as callback to get the contact name of the changed handles + * + * /param group_iface unused + * /param message unused + * /param added List of contacts that are recently added + * /param removed List of contacts that were recently removed + * /param local_pending List of contacts that are locally pending for approval + * /param remote_pending List of contacts that are remotely pending for approval + * /param actor unused + * /param reason unused + * /param userdata unused + * /return void + */ +void roster_members_changed_cb ( DBusGProxy *group_iface, + gchar *message, + GArray *added, + GArray *removed, + GArray *local_pending, + GArray *remote_pending, + guint actor, + guint reason, + gpointer userdata ) + { + + gint* msg_type = ( gint* ) malloc ( sizeof( gint* ) ); + + iso_logger( "%s", "In - roster_members_changed_cb\n" ); + + //members in the contact list have changed + //Get the contact name of the handles thru rosters_changed_contacts_cb + UNUSED_FORMAL_PARAM(message); + UNUSED_FORMAL_PARAM(actor); + UNUSED_FORMAL_PARAM(reason); + UNUSED_FORMAL_PARAM(userdata); + if ( group_iface == globalCon.group_iface_subscribe && remote_pending + && 0 < remote_pending->len ) + { + *msg_type = ESubscribe_Remote_Pending; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,remote_pending, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_subscribe && removed + && 0 < removed->len ) + { + //User is trying to remove the contact from list + // + *msg_type = ESubscribe_Removed_Or_Rejected; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,removed, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_subscribe && added + && 0 < added->len ) + { + // + *msg_type = ESubscribe_RP_Accepted; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,added, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_publish && added + && 0 < added->len ) + { + *msg_type = EPublish_RP_Accepted; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,added, + rosters_changed_contacts_cb, msg_type ); + } + + if ( group_iface == globalCon.group_iface_publish && local_pending + && 0 < local_pending->len ) + { + *msg_type = ETrying_To_Add_Contact_Publish; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,local_pending, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_publish && removed + && 0 < removed->len ) + { + *msg_type = EPublish_Removed_Or_Rejected; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,removed, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_known && removed + && 0 < removed->len ) + { + //User is trying to remove the contact from list + // + *msg_type = ESubscribe_Removed_Or_Rejected; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,removed, + rosters_changed_contacts_cb, msg_type ); + } + if ( group_iface == globalCon.group_iface_known && added + && 0 < added->len ) + { + //User is trying to remove the contact from list + // + *msg_type = ETrying_To_Add_Contact_Known; + tp_conn_inspect_handles_async( DBUS_G_PROXY( globalCon.conn ), + TP_CONN_HANDLE_TYPE_CONTACT ,added, + rosters_changed_contacts_cb, msg_type ); + } + + //log message + iso_logger( "%s", "out - roster_members_changed_cb\n" ); + } + diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isopresence.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isopresence.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,830 @@ +/* +* ============================================================================ +* Name : isopresence.c +* Part of : isolation server. +* Version : %version: 18 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include "isopresence.h" +#include "stdio.h" +#include "isoservermain.h" +#include "msgliterals.h" +#include "msgqlib.h" +#include "msg_enums.h" +#include "isoutils.h" + +//#include "config.h" + +#include +#include + +#ifndef SYMBIAN +#include +#include +#define _(x) dgettext (GETTEXT_PACKAGE, x) +#define N_(x) x +#else +#define _(x) x +#define N_(x) x +#endif + +/*! \file +* Impliments the functions in isomodifycontactlist.h +*/ + +#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TELEPATHY_TYPE_PRESENCE, TelepathyPresencePriv)) + +/*! \var glob_handle_name accessed in multiple functions. Stores the +* contact name +* \remark This global variable can be avoided +*/ +gchar * glob_handle_name; + +/*! \typedef long typedefed to TelepathyTime +*/ +typedef long TelepathyTime; /* Note: Always in UTC. */ + + +/*! \typedef long struct _TelepathyPresencePriv to TelepathyPresencePriv +*/ +typedef struct _TelepathyPresencePriv TelepathyPresencePriv; + +/*! \struct _TelepathyPresencePriv +* \brief telepathy presence object +* +* \var state presence state +* \var status status text +* \var resource GObject resource +* \var priority GObject priority +* \var timestamp set with current time +*/ +struct _TelepathyPresencePriv { + TelepathyPresenceState state; + + gchar *status; + gchar *resource; + + gint priority; + TelepathyTime timestamp; +}; + +/*! \enum +* \brief _TelepathyPresencePriv member variables +*/ +enum { + PROP_0, + PROP_STATE, + PROP_STATUS, + PROP_RESOURCE, + PROP_PRIORITY +}; + +G_DEFINE_TYPE (TelepathyPresence, telepathy_presence, G_TYPE_OBJECT); + +/*! \brief Documented in the header file +*/ +TelepathyTime +telepathy_time_get_current (void) +{ + return time (NULL); +} + +/*! \brief Documented in the header file +*/ +static void +telepathy_presence_class_init (TelepathyPresenceClass *presclass) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (presclass); + + object_class->finalize = presence_finalize; + object_class->get_property = presence_get_property; + object_class->set_property = presence_set_property; + + g_object_class_install_property (object_class, + PROP_STATE, + g_param_spec_int ("state", + "Presence State", + "The current state of the presence", + TELEPATHY_PRESENCE_STATE_AVAILABLE, + TELEPATHY_PRESENCE_STATE_EXT_AWAY, + TELEPATHY_PRESENCE_STATE_AVAILABLE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_STATUS, + g_param_spec_string ("status", + "Presence Status", + "Status string set on presence", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_RESOURCE, + g_param_spec_string ("resource", + "Presence Resource", + "Resource that this presence is for", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_PRIORITY, + g_param_spec_int ("priority", + "Presence Priority", + "Priority value of presence", + G_MININT, + G_MAXINT, + 0, + G_PARAM_READWRITE)); + + g_type_class_add_private (object_class, sizeof (TelepathyPresencePriv)); +} + +/*! \brief Documented in the header file +*/ +static void +telepathy_presence_init (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (presence); + + priv->state = TELEPATHY_PRESENCE_STATE_AVAILABLE; + + priv->status = NULL; + priv->resource = NULL; + + priv->priority = 0; + + priv->timestamp = telepathy_time_get_current (); +} + +/*! /brief GObject finalize funtion +* +* /param object object to be finalized +*/ +static void +presence_finalize (GObject *object) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + g_free (priv->status); + g_free (priv->resource); + + (G_OBJECT_CLASS (telepathy_presence_parent_class)->finalize) (object); +} + +/*! /brief GObject get property funtion +* +* /param object Gobject +* /param param_id +* /param value +* /param pspec +*/ +static void +presence_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + switch (param_id) { + case PROP_STATE: + g_value_set_int (value, priv->state); + break; + case PROP_STATUS: + g_value_set_string (value, + telepathy_presence_get_status (TELEPATHY_PRESENCE (object))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +/*! /brief GObject set property funtion +* +* /param object Gobject +* /param param_id +* /param value +* /param pspec +*/ +static void +presence_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + switch (param_id) { + case PROP_STATE: + priv->state = g_value_get_int (value); + break; + case PROP_STATUS: + telepathy_presence_set_status (TELEPATHY_PRESENCE (object), + g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +/*! /brief create a presence object instance + * /return created presence object instance + */ + +TelepathyPresence * +telepathy_presence_new (void) +{ + return g_object_new (TELEPATHY_TYPE_PRESENCE, NULL); +} + +/*! /brief get the presence status value + * + * /param presence : presence object + * /return state : status as set in presence object + */ +const gchar * +telepathy_presence_get_status (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), NULL); + + priv = GET_PRIV (presence); + + return priv->status; +} + +/*! /brief get the presence state value + * + * /param presence : presence object + * /return state : state as set in presence object + */ +TelepathyPresenceState +telepathy_presence_get_state (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), + TELEPATHY_PRESENCE_STATE_AVAILABLE); + + priv = GET_PRIV (presence); + + return priv->state; +} + +/*! /brief set the presence state value in presence gobject + * + * /param presence : presence object + * /param state : state + * /return : void + */ +void +telepathy_presence_set_state (TelepathyPresence *presence, + TelepathyPresenceState state) +{ + TelepathyPresencePriv *priv; + + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + + priv = GET_PRIV (presence); + + priv->state = state; + + g_object_notify (G_OBJECT (presence), "state"); +} + +/*! /brief set the presence status text value in presence gobject + * + * /param presence : presence object + * /param state : status + * /return : void + */ +void +telepathy_presence_set_status (TelepathyPresence *presence, + const gchar *status) +{ + TelepathyPresencePriv *priv; + + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + + priv = GET_PRIV (presence); + + g_free (priv->status); + + if (status) { + priv->status = g_strdup (status); + } else { + priv->status = NULL; + } + + g_object_notify (G_OBJECT (presence), "status"); + +} + +/*! /brief converts presence state value from enum to string + * /param presence_state : presence state enum value + * /return : presence state string value + */ +const gchar * +telepathy_presence_state_to_str (TelepathyPresenceState presence_state) +{ + + switch (presence_state) { + case TELEPATHY_PRESENCE_STATE_AVAILABLE: + return "available"; + case TELEPATHY_PRESENCE_STATE_BUSY: + return "dnd"; + case TELEPATHY_PRESENCE_STATE_AWAY: + return "away"; + case TELEPATHY_PRESENCE_STATE_EXT_AWAY: + return "xa"; + case TELEPATHY_PRESENCE_STATE_HIDDEN: + return "hidden"; + case TELEPATHY_PRESENCE_STATE_UNAVAILABLE: + return "offline"; + default: + return NULL; + } +} + +/*! /brief converts presence state value from string to enum + * + * /param str : presence state string value + * /return : presence state enum value + */ +TelepathyPresenceState +telepathy_telepathy_presence_state_from_str (const gchar *str) +{ + + if (strcmp (str, "available") == 0) { + return TELEPATHY_PRESENCE_STATE_AVAILABLE; + } else if ((strcmp (str, "dnd") == 0) || (strcmp (str, "busy") == 0)) { + return TELEPATHY_PRESENCE_STATE_BUSY; + } else if ((strcmp (str, "away") == 0) || (strcmp (str, "brb") == 0)) { + return TELEPATHY_PRESENCE_STATE_AWAY; + } else if (strcmp (str, "xa") == 0) { + return TELEPATHY_PRESENCE_STATE_EXT_AWAY; + } else if (strcmp (str, "hidden") == 0) { + return TELEPATHY_PRESENCE_STATE_HIDDEN; + } else if (strcmp (str, "offline") == 0) { + return TELEPATHY_PRESENCE_STATE_UNAVAILABLE; + } + + return TELEPATHY_PRESENCE_STATE_AVAILABLE; +} + +/*! /brief updates own presence to the n/w server. update_status_cb + * is registered for the callback + * + * /param pres_iface : presence interface + * /param presence : presence object + * /param msg_hdr : presence info list to send presence_msg_struct + * has state, status etc., + * /return : void + */ +void +telepathy_contacts_send_presence (DBusGProxy *pres_iface, + TelepathyPresence *presence, + presence_msg_struct* msg_hdr) +{ + GHashTable *status_ids; + GHashTable *status_options; + const gchar *status_id; + const gchar *message; + TelepathyPresenceState presence_state; + GValue value_message = {0, }; + + if (!pres_iface) { + return; + } + iso_logger( "%s", "In - telepathy_contacts_send_presence\n" ); + + status_ids = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_hash_table_destroy); + status_options = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) g_value_unset); //ToDo: get clarity on freeing this resource + + presence_state = telepathy_presence_get_state (presence); + status_id = telepathy_presence_state_to_str (presence_state); + message = telepathy_presence_get_status (presence); + + if (message) { + g_value_init (&value_message, G_TYPE_STRING); + g_value_set_string (&value_message, message); + g_hash_table_insert (status_options, "message", &value_message); + } + + g_hash_table_insert (status_ids, + g_strdup (status_id), + status_options); + + tp_conn_iface_presence_set_status_async(DBUS_G_PROXY(pres_iface), + status_ids, + update_status_cb, + (gpointer)msg_hdr->hdr_req ); + + g_hash_table_destroy (status_options); //ToDo: get clarity on freeing this resource + g_hash_table_destroy (status_ids); + iso_logger( "%s", "Out - telepathy_contacts_send_presence\n" ); + +} + +/*! /brief This function will be called for presence of each contact + * key has got the state and value status + * + * /param key : hash table key ie presence state + * /param value : hash table value ie presence information + * /param presence : user data + * /remark presence object is logically unused ? + * + * /return : void + */ +static void +telepathy_presences_foreach (gpointer *key, + gpointer *value, + TelepathyPresence **presence) +{ + + TelepathyPresenceState state; + const gchar *message = NULL; + + *presence = telepathy_presence_new(); + iso_logger( "%s", "In - telepathy_presences_foreach\n" ); + + iso_logger( "%s%s", "state : ", (gchar *)key ); + + state = telepathy_telepathy_presence_state_from_str((const gchar *) + key); + telepathy_presence_set_state(*presence, state); + + message = g_value_get_string((GValue *) + g_hash_table_lookup((GHashTable *) + value, "message")); + iso_logger( "%s%s", "message : ", (const gchar *)message ); + + send_presence_to_client((const gchar *)key, message ); + + if (*presence) { + g_object_unref (*presence); + } + + iso_logger( "%s", "Out - telepathy_presences_foreach\n" ); + +} + +/*! /brief This function will be called for each contact. Contact name is + * got from the contcat handle, telepathy_presences_foreach is called + * to get the presence from value of the hash table + * + * @param key : hash table key ie contact handle id + * @param value : hash table value ie presence + * @return : void + */ +static void +telepathy_presence_handle_foreach (gpointer *key, + gpointer *value) +{ + gint handle_id; + GHashTable *presences_hash; + GValue *gvalue; + GObject *presence; + gchar **handle_name = NULL; + GArray *handles; + GError *error = NULL; + + handle_id = GPOINTER_TO_INT(key); + + iso_logger( "%s", "In - telepathy_presence_handle_foreach\n" ); + + handles = g_array_new (FALSE, FALSE, sizeof (gint)); + g_array_append_val (handles, handle_id); + if(!tp_conn_inspect_handles(DBUS_G_PROXY(globalCon.conn), + TP_CONN_HANDLE_TYPE_CONTACT, handles, + &handle_name, &error)) + { + iso_logger( "%s%s", "InspectHandle Error: ", error->message ); + g_clear_error (&error); + g_array_free (handles, TRUE); + if( handle_name ) + { + g_strfreev (handle_name); + } + return; + } + + if (handle_name) + { + iso_logger( "%s%s", "handle_name : ", *handle_name ); + glob_handle_name = *handle_name; + } + + gvalue = g_value_array_get_nth((GValueArray *) value, 1); + + presences_hash = (GHashTable *) g_value_get_boxed(gvalue); + + g_hash_table_foreach(presences_hash, + (GHFunc) telepathy_presences_foreach, &presence ); + + g_clear_error (&error); + g_array_free (handles, TRUE); + g_strfreev (handle_name); + + iso_logger( "%s", "Out - telepathy_presence_handle_foreach\n" ); + +} + +/*! /brief Registered as a signal for presence updates of + * other users. This function will be called whenevr a contact + * to whom this user has subscribed for presence changes his + * presence state or status message. + * + * /param proxy : unused + * /param handle_hash : hash table containing presence information + * as hash value, contact handle as key + * /return : void + */ +void +telepathy_presence_handler(DBusGProxy *proxy, + GHashTable *handle_hash) +{ + GSList *data = NULL; + UNUSED_FORMAL_PARAM(proxy); + iso_logger( "%s", "In - telepathy_presence_handler\n" ); + g_hash_table_foreach(handle_hash, (GHFunc) telepathy_presence_handle_foreach, data); + iso_logger( "%s", "Out - telepathy_presence_handler\n" ); + +} + + +/*! /brief sends presence of the client to n/w server thru' gabble + * calls telepathy_contacts_send_presence to send presence + * + * /param msghdr request header that will be passed back to client + * /param message_type_err unused + * /remark please remove this unused variable(why was this added?) + * + * /return : error code on failure, 0 on success + */ +void send_presence( presence_msg_struct* msg_hdr , gint message_type_err ) + { + TelepathyPresence *presence; + TelepathyPresenceState state; + UNUSED_FORMAL_PARAM(message_type_err); + + iso_logger( "%s", "In - send_presence\n" ); + + //changing own presence status + presence = telepathy_presence_new(); + state = telepathy_telepathy_presence_state_from_str(msg_hdr->useravailability); + telepathy_presence_set_state(presence, state); + + //if (msg_hdr->statustext != NULL) + telepathy_presence_set_status (presence, msg_hdr->statustext); + + telepathy_contacts_send_presence(DBUS_G_PROXY(globalCon.pres_iface), presence, msg_hdr); + + g_object_unref (presence); + iso_logger( "%s", "Out - send_presence\n" ); + } + +/*! /brief parses the message buffer. aPresenceStatus and aStatustext + * pointers updated + * + * /param aMsgBuffer message buffer + * /param aPresenceStatus after call to this function it will + * have the presence status to be updated + * /param aStatustext after call to this function it will + * have the status text to be updated + * + * /param msg_len : msg_len no. of bytes in msg_buf + * /return returns error code on failure, or 0 + */ +int parse_for_presence( gchar* msgbuffer, gchar** presencestatus, + gchar** statustext, gint msg_len ) +{ + + gint len = 0; + gint err=0; + gchar *user_availability =NULL; + gchar *status_text =NULL; + + iso_logger( "%s", "In - parse_for_presence\n" ); + //calculating len for request header + //skip the msg_hdr part + len += sizeof( message_hdr_req ); + + // reading a availability from buffer + err = parse_a_string( msgbuffer, &user_availability, &len, msg_len ); + *presencestatus=user_availability; + if ( err < 0 ) + { + return err; + } + // reading a status text + err = parse_a_string( msgbuffer, &status_text, &len, msg_len ); + *statustext=status_text; + +iso_logger( "%s", "Out - parse_for_presence\n" ); +// need to check..... +return 1; +} + +/*! /brief Parses the message from client and sends the presence + * to n/w server. A err is returned if there is any parse error + * or out of memory condition + * + * /param buf : buffer to be parsed + * /param buf_len : buffer length + * /return : error code if any, 0 on success + */ +int action_parse_presence( gchar* buf, gint buf_len ) + +{ + gchar* presencestatus = NULL; + gchar* statustext = NULL; + message_hdr_req *msg_hdr = NULL; + gint message_type_err = 0; + presence_msg_struct* msg_struct = NULL; + //parse user availability and status text .. + iso_logger( "%s", "In - action_parse_presence\n" ); + message_type_err = parse_for_presence( buf, + &presencestatus,&statustext, buf_len ); + //if <= 0 there is some error in the message formation + if ( message_type_err > 0 ) + { + + //send message + msg_hdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + if ( NULL == msg_hdr ) + { + return MEM_ALLOCATION_ERROR; + } + memset( msg_hdr, '\0', sizeof( message_hdr_req ) ); + //read message header from buffer + memcpy( msg_hdr, buf, sizeof( message_hdr_req ) ); + + //fill the contacts and message into a struct + msg_struct = ( presence_msg_struct* ) malloc ( sizeof ( presence_msg_struct ) ); + if ( NULL == msg_struct ) + { + free ( msg_hdr ); + return MEM_ALLOCATION_ERROR; + } + msg_struct->hdr_req = msg_hdr; + msg_struct->useravailability = presencestatus; + msg_struct->statustext = statustext; + //send presence should be called + send_presence( msg_struct, message_type_err ); + } + + //free ( msg_hdr ); + iso_logger( "%s", "Out - action_parse_send\n" ); + //return error on failure, or no. of contacts message sent to on success + return message_type_err; + + + +} + + +/*! /brief callback for updating own presence. This function + * sends response to client + * + * /param proxy : unused + * /param error : error if any + * /param message : message header + * /return : void + */ +void update_status_cb(DBusGProxy *proxy, GError* error, gpointer userdata) +{ + + int err = 0; + + message_hdr_req* msg_hdr = ( message_hdr_req* ) userdata; + // create the msg queue + //user data is of type message_hdr_req + iso_logger( "%s", "In - update_status_cb\n" ); + UNUSED_FORMAL_PARAM(proxy); + if ( NULL != error ) + { + //There was some error + //send the response for the msg_hdr request to client + err = send_response_to_client( msg_hdr, error->code, 0 ); + } + else + { + //send the response for the msg_hdr request to client + err = send_response_to_client( msg_hdr, 0, 1 ); + } + + //free( msg_hdr ); + + if ( err < 0 ) + { + // failed to deliver + iso_logger( "%s", "failed to deliver\n" ); + } + iso_logger( "%s", "Out - update_status_cb\n" ); + +} + + +/*! /brief Sends presence of conatct to the client. Forms + * the proper presence message format and sends that to client + * + * /param : availability user availability + * /param : text custom status message set by user + * /return : error code on failure, 0 on success + */ +int send_presence_to_client( const gchar *availability , const gchar *text ) + { + int len=0; + int pri = MSG_PRI_NORMAL; + char rmsg[MAX_MSG_SIZE]; + int index = 0; + int err; + message_hdr_resp* msg_resp = NULL; + int result = 0; + int timeout = NO_WAIT; + + iso_logger( "%s", "In - send_presence_to_client\n" ); + + msg_resp = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + if ( NULL == msg_resp ) + { + return MEM_ALLOCATION_ERROR; + } + memset( msg_resp, '\0', sizeof( message_hdr_resp ) ); + memset( msg_resp, '\0', sizeof( message_hdr_resp ) ); + msg_resp->hdr_req.message_type = EPresenceNotification; + msg_resp->hdr_req.protocol_id = 1; + msg_resp->hdr_req.session_id = 1; + msg_resp->hdr_req.request_id =1; + msg_resp->response = 1; + msg_resp->error_type = 0; + memset( rmsg, '\0', MAX_MSG_SIZE ); + memcpy( rmsg, msg_resp, sizeof( message_hdr_resp ) ); + index += sizeof( message_hdr_resp ); + //putting sender in message queue + len = strlen(glob_handle_name); + strcpy( rmsg + index, glob_handle_name ); + index += len + 1; + //putting user availability + len = strlen(availability); + strcpy( rmsg + index, availability ); + index += len + 1; + // puttin status text + len = strlen(text); + strcpy( rmsg + index, text ); + index += len + 1; + result = MsgQSend( RESPONSE_QUEUE, rmsg, index, + pri, timeout, &err); + + free ( msg_resp ); + if(result<0) + { + return FALSE; + } + + + iso_logger( "%s", "message is:\n"); + iso_logger( "%s", "Out - send_presence_to_client\n" ); + + return TRUE; + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isosearch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isosearch.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,634 @@ +/* +* ============================================================================ +* Name : isosearch.c +* Part of : isolation server. +* Version : %version: 17 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +/*! \file +* Impliments the functions in isosearch.h +*/ + +/*! \def For malloc +*/ +#include + +/*! \def For string operations +*/ +#include + +/*! \def For GHashTable +*/ +#include + +/*! \def For search related declarations +*/ +#include "isosearch.h" + +/*! \def For globalCon +*/ +#include "isoservermain.h" + +/*! \def For tp_chan_type_search_async +*/ +#include "tp-chan-type-search-gen.h" + +/*! \def For MSG_PRI_NORMAL +*/ +#include "msgqlib.h" + +/*! \def For message_hdr_req +*/ +#include "isoutils.h" + +/*! \def For RESPONSE_QUEUE +*/ +#include "msgliterals.h" + +/*! \struct key_value_struct isoserach.h +* \brief This struct is used for to form the msg buffer that will be sent to client +* \var msg As the key/value pairs are read those will be appended to msg +* \var len is the no. of bytes appended to msg +*/ +struct key_value_struct + { + gchar* msg; + gint len; + }; + +/*! \typedef struct key_value_struct to key_value_struct +* +*/ +typedef struct key_value_struct key_value_struct; + + +static void search_result_received_cb ( DBusGProxy *proxy, + guint contact_handle, + GHashTable *values, + gpointer user_data + ); + +static void search_state_changed_cb ( DBusGProxy *proxy, + guint search_state, + gpointer user_data + ); + +static void searchreply_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + + +static void do_search_again( GHashTable* search_hash ); + + + +/*! \brief This function called by action_parse_search parses rmsg and +* validates the arguments(key/value pairs). If value for any key found missing +* returns INVALID_PARAMETERES +* +* \param rmsg Message which is parsed +* \param rmsg_len message len +* \param search_hash parsed key/value pairs are filled into this hash table +* +* \return error if any else 0 +*/ +gint parse_for_search( gchar* rmsg, gint rmsg_len, GHashTable* search_hash ) + { + gint pointer_nav = 0; + gchar* value_str = NULL; + gchar* key_str = NULL; + gint err = 0; + GValue *value = NULL; + + iso_logger( "in parse_for_search"); + //Skip the header field + pointer_nav += sizeof( message_hdr_req ); + + while ( '\0' != *( rmsg + pointer_nav ) && pointer_nav < rmsg_len ) + { + //Copy the key + err = parse_a_string( rmsg, &key_str, &pointer_nav, rmsg_len ); + if ( err < 0 ) + { + //if error, return error + return err; + } + //End of message reached and no value found for + //corresponding key + if ( '\0' == *( rmsg + pointer_nav ) ) + { + return INVALID_PARAMETERES; + } + //Copy the value + err = parse_a_string( rmsg, &value_str, &pointer_nav, rmsg_len ); + if ( err < 0 ) + { + //if error, return error + return err; + } + + value = g_new0( GValue, 1 ); + g_value_init( value, G_TYPE_STRING ); + g_value_set_string ( value, value_str ); + + + //insert the key value pair into the hash table + g_hash_table_insert ( search_hash, key_str, value ); + } + iso_logger( "out parse_for_search"); + return 0; + } + +/*! \brief This function is called as a callback to search chan request +* This function creates a search channel and interface which are +* used for subsequent search requests. Logically this function is called +* only once per login session. +* \remark Not creating a search channel each time is a workaround +* +* \param proxy unused +* \param chan_object_path channel object path to create a new channel +* \param error if any +* \param user_data hash table entry(key/value pair) +* +* \return void +*/ + + void do_search_reply( DBusGProxy *proxy, char *chan_object_path, + GError *error, gpointer user_data ) + { + GHashTable *search_hash = ( GHashTable* ) user_data; + TpChan *search_chan = NULL; + DBusGProxy *search_iface = NULL; + + + UNUSED_FORMAL_PARAM( proxy ); + + iso_logger( "in do_search_reply"); + /* Create the object to represent the channel */ + if ( error ) + { + iso_logger( "Error in do_search_reply"); + //There was an error.. send it to client + send_response_to_client( globalCon.search_hdr_req, error->code, 0 ); + //Should error be returned to the client ? + return; + } + search_chan = tp_chan_new( globalCon.dbusConn, globalCon.connmgr_bus, chan_object_path, + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, TP_CONN_HANDLE_TYPE_NONE, 0 ); + + globalCon.search_chan = search_chan; + + g_free(chan_object_path); + + + if ( NULL == search_chan ) + { + iso_logger( "returning because of search_chan"); + //search chan not created + //sending to client + send_response_to_client( globalCon.search_hdr_req, TP_SEARCH_CHAN_ERROR, 0 ); + return ; + } + //Get chan interface + search_iface = tp_chan_get_interface( search_chan, + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + + if ( NULL == search_iface ) + { + iso_logger( "returning because of search_iface"); + //interface for search chan not created + //send that to client + send_response_to_client( globalCon.search_hdr_req, TP_SEARCH_IFACE_ERROR, 0 ); + return ; + } + + //Register for the SearchResultReceived signal + //ownership of the srch_result->user_data is transfered + dbus_g_proxy_connect_signal( search_iface, "SearchResultReceived", + G_CALLBACK( search_result_received_cb ), + NULL, NULL ); + + + //Register for the SearchStateChanged signal + dbus_g_proxy_connect_signal( search_iface, "SearchStateChanged", + G_CALLBACK( search_state_changed_cb ), + NULL , NULL ); + //Call the search on tp + tp_chan_type_search_async( search_iface, search_hash , searchreply_cb, + NULL ); + + iso_logger( "out do_search_reply"); + + + } + + +/*! \brief This function is called by action_parse_search to search for fields +* \remark This function routes the searches to do_search_again if searched more +* than once. This is a workaround because we are getting the signal callbacks +* 'n'ths( where n is nth search ) time if search channel is created each time. +* +* \param search_hash Hash table having the search key and value pairs to be searched +* +* \return void +*/ + +gint do_search( GHashTable* search_hash ) + { + + iso_logger( "in do_search"); + + if(globalCon.search_chan == NULL) + { + tp_conn_request_channel_async( DBUS_G_PROXY( globalCon.conn ), + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, + TP_CONN_HANDLE_TYPE_NONE, 0, TRUE, + do_search_reply, (gpointer)search_hash ) ; + } + + else + { + iso_logger( "calling do_search_again"); + do_search_again(search_hash); + } + iso_logger( "out do_search"); + + return 0; + } + +/*! \brief This function is called if search is done more than once in same login session. +* \remark This is a workaround because we are getting the signal callbacks +* 'n'ths( where n is nth search ) time. +* +* \param search_hash Hash table having the search key and value pairs to be searched +* +* \return void +*/ +void do_search_again( GHashTable* search_hash ) + { + + DBusGProxy *search_iface = NULL; + + iso_logger( "in do_search_again"); + + if ( NULL == globalCon.search_chan ) + { + iso_logger( "returning because of search_chan"); + //search chan not created + //sending to client + send_response_to_client( globalCon.search_hdr_req, TP_SEARCH_CHAN_ERROR, 0 ); + return ; + } + //Get chan interface + search_iface = tp_chan_get_interface( globalCon.search_chan, + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + + if ( NULL == search_iface ) + { + iso_logger( "returning because of search_iface"); + //interface for search chan not created + //send that to client + send_response_to_client( globalCon.search_hdr_req, TP_SEARCH_IFACE_ERROR, 0 ); + return ; + } + + + //Call the search on tp + tp_chan_type_search_async( search_iface, search_hash, searchreply_cb, + NULL ); + + iso_logger( "out do_search_again"); + + + } + + +/* +! /brief This function is called by message_send_recv function in isoservermain.c if message type +* is ESearch. This function parses the rmsg, validates the parameter passed, if parameters are +* correct a search performed for them. else INVALID_PARAMETERES error is returned +* +* /param rmsg message buffer to be parsed +* /param rmsg_len the length of the rmsg +* /remark rmsg_len is not strlen(rmsg) +* /return returns error code or 0 on success +*/ +gint action_parse_search( gchar* rmsg, gint rmsg_len ) + { + + gint err = 0; + GHashTable* search_hash = NULL; + message_hdr_req* hdr_req = NULL; + //Allocate memory and set the memory to '\0' + iso_logger( "in action_parse_search"); + hdr_req = ( message_hdr_req* ) malloc ( sizeof ( message_hdr_req ) ); + + if ( NULL == hdr_req ) + { + return MEM_ALLOCATION_ERROR; + } + memset( hdr_req, '\0', sizeof( message_hdr_req ) ); + //Copy the header into message struct + memcpy( hdr_req, rmsg, sizeof( message_hdr_req ) ); + //Create the hash table + search_hash = g_hash_table_new( g_str_hash, g_str_equal ); + if ( NULL == search_hash ) + { + return MEM_ALLOCATION_ERROR; + } + //Parse the key value pairs to be searched into the hash + err = parse_for_search( rmsg, rmsg_len, search_hash ); + if ( !err ) + { + //Do the search on the fields + globalCon.search_hdr_req = hdr_req; + err = do_search( search_hash ); + } + iso_logger( "out action_parse_search"); + + return err; + } + +/*! \brief This function is called by search_results_recieved for each key/value +* pair of search result(one entry). This function appends the key/value pair +* to the message buffer in the key_value_struct(.msg) and increments +* the no. of bytes written to(key_value_struct.len) +* +* Format of response header(msg buffer) +* key1\0value1\0key2\0value2\0(key3\0value3\0) (3rd round append) +* +* \param key one field of the search entry +* \param value value for the above field +* \param user_data unused +* +* \return void +*/ + +void key_value_store( gpointer key, gpointer value, gpointer user_data ) + { + + key_value_struct* pairs = ( key_value_struct * ) user_data; + GValue* value1 = ( GValue* ) value; + const gchar *value_str = NULL; + const gchar *key_str = ( gchar* ) key; + + iso_logger( "in key_value_store"); + + value_str = g_value_get_string ( value1 ); + + if ( '\0' == *value_str ) + { + iso_logger( "No value"); + return; + } + + iso_logger( "key is %s", key_str ); + //copy The results key part + strcpy( pairs->msg + pairs->len, key_str ); + pairs->len += strlen( key_str ) + 1; + + iso_logger( "value is %s", value_str ); + //copy The results value part + strcpy( pairs->msg + pairs->len, value_str ); + pairs->len += strlen( value_str ) + 1; + iso_logger( "out key_value_store"); + } + + +/*! +* \brief This function is called when the search results are recieved +* This function is called for each contact found matching the +* search criteria. +* +* \param proxy unused +* \param contact_handle unused +* \param results Key value pair of one search result entry +* \param user_data unused +* +* \return void +*/ +static void search_result_received_cb ( DBusGProxy *proxy, + guint contact_handle, + GHashTable *results, + gpointer user_data + ) + { + message_hdr_resp hdr_resp; + //Get the header request + + message_hdr_req* hdr_request = globalCon.search_hdr_req; + key_value_struct pairs; + + gint pri = MSG_PRI_NORMAL; + gint result = 0; + gint timeout = NO_WAIT; + gint err = 0; + + //Create the handle + iso_logger( "in search_result_received_cb"); + + UNUSED_FORMAL_PARAM( proxy ); + UNUSED_FORMAL_PARAM( contact_handle ); + UNUSED_FORMAL_PARAM( user_data ); + + if ( g_hash_table_size( results ) <= 0 ) + { + iso_logger( "No results recieved"); + return; + } + + iso_logger("search result count for hash table %d", + g_hash_table_size( results ) ); + iso_logger("contact handle is %d", + contact_handle ); + + //Create the response header to be sent to client + //Copy the message header request + //Not copying from hdr req because it could have been modified + //in search_state_changed_cb + hdr_resp.hdr_req.message_type = ESearch; + hdr_resp.hdr_req.protocol_id = hdr_request->protocol_id; + hdr_resp.hdr_req.request_id = hdr_request->request_id; + hdr_resp.hdr_req.session_id = hdr_request->session_id; + //set continue flag + hdr_resp.continue_flag = 0; + hdr_resp.error_type = 0; + hdr_resp.response = 1; + //Allocate memory for the message and set memory to '\0' + pairs.msg = ( gchar* ) malloc ( MAX_PARAM_LEN ); + if ( NULL == pairs.msg ) + { + iso_logger( "malloc error @ pairs.msg" ); + return ; + } + memset( pairs.msg, '\0', MAX_PARAM_LEN ); + pairs.len = 0; + //Copy the response + memcpy( pairs.msg, &hdr_resp, sizeof ( message_hdr_resp ) ); + pairs.len += sizeof( message_hdr_resp ); + //Copy the contact name + iso_logger( "%s%d", "message type in search_result_received_cb", hdr_request->message_type ); + + + iso_logger( "%s", "start -------------------------------------------------" ); + + iso_logger( "%s", "contacts key value pair start" ); + + //Copy all the key/value pairs : + //no need to check for size here as it is already done at top + g_hash_table_foreach ( results, key_value_store, &pairs ); + + iso_logger( "%s", "end -------------------------------------------------" ); + + //End the message with a '\0' + pairs.len += 1; + pairs.msg[pairs.len] = '\0'; + //Send the message to client + result = MsgQSend( RESPONSE_QUEUE, pairs.msg, pairs.len, + pri, timeout, &err ); + + if ( result < 0 ) + { + + } + + //Free the hash table itself + g_hash_table_destroy ( results ); + + iso_logger( "in search_result_received_cb"); + } + +/*! \brief This function is a callback registered to searchstatechanged signal. +* This function is called by telepathygabble when status of the search is changed. +* +* \param proxy unused +* \param search_state state of the search +* \param user_data unused +* +* \return void +*/ +static void search_state_changed_cb ( DBusGProxy *proxy, + guint search_state, + gpointer user_data + ) + { + + gint err = 0; + //Get the header request + + iso_logger( "in search_state_changed_cb"); + + UNUSED_FORMAL_PARAM( proxy ); + UNUSED_FORMAL_PARAM( user_data ); + + + if ( 1 == search_state && globalCon.search_hdr_req ) + { + globalCon.search_hdr_req->message_type = ESearch_State_During; + err = send_response_to_client( globalCon.search_hdr_req, 0, 1 ); + if ( err ) + { + iso_logger( " 1 == search_state Error sending to client"); + //? + } + } + else if ( TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER == search_state + && globalCon.search_hdr_req ) + { + globalCon.search_hdr_req->message_type = ESearch_State_Finished; + err = send_response_to_client( globalCon.search_hdr_req, 0, 1 ); + if ( err ) + { + iso_logger( "Error sending to client"); + //? + } + //Since the search is finished delete the hdr request + free ( globalCon.search_hdr_req ); + globalCon.search_hdr_req = NULL; + } + + + iso_logger( "out search_state_changed_cb"); + } + +/*! \brief Function called by telepathygabble when search channel is closed +* This function is regisered when calling the async function to close channel +* +* \param proxy unused +* \param error Error if any +* \param user_data unused +* +* \return void +*/ +void search_chan_closed_cb ( DBusGProxy *proxy, + GError *error, + gpointer user_data + ) + { + iso_logger( "in search_chan_closed_cb"); + UNUSED_FORMAL_PARAM( proxy ); + UNUSED_FORMAL_PARAM( error ); + UNUSED_FORMAL_PARAM( user_data ); + g_object_unref(globalCon.search_chan); + globalCon.search_chan = NULL; + iso_logger( "out search_chan_closed_cb"); + } + +/*! \brief Function called by telepathygabble when search request is sent to server. +* This function is can be thought of as an ack for search request from server. +* +* \param proxy unused +* \param error Network error if any +* \param user_data unused +* +* \return void +*/ +static void searchreply_cb( DBusGProxy *proxy, GError *error, gpointer userdata ) + { + + + iso_logger( "in searchreply_cb" ); + UNUSED_FORMAL_PARAM( proxy ); + UNUSED_FORMAL_PARAM( userdata ); + + if ( error ) + { + + iso_logger( "Error!!!!!" ); + //err cant be handled as of now/this is a special case + //where mem alloc is not possible when sending to client.. + send_response_to_client( globalCon.search_hdr_req, error->code, 0 ); + + tp_chan_close_async( DBUS_G_PROXY( globalCon.search_chan ), + search_chan_closed_cb, NULL ); + //Header request is deleted only in case of error + //Because the search_state_finished_cb will not be called + //In othr cases ownership of user_data is with search_state_finished_cb + + free ( globalCon.search_hdr_req ); + globalCon.search_hdr_req = NULL; + } + + iso_logger( "out searchreply_cb"); + + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isoservermain.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isoservermain.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,496 @@ +/* +* ============================================================================ +* Name : isoservermain.c +* Part of : isolation server. +* Version : %version: 33 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "msgqlib.h" +#include "msg_enums.h" +#include "msgliterals.h" +#include "isoservermain.h" +#include "isoim.h" +#include "isoconnectionmanager.h" +#include "isomodifycontactlist.h" +#include "isoutils.h" +#include "isopresence.h" +#include "isoutils.h" +#include "isoavtar.h" +#include "isosearch.h" +#include "isogetsearchkeys.h" +#include "isofetchcontactlist.h" + +/*! \file +* Impliments the functions in isoservermain.h +*/ + +/*! \def Thread stack size +*/ +#define THREAD_STACK_SIZE 26000 + +/*! \var mainloop_struct global variable having a pointer to mainloop +*/ +globalMainloop mainloop_struct; + +/*! \var globalCon one object per login session +*/ +userConnection globalCon; + + +/*! /brief This message reads message type from the message buffer +* passed as argument +* +* /var pc message buffer +* +* /return pointer to message header response which has the message type +*/ +message_hdr_resp* read_message_type( gchar* buf ) + { + + message_hdr_resp *msg_hdr = NULL; + iso_logger( "%s", "In - read_message_type\n" ); + //allocate memory and check for error + msg_hdr = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + if ( NULL == msg_hdr ) + { + return NULL; + } + //initialze memory to 0 + memset( msg_hdr, '\0', sizeof( message_hdr_resp ) ); + //read message request header from buffer + memcpy( msg_hdr, buf, sizeof( message_hdr_req ) ); + iso_logger( "%s", "Out - read_message_type\n" ); + //return message header read from buffer + return msg_hdr; + } + +/*! /brief This is an entry point to the thread. isoserver.exe +* creates a thread which runs a mainloop. mainloop is passed as +* argument to the thread entry function. This mainloop which is +* run in the thread listens for the events from telepathygabble +* +* /var data unused param +*/ +gpointer thread_entry( gpointer data ) + { + UNUSED_FORMAL_PARAM(data); + //wait till status_changed_cb to happen + //The only main loop is run in a thread.. + iso_logger( "%s", "In - thread_entry\n" ); + //run the mainloop in thread.. + g_main_loop_run( mainloop_struct.mainloop ); + iso_logger( "%s", "Out - thread_entry\n" ); + return NULL; + } + +/*! /brief If there are any parse error, this function is called to +* dispatch the error to client. +* +* /param msg_struct The response header to be sent +* /param err Error +*/ +gint send_error( message_hdr_resp* msg_struct, gint err ) + { + int result = 0; + int pri = MSG_PRI_NORMAL; + int timeout = NO_WAIT; + int error = 0; + + //set the error and reason + msg_struct->error_type = err; + //Since this is method to send error + //response is always 0 + msg_struct->response = 0; + + //request has fialed send appr. response + result = MsgQCreate( RESPONSE_QUEUE, MAX_MSG_Q_SIZE, MSG_Q_FIFO, &error ); + if ( ERROR == result ) + { + //graceful exit? + return ERROR; + } + + //send message created to client + result = MsgQSend( RESPONSE_QUEUE, (void*)msg_struct, sizeof( message_hdr_resp ), + pri, timeout, &error ); + + if( result != 0 ) + { + // msg deliver falied + return MSG_Q_SEND_FAILED; + } + return 0; + } + +/*! /brief This function waits for the requests from the client. +* Requests are parsed, validated and appropriate actions taken. +* A new thread is created when login happens. This function runs +* a while loop which is only quit when a kill request is recieved +* from the client. +* +* /remark should this thread be created before login? +* /remark when is the mainloop quit ? (Should that be after logout or +* after getting a kill request from the client) +*/ +int message_send_recv() + { + + int err = 0; + int result = 0; + int timeout1 = TIME_OUT; // block for 100 ms + char rmsg[MAX_MSG_SIZE]; // 1024 bytes + GMainLoop* mainloop = NULL; + GThread* join1 = NULL; + message_hdr_resp* msg_struct = NULL; + GArray* avtarcontent = NULL; + + globalCon.conn_stat = disconnected; + globalCon.logout_flag = 0; + + /* Try to Create queueOne again, this will create the queue again, + this will just return as its already created by main thread */ + iso_logger( "%s", "In - message_send_recv\n" ); + + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE, MSG_Q_FIFO, &err); + + //logic here to accept multiple clients + mainloop = g_main_loop_new ( NULL, FALSE ); //global mainloop + + + if ( ERROR == result || NULL == mainloop ) + { + return ERROR; + } + + mainloop_struct.mainloop = mainloop; + + while( 1 ) + { + + //initalize memory to 0 + memset( rmsg, '\0', MAX_MSG_SIZE ); + // Receive Message from queueTwo + result = MsgQReceive(REQUEST_QUEUE, rmsg, MAX_MSG_SIZE, timeout1, &err); + + //MRT bug - 4 more bytes recieved than sent.. + result -= 4; + + + //The message should be atleast of size msg_hdr_req + //sizeof should be type casted to gint + //coz when comparing gint and guint(sizeof return value) + //gint is converted to guint + if( result >= ( gint )sizeof( message_hdr_req ) ) + { + gboolean stat_err = FALSE; + // read message header and get type.. + msg_struct = read_message_type( rmsg ); + if ( NULL == msg_struct ) + { + //needs to be discussed what can be done.. + //should exit from here? + return MEM_ALLOCATION_ERROR; + } + switch( globalCon.conn_stat ) + { + case connected: + { + //switch to the message type, where action to be performed + //is decided dpending on the message type + switch ( msg_struct->hdr_req.message_type ) + { + + case ESend_Request: + { + iso_logger( "%s", "In - ESend_Request\n" ); + //parse the request and + // send the request to telepathy + err = action_parse_send( rmsg, result ); + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + send_error( msg_struct, err ); + } + + break; + } + case EUpdateOwnPresence: + { + iso_logger( "%s", "In - EUpdateOwnPresence\n" ); + //parse the request and + // send the request to telepathy + err = action_parse_presence( rmsg, result ); + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + send_error( msg_struct, err ); + } + + break; + } + //For accept, add and delete same function does the job + //depending on the message type that is passed with rmsg + case EReject_Contact_Request: + + case EAccept_Contact_Request: + + case EAdd_Contact_Request: + + case EDelete_Contact_Request: + { + iso_logger( "%s", "In - modify Contact \n" ); + //Parse the request for to add contact and + //request telepathy to add contact + err = action_parse_modify_contact_list( rmsg, result ); + if ( err < 0 ) + { + //addcontacts has fialed send appr. response + send_error( msg_struct, err ); + } + + break; + } + + case ESearch: + { + iso_logger( "%s", "In - ESearch\n" ); + //parse the request and + // send the request to telepathy + err = action_parse_search( rmsg, result ); + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + iso_logger( "%s %d", "error in - ESearch error code:", err ); + send_error( msg_struct, err ); + } + break; + } + + case ESearch_Get_Keys: + { + iso_logger( "%s", "In - ESearch_Get_Keys\n" ); + err = get_search_keys( msg_struct ); + + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + iso_logger( "%s %d", "error in - ESearch_Get_Keys error code:", err ); + send_error( msg_struct, err ); + } + + break; + } + case ELogout_Request: + { + //Message type is to logout + iso_logger( "%s", "In - logout\n" ); + globalCon.conn_stat = disconnecting; + action_logout( rmsg ); + //globalCon.logout_flag = 1; + break; + } + case EUpdateOwnAvtar: + { + err = update_own_avatar( rmsg,msg_struct,result, &avtarcontent); + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + iso_logger( "%s %d", "error in - ESearch_Get_Keys error code:", err ); + send_error( msg_struct, err ); + } + break; + } + case EClearOwnAvatar: + { + err = clear_avatar( &(msg_struct->hdr_req) ); + if ( err < 0 ) + { + //Send request has failed.. + //send the error code to the client + send_error( msg_struct, err ); + } + break; + } + case EFetchCachedContacts: + fetch_cached_contacts(); + break; + + default: + { + iso_logger( "%s", "In - default state is connected\n" ); + stat_err = TRUE; + break; + } + + } + } + break; + case disconnected: + switch( msg_struct->hdr_req.message_type ) + { + case ELogin_Request: + { + //parse the message buffer and login + iso_logger( "%s", "In - login\n" ); + //parses the request message and does a login + //if all the parameters are correct + globalCon.conn_stat = connecting; + err = action_parse_login( rmsg, result ); + //If there is no error in login create a new thread + //where mainloop will be run.. + if ( !err ) + { + //Create a thread for the mainloop to run.. + //Thread entry does a run on mainloop + join1 = g_thread_create_full( thread_entry, mainloop, + THREAD_STACK_SIZE, TRUE, FALSE, + G_THREAD_PRIORITY_NORMAL , NULL ); + + + } + else + { + //There was some error while loging in.. send the error + //to client + globalCon.conn_stat = disconnected; + send_error( msg_struct, err ); + } + break; + } + + default: + { + iso_logger( "%s", "In - default state is disconnected\n" ); + stat_err = TRUE; + } + } + break; + case not_connected: + switch( msg_struct->hdr_req.message_type ) + { + case EKill_Process : + { + //no need to change the state as anyways it is going to be killed + //globalCon.conn_stat = not_connected; + globalCon.logout_flag = 1; + break; + } + default: + { + iso_logger( "%s", "In - default state is not_connected\n" ); + stat_err = TRUE; + } + } + break; + default: + { + iso_logger( "%s", "In - default state connecting or disconnecting \n" ); + stat_err = TRUE; + break; + } + } + if ( stat_err ) + { + stat_err = FALSE; + iso_logger( "%s", "In - stat_err true \n" ); + send_error( msg_struct, CONNECTION_STATUS_ERROR ); + } + if ( globalCon.logout_flag ) + { + //quit mainloop before exiting the thread and then server + //quiting mainloop will inturn make the thread to fall off + g_main_loop_quit( mainloop_struct.mainloop ); + iso_logger( "%s", "logout flag break \n" ); + break; + } + free ( msg_struct ); + + } + else + { + break; + } + } + iso_logger( "%s", "In - g_thread_join\n" ); + + + + //join the thread created for to run mainloop before exiting + g_thread_join( join1 ); + iso_logger( "%s", "After this should be after mainloop quit - g_thread_join\n" ); + + /* delete message queueOne */ + result=MsgQDelete( REQUEST_QUEUE, &err ); + + iso_logger( "%s", "Out - MsgQDelete\n" ); + return 0; + } + +/*! \brief server main process which listens to requests from client +* and processes those requests. A new thread is created to listen to +* the events from the telepathygabble. +*/ +int main() + { + int err = 0; + //FILE *fp = NULL; + + g_type_init(); + + g_thread_init( NULL );/* + _dbus_setenv("DBUS_VERBOSE","1"); + fp= freopen("c:\\iso-dbus.txt", "a",stderr);*/ + iso_logger( "%s", "In - main\n" ); + //wait in a loop to accept requests from the client + //Can mainloop be used instead of waiting in a loop? + err = message_send_recv(); + if ( err != 0 ) + { + printf("exit err code is %d\n", err ); + } + iso_logger( "%s", "Out - main\n" ); + + //fclose(fp); + return 0; + } diff -r 000000000000 -r d0f3a028347a isolationserver/isoserver/src/isoutils.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/isoserver/src/isoutils.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,305 @@ +/* +* ============================================================================ +* Name : isoutils.c +* Part of : isolation server. +* Version : %version: 15 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include +#include +#include +#include + +#include "isoutils.h" +#include "msgliterals.h" +#include "isoservermain.h" + +/*! \file +* Impliments the functions in isoutils.h +*/ + +/*! \def Thread stack size +*/ +#define LOG_FILENAME "c:\\isoserver.txt" + +/*! \brief Documented in the header file +*/ +void iso_logger ( gchar* fmt, ... ) + { + #ifdef _DEBUG + + FILE* fp; + //open file to read.. + fp = fopen( LOG_FILENAME,"a" ); + if ( fp ) + { + int ival; + double dval; + char* sval; + char* p; + va_list list; + //initalize the variable arg to fmt.. + va_start( list, fmt ); + //Go char by char thru' format string + //example format string ("Hi, by %s", str) + for ( p = fmt; *p; p++ ) + { + if ( *p != '%' ) + { + //Not format specifiers just print them to file + //In example above printe "Hi, by " to file + putc( *p, fp ); + continue; + } + switch( *++p ) + { + case 'd' : + //Next arg got is int + //read integer and print to file + ival = va_arg( list, int ); + fprintf( fp, "%d", ival ); + break; + + case 'f' : + //Next arg got is float + //read float and print to file + dval = va_arg( list, double ); + fprintf( fp, "%f", dval, fp ); + break; + + case 's' : + //Next arg got is string + //read string and go char by char and print to file + for ( sval = va_arg( list, char * ); *sval; sval++ ) + { + putc( *sval, fp ); + } + break; + case 'u' : + //Next arg got is int + //read integer and print to file + ival = va_arg( list, uint ); + fprintf( fp, "%u", ival ); + break; + default: + break; + } + } + //print a new line + fprintf(fp,"\n"); + //close file + fclose(fp); + //close the variable arg list + va_end( list ); + } + #endif //_DEBUG + } + +/*! \brief Documented in the header file +*/ +gint parse_a_string( gchar* msg_buf, gchar** str, gint* len, gint msg_len ) + { + //parsing the buffer into an array of strings(contacts) + gint userlen = 0; + gchar* users = NULL; + + while( '\0' != *( msg_buf + *len ) && *len < msg_len ) + { + //len is different from userlen + //len is total no. of characters read in msg + //where as userlen is no. of char read for this contact + userlen++; + (*len)++; + } + + //the string is not present + //or,Reached the last byte of parse string and it is not '\0' + if ( 0 == userlen || + ( '\0' != *( msg_buf + *len ) && *len == msg_len ) ) + { + //Got parse error.. + //Invalid message format.. + return INVALID_PARAMETERES; + } + //Allocate memory and check for error + users = ( gchar* ) malloc ( userlen + 1 ); + if ( NULL == users ) + { + return MEM_ALLOCATION_ERROR; + } + memset( users, '\0', userlen + 1 ); + //copy one contact... + memcpy( users, ( msg_buf + *len - userlen ), userlen + 1 ); + *str = users; + (*len)++; + //On success return 0 + return 0; + } + +/*! \brief Documented in the header file +*/ +gint parse_into_array_of_strings( gchar* msg_buf, gchar*** contact_ids, + gint* len, gint msg_len, gint* cntidscount ) + { + gchar** cntids = NULL; + gchar* users = NULL; + gint err = 0; + + //to calc MAX_MSG_RECEIPIENTS dynamically one more loop needs to be done + //for this + //Allocate memory and check for error returns + cntids = ( gchar** ) malloc( MAX_MSG_RECEIPIENTS * sizeof( gchar* ) ); + if ( NULL == cntids ) + { + return MEM_ALLOCATION_ERROR; + } + do + { + //get one string at a time.. + err = parse_a_string( msg_buf, &users, len, msg_len ); + + if ( err < 0 ) + { + return err; + } + //check if max no of contacts are read.. + //if not, copy contact into 2D array of strings... + //else ignore the extra contacts + //do not over run the cntids , incase of + //no. of contacts more than max msg recp. @ line 197 + //cntids[*cntidscount] = NULL; + if ( *cntidscount < MAX_MSG_RECEIPIENTS - 1 ) + { + cntids[*cntidscount] = users; + ( *cntidscount )++; + } + else + { + //users to be freed..ignoring extra no. of recipients + free ( users ); + } + + //increment the no. of contacts.. + + //all contacts read break the loop + // + if ( '\0' == *( msg_buf + *len ) ) + { + break; + } + //If maximum no. of receipients is reached break + //so here of total no. of contacts, message is only sent to + //first MAX_MSG_RECEIPIENTS - 1 + } while( *len < msg_len ); + cntids[*cntidscount] = NULL; + + /* + //Did not find any use of this as of now.. + //But in case of any mem issues can be looked into + if ( *cntidscount < MAX_MSG_RECEIPIENTS ) + { + //realloc is debatable ... + cntids = ( char** ) realloc( cntids, ( *cntidscount + 1 ) * sizeof( char* ) ); + }*/ + //Assign to contact ids + *contact_ids = cntids; + (*len)++; //skip the last '\0' ... 2D arrays end with '\0' + return 0; + } + +/*! \brief Documented in the header file +*/ +void free_msg_args( gchar** contactid, gint contacts_count, gchar* sendmsg ) + { + gint i = 0; + //free all the contacts + if ( NULL != contactid ) + { + for ( i = 0; i < contacts_count; i++ ) + { + if ( NULL != (contactid)[i] ) + { + free ( (contactid)[i] ); + } + } + } + //free the message + if ( NULL != sendmsg ) + { + free ( sendmsg ); + } + } + +/*! \brief Documented in the header file +*/ +gint send_response_to_client( message_hdr_req* hdr_req, gint error, + gboolean response ) + { + int pri = MSG_PRI_NORMAL; + gint result = 0; + gint err = 0; + int timeout = NO_WAIT; + message_hdr_resp* msg_struct = NULL; + + result = MsgQCreate( RESPONSE_QUEUE, MAX_MSG_Q_SIZE, MSG_Q_FIFO, &err ); + if ( ERROR == result ) + { + return ERROR; + } + + msg_struct = ( message_hdr_resp* ) malloc ( sizeof( message_hdr_resp ) ); + if ( NULL == msg_struct ) + { + return MEM_ALLOCATION_ERROR; + } + + //intialize memory to 0 + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + //Copy the header request into response header.. + //This req header in resp will be used to map the req to resp. + msg_struct->hdr_req.message_type = hdr_req->message_type; + msg_struct->hdr_req.protocol_id = hdr_req->protocol_id; + msg_struct->hdr_req.session_id = hdr_req->session_id; + msg_struct->hdr_req.request_id = hdr_req->request_id; + + //set the error and responses.. + msg_struct->error_type = error; + msg_struct->response = response; + + //send the message to the client + result = MsgQSend( RESPONSE_QUEUE, (void*)msg_struct, sizeof( message_hdr_resp ), + pri, timeout, &err ); + + free ( msg_struct ); + + if ( 0 > result ) + { + return MSG_Q_SEND_FAILED; + } + + return 0; + + } diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/bwins/opencmessagequeuelibraryu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/bwins/opencmessagequeuelibraryu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,9 @@ +EXPORTS + MsgQCheck @ 1 NONAME + MsgQClean @ 2 NONAME + MsgQCreate @ 3 NONAME + MsgQDelete @ 4 NONAME + MsgQMaxCheck @ 5 NONAME + MsgQReceive @ 6 NONAME + MsgQSend @ 7 NONAME + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/eabi/opencmessagequeuelibraryu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/eabi/opencmessagequeuelibraryu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,9 @@ +EXPORTS + MsgQCheck @ 1 NONAME + MsgQClean @ 2 NONAME + MsgQCreate @ 3 NONAME + MsgQDelete @ 4 NONAME + MsgQMaxCheck @ 5 NONAME + MsgQReceive @ 6 NONAME + MsgQSend @ 7 NONAME + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* +* ============================================================================ +* Name : isosearch.c +* Part of : isolation server. +* Version : %version: bh1cfmsg#13 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + + +PRJ_PLATFORMS + WINSCW ARMV5 + +#include + +PRJ_EXPORTS + + +PRJ_MMPFILES +messagequeuelibrary.mmp + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/group/messagequeuelibrary.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/group/messagequeuelibrary.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,89 @@ +/* +* ============================================================================ +* Name : isosearch.c +* Part of : isolation server. +* Version : %version: bh1cfmsg#13 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#include +TARGET opencmessagequeuelibrary.dll +TARGETTYPE DLL +UID 0x1000008d 0x2001241B + + +CAPABILITY ALL -TCB +VENDORID VID_DEFAULT + +VERSION 10.0 + +#ifndef WINSCW +EPOCALLOWDLLDATA +#endif //WINSCW + +#ifdef WINSCW +MACRO EMULATOR +#endif + +SOURCEPATH ../src + + +/* +#ifdef WINSCW +SOURCE mesgq_wsd.cpp +#endif +*/ + +SOURCE msgqcheck.c +SOURCE msgqclean.c +SOURCE msgqcreate.c +SOURCE msgqdelete.c +SOURCE msgqmaxcheck.c +SOURCE msgqrecv.c +SOURCE msgqsend.c +SOURCE msgqinternals.cpp + + +USERINCLUDE ../inc + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + + +LIBRARY libc.lib + +#ifdef WINSCW +LIBRARY euser.lib +LIBRARY ewsd.lib +#endif +#ifdef GCCE +STATICLIBRARY libcrt0_gcce.lib +#else +STATICLIBRARY libcrt0.lib +#endif + + +LANG SC + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqcheck.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqcheck.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,59 @@ +/** + * @file MsgQCheck.cpp + * Description: Source file for MsgQLib's MsgQCheck API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + + + +/***************************************************************************** +* MsgQCheck +* Function: Function for checking how many messages are in a queue +*******************************************************************************/ + +EXPORT_C int MsgQCheck(ULONG qName, int* err) { + + int nMsgs; + struct msqid_ds qStatus ; + int qId; + + + if((qId = msgget((key_t) qName ,IPC_CREAT | 0666 /*| IPC_EXCL */)) >=0 ) { + // get total count of msgs from the msg queue + if ((msgctl(qId,IPC_STAT ,&qStatus)) >= 0 ) { + nMsgs=qStatus.msg_qnum ; + *err = OK; + return(nMsgs); + } + else + *err=errno; + } + else + *err = KMsgQLibQIdErr; + return(ERROR); +} + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqclean.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqclean.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,58 @@ +/** + * @file MsgQClean.cpp + * Description: Source file for MsgQLib's MsgQClean API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + + +/**************************************************************************** +* MsgQClean (qName, err) +* Description: Function that empties the specified queue +*****************************************************************************/ + +EXPORT_C int MsgQClean(ULONG qName, int* err) { + + char msg[MAX_MSG_LEN]; + int rcv_err; + + if(( msgget((key_t) qName ,IPC_CREAT | 0666 /*| IPC_EXCL */ )) >=0 ) { + // sending a message is not allowed + // empty out the queue + while(MsgQReceive(qName, msg, MAX_MSG_LEN, IPC_NOWAIT, &rcv_err) != ERROR) {}; + if (rcv_err == ENOMSG) { + *err = OK; + return (OK); + } + else + *err = rcv_err; + } + else + *err = KMsgQLibQIdErr; + + return(ERROR); +} + + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqcreate-del.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqcreate-del.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,116 @@ +/** + * @file MsgQCreate.cpp + * Description: Source file for MsgQLib's MsgQCreate API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + + +/******************************************************************************** +* MsgQCreate +* Description: Creates a message queue +* Inputs: +* qName : ULONG that represents the queue name +* maxMsgs : ULONG that represents maximum size of messages +*********************************************************************************/ +EXPORT_C int MsgQCreate(ULONG qName, ULONG maxMsgs, ULONG qOptions, int* err) { + int qId; + //int semId; + //int semName ; + struct msqid_ds qStatus ; + //struct semid_ds sStatus ; + + //union semun { + // int val; + // struct semid_ds* buf; + // ushort_t* array; + //} arg ; + + int hashInstErr; + + //if (MsgQTableLookup(qName) != NULL) { + // *err = OK; + // return (OK); + //} + //else { + if((qOptions == MSG_Q_FIFO) || (qOptions == MSG_Q_PRIORITY)) { + // Set msg queue options to FIFO and create the message queue + qOptions= MSG_Q_FIFO ; + + if((qId = msgget((key_t) qName ,IPC_CREAT | 0666 | IPC_EXCL )) >=0 ) { + // set msg queue parameter max # bytes in queue + + if( msgctl(qId,IPC_STAT,&qStatus) == 0 ) + + if( qStatus.msg_qbytes > (maxMsgs * MAX_MSG_LEN) ) { + qStatus.msg_qbytes = maxMsgs * MAX_MSG_LEN ; + if( msgctl(qId,IPC_SET,&qStatus) < 0) { + // delete message queue on error + msgctl(qId,IPC_RMID,0); + *err = errno; + return(ERROR); + } + } + *err = OK; + return (OK); + + // create semaphore + //semName= (key_t) qName; + //if((semId = semget(semName, 1, IPC_CREAT | 0666 |IPC_EXCL )) >= 0 ) { + // set the semaphore value + // arg.buf = &sStatus; + // arg.val = 1; + // semctl(semId , 0, SETVAL, arg) ; + + //install queue data in hash table + // if(InstallMsqQTable(qName, qId, semId, &hashInstErr) == OK) { + // AddToMsgQTable(qName); + // *err = OK; + // return (OK); + // } + // else { + //delete semaphore on error + // semctl(semId,0,IPC_RMID,0) ; + // *err = hashInstErr; + // } + //} + //else { + // delete message queue on error + // msgctl(qId,IPC_RMID,0); + // *err = errno; + //} + } + else { + *err = errno; + } + } + else + *err = KMsgQLibParamErr; + + return(ERROR); + //} +} + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqcreate.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqcreate.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,91 @@ +/** + * @file MsgQCreate.cpp + * Description: Source file for MsgQLib's MsgQCreate API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + + +/******************************************************************************** +* MsgQCreate +* Description: Creates a message queue +* Inputs: +* qName : ULONG that represents the queue name +* maxMsgs : ULONG that represents maximum size of messages +*********************************************************************************/ +EXPORT_C int MsgQCreate(ULONG qName, ULONG maxMsgs, ULONG qOptions, int* err) { + + + UNUSED_FORMAL_PARAM(qName); + UNUSED_FORMAL_PARAM(maxMsgs); + UNUSED_FORMAL_PARAM(err); + if((qOptions == MSG_Q_FIFO) || (qOptions == MSG_Q_PRIORITY)) { + // Set msg queue options to FIFO and create the message queue + qOptions= MSG_Q_FIFO ; + + if((msgget((key_t) qName ,IPC_CREAT | 0666 | IPC_EXCL )) == -1 ) { + if ( errno == 17 ){ + // message queue already exists + // now just get the hanlde to it + // no need to leave over here; + } + } + + if((msgget((key_t) qName ,IPC_CREAT | 0666 )) >=0 ) { + + // set msg queue parameter max # bytes in queue + + /* if( msgctl(qId,IPC_STAT,&qStatus) == 0 ) + + if( qStatus.msg_qbytes > (maxMsgs * MAX_MSG_LEN) ) { + qStatus.msg_qbytes = maxMsgs * MAX_MSG_LEN ; + if( msgctl(qId,IPC_SET,&qStatus) < 0) { + // delete message queue on error + msgctl(qId,IPC_RMID,0); + *err = errno; + return(ERROR); + } + } + + */ + + *err = OK; + return (OK); + + + } + else { + *err = errno; + } + } + else { + *err = KMsgQLibParamErr; + } + + return(ERROR); +} + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqdelete.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqdelete.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,58 @@ +/** + * @file MsgQDelete.cpp + * Description: Source file for MsgQLib's MsgQDelete API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + + +/******************************************************************************* +* MsgQDelete (qName, err) +* Description: Function for deleting a message queue +********************************************************************************/ + +EXPORT_C int MsgQDelete(ULONG qName, int* err) +{ + int qId; + + if((qId = msgget((key_t) qName ,IPC_CREAT | 0666 /*| IPC_EXCL */ )) >=0 ) { + + if (msgctl(qId,IPC_RMID,0) == 0) { + *err = OK; + return (OK); + } + else { + *err = errno; + } + + } + else { + *err = KMsgQLibQIdErr; + } + + return(ERROR); +} + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqinternals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqinternals.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,236 @@ +/** + * @file MsgQInternals.cpp + * Description: Source file for MsgQLib + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include + +/* Declaration and definition of Internal Functions and data structures */ +#ifdef __WINSCW__ + +#include +typedef void TAny; +#include // For emulator WSD API + +const TUid KMsgQLibUid3 = {0xA0001319}; + + +typedef struct { + MSGQ_INFO_PTR _MsgQInfo[MSGQ_TBL_SZ]; + MSGQ_INFO_LIST_PTR _MsgQListHead; +}MsgQGlobalData; + +int InitWSDVar(MsgQGlobalData* p) { + p->_MsgQListHead = NULL; + return 0; +} +MsgQGlobalData* GetGlobal() { + // Access the PLS of this process + MsgQGlobalData* p = Pls(KMsgQLibUid3, &InitWSDVar); + return p; +} + + +MSGQ_INFO_PTR* _MsgQInfo() { + //return &(GetGlobal()->_MsgQInfo[0]); // orig code + MSGQ_INFO_PTR* p = (GetGlobal()->_MsgQInfo); + return p; + //return (GetGlobal()->_MsgQInfo); // modified line +}; + +MSGQ_INFO_LIST_PTR* _MsgQListHead() { + return &(GetGlobal()->_MsgQListHead); +}; + +#define MsgQInfo (_MsgQInfo()) +#define MsgQListHead (*_MsgQListHead()) + +#else +MSGQ_INFO_PTR MsgQInfo[MSGQ_TBL_SZ]; +MSGQ_INFO_LIST_PTR MsgQListHead = NULL; +#endif + +inline unsigned int HashIndex(ULONG qName); + +/*************** INTERNAL FUNCTIONS ******************************/ + +/*************************************************************************** +* InstallMsqQTable (qName, qid, semId, sendState, numMsgs, err) +* Function: This function installs a queue into the hash table +****************************************************************************/ + +int InstallMsqQTable(ULONG qName, int qId, int semId, int* err) { + + MSGQ_INFO_PTR pMsgQInfo = NULL; + unsigned int index; + + if ((pMsgQInfo = MsgQTableLookup(qName)) == NULL) { + pMsgQInfo = (MSGQ_INFO_PTR)malloc(sizeof(*pMsgQInfo)); + + if(pMsgQInfo != NULL) { + index = HashIndex(qName); + + pMsgQInfo->next = MsgQInfo[index]; + MsgQInfo[index] = pMsgQInfo; + pMsgQInfo->qName = qName; + pMsgQInfo->qId = qId; + pMsgQInfo->semId = semId; + pMsgQInfo->sendState = MSG_Q_READY; + pMsgQInfo->numMsgs = 0; + + *err = OK; + return (OK); + } + else + *err = KMsgQLibNoMemoryErr; + } + else + *err = KMsgQLibQIdErr; + + return(ERROR); + +} + + +/****************************************************************************** +* HashIndex +* Function: This function returns the hash index +*******************************************************************************/ + +inline unsigned int HashIndex(ULONG qName) { + unsigned int hash_index = (qName % MSGQ_TBL_SZ); + //return(qName % MSGQ_TBL_SZ); + return hash_index; +} + + +/************************************************************************ +* MsgQTableLookup (qName) +* Function: This function finds the block pointer for each queue +*************************************************************************/ + +MSGQ_INFO* MsgQTableLookup(ULONG qName) { + MSGQ_INFO_PTR pMsgQInfo = NULL; + + for (pMsgQInfo = MsgQInfo[HashIndex(qName)]; pMsgQInfo != NULL; pMsgQInfo = pMsgQInfo->next) { + if (qName == pMsgQInfo->qName) + return(pMsgQInfo); + } + + return(NULL); +} + + +/************************************************************************* +* RemoveFromMsqQTable (qName, err) +* Function: This function removes a queue from the hash table +**************************************************************************/ + + +int RemoveFromMsqQTable(ULONG qName, int* err) { + unsigned int index = 0; + MSGQ_INFO_PTR prev = NULL; + MSGQ_INFO_PTR pMsgQInfo = NULL; + + index = HashIndex(qName); + for (pMsgQInfo = MsgQInfo[index]; pMsgQInfo != NULL; pMsgQInfo = pMsgQInfo->next) { + if (qName == pMsgQInfo->qName) + break; + prev = pMsgQInfo; + } + + if (pMsgQInfo != NULL) { + if (prev == NULL) + MsgQInfo[index] = pMsgQInfo->next; + else + prev->next = pMsgQInfo->next; + + free((void*)pMsgQInfo); + *err = OK; + return (OK); + } + else + *err = KMsgQLibQIdErr; + + return(ERROR); +} + + +/************************************************************************ +* AddToMsgQTable (qName) +* Function: Adding a queue to list +*************************************************************************/ + +void AddToMsgQTable(ULONG qName) { + MSGQ_INFO_LIST_PTR tempNext; + + if (MsgQListHead != NULL) { + /* subsequent entries */ + tempNext = MsgQListHead->next; + + if ((MsgQListHead->next = (MSGQ_INFO_LIST*)malloc(sizeof(MSGQ_INFO_LIST))) != NULL) { + MsgQListHead->next->next = tempNext; + MsgQListHead->next->qName = qName; + } + else + MsgQListHead->next = tempNext; + } + else { + if ((MsgQListHead = (MSGQ_INFO_LIST*)malloc(sizeof(MSGQ_INFO_LIST))) != NULL) { + MsgQListHead->next = NULL; + MsgQListHead->qName = qName; + } + } +} + +/************************************************************************ +* DeleteFromMsgQTable (qName) +* Function: removing a queu entry from list +*************************************************************************/ + +void DeleteFromMsgQTable(ULONG qName) { + MSGQ_INFO_LIST_PTR prev = NULL; + MSGQ_INFO_LIST_PTR pMsgQInfo = NULL; + + for (pMsgQInfo = MsgQListHead; pMsgQInfo != NULL; pMsgQInfo = pMsgQInfo->next) { + if (qName == pMsgQInfo->qName) + break; + prev = pMsgQInfo; + } + + if (pMsgQInfo != NULL) { + /* Check whether prev pointer is null or not. If it is Null, update Head pointer */ + if( prev == NULL ) + MsgQListHead = MsgQListHead->next ; + + /* Else update the linked list by removing present node and updating prev next pointer */ + else + prev->next = pMsgQInfo->next; + + /* Now free up the memory used by the present node */ + free((void*) pMsgQInfo); + } +} + +// end of fil diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqmaxcheck.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqmaxcheck.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +/** + * @file MsgQMaxCheck.cpp + * Description: Source file for MsgQLib's MsgQMaxCheck API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************************/ + +#include <_ansi.h> +#include +#include + + +/************************************************************************** +* MsgQMaxCheck +* Function: This function checks the maximum number of messages in a +***************************************************************************/ + +EXPORT_C int MsgQMaxCheck(ULONG qName, int* err) { + + //if ((pMsgQInfo = MsgQTableLookup(qName)) != NULL) { + // *err = OK; + // return (pMsgQInfo->maxNumMsgs); + //} + //else + // *err = KMsgQLibQIdErr; + UNUSED_FORMAL_PARAM(qName); + UNUSED_FORMAL_PARAM(err); + return(ERROR); +} + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqrecv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqrecv.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,76 @@ +/** + * @file MsgQRecv.cpp + * Description: Source file for MsgQLib's MsgQReceive API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include + + + +/******************************************************************************* +* MsgQReceive (qName, msg, maxNBytes, timeout, err) +* Description: Function for receiving a message with internal copy +********************************************************************************/ + +EXPORT_C int MsgQReceive(ULONG qName, char* msg, ULONG maxNBytes, int timeout, int* err) { + ssize_t rxBytes; + int toTicks; + + int qId; + struct { + long mtype; + char mtext[MAX_MSG_LEN]; + } message; + + /* check parameters */ + + if((qId = msgget((key_t) qName ,IPC_CREAT | 0666 /*| IPC_EXCL */ )) >=0 ) { + + toTicks = timeout; + message.mtype = 1; + /* receive message */ + if((rxBytes = msgrcv(qId, &message, (size_t)maxNBytes, 1, toTicks)) != -1) { + message.mtext[rxBytes-4] = '\0'; + bcopy(message.mtext, msg, rxBytes); + + *err = OK; + return ((ULONG)rxBytes); + } + else { + *err = errno; + } + + } + else { + *err = KMsgQLibQIdErr; + } + + return(ERROR); +} + + diff -r 000000000000 -r d0f3a028347a isolationserver/messagequeue/src/msgqsend.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/messagequeue/src/msgqsend.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,77 @@ +/** + * @file MsgQSend.cpp + * Description: Source file for MsgQLib's MsgQSend API + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include + +/******************************************************************************* +* MsgQSend (qName, msg, nBytes, priority, timeout, err) +* Description: Function for sending a message with internal copy +*********************************************************************************/ + +EXPORT_C int MsgQSend(ULONG qName, char* msg, ULONG nBytes, ULONG priority, int timeout, int* err) +{ + int qId; + struct { + long mtype; + char mtext[MAX_MSG_LEN]; + } message; + + /* check parameters */ + if ((priority == MSG_PRI_NORMAL) || (priority == MSG_PRI_URGENT)) { + + if((qId = msgget((key_t) qName ,IPC_CREAT | 0666 /*| IPC_EXCL */ )) >=0 ) { + + if( 1 ) { + message.mtype = 1; + bcopy(msg, message.mtext, nBytes); + message.mtext[nBytes] = '\0'; + + if(msgsnd (qId, &message, (size_t)nBytes+4, timeout) == OK) { + *err = OK; + /* After successfull send, unlock the message queue by using post operation on semaphore.*/ + return (OK); + } + else { + *err = errno; + } + } + else + *err = errno; + } + else + *err = KMsgQLibQIdErr; + } + else + *err = KMsgQLibParamErr; + + return(ERROR); +} + diff -r 000000000000 -r d0f3a028347a isolationserver/rom/isoserver.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/rom/isoserver.iby Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +/* +* ============================================================================ +* Name : isoserver.iby +* Part of : isolation server. +* Version : %version: 1.1.1 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + +#ifndef __ISOSERVER_IBY__ +#define __ISOSERVER_IBY__ + +//Isolation server + +file=ABI_DIR\BUILD_DIR\OpenCMessageQueueLibrary.dll SHARED_LIB_DIR\OpenCMessageQueueLibrary.dll +file=ABI_DIR\BUILD_DIR\IsoServer.exe PROGRAMS_DIR\IsoServer.exe + +// mecostub SIS, provides support for SIS upgrading +//data=DATAZ_\system\install\meco_stub.sis system\install\meco_stub.sis + +#endif + + diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/bwins/isolationserveru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/bwins/isolationserveru.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &) + diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/conf/isolationserver.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/conf/isolationserver.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,478 @@ +// Definitions +[Define] +SERVER talk.google.com +USERNAME meco7777@gmail.com +PASSWORD meco7778 +RECIPIENT nokiatestlm@gmail.com +MESSAGE Hello +SPECIALMESSAGE ***___HELLO++++ +RESOURCE mytest +BADSERVER talk.gaagle.com +BADPASSWORD junk123 +BLOCKEDUSER user.block2008@gmail.com +UNEXISTUSERID isoserver@gmail.com +MIXEDLETTERUSERNAME MEcO7777@gmail.com +MAXLENGTHUSERID abcd123456abcd123456abcd123456@gmail.com +PWD nokia123 +MINLENGTHUSERID ab123d@gmail.com +NOTADDEDUSER rakesh.harsha@gmail.com +PROXY_SERVER 172.16.42.135 +PROXY_PORT 8080 +PORT 443 +CONNMGR_BUS org.freedesktop.Telepathy.ConnectionManager.gabble +CONNMGR_PATH /org/freedesktop/Telepathy/ConnectionManager/gabble +PROTOCOL jabber +CONTACT test_isoserver@gmail.com +MIXCONTACT Test_IsoServer@gmail.com +INVALIDUSERID ISOSERVER_TEST@gmail.com +LONGMESSAGE abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz +SERVER_GIZMO chat.gizmoproject.com +USERNAME_GIZMO testlmnokia@chat.gizmoproject.com +PASSWORD_GIZMO loudmouth + +//dummy string +DUMMY dummy + +//avatar +AVATARFILEJPEG C:\data\Images\test.jpg +MIMETYPEJPEG image/jpeg +AVATARFILEPNG C:\data\Images\test.png +MIMETYPEPNG image/png +AVATARFILEGIF C:\data\Images\test.gif +MIMETYPEGIF image/gif +AVATARLARGEJPG C:\data\Images\large.jpg +AVATARLARGEPNG C:\data\Images\large.png +AVATARLARGEGIF C:\data\Images\large.gif +AVATARFILEDRM C:\data\Images\drmprotected.jpg +AVATARFILECORRUPT C:\data\Images\corrupted.jpg +[Enddefine] + + +[Test] +title 1.LoginWithCorrectData +create isolationservertest isolationserverObj +isolationserverObj LoginWithCorrectData SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 2.LoginWithWrongPassword +create isolationservertest isolationserverObj +isolationserverObj LoginWithWrongPassword SERVER USERNAME BADPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 3.LoginWithUnexistUserId +create isolationservertest isolationserverObj +isolationserverObj LoginWithUnexistUserId SERVER UNEXISTUSERID BADPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL + +delete isolationserverObj +[Endtest] + +/* +[Test] +title 4.LoginWithUnexistServer +create isolationservertest isolationserverObj +isolationserverObj LoginWithUnexistServer BADSERVER USERNAME BADPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] +*/ +[Test] +title 5.LoginWithMixedLetterUserId +create isolationservertest isolationserverObj +isolationserverObj LoginWithMixedLetterUserId SERVER MIXEDLETTERUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL + +delete isolationserverObj +[Endtest] + +[Test] +title 6.LoginWithMaximumLenghtUserId +create isolationservertest isolationserverObj +isolationserverObj LoginWithMaximumLenghtUserId SERVER MAXLENGTHUSERID PWD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL + +delete isolationserverObj +[Endtest] + +[Test] +title 7.LoginWithMinimumLenghtUserId +create isolationservertest isolationserverObj +isolationserverObj LoginWithMinimumLenghtUserId SERVER MINLENGTHUSERID PWD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 8.LogoutFromServer +create isolationservertest isolationserverObj +isolationserverObj LogoutFromServer SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 9.LoginWithBlankUserId +create isolationservertest isolationserverObj +isolationserverObj LoginWithBlankUserId SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 10.LoginLogOutWithReapitiveSession +create isolationservertest isolationserverObj +isolationserverObj LoginLogOutWithReapitiveSession SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL + +delete isolationserverObj +[Endtest] + +[Test] +title 11.LoginWithCoreectUserIDWithSpace +create isolationservertest isolationserverObj +isolationserverObj LoginWithCoreectUserIDWithSpace SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 12.SendMessageToCorrectUserID +create isolationservertest isolationserverObj +isolationserverObj SendMessageToCorrectUserID SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 13.SendMaxLenMessageToCorrectUserID +create isolationservertest isolationserverObj +isolationserverObj SendMaxLenMessageToCorrectUserID SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 14.SendTextMessageUnExistUserID +create isolationservertest isolationserverObj +isolationserverObj SendTextMessageUnExistUserID SERVER USERNAME PASSWORD UNEXISTUSERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 15.SendTextMessageWithSpecialCharacter +create isolationservertest isolationserverObj +isolationserverObj SendTextMessageWithSpecialCharacter SERVER USERNAME PASSWORD RECIPIENT SPECIALMESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 16.SendMessageWithBlankUserID +create isolationservertest isolationserverObj +isolationserverObj SendMessageWithBlankUserID SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 17.SendBlankMessageToUserID +create isolationservertest isolationserverObj +isolationserverObj SendBlankMessageToUserID SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 18.SendSmilyToCorrectUserID +create isolationservertest isolationserverObj +isolationserverObj SendSmilyToCorrectUserID SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 19.SendMessageToOfflineContact +create isolationservertest isolationserverObj +isolationserverObj SendMessageToOfflineContact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 20.SendContinuousltReapitiveMessage +create isolationservertest isolationserverObj +isolationserverObj SendContinuousltReapitiveMessage SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 21.SendTextMessageToBlockedUser +create isolationservertest isolationserverObj +isolationserverObj SendTextMessageToBlockedUser SERVER USERNAME PASSWORD BLOCKEDUSER MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + + +[Test] +title 22.SendTextMessageUserWhoIsNotAddedInContactList +create isolationservertest isolationserverObj +isolationserverObj SendTextMessageUserWhoIsNotAddedInContactList SERVER USERNAME PASSWORD NOTADDEDUSER MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 23.MessageReceiveFromUser +create isolationservertest isolationserverObj +isolationserverObj MessageReceiveFromUser SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 24.AddExistingContact +create isolationservertest isolationserverObj +isolationserverObj AddExistingContact SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 25.ClientSendBlankUserIdForADD +create isolationservertest isolationserverObj +isolationserverObj ClientSendBlankUserIdForADD SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 26.AddUnexistingUserID +create isolationservertest isolationserverObj +isolationserverObj AddUnexistingUserID SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT UNEXISTUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 27.AddExistingContactWIthSpace +create isolationservertest isolationserverObj +isolationserverObj AddExistingContactWIthSpace SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 28.AddContactWhichIsAlreadyAdded +create isolationservertest isolationserverObj +isolationserverObj AddContactWhichIsAlreadyAdded SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 29.AddExistingContactWIthMixedLetter +create isolationservertest isolationserverObj +isolationserverObj AddExistingContactWIthMixedLetter SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT MIXCONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 30.AddInvalidContactWIthSpecialLetter +create isolationservertest isolationserverObj +isolationserverObj AddInvalidContactWIthSpecialLetter SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 31.DeleteExistingContact +create isolationservertest isolationserverObj +isolationserverObj DeleteExistingContact SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 32.ClientSendBlankUserIdForDELETE +create isolationservertest isolationserverObj +isolationserverObj ClientSendBlankUserIdForDELETE SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 33.DeleteUnexistingUserID +create isolationservertest isolationserverObj +isolationserverObj DeleteUnexistingUserID SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT UNEXISTUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 34.DeleteExistingContactWIthSpace +create isolationservertest isolationserverObj +isolationserverObj DeleteExistingContactWIthSpace SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 35.DeleteContactWhichIsAlreadyDeleted +create isolationservertest isolationserverObj +isolationserverObj DeleteContactWhichIsAlreadyDeleted SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 36.DeleteExistingContactWIthMixedLetter +create isolationservertest isolationserverObj +isolationserverObj DeleteExistingContactWIthMixedLetter SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT MIXCONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 37.DeleteInvalidContactWIthSpecialLetter +create isolationservertest isolationserverObj +isolationserverObj DeleteInvalidContactWIthSpecialLetter SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 38.UpdatePresenceWithAway +create isolationservertest isolationserverObj +isolationserverObj UpdatePresenceWithAway SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 39.UpdatePresenceWithDnd +create isolationservertest isolationserverObj +isolationserverObj UpdatePresenceWithDnd SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 40.UpdatePresenceWithAvailable +create isolationservertest isolationserverObj +isolationserverObj UpdatePresenceWithAvailable SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 41.UpdatePresenceMultipleTimeInSameSession +create isolationservertest isolationserverObj +isolationserverObj UpdatePresenceMultipleTimeInSameSession SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 42.UpdateOnlyStatusText +create isolationservertest isolationserverObj +isolationserverObj UpdateOnlyStatusText SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 43.UpdateOnlyUserAvailability +create isolationservertest isolationserverObj +isolationserverObj UpdateOnlyUserAvailability SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 44.UpdateOwnPresenceWithBlankData +create isolationservertest isolationserverObj +isolationserverObj UpdateOwnPresenceWithBlankData SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 45.UpdateStatusTextWithSpecialCharacter +create isolationservertest isolationserverObj +isolationserverObj UpdateStatusTextWithSpecialCharacter SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 46.UpdateStatusTextWithMaxLen +create isolationservertest isolationserverObj +isolationserverObj UpdateStatusTextWithMaxLen SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +/* +[Test] +title 47.LoginWithInvalidPortAddress +create isolationservertest isolationserverObj +isolationserverObj LoginWithInvalidPortAddress SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID +delete isolationserverObj +[Endtest] +*/ + +[Test] +title 48.SetOwnAvatarJpeg +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEJPEG AVATARFILEJPEG +delete isolationserverObj +[Endtest] + +[Test] +title 49.ClearOwnAvatarJpeg +create isolationservertest isolationserverObj +isolationserverObj ClearOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 50.SetOwnAvatarPng +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEPNG AVATARFILEPNG +delete isolationserverObj +[Endtest] + +[Test] +title 51.ClearOwnAvatarPng +create isolationservertest isolationserverObj +isolationserverObj ClearOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 52.SetOwnAvatarGif +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEGIF AVATARFILEGIF +delete isolationserverObj +[Endtest] + +[Test] +title 53.ClearOwnAvatarGif +create isolationservertest isolationserverObj +isolationserverObj ClearOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 54.ClearOwnAvatarNull +create isolationservertest isolationserverObj +isolationserverObj ClearOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 55.SetOwnAvatarDrm +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEJPEG AVATARFILEDRM +delete isolationserverObj +[Endtest] + +[Test] +title 56.SetOwnAvatarLargeJpg +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEJPEG AVATARLARGEJPG +delete isolationserverObj +[Endtest] + +[Test] +title 57.SetOwnAvatarLargePng +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEPNG AVATARLARGEPNG +delete isolationserverObj +[Endtest] + +[Test] +title 58.SetOwnAvatarLargeGif +create isolationservertest isolationserverObj +isolationserverObj SetOwnAvatar SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL DUMMY DUMMY DUMMY DUMMY MIMETYPEGIF AVATARLARGEGIF +delete isolationserverObj +[Endtest] + +[Test] +title 59.FetchCachedContacts +create isolationservertest isolationserverObj +isolationserverObj FetchCachedContacts SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + + diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/conf/isolationserver_manual.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/conf/isolationserver_manual.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,223 @@ +// Definitions +[Define] +SERVER talk.google.com +USERNAME immeco8@gmail.com +PASSWORD loudmouth +RECIPIENT nokiatestlm@gmail.com +MESSAGE Hello +SPECIALMESSAGE ***___HELLO++++ +RESOURCE mytest +BADSERVER talk.gaagle.com +BADPASSWORD junk123 +BLOCKEDUSER user.block2008@gmail.com +UNEXISTUSERID isoserver@gmail.com +MIXEDLETTERUSERNAME ImMEco8@gmail.com +MAXLENGTHUSERID abcd123456abcd123456abcd123456@gmail.com +PWD nokia123 +MINLENGTHUSERID ab123d@gmail.com +NOTADDEDUSER rakesh.harsha@gmail.com +PROXY_SERVER 172.16.42.135 +PROXY_PORT 8080 +PORT 443 +CONNMGR_BUS org.freedesktop.Telepathy.ConnectionManager.gabble +CONNMGR_PATH /org/freedesktop/Telepathy/ConnectionManager/gabble +PROTOCOL jabber +CONTACT test_isoserver@gmail.com +MIXCONTACT Test_IsoServer@gmail.com +INVALIDUSERID ISOSERVER_TEST@gmail.com +LONGMESSAGE abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz +SERVER_GIZMO chat.gizmoproject.com +USERNAME_GIZMO testlmnokia@chat.gizmoproject.com +PASSWORD_GIZMO loudmouth + +//Search strings +GIVEN_NAME first_name +FULL_NAME fn +MIDDLE_NAME last_name +JID jid + +[Enddefine] + + + + +[Test] +title 1..MessageReceiveFromUser +create isolationservertest isolationserverObj +isolationserverObj MessageReceiveFromUser SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 2.HandelingPresenceNotification +create isolationservertest isolationserverObj +isolationserverObj HandelingPresenceNotification SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 3.LoginWhenTGAndDDAreNotRunning +create isolationservertest isolationserverObj +isolationserverObj LoginWhenTGAndDDAreNotRunning SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID +delete isolationserverObj +[Endtest] + + +[Test] +title 4.AcceptAddRequestFromUser +create isolationservertest isolationserverObj +isolationserverObj AcceptAddRequestFromUser SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 5.RejectAddRequestFromUser +create isolationservertest isolationserverObj +isolationserverObj RejectAddRequestFromUser SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 6.SendAcceptRequestWithoutAnyUserID +create isolationservertest isolationserverObj +isolationserverObj SendAcceptRequestWithoutAnyUserID SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + +[Test] +title 7.SendRejectRequestWithoutAnyUserID +create isolationservertest isolationserverObj +isolationserverObj SendRejectRequestWithoutAnyUserID SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +//this functionality is not there +[Test] +title 8.SendTextMessageToUserIdWhoIsBlockedSender +create isolationservertest isolationserverObj +isolationserverObj SendTextMessageToUserIdWhoIsBlockedSender SERVER USERNAME PASSWORD BLOCKEDUSER MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 9.SendLongTextMessageToUserId +create isolationservertest isolationserverObj +isolationserverObj SendLongTextMessageToUserId SERVER USERNAME PASSWORD RECIPIENT LONGMESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 10.SendAcceptRequestWithoutReceivingAddrequest +create isolationservertest isolationserverObj +isolationserverObj SendAcceptRequestWithoutReceivingAddrequest SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 11.SendRejectRequestWithoutReceivingAddrequest +create isolationservertest isolationserverObj +isolationserverObj SendRejectRequestWithoutReceivingAddrequest SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT CONTACT CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + + + +[Test] +title 12.SearchKeyValueInvalidParam2 +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueInvalidParam2 SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 13.SearchKeyValueInvalidHashValues +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueInvalidHashValues SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 14.SearchKeyValueBlank +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueBlank SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 15.SearchKeyValueSpecialChar +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueSpecialChar SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 16.SearchKeyValueLargeString +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueLargeString SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + + +[Test] +title 17.SearchKeyValue +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValue SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 18.SearchKeyValueWithResult +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueWithResult SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 19.SearchKeyValueInvalidParam +create isolationservertest isolationserverObj +isolationserverObj SearchKeyValueInvalidParam SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + +[Test] +title 20.SearchForLargeNoOfResult +create isolationservertest isolationserverObj +isolationserverObj SearchForLargeNoOfResult SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + + +[Test] +title 21.SearchAndAddContact +create isolationservertest isolationserverObj +isolationserverObj SearchAndAddContact SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + + +[Test] +title 22.SecondSearch +create isolationservertest isolationserverObj +isolationserverObj SecondSearch SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] + + +[Test] +title 23.AddContatcs +create isolationservertest isolationserverObj +isolationserverObj AddContatcs SERVER USERNAME PASSWORD USERNAME MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL +delete isolationserverObj +[Endtest] + +[Test] +title 24.GetKeysAndSearch +create isolationservertest isolationserverObj +isolationserverObj GetKeysAndSearch SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO USERNAME_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT INVALIDUSERID CONNMGR_BUS CONNMGR_PATH PROTOCOL GIVEN_NAME MIDDLE_NAME JID FULL_NAME +delete isolationserverObj +[Endtest] diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/corrupted.jpg Binary file isolationserver/tsrc/data/corrupted.jpg has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/drmprotected.jpg Binary file isolationserver/tsrc/data/drmprotected.jpg has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/large.gif Binary file isolationserver/tsrc/data/large.gif has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/large.jpg Binary file isolationserver/tsrc/data/large.jpg has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/large.png Binary file isolationserver/tsrc/data/large.png has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/test.gif Binary file isolationserver/tsrc/data/test.gif has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/test.jpg Binary file isolationserver/tsrc/data/test.jpg has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/data/test.png Binary file isolationserver/tsrc/data/test.png has changed diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/eabi/isolationserveru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/eabi/isolationserveru.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + _Z9LibEntryLR13CTestModuleIf @ 1 NONAME + diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: bld.inf +* +*/ + + + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these +DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + +PRJ_EXPORTS +../init/TestFramework.ini /epoc32/winscw/c/TestFramework/TestFramework.ini +../conf/isolationserver.cfg /epoc32/winscw/c/TestFramework/isolationserver.cfg +//../conf/isolationserver_manual.cfg /epoc32/winscw/c/TestFramework/isolationserver_manual.cfg +../data/test.jpg /epoc32/winscw/c/data/Images/test.jpg +../data/test.gif /epoc32/winscw/c/data/Images/test.gif +../data/test.png /epoc32/winscw/c/data/Images/test.png +../data/large.jpg /epoc32/winscw/c/data/Images/large.jpg +../data/large.gif /epoc32/winscw/c/data/Images/large.gif +../data/large.png /epoc32/winscw/c/data/Images/large.png +../data/corrupted.jpg /epoc32/winscw/c/data/Images/corrupted.jpg +../data/drmprotected.jpg /epoc32/winscw/c/data/Images/drmprotected.jpg +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in /epoc32/include +// Example: +/* +/agnmodel/inc/AGMCOMON.H +*/ + +PRJ_TESTMMPFILES +// NOTE: If using ARS requirements .mmp file operation should be done under this. +// 'abld test build' +isolationservertest.mmp +PRJ_MMPFILES +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: +/* +/agnmodel/group/agnmodel.mmp +#if defined(MARM) +/agnmodel/group/agsvexe.mmp +#endif +*/ +//isolationservertest.mmp + +// End of File \ No newline at end of file diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/inc/isolationserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/inc/isolationserver.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,261 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: isolationserver.h +* +*/ + + + +#ifndef ISOLATIONSERVER_H +#define ISOLATIONSERVER_H + +// INCLUDES +#include +#include +#include +#include + + +// CONSTANTS +//const ?type ?constant_var = ?constant; + + +// MACROS +//#define ?macro ?macro_def +// Logging path +_LIT( KisolationserverLogPath, "\\logs\\testframework\\isolationserver\\" ); +// Log file +_LIT( KisolationserverLogFile, "isolationserver.txt" ); +_LIT( KisolationserverLogFileWithTitle, "isolationserver_[%S].txt" ); + +// FUNCTION PROTOTYPES +//?type ?function_name(?arg_list); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; +class Cisolationserver; + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// CLASS DECLARATION + +/** +* Cisolationserver test class for STIF Test Framework TestScripter. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(Cisolationserver) : public CScriptBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static Cisolationserver* NewL( CTestModuleIf& aTestModuleIf ); + + /** + * Destructor. + */ + virtual ~Cisolationserver(); + + public: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + protected: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + protected: // Functions from base classes + + /** + * From ?base_class ?member_description + */ + //?type ?member_function(); + + private: + + /** + * C++ default constructor. + */ + Cisolationserver( CTestModuleIf& aTestModuleIf ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + void Delete(); + + /** + * Test methods are listed below. + */ + + /** + * Example test method. + * @since ?Series60_version + * @param aItem Script line containing parameters. + * @return Symbian OS error code. + */ + virtual TInt SecondSearch( CStifItemParser& aItem ); + virtual TInt LoginWithCorrectdata( CStifItemParser& aItem ); + virtual TInt LoginWithWrongPassword( CStifItemParser& aItem ); + virtual TInt LoginWithUnexistUserId( CStifItemParser& aItem ); + virtual TInt LoginWithUnexistServer( CStifItemParser& aItem ); + virtual TInt LoginWithMixedletterUserId( CStifItemParser& aItem ); + virtual TInt LoginWithMaximumLengthUserId( CStifItemParser& aItem ); + virtual TInt LoginWithMinimumLengthUserId( CStifItemParser& aItem ); + virtual TInt LogoutFromServer( CStifItemParser& aItem ); + virtual TInt LoginWithBlankUserId(CStifItemParser& aItem); + virtual TInt LoginLogOutWithReapitiveSession(CStifItemParser& aItem); + virtual TInt LoginWithCoreectUserIDWithSpace(CStifItemParser& aItem); + virtual TInt LoginWithInvalidPortAddress(CStifItemParser& aItem); + virtual TInt LoginWithMissingSettings(CStifItemParser& aItem); + virtual TInt LoginWhenTGAndDDAreNotRunning(CStifItemParser& aItem); + virtual TInt SendMessageToCorrectUserID(CStifItemParser& aItem); + virtual TInt SendMaxLenMessageToCorrectUserID(CStifItemParser& aItem); + virtual TInt SendTextMessageUnExistUserID(CStifItemParser& aItem); + virtual TInt SendTextMessageWithSpecialCharacter(CStifItemParser& aItem); + virtual TInt SendMessageWithBlankUserID(CStifItemParser& aItem); + virtual TInt SendBlankMessageToUserID(CStifItemParser& aItem); + virtual TInt SendSmilyToCorrectUserID(CStifItemParser& aItem); + virtual TInt SendMessageToOfflineContact(CStifItemParser& aItem); + virtual TInt SendTextMessageToBlockedUser(CStifItemParser& aItem); + virtual TInt SendContinuousltReapitiveMessage(CStifItemParser& aItem); + virtual TInt SendTextMessageToUserIdWhoIsBlockedSender(CStifItemParser& aItem); + virtual TInt SendLongTextMessageToUserId(CStifItemParser& aItem); + virtual TInt SendTextMessageUserWhoIsNotAddedInContactList(CStifItemParser& aItem); + //virtual TInt FetchContactList(CStifItemParser& aItem); + virtual TInt MessageReceiveFromUser(CStifItemParser& aItem); + virtual TInt AddExistingContact(CStifItemParser& aItem); + virtual TInt ClientSendBlankUserIdForADD(CStifItemParser& aItem); + virtual TInt AddUnexistingUserID(CStifItemParser& aItem); + virtual TInt AddContactWhichIsAlreadyAdded(CStifItemParser& aItem); + virtual TInt AddExistingContactWIthSpace(CStifItemParser& aItem); + virtual TInt AddExistingContactWIthMixedLetter(CStifItemParser& aItem); + virtual TInt AddInvalidContactWIthSpecialLetter(CStifItemParser& aItem); + virtual TInt DeleteExistingContact(CStifItemParser& aItem); + virtual TInt ClientSendBlankUserIdForDELETE(CStifItemParser& aItem); + virtual TInt DeleteUnexistingUserID(CStifItemParser& aItem); + virtual TInt DeleteContactWhichIsAlreadyDeleted(CStifItemParser& aItem); + virtual TInt DeleteExistingContactWIthSpace(CStifItemParser& aItem); + virtual TInt DeleteExistingContactWIthMixedLetter(CStifItemParser& aItem); + virtual TInt DeleteInvalidContactWIthSpecialLetter(CStifItemParser& aItem); + virtual TInt Cisolationserver::FetchContatcs( CStifItemParser& aItem ); + virtual TInt Cisolationserver::AddContatcs( CStifItemParser& aItem ); + virtual TInt UpdatePresenceWithAway(CStifItemParser& aItem); + virtual TInt UpdatePresenceWithDnd(CStifItemParser& aItem); + virtual TInt UpdatePresenceWithAvailable(CStifItemParser& aItem); + virtual TInt UpdatePresenceMultipleTimeInSameSession(CStifItemParser& aItem); + virtual TInt UpdateOnlyStatusText(CStifItemParser& aItem); + virtual TInt UpdateOnlyUserAvailability(CStifItemParser& aItem); + virtual TInt UpdateOwnPresenceWithBlankData(CStifItemParser& aItem); + virtual TInt UpdateStatusTextWithMaxLen(CStifItemParser& aItem); + virtual TInt UpdateStatusTextWithSpecialCharacter(CStifItemParser& aItem); + virtual TInt HandelingPresenceNotification(CStifItemParser& aItem); + virtual TInt Cisolationserver::SearchKeyValue( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueWithResult( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueInvalidParam( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchForLargeNoOfResult( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueInvalidParam2( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueInvalidHashValues( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueBlank( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueSpecialChar( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchKeyValueLargeString( CStifItemParser& aItem ); + virtual TInt Cisolationserver::SearchAndAddContact( CStifItemParser& aItem ); + virtual TInt AcceptAddRequestFromUser(CStifItemParser& aItem); + virtual TInt RejectAddRequestFromUser(CStifItemParser& aItem); + virtual TInt SendAcceptRequestWithoutReceivingAddrequest(CStifItemParser& aItem); + virtual TInt SendRejectRequestWithoutReceivingAddrequest(CStifItemParser& aItem); + virtual TInt SendAcceptRequestWithoutAnyUserID(CStifItemParser& aItem); + virtual TInt SendRejectRequestWithoutAnyUserID(CStifItemParser& aItem); + virtual TInt LogoutWhileUserIsNotLoggedIn(CStifItemParser& aItem); + virtual TInt GetKeysAndSearch( CStifItemParser& aItem ); + virtual TInt SetOwnAvatar( CStifItemParser& aItem ); + virtual TInt ClearOwnAvatar( CStifItemParser& aItem ); + virtual TInt FetchCachedContacts( CStifItemParser& aItem ); + +//ADD NEW METHOD DEC HERE + //[TestMethods] - Do not remove + + public: + + const gchar* GetSearchLabelForGizmoL(gchar* search_key); + const gchar* GetSearchLabelForYukonL(gchar* search_key); + const gchar* GetSearchLabelL(gchar* aService,gchar* aSearchKey); + + public: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + protected: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + private: // Data + + // ?one_line_short_description_of_data + //?data_declaration; + + // Reserved pointer for future extension + //TAny* iReserved; + + public: // Friend classes + //?friend_class_declaration; + protected: // Friend classes + //?friend_class_declaration; + private: // Friend classes + //?friend_class_declaration; + + }; + +#endif // ISOLATIONSERVER_H + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/init/TestFramework.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/init/TestFramework.ini Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +# +# This is STIFTestFramework initialization file +# Comment lines start with '#'-character. +# See STIF TestFramework users guide.doc for instructions + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Engine_Defaults] + +TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment', + 'TestCases' or 'FullReport' + +CreateTestReport= YES # Possible values: YES or NO + +TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFileName= TestReport + +TestReportFormat= TXT # Possible values: TXT or HTML +TestReportOutput= FILE # Possible values: FILE or RDEBUG +TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting + +[End_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Module configurations start + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\isolationserver.cfg +[End_Module] + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\isolationserver_manual.cfg +[End_Module] + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Logger_Defaults] + +[End_Logger_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# End of file diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/src/isolationserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/src/isolationserver.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,182 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: isolationserver.cpp +* +*/ + + + +// INCLUDE FILES +#include +#include "isolationserver.h" +#include + + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Cisolationserver::Cisolationserver +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +Cisolationserver::Cisolationserver( + CTestModuleIf& aTestModuleIf ): + CScriptBase( aTestModuleIf ) + { + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void Cisolationserver::ConstructL() + { + //Read logger settings to check whether test case name is to be + //appended to log file name. + RSettingServer settingServer; + TInt ret = settingServer.Connect(); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Struct to StifLogger settigs. + TLoggerSettings loggerSettings; + // Parse StifLogger defaults from STIF initialization file. + ret = settingServer.GetLoggerSettings(loggerSettings); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Close Setting server session + settingServer.Close(); + + TFileName logFileName; + + if(loggerSettings.iAddTestCaseTitle) + { + TName title; + TestModuleIf().GetTestCaseTitleL(title); + logFileName.Format(KisolationserverLogFileWithTitle, &title); + } + else + { + logFileName.Copy(KisolationserverLogFile); + } + + iLog = CStifLogger::NewL( KisolationserverLogPath, + logFileName, + CStifLogger::ETxt, + CStifLogger::EFile, + EFalse ); + + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +Cisolationserver* Cisolationserver::NewL( + CTestModuleIf& aTestModuleIf ) + { + Cisolationserver* self = new (ELeave) Cisolationserver( aTestModuleIf ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +Cisolationserver::~Cisolationserver() + { + + // Delete resources allocated from test methods + Delete(); + + // Delete logger + delete iLog; + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point. +// Returns: CScriptBase: New CScriptBase derived object +// ----------------------------------------------------------------------------- +// +EXPORT_C CScriptBase* LibEntryL( + CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework + { + + return ( CScriptBase* ) Cisolationserver::NewL( aTestModuleIf ); + + } + + +// End of File diff -r 000000000000 -r d0f3a028347a isolationserver/tsrc/src/isolationserverBlocks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/isolationserver/tsrc/src/isolationserverBlocks.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,19062 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: isolationserverBlocks.cpp +* +*/ + + + +// [INCLUDE FILES] - do not remove +#include +#include +#include +#include "isolationserver.h" +#include + +#include +#include // for g_stpcpy +#include +#include + +#include +#include "msgliterals.h" +#include "msg_enums.h" +#include +#define ONE_K_OPENC_FIX 1020 + +typedef enum +{ + RC_OK, + RC_ERROR +} RC_Code_t; + + +typedef struct +{ + gchar *recipient; + gchar *message; +} MessageData; + +typedef struct +{ + gchar *proxy_server; + gchar *proxy_port; +}ProxyData; + +typedef struct +{ + gchar *server; + gchar *username; + gchar *password; + gchar *resource; + MessageData *msg_data; + gchar *port; + + ProxyData *proxy_data; + gchar *contact; + gchar *connmgr_bus; + gchar *connmgr_path; + gchar *protocol; + gchar *key_given_name; + gchar *key_middle_name; + gchar *key_jid; + gchar *key_full_name; + gchar *mimetype; + gchar *image_file_name; + +} ConnectData; + + +// Function to read data from the cfg file +static RC_Code_t read_data ( ConnectData*& connect_data, + CStifItemParser& aItem ); + +// Function to free the allocated resources +static void free_data ( ConnectData*& connect_data ); + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + + + +//----------------------------------------------------------------------------- +// function_name : read_data +// description : Reads data from the CFG file +// Returns : None +//----------------------------------------------------------------------------- +// +static RC_Code_t +read_data ( ConnectData*& connect_data, CStifItemParser& aItem ) + { + TPtrC string; + TBuf8 temp; + MessageData *msg_data = NULL; + + + ProxyData *proxy_data = NULL; +// TInt proxy_port; + + + + connect_data = g_new0 ( ConnectData, 1 ); + if ( !connect_data ) + { + return RC_ERROR; + } + + msg_data = g_new0 ( MessageData, 1 ); + if ( !msg_data ) + { + free_data ( connect_data ); + return RC_ERROR; + } + + connect_data->msg_data = msg_data; + + + proxy_data = g_new0 ( ProxyData, 1 ); + if ( !proxy_data ) + { + free_data ( connect_data ); + return RC_ERROR; + } + connect_data->proxy_data = proxy_data; + + + // Read server name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->server = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->server ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->server, ( gchar * ) temp.Ptr() ); + } + + // Read Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->username = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->username ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->username, ( gchar * ) temp.Ptr() ); + } + + // Read Password corresponding to Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->password = g_new0 ( gchar, temp.Length () ); + if ( !connect_data->password ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->password, ( gchar *) temp.Ptr() ); + } + + // Read recipient + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->recipient = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->recipient ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( msg_data->recipient, ( gchar * ) temp.Ptr() ); + } + + // Read Message + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->message = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->message ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( msg_data->message, ( gchar * ) temp.Ptr() ); + } + + // Read resource identifier + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->resource = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->resource ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->resource, ( gchar * ) temp.Ptr() ); + } + + + // Read proxy server and proxy port + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + proxy_data->proxy_server = g_new0 ( gchar, temp.Length() ); + if ( !proxy_data->proxy_server ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( proxy_data->proxy_server, ( gchar * ) temp.Ptr() ); + } + + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + proxy_data->proxy_port = g_new0 ( gchar, temp.Length() ); + if ( !proxy_data->proxy_port ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( proxy_data->proxy_port, ( gchar * ) temp.Ptr() ); + } + + + + /* if ( aItem.GetNextString ( proxy_port ) == KErrNone ) + { + proxy_data->proxy_port = proxy_port; + } */ + + + // Read POrt address + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->port = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->port ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->port, ( gchar * ) temp.Ptr() ); + } + + // read Add member + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->contact = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->contact ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->contact, ( gchar * ) temp.Ptr() ); + } + + // read CONNMGR_BUS + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->connmgr_bus = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->connmgr_bus ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->connmgr_bus, ( gchar * ) temp.Ptr() ); + } + + // read CONNMGR_PATH + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->connmgr_path = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->connmgr_path ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->connmgr_path, ( gchar * ) temp.Ptr() ); + } + + // read PROTOCOL + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->protocol = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->protocol ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->protocol, ( gchar * ) temp.Ptr() ); + } + + + // read given Name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->key_given_name = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->key_given_name ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->key_given_name, ( gchar * ) temp.Ptr() ); + } + + // read middle Name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->key_middle_name = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->key_middle_name ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->key_middle_name, ( gchar * ) temp.Ptr() ); + } + + // read email Name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->key_jid = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->key_jid ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->key_jid, ( gchar * ) temp.Ptr() ); + } + + // read full Name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->key_full_name = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->key_full_name ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->key_full_name, ( gchar * ) temp.Ptr() ); + } + // read mimetype + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->mimetype = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->mimetype ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->mimetype, ( gchar * ) temp.Ptr() ); + } + // read image filename + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->image_file_name = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->image_file_name ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->image_file_name, ( gchar * ) temp.Ptr() ); + } + return RC_OK; + } + + +//----------------------------------------------------------------------------- +// function_name : free_data +// description : Deallocates all the data +// Returns : None +//----------------------------------------------------------------------------- +// +static void +free_data ( ConnectData*& connect_data ) + { + if ( connect_data ) + { + if ( connect_data->server ) + { + g_free ( connect_data->server ); + connect_data->server = NULL; + } + + if ( connect_data->username ) + { + g_free ( connect_data->username ); + connect_data->username = NULL; + } + + if ( connect_data->password ) + { + g_free ( connect_data->password ); + connect_data->password = NULL; + } + + if ( connect_data->msg_data ) + { + if ( connect_data->msg_data->recipient ) + { + g_free ( connect_data->msg_data->recipient ); + connect_data->msg_data->recipient = NULL; + } + if ( connect_data->msg_data->message ) + { + g_free ( connect_data->msg_data->message ); + connect_data->msg_data->message = NULL; + } + g_free ( connect_data->msg_data ); + connect_data->msg_data = NULL; + } + + if ( connect_data->resource ) + { + g_free ( connect_data->resource ); + connect_data->resource = NULL; + } + + + if ( connect_data->proxy_data ) + { + if ( connect_data->proxy_data->proxy_server ) + { + g_free ( connect_data->proxy_data->proxy_server ); + connect_data->proxy_data->proxy_server = NULL; + } + g_free ( connect_data->proxy_data ); + connect_data->proxy_data = NULL; + } + + if ( connect_data->port ) + { + g_free ( connect_data->port ); + connect_data->port = NULL; + } + + + if ( connect_data->contact ) + { + g_free ( connect_data->contact ); + connect_data->contact = NULL; + } + + if ( connect_data->key_given_name ) + { + g_free ( connect_data->key_given_name ); + connect_data->key_given_name = NULL; + } + + if ( connect_data->key_middle_name ) + { + g_free ( connect_data->key_middle_name ); + connect_data->key_middle_name = NULL; + } + + if ( connect_data->key_jid ) + { + g_free ( connect_data->key_jid ); + connect_data->key_jid = NULL; + } + + if ( connect_data->key_full_name ) + { + g_free ( connect_data->key_full_name ); + connect_data->key_full_name = NULL; + } + + g_free ( connect_data ); + connect_data = NULL; + } + } + + //----------------------------------------------------------------------------- +// function_name : running isolation server exe +// description : Deallocates all the data +// Returns : None +//----------------------------------------------------------------------------- + int run_isoserver() + { + // running isoserver + RProcess isosrv_launcher; + TInt lunch_err = 0; + _LIT(KProcess, "isoserver.exe"); + lunch_err = isosrv_launcher.Create( KProcess, KNullDesC ); + if ( KErrNone != lunch_err ) + { + return KErrGeneral; + + } + isosrv_launcher.Resume(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Cisolationserver::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void Cisolationserver::Delete() + { + + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::RunMethodL +// Run specified method. Contains also table of test mothods and their names. +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::RunMethodL( + CStifItemParser& aItem ) + { + + static TStifFunctionInfo const KFunctions[] = + { + + ENTRY( "SecondSearch", Cisolationserver::SecondSearch), + ENTRY( "SearchAndAddContact", Cisolationserver::SearchAndAddContact ), + ENTRY( "LoginWithCorrectData", Cisolationserver::LoginWithCorrectdata ), + ENTRY( "LoginWithWrongPassword", Cisolationserver::LoginWithWrongPassword ), + ENTRY( "LoginWithUnexistUserId", Cisolationserver::LoginWithUnexistUserId), + ENTRY( "LoginWithUnexistServer", Cisolationserver::LoginWithUnexistServer), + ENTRY( "LoginWithMixedLetterUserId", Cisolationserver::LoginWithMixedletterUserId), + ENTRY( "LoginWithMaximumLenghtUserId", Cisolationserver::LoginWithMaximumLengthUserId), + ENTRY( "LoginWithMinimumLenghtUserId", Cisolationserver::LoginWithMinimumLengthUserId), + ENTRY( "LogoutFromServer", Cisolationserver::LogoutFromServer), + ENTRY( "LoginWithBlankUserId", Cisolationserver::LoginWithBlankUserId), + ENTRY( "LoginLogOutWithReapitiveSession", Cisolationserver::LoginLogOutWithReapitiveSession), + ENTRY( "LoginWithCoreectUserIDWithSpace", Cisolationserver::LoginWithCoreectUserIDWithSpace), + ENTRY( "LoginWithInvalidPortAddress", Cisolationserver::LoginWithInvalidPortAddress), + ENTRY( "LoginWithMissingSettings", Cisolationserver::LoginWithMissingSettings), + ENTRY( "LoginWhenTGAndDDAreNotRunning", Cisolationserver::LoginWhenTGAndDDAreNotRunning), + ENTRY( "SendMessageToCorrectUserID", Cisolationserver::SendMessageToCorrectUserID), + ENTRY( "SendMaxLenMessageToCorrectUserID", Cisolationserver::SendMaxLenMessageToCorrectUserID), + ENTRY( "SendTextMessageUnExistUserID", Cisolationserver::SendTextMessageUnExistUserID), + ENTRY( "SendTextMessageWithSpecialCharacter", Cisolationserver::SendTextMessageWithSpecialCharacter), + ENTRY( "SendMessageWithBlankUserID", Cisolationserver::SendMessageWithBlankUserID), + ENTRY( "SendSmilyToCorrectUserID", Cisolationserver::SendSmilyToCorrectUserID), + ENTRY( "SendBlankMessageToUserID", Cisolationserver::SendBlankMessageToUserID), + ENTRY( "SendMessageToOfflineContact", Cisolationserver::SendMessageToOfflineContact), + ENTRY( "SendContinuousltReapitiveMessage", Cisolationserver::SendContinuousltReapitiveMessage), + ENTRY( "SendTextMessageToBlockedUser", Cisolationserver::SendTextMessageToBlockedUser), + ENTRY( "SendTextMessageToUserIdWhoIsBlockedSender", Cisolationserver::SendTextMessageToUserIdWhoIsBlockedSender), + ENTRY( "SendLongTextMessageToUserId", Cisolationserver::SendLongTextMessageToUserId), + ENTRY( "SendTextMessageUserWhoIsNotAddedInContactList", Cisolationserver::SendTextMessageUserWhoIsNotAddedInContactList), + ENTRY( "MessageReceiveFromUser", Cisolationserver::MessageReceiveFromUser), + ENTRY( "AddExistingContact", Cisolationserver::AddExistingContact), + ENTRY( "ClientSendBlankUserIdForADD", Cisolationserver::ClientSendBlankUserIdForADD), + ENTRY( "AddContactWhichIsAlreadyAdded", Cisolationserver::AddContactWhichIsAlreadyAdded), + ENTRY( "AddExistingContactWIthSpace", Cisolationserver::AddExistingContactWIthSpace), + ENTRY( "AddUnexistingUserID", Cisolationserver::AddUnexistingUserID), + ENTRY( "AddExistingContactWIthMixedLetter", Cisolationserver::AddExistingContactWIthMixedLetter), + ENTRY( "AddInvalidContactWIthSpecialLetter", Cisolationserver::AddInvalidContactWIthSpecialLetter), + ENTRY( "DeleteExistingContact", Cisolationserver::DeleteExistingContact), + ENTRY( "ClientSendBlankUserIdForDELETE", Cisolationserver::ClientSendBlankUserIdForDELETE), + ENTRY( "DeleteContactWhichIsAlreadyDeleted", Cisolationserver::DeleteContactWhichIsAlreadyDeleted), + ENTRY( "DeleteExistingContactWIthSpace", Cisolationserver::DeleteExistingContactWIthSpace), + ENTRY( "DeleteUnexistingUserID", Cisolationserver::DeleteUnexistingUserID), + ENTRY( "DeleteExistingContactWIthMixedLetter", Cisolationserver::DeleteExistingContactWIthMixedLetter), + ENTRY( "DeleteInvalidContactWIthSpecialLetter", Cisolationserver::DeleteInvalidContactWIthSpecialLetter), + ENTRY( "FetchContatcs", Cisolationserver::FetchContatcs), + ENTRY( "AddContatcs", Cisolationserver::AddContatcs), + ENTRY( "UpdatePresenceWithAway", Cisolationserver::UpdatePresenceWithAway), + ENTRY( "UpdatePresenceWithDnd", Cisolationserver::UpdatePresenceWithDnd), + ENTRY( "UpdatePresenceWithAvailable", Cisolationserver::UpdatePresenceWithAvailable), + ENTRY( "UpdatePresenceMultipleTimeInSameSession", Cisolationserver::UpdatePresenceMultipleTimeInSameSession), + ENTRY( "UpdateOnlyStatusText", Cisolationserver::UpdateOnlyStatusText), + ENTRY( "UpdateOnlyUserAvailability", Cisolationserver::UpdateOnlyUserAvailability), + ENTRY( "UpdateOwnPresenceWithBlankData", Cisolationserver::UpdateOwnPresenceWithBlankData), + ENTRY( "UpdateStatusTextWithMaxLen", Cisolationserver::UpdateStatusTextWithMaxLen), + ENTRY( "UpdateStatusTextWithSpecialCharacter", Cisolationserver::UpdateStatusTextWithSpecialCharacter), + ENTRY( "HandelingPresenceNotification", Cisolationserver::HandelingPresenceNotification), + ENTRY( "SearchKeyValue", Cisolationserver::SearchKeyValue), + ENTRY( "SearchKeyValueWithResult", Cisolationserver::SearchKeyValueWithResult ), + ENTRY( "SearchKeyValueInvalidParam", Cisolationserver::SearchKeyValueInvalidParam ), + ENTRY( "SearchForLargeNoOfResult", Cisolationserver::SearchForLargeNoOfResult ), + ENTRY( "SearchKeyValueInvalidParam2", Cisolationserver::SearchKeyValueInvalidParam2 ), + ENTRY( "SearchKeyValueInvalidHashValues", Cisolationserver::SearchKeyValueInvalidHashValues ), + ENTRY( "SearchKeyValueBlank", Cisolationserver::SearchKeyValueBlank ), + ENTRY( "SearchKeyValueSpecialChar", Cisolationserver::SearchKeyValueSpecialChar ), + ENTRY( "SearchKeyValueLargeString", Cisolationserver::SearchKeyValueLargeString ), + ENTRY( "AcceptAddRequestFromUser", Cisolationserver::AcceptAddRequestFromUser ), + ENTRY( "RejectAddRequestFromUser", Cisolationserver::RejectAddRequestFromUser ), + ENTRY( "SendAcceptRequestWithoutReceivingAddrequest", Cisolationserver::SendAcceptRequestWithoutReceivingAddrequest ), + ENTRY( "SendRejectRequestWithoutReceivingAddrequest", Cisolationserver::SendRejectRequestWithoutReceivingAddrequest ), + ENTRY( "SendAcceptRequestWithoutAnyUserID", Cisolationserver::SendAcceptRequestWithoutAnyUserID ), + ENTRY( "SendRejectRequestWithoutAnyUserID", Cisolationserver::SendRejectRequestWithoutAnyUserID ), + ENTRY( "LogoutWhileUserIsNotLoggedIn", Cisolationserver::LogoutWhileUserIsNotLoggedIn), + ENTRY( "GetKeysAndSearch", Cisolationserver::GetKeysAndSearch), + ENTRY( "SetOwnAvatar", Cisolationserver::SetOwnAvatar), + ENTRY( "ClearOwnAvatar", Cisolationserver::ClearOwnAvatar), + ENTRY( "FetchCachedContacts", Cisolationserver::FetchCachedContacts), + //ADD NEW ENTRY HERE + // [test cases entries] - Do not remove + + }; + + const TInt count = sizeof( KFunctions ) / + sizeof( TStifFunctionInfo ); + + return RunInternalL( KFunctions, count, aItem ); + + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithCorrectdata( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::Logout from server +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LogoutFromServer( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with mixed letter user +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithMixedletterUserId( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with mixed letter user +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithMinimumLengthUserId( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with mixed letter user +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithMaximumLengthUserId( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } +// ----------------------------------------------------------------------------- +// Cisolationserver::Login with bad password +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithWrongPassword( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Login with unexist user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithUnexistUserId( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if( msg_struct->response != 0 ) + { + return_value = KErrGeneral; + goto return_code; + } + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::connect with unexist server +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithUnexistServer( CStifItemParser& aItem ) + { + + /* + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + //Send Message to queueOne + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + // login end + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + */ + //LM is not getting call back from server so we are just saying KerrGeneral + return KErrGeneral; + } + + + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithBlankUserId( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // blank user id + smsg[index++]='\0'; + smsg[index++]='\0'; + + //appending password + + int len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->error_type > 0) + { + return_value = KErrGeneral; + goto return_code; + } + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Logout from server +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginLogOutWithReapitiveSession( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isolation server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + //request formation + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::connect with invalid port +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithInvalidPortAddress( CStifItemParser& aItem ) + { + + /* + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + + smsg[index++]='4'; + smsg[index++]='4'; + smsg[index++]='2'; + + smsg[index++]='\0'; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + // Send Message to queueOne + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response == 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + */ + //LM is not getting call back from server so we are just saying KerrGeneral + return KErrGeneral; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithMissingSettings( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + // ssl is missing here + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::LoginWhenTGAndDDAreNotRunning +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWhenTGAndDDAreNotRunning( CStifItemParser& aItem ) + { + /* + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + // Send Message to queueOne + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; */ + return KErrNone; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LoginWithCoreectUserIDWithSpace( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + smsg[index++]='\0'; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->error_type >0) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendMessageToCorrectUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message with max len +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendMaxLenMessageToCorrectUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send message to unexist user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendTextMessageUnExistUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + /* if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + }*/ + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send message to unexist user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendTextMessageWithSpecialCharacter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send message to blank user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendMessageWithBlankUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + smsg[index++] = '\0'; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send blank message to user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendBlankMessageToUserID( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + smsg[index++]=' '; + smsg[index++]='\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send blank message to user id +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendSmilyToCorrectUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strncpy( smsg + index, connect_data->msg_data->message, strlen( connect_data->msg_data->message ) ); + index += len; + smsg[index++] = ' '; + smsg[index++]=':'; + smsg[index++]='-'; + smsg[index++]=')'; + smsg[index++] = '\0'; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendMessageToOfflineContact( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //send message end--------------------------------------- + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendContinuousltReapitiveMessage( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge 1 -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //send message end--------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendTextMessageToBlockedUser( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendTextMessageToUserIdWhoIsBlockedSender( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendLongTextMessageToUserId( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Send message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendTextMessageUserWhoIsNotAddedInContactList( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + //send message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::MessageReceiveFromUser( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int i=0; + int msglen=0; + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp ; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + fp = fopen("c:\\receive_message_logs.txt","a");TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + // running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + + //send messge to our self-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + TBool ESend = EFalse , EReceive = EFalse; + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + // adding recipient + /*len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1;*/ + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + if(msg_struct->hdr_req.message_type==ESend_Request) + ESend=ETrue; + if(msg_struct->hdr_req.message_type==EText_Message_Receive) + ESend=ETrue; + } while (ESend/* == ETrue */&& EReceive/* ==ETrue*/) ;//(msg_struct->hdr_req.message_type!=ESend_Request); + + /* if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + fprintf( fp, "receive message %s\n", rmsg+24 ); + + for ( i=24 ; i message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddExistingContact( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + + //adding contact -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++]='\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddUnexistingUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //add contact -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++] = '\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddContactWhichIsAlreadyAdded( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //add member 1 st time-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + + + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + //add member 2 nd time-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::ClientSendBlankUserIdForADD( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //add contact -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + smsg[index++]='\0'; + //client is sending blank user id + smsg[index++]='\0'; + + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if( msg_struct->error_type >0) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddExistingContactWIthSpace( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++]=' '; + + smsg[index++]= '\0'; + + + + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddExistingContactWIthMixedLetter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++]='\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::AddInvalidContactWIthSpecialLetter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteExistingContact( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //delete contact-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteUnexistingUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //delete contact-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteContactWhichIsAlreadyDeleted( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + + //add member 1 st time-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + // addiing in q for deleting contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end 1--------------------------------------- + + //delete member 1 st time-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // addiing in q for deleting contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //delete contact end 1--------------------------------------- + + //delete contact 2 nd time-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // delete contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //delete contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::ClientSendBlankUserIdForDELETE( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //delete contact -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + smsg[index++]='\0'; + //client is sending blank user id + smsg[index++]='\0'; + + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if( msg_struct->error_type >0) + { + return_value = KErrGeneral; + goto return_code; + } + + //delete contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteExistingContactWIthSpace( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //delete contact-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding delete contact in queue + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++]='\0'; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + //delete contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteExistingContactWIthMixedLetter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //delete contact-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding delete contact id + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + + //delete contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::add member message +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::DeleteInvalidContactWIthSpecialLetter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //delete contact-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding delete contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //delete contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::FetchContatcs( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + // logout test code from server + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +TInt Cisolationserver::AddContatcs( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + + //running isoserver + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //send msg copy + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + //------------------------1 + // adding recipient + len = strlen( "santhosh09431243.ic@gmail.com" ); + strcpy( smsg + index, "santhosh09431243.ic@gmail.com" ); + index += len + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //send msg copy end + + + + //EAdd_Contact_Request messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + //len = strlen( "tele1236@gmail.com" ); + //strcpy( smsg + index, "tele1236@gmail.com" ); + //index += len + 1; + + strcpy( smsg + index, "testlm123@gmail.com" ); + index += strlen( "testlm123@gmail.com" ) + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // sleep( 50 ); + //EAdd_Contact_Request message end--------------------------------------- + + /* sleep( 100 ); + //--------------------------------Trying to add client notification---------------------- + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if ( status < 0 ) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + */ + //--------------------------------Trying to add client end---------------------- + + + + + //EAdd_Contact_Request messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + strcpy( smsg + index, "tele1236@gmail.com" ); + index += strlen( "tele1236@gmail.com" ) + 1; + + // adding recipient + //len = strlen(connect_data->msg_data->recipient ); + //strcpy( smsg + index, connect_data->msg_data->recipient ); + //index += len + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //EAdd_Contact_Request message end--------------------------------------- + + + + //EAdd_Contact_Request -ve messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + //-----------------1 + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + strcpy( smsg + index, "tele1236@gmail.com" ); + index += strlen( "tele1236@gmail.com" ) + 1; + + smsg[index++] = '\0'; + + // adding message part + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //-----------------2 -ve + index = 0; + index += sizeof( message_hdr_req ); + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + memcpy( smsg + index, connect_data->msg_data->recipient, len ); + index += len; + + // adding message part + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //----------------- + + + //EAdd_Contact_Request -ve message end--------------------------------------- + + //send messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESend_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + //------------------------1 + // adding recipient + len = strlen( "santhosh.ic@gmail.com" ); + strcpy( smsg + index, "santhosh.ic@gmail.com" ); + index += len + 1; + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //-----------------------------------2 -ve + index = 0; + index += sizeof( message_hdr_req ); + // adding recipient + for ( int i = 0; i <= 11; i++ ) + { + len = strlen( "santhosh.ic@gmail.com" ); + strcpy( smsg + index, "santhosh.ic@gmail.com" ); + index += len + 1; + } + smsg[index++] = '\0'; + // adding message part + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + //-----------------------------------3 -ve + index = 0; + index += sizeof( message_hdr_req ); + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + memcpy( smsg + index, connect_data->msg_data->recipient, len ); + index += len; + + // adding message part + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ESend_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + //send message end--------------------------------------- + + //EDelete_Contact_Request messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + strcpy( smsg + index, "tele1236@gmail.com" ); + index += strlen( "tele1236@gmail.com" ) + 1; + + // adding recipient + //len = strlen(connect_data->msg_data->recipient ); + //strcpy( smsg + index, connect_data->msg_data->recipient ); + //index += len + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + //--------------------delete---------------------- + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EDelete_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding recipient + len = strlen(connect_data->msg_data->recipient ); + strcpy( smsg + index, connect_data->msg_data->recipient ); + index += len + 1; + + strcpy( smsg + index, "rakesh.harsh@gmail.com" ); + index += strlen( "rakesh.harsh@gmail.com" ) + 1; + + // adding recipient + //len = strlen(connect_data->msg_data->recipient ); + //strcpy( smsg + index, connect_data->msg_data->recipient ); + //index += len + 1; + + smsg[index++] = '\0'; + + // adding message part + + len = strlen(connect_data->msg_data->message ); + strcpy( smsg + index, connect_data->msg_data->message ); + index += len + 1; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EDelete_Contact_Request); + + + + //EDelete_Contact_Request message end--------------------------------------- + + //--------------Recieve message----------------------------------- + /* do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EText_Message_Receive); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EText_Message_Receive); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } */ //------------------------Recieve message end--------------------- + + //-------------update presence with available--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "available"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + + smsg[index++]='\0'; + + //updating status text + char *statustext = "i m busy"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } +// ------------------------------------------------------------------ + + //-------------update presence with available--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability1 = "dnd"; + memcpy( smsg + index, availability1, strlen( availability1 ) ); + index += strlen( availability1 ); + + smsg[index++]='\0'; + + //updating status text + char *statustext1 = "i m busy"; + memcpy( smsg + index, statustext1, strlen( statustext1 ) ); + index += strlen( statustext1 ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } +// ------------------------------------------------------------------ + + //-------------update presence with available--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability2 = "away"; + memcpy( smsg + index, availability2, strlen( availability2 ) ); + index += strlen( availability2 ); + + smsg[index++]='\0'; + + //updating status text + char *statustext2 = "i m busy"; + memcpy( smsg + index, statustext2, strlen( statustext2 ) ); + index += strlen( statustext2 ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } +// ------------------------------------------------------------------ + + //----------------------------presence negative case------------------ + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability with blank + smsg[index++]='\0'; + smsg[index++]='\0'; + //smsg[index++]='\0'; + + //updating status text + char *statustext4 = "i m not on desk"; + memcpy( smsg + index, statustext4, strlen( statustext4 ) ); + index += strlen( statustext4 ); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->error_type > 0) + { + return_value = KErrGeneral; + goto return_code; + } + + //-------------------------1 end + + // update 2 negative + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability4 = "available"; + memcpy( smsg + index, availability, strlen( availability4 ) ); + index += strlen( availability4 ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //---- + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithAway +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdatePresenceWithAway( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "away"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + + smsg[index++]='\0'; + + //updating status text + char *statustext = "i m busy"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithAway +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdatePresenceWithAvailable( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "available"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "there is difference between thought and execution"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdatePresenceWithDnd( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "dnd"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "i m busy"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdatePresenceMultipleTimeInSameSession( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "dnd"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "i m busy"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //-------------update presence 2nd time--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability1 = "away"; + memcpy( smsg + index, availability1, strlen( availability1 ) ); + index += strlen( availability1 ); + smsg[index++]='\0'; + + //updating status text + char *statustext1 = "i m not on desk"; + memcpy( smsg + index, statustext1, strlen( statustext1 ) ); + index += strlen( statustext1 ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogout_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdateOnlyStatusText( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability with blank + smsg[index++]='\0'; + smsg[index++]='\0'; + //smsg[index++]='\0'; + + //updating status text + char *statustext = "i m not on desk"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->error_type > 0) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithAway +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdateOnlyUserAvailability( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "available"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithAway +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdateOwnPresenceWithBlankData( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->error_type > 0) + { + return_value = KErrGeneral; + goto return_code; + } + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdateStatusTextWithSpecialCharacter( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "dnd"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "hi i m_ fine here @@@@@ ********* &&&&&&&&&&&&"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::UpdateStatusTextWithMaxLen( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "dnd"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "thesr is difference between thoughts and execution "; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::UpdatePresenceWithDnd +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::HandelingPresenceNotification( CStifItemParser& aItem ) + { + + /* + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + // Send Message to queueOne + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //-------------update presence--------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnPresence; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // updating availability + char *availability = "dnd"; + memcpy( smsg + index, availability, strlen( availability ) ); + index += strlen( availability ); + smsg[index++]='\0'; + + //updating status text + char *statustext = "i m busy"; + memcpy( smsg + index, statustext, strlen( statustext ) ); + index += strlen( statustext ); + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnPresence); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // waiting for second change + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + // waiting for first change + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + // waiting for first change + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + // waiting for first change + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + // waiting for first change + memset( rmsg, '\0', MAX_MSG_SIZE ); + //wait for message receive + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; */ + return KErrNone; + } + + +Cisolationserver::SearchKeyValue( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + TInt return_value = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + + + // adding value + + len = strlen("santhosh" ); + strcpy( smsg + index, "santhosh" ); + index += len + 1; + + + smsg[index++] = '\0'; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + ///------------------------------------------------------------- + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +Cisolationserver::SearchKeyValueWithResult( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + // adding value + + len = strlen("rakesh" ); + strcpy( smsg + index, "rakesh" ); + index += len + 1; + + smsg[index++] = '\0'; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + +Cisolationserver::SearchKeyValueInvalidParam( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch ); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + +Cisolationserver::SearchForLargeNoOfResult( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + + + // adding value + + len = strlen("a*" ); + strcpy( smsg + index, "a*" ); + index += len + 1; + + smsg[index++] = '\0'; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +Cisolationserver::SearchKeyValueInvalidParam2( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch ); + + if ( msg_struct->response != 0 ) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } +Cisolationserver::SearchKeyValueInvalidHashValues( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding key + len = strlen( "firstGname" ); + strcpy( smsg + index, "firstGname" ); + index += len + 1; + + // adding value + len = strlen("I" ); + strcpy( smsg + index, "I" ); + index += len + 1; + + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch ); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +Cisolationserver::SearchKeyValueBlank( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding key + len = strlen( connect_data->key_jid ); + strcpy( smsg + index, connect_data->key_jid ); + index += len + 1; + + // adding value + len = strlen("" ); + strcpy( smsg + index, "" ); + index += len + 1; + + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch ); + + + if( msg_struct->error_type != INVALID_PARAMETERES ) + { + return_value = KErrGeneral; + goto return_code; + } + + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +Cisolationserver::SearchKeyValueLargeString( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + // adding value + len = strlen( "Gmail is a new kind of webmail built on \ + the idea that email can be more intuitive efficient and useful" ); + + strcpy( smsg + index, "Gmail is a new kind of webmail built on \ + the idea that email can be more intuitive efficient and useful" ); + index += len + 1; + + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +Cisolationserver::SearchKeyValueSpecialChar( CStifItemParser& aItem ) + { + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + // adding value + len = strlen("happy_123@chat.gizmoproject.com" ); + strcpy( smsg + index, "happy_123@chat.gizmoproject.com" ); + index += len + 1; + + smsg[index++] = '\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::RejectAddRequestFromUser +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +//RejectAddRequestFromUser +TInt Cisolationserver::RejectAddRequestFromUser( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + // getting add notification from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + + do { + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + // memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ETrying_To_Add_Contact_Publish); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + char *userid = (char *)malloc(100); + len=0; + len+=sizeof(message_hdr_resp); + strcpy(userid,rmsg+len); + + + + + // rejecting add request from user + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EReject_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + len=0; + len+=strlen(userid); + strcpy( smsg + index ,userid ); + index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EReject_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::AcceptAddRequestFromUser +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +Cisolationserver::SearchAndAddContact( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + // adding value + len = strlen("rakesh" ); + strcpy( smsg + index, "rakesh" ); + index += len + 1; + + smsg[index++] = '\0'; + + gint temp = 0; + gchar* add_contact = NULL; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do + { + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + //To add contact only once for the first time + if ( 0 == temp && ESearch == msg_struct->hdr_req.message_type ) + { + // length will point to the start of the contact to be added + int length = 0; + length += sizeof( message_hdr_resp ); + + while ( 0 != strcmp( "jid", rmsg + length ) + && '\0' != *( rmsg + length + 1) ) + { + length += strlen( rmsg + length ) + 1; + gchar* add_contact = rmsg + length; + } + length += strlen( rmsg + length ) + 1; + + add_contact = strdup( rmsg + length ); + //add contact end--------------------------------------- + temp++; + } + + + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1 ) + { + return_value = KErrGeneral; + goto return_code; + } + + //search message end--------------------------------------- + + //adding contact -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAdd_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // adding add contact + len = strlen( add_contact ); + strcpy( smsg + index, add_contact ); + index += len + 1; + smsg[index++]='\0'; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + } while (msg_struct->hdr_req.message_type!=EAdd_Contact_Request); + + if ( msg_struct->response != 1 ) + { + return_value = KErrGeneral; + goto return_code; + } + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::AcceptAddRequestFromUser +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +Cisolationserver::SecondSearch( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + const gchar* search_label = GetSearchLabelL(connect_data->server,connect_data->key_given_name); + // adding key + len = strlen(search_label); + strcpy( smsg + index, search_label ); + index += len + 1; + + // adding value + len = strlen("sharath" ); + strcpy( smsg + index, "sharath" ); + index += len + 1; + + smsg[index++] = '\0'; + + gint temp = 0; + gchar* add_contact = NULL; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do + { + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1 ) + { + return_value = KErrGeneral; + goto return_code; + } + + //search message end--------------------------------------- + + + //second search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + + + const gchar* search_label1 = GetSearchLabelL(connect_data->server,connect_data->key_middle_name); + // adding key + len = strlen(search_label1); + strcpy( smsg + index, search_label1 ); + index += len + 1; + + // adding value + len = strlen("Jeppu" ); + strcpy( smsg + index, "Jeppu" ); + index += len + 1; + + smsg[index++] = '\0'; + + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do + { + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1 ) + { + return_value = KErrGeneral; + goto return_code; + } + + //search message end--------------------------------------- + + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +TInt Cisolationserver::AcceptAddRequestFromUser( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + // getting add notification from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + + do { + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + // memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ETrying_To_Add_Contact_Publish); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + char *userid = (char *)malloc(100); + len=0; + len+=sizeof(message_hdr_resp); + strcpy(userid,rmsg+len); + // accepting add request from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EReject_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + len=0; + len+=strlen(userid); + strcpy( smsg + index ,userid ); + index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAccept_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::SendAcceptRequestWithoutReceivingAddrequest +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendAcceptRequestWithoutReceivingAddrequest( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //Accepting Add request from contact without ne add notification -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EAccept_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++] = '\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAccept_Contact_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::SendRejectRequestWithoutReceivingAddrequest +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendRejectRequestWithoutReceivingAddrequest( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //Accepting Add request from contact without ne add notification -------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EReject_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + // adding add contact + len = strlen(connect_data->contact ); + strcpy( smsg + index, connect_data->contact ); + index += len + 1; + smsg[index++] = '\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EReject_Contact_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //add contact end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + + // ----------------------------------------------------------------------------- +// Cisolationserver::SendAcceptRequestWithoutAnyUserID +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SendAcceptRequestWithoutAnyUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + // getting add notification from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + + do { + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + // memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ETrying_To_Add_Contact_Publish); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + char *userid = (char *)malloc(100); + len=0; + len+=sizeof(message_hdr_resp); + strcpy(userid,rmsg+len); + // accepting add request from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EReject_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + //no need to send user id with this message + //len=0; + //len+=strlen(userid); + //strcpy( smsg + index ,userid ); + //index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EAccept_Contact_Request); + // need to check response + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::SendRejectRequestWithoutAnyUserID +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +//RejectAddRequestFromUser +TInt Cisolationserver::SendRejectRequestWithoutAnyUserID( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + + int timeout = 100; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + + + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //fetch end + // getting add notification from user + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + + do { + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + // memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ETrying_To_Add_Contact_Publish); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + char *userid = (char *)malloc(100); + len=0; + len+=sizeof(message_hdr_resp); + strcpy(userid,rmsg+len); + + + + + // rejecting add request from user + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EReject_Contact_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + //len=0; + //len+=strlen(userid); + //strcpy( smsg + index ,userid ); + //index += len + 1; + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EReject_Contact_Request); + + if ( msg_struct->response != 0) + { + return_value = KErrGeneral; + goto return_code; + } + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + // ----------------------------------------------------------------------------- +// Cisolationserver::Login with correct data +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::LogoutWhileUserIsNotLoggedIn( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + + FILE *fp; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ELogin_Request; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + //appending password + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + //appending server name + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + // appending IAP id + smsg[index++]= '1'; + smsg[index++]= '\0'; + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + #endif + //running isoserver + run_isoserver(); + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + //fetch end + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + return_value = KErrNone; + goto return_code; + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::GetSearchLabelForYukonL +// ----------------------------------------------------------------------------- +const gchar* Cisolationserver::GetSearchLabelForYukonL(gchar *search_key) +{ +if(strcmp(search_key,"user") == 0) + { + gchar* label= "User"; + return label; + } +else if(strcmp(search_key,"fn") == 0) + { + gchar* label= "Full Name"; + return label; + } +else if(strcmp(search_key,"first") == 0) + { + gchar* label= "Name"; + return label; + } +else if(strcmp(search_key,"middle") == 0) + { + gchar* label= "Middle Name"; + return label; + } +else if(strcmp(search_key,"last") == 0) + { + gchar* label= "Family Name"; + return label; + } +else if(strcmp(search_key,"nick") == 0) + { + gchar* label= "Nickname"; + return label; + } +else if(strcmp(search_key,"email") == 0) + { + gchar* label= "Email"; + return label; + } +else if(strcmp(search_key,"bday") == 0) + { + gchar* label= "Birthday"; + return label; + } +else if(strcmp(search_key,"ctry") == 0) + { + gchar* label= "Country"; + return label; + } +else if(strcmp(search_key,"orgname") == 0) + { + gchar* label= "Organization Name"; + return label; + } +else if(strcmp(search_key,"locality") == 0) + { + gchar* label= "City"; + return label; + } +else if(strcmp(search_key,"orgunit") == 0) + { + gchar* label= "Organization Unit"; + return label; + } +} + + +// ----------------------------------------------------------------------------- +// Cisolationserver::GetSearchLabelForGizmoL +// ----------------------------------------------------------------------------- +const gchar* Cisolationserver::GetSearchLabelForGizmoL(gchar *search_key) +{ +if(strcmp(search_key,"xmpp_user") == 0) + { + gchar* label= "Account Name"; + return label; + } +else if(strcmp(search_key,"email_address") == 0) + { + gchar* label= "Email Address"; + return label; + } +else if(strcmp(search_key,"first_name") == 0) + { + gchar* label= "First Name"; + return label; + } +else if(strcmp(search_key,"last_name") == 0) + { + gchar* label= "Family Name"; + return label; + } +else if(strcmp(search_key,"country") == 0) + { + gchar* label= "Country"; + return label; + } +else if(strcmp(search_key,"state") == 0) + { + gchar* label= "State/Province"; + return label; + } +else if(strcmp(search_key,"city") == 0) + { + gchar* label= "City"; + return label; + } +else if(strcmp(search_key,"max_results") == 0) + { + gchar* label= "Maximum # of Results"; + return label; + } +} + +// ----------------------------------------------------------------------------- +// Cisolationserver::GetSearchLabelL +// ----------------------------------------------------------------------------- +const gchar* Cisolationserver::GetSearchLabelL(gchar* aService,gchar* aSearchKey) +{ +if(strcmp(aService,"chat.gizmoproject.com") == 0) + { + GetSearchLabelForGizmoL(aSearchKey); + } +else if(strcmp(aService,"chat.ovi.com") == 0 ) + { + GetSearchLabelForYukonL(aSearchKey); + } +} + + +// ----------------------------------------------------------------------------- +// Cisolationserver::?member_function +// ?implementation_description +// (other items were commented in a header). + +// ----------------------------------------------------------------------------- +// Cisolationserver::AcceptAddRequestFromUser +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +Cisolationserver::GetKeysAndSearch( CStifItemParser& aItem ) + { + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + TInt return_value = 0; + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '0'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + run_isoserver(); + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + + + // get search keys test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ESearch_Get_Keys; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + } while (msg_struct->hdr_req.message_type!= ESearch_Get_Keys ); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + int length = sizeof( message_hdr_resp ); + char* search_value = NULL; + do { + search_value = strdup ( rmsg + length ); + + if ( !search_value ) + { + return_value = KErrGeneral; + goto return_code; + } + length += strlen( search_value ) + 1; + } while ( ( 0 != strcmp( "First Name", search_value ) ) + && length < status &&( free ( search_value ), search_value = NULL, 1 ) ); + + + + + //search messge-------------------------------------------- + + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = ESearch; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + // adding key + len = strlen( search_value ); + strcpy( smsg + index, search_value ); + index += len + 1; + + // adding value + len = strlen( "santhosh" ); + strcpy( smsg + index, "santhosh" ); + index += len + 1; + + smsg[index++] = '\0'; + + gint temp = 0; + gchar* add_contact = NULL; + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do + { + memset( rmsg, '\0', MAX_MSG_SIZE ); + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + } while (msg_struct->hdr_req.message_type!= ESearch_State_Finished ); + + if ( msg_struct->response != 1 ) + { + return_value = KErrGeneral; + goto return_code; + } + + //search message end--------------------------------------- + + + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + // result = MsgQDelete(REQUEST_QUEUE, &err); + // result = MsgQDelete(RESPONSE_QUEUE, &err); + return_value = KErrNone; + goto return_code; + +//killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::set avatar +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::SetOwnAvatar( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + //set avatar + TPtrC filename; + TPtrC mimetype; + gchar *file_name; + gchar *mime_type; + gchar *filecontent; + int n; + TBuf8 temp; + + index = 0; + index += sizeof( message_hdr_req ); + // setting avatar + FILE *file; + char *buffer; + unsigned long fileLen; + + //Open file + file = fopen(connect_data->image_file_name, "rb"); + if (!file) + { + fprintf(stderr, "Unable to open file %s", file_name); + return; + } + + //Get file length + fseek(file, 0, SEEK_END); + fileLen=ftell(file); + fseek(file, 0, SEEK_SET); + + + //strcpy(mime_type,"image\jpeg"); + len = fileLen + strlen(connect_data->mimetype) + 1; + buffer=(char *)malloc(len); + if (!buffer) + { + fprintf(stderr, "Memory error!"); + fclose(file); + return; + } + memset( buffer, '\0', len ); + memcpy( buffer, connect_data->mimetype, strlen(connect_data->mimetype) ); + //Read file contents into buffer + + fread(buffer + strlen(connect_data->mimetype) + 1, fileLen, 1, file); + fclose(file); + + //Do what ever with buffer + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EUpdateOwnAvtar; + // memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + /* Send Message to queueOne */ + TInt header_size = sizeof( message_hdr_req ); + //crashes for perticuler image.Need to fix + char* one_pdu = ( char* ) malloc( ONE_K_OPENC_FIX ); + //run a loop for rest of the data and keep track of the case of nBytes being + //multiple of 1020 - sizeof(msghdr) and it being not + //Amount of payload that can be sent + TInt single_read = ONE_K_OPENC_FIX - header_size; + //Data recieved from PublishOwnPresenceL has message header at begining + TInt actual_data = fileLen; + //No of packets needed to send the image data + TInt total_packets = (TInt)ceil( ( double ) ( actual_data ) / single_read ); + //This offset moves thru the msg pointer + TInt navigate_offset = 0; + for ( TInt i = 0; i < total_packets; i++ ) + { + //till the last packet size_tobe_sent will be ONE_K_OPENC_FIX + //last packet data is actual_data % single_read if less than single_read else ONE_K_OPENC_FIX + TInt size_tobe_sent = ( i < total_packets - 1 ) ? ONE_K_OPENC_FIX : + ( actual_data % single_read ? + actual_data % single_read + header_size : ONE_K_OPENC_FIX ); + + if ( i < total_packets - 1 ) + { + msgHdr->continue_flag = 1; + } + else + { + msgHdr->continue_flag = 0; + } + + //memcpy ( msg + header_size , msg + navigate_offset, size_tobe_sent - header_size ); + memcpy( one_pdu , msgHdr, header_size ); + memcpy( one_pdu + header_size, buffer + navigate_offset, size_tobe_sent - header_size ); + result = MsgQSend ( REQUEST_QUEUE, one_pdu, size_tobe_sent, + MSG_PRI_NORMAL, timeout, &err ); + User::LeaveIfError ( result ); + navigate_offset += single_read; + } + free(one_pdu); + free(buffer); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EUpdateOwnAvtar); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + //set avatar end + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::clear avatar +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::ClearOwnAvatar( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + for (int i= 0 ;i<3 ;i++) + { + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (!((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts))&& 0 == msg_struct->continue_flag); + fclose(fp); + + } + + //fetch end + + //clear avatar + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EClearOwnAvatar; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + smsg[index++]='\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=EClearOwnAvatar); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //clear avatar end + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// Cisolationserver::clear avatar +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cisolationserver::FetchCachedContacts( CStifItemParser& aItem ) + { + + + ConnectData *connect_data = NULL; + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + FILE *fp; + + int timeout = 200; + int nBytes; + + int result = 0; + int err = 0; + int status = 0; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return_value = KErrGeneral; + goto return_code; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + int len = strlen(connect_data->username); + strcpy( smsg + index, connect_data->username ); + index += len + 1; + + //appending password + + len = strlen(connect_data->password ); + strcpy( smsg + index, connect_data->password ); + index += len + 1; + + //appending server name + + len = strlen(connect_data->server ); + strcpy( smsg + index, connect_data->server ); + index += len + 1; + + //appending resource + len = strlen(connect_data->resource ); + strcpy( smsg + index, connect_data->resource ); + index += len + 1; + + //appending ssl + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending server port + len = strlen(connect_data->port ); + strcpy( smsg + index, connect_data->port ); + index += len + 1; + + // appending IAP id + + smsg[index++]= '1'; + smsg[index++]= '\0'; + + //appending connmgr_bus + len = strlen(connect_data->connmgr_bus ); + strcpy( smsg + index, connect_data->connmgr_bus ); + index += len + 1; + + //appending connmgr_path + len = strlen(connect_data->connmgr_path ); + strcpy( smsg + index, connect_data->connmgr_path ); + index += len + 1; + + //appending protocol + len = strlen(connect_data->protocol ); + strcpy( smsg + index, connect_data->protocol ); + index += len + 1; + + #ifdef __WINSCW__ + //proxy server + len = strlen(connect_data->proxy_data->proxy_server ); + strcpy( smsg + index, connect_data->proxy_data->proxy_server ); + index += len + 1; + + //proxy port + len = strlen(connect_data->proxy_data->proxy_port ); + strcpy( smsg + index, connect_data->proxy_data->proxy_port ); + index += len + 1; + + #endif + + //running isoserver + run_isoserver(); + + + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + + + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return_value = KErrGeneral; + goto return_code; + } + msg_struct = ( message_hdr_resp* ) malloc( sizeof( message_hdr_resp ) ); + memset( msg_struct, '\0', sizeof( message_hdr_resp ) ); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + + if( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + + + // login end + + //fetch req.. + TInt count = 0; + + fp = fopen("c:\\fetch_contact.txt","a"); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fp); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + if ( (msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts) && 0 == msg_struct->continue_flag ) + { + count++; + } + + + } while (count < 3 ); + fclose(fp); + + + + + //fetch end + FILE* fop = NULL; + //clear avatar + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + index=0; + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EFetchCachedContacts; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + smsg[index++]='\0'; + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + fop = fopen("c:\\santhosh.txt","a"); + count = 0; + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + fwrite(rmsg,1,status,fop); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + if ( ((msg_struct->hdr_req.message_type==ECurrent_Member_Contacts) + ||(msg_struct->hdr_req.message_type==ELocal_Pending_Contacts) + ||(msg_struct->hdr_req.message_type==ERemote_Pending_Contacts)) && 0 == msg_struct->continue_flag ) + { + count++; + } + + + } while (count < 3 ); + fclose(fop); + + //clear avatar end + // logout test code from server + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogout_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + do { + status = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, 2000, &err); + memcpy( msg_struct, rmsg, sizeof( message_hdr_resp ) ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + } while (msg_struct->hdr_req.message_type!=ELogout_Request); + + if ( msg_struct->response != 1) + { + return_value = KErrGeneral; + goto return_code; + } + //killing isoserver + return_code: + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free( msg_struct ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// Cisolationserver::?member_function +// ?implementation_description +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +/* +TInt Cisolationserver::?member_function( + CItemParser& aItem ) + { + + ?code + + } +*/ + +// ========================== OTHER EXPORTED FUNCTIONS ========================= +// None + +// [End of File] - Do not remove diff -r 000000000000 -r d0f3a028347a layers.sysdef.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layers.sysdef.xml Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,14 @@ + + +]> + + + + + + + + + + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/bwins/libtelepathyu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/bwins/libtelepathyu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,18 @@ +EXPORTS + tp_chan_get_interface @ 1 NONAME + tp_chan_new @ 2 NONAME + tp_conn_get_interface @ 3 NONAME + tp_conn_get_type @ 4 NONAME + tp_conn_new_channel @ 5 NONAME + tp_connmgr_get_parameters @ 6 NONAME + tp_connmgr_list_protocols @ 7 NONAME + tp_connmgr_new @ 8 NONAME + tp_connmgr_new_connection @ 9 NONAME + tp_get_chan_contactsearch_interface @ 10 NONAME + tp_get_chan_group_interface @ 11 NONAME + tp_get_chan_text_interface @ 12 NONAME + tp_get_conn_avatar_interface @ 13 NONAME + tp_get_conn_presence_interface @ 14 NONAME + tp_get_props_interface @ 15 NONAME + tp_props_iface_get_type @ 16 NONAME + diff -r 000000000000 -r d0f3a028347a libtelepathy/eabi/libtelepathyu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/eabi/libtelepathyu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,18 @@ +EXPORTS + tp_chan_get_interface @ 1 NONAME + tp_chan_new @ 2 NONAME + tp_conn_get_interface @ 3 NONAME + tp_conn_get_type @ 4 NONAME + tp_conn_new_channel @ 5 NONAME + tp_connmgr_get_parameters @ 6 NONAME + tp_connmgr_list_protocols @ 7 NONAME + tp_connmgr_new @ 8 NONAME + tp_connmgr_new_connection @ 9 NONAME + tp_get_chan_contactsearch_interface @ 10 NONAME + tp_get_chan_group_interface @ 11 NONAME + tp_get_chan_text_interface @ 12 NONAME + tp_get_conn_avatar_interface @ 13 NONAME + tp_get_conn_presence_interface @ 14 NONAME + tp_get_props_interface @ 15 NONAME + tp_props_iface_get_type @ 16 NONAME + diff -r 000000000000 -r d0f3a028347a libtelepathy/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,40 @@ +/* bld.inf + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +// Project configuration file for dbus + +// Project platforms +PRJ_PLATFORMS +WINSCW ARMV5 + +#include + +// Project exports +PRJ_EXPORTS +../rom/libtelepathy.iby CORE_MW_LAYER_IBY_EXPORT_PATH(libtelepathy.iby) + + + + +// MMP files for project components +PRJ_MMPFILES +libtelepathy.mmp + +PRJ_TESTMMPFILES diff -r 000000000000 -r d0f3a028347a libtelepathy/group/libtelepathy.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/group/libtelepathy.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,98 @@ +/* libtelepathy.mmp + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +// General properties +#include +TARGET libtelepathy.dll +TARGETTYPE dll +CAPABILITY CAP_GENERAL_DLL +UID 0x1000008d 0x2000F850 + +VERSION 10.0 +#ifndef WINSCW +// Allow global writeable static data +EPOCALLOWDLLDATA +#endif + +// Macros +MACRO SYMBIAN +MACRO HAVE_CONFIG_H +MACRO HAVE_ERRNO_H VERBOSE + +#ifdef WINSCW +MACRO EMULATOR +#endif + + +SOURCEPATH ../src +//START RESOURCE dbus-daemon_reg.rss +#ifdef WINSCW +TARGETPATH /private/10003a3f/apps +#else +TARGETPATH /private/10003a3f/import/apps +#endif +//END //RESOURCE + +// Source files +#ifdef WINSCW +SOURCE libtelepathy_wsd.cpp +#endif /*WINSCW*/ + +SOURCE tp-chan.c +SOURCE tp-chan-ifaces-signal-setters.c +SOURCE tp-chan-signals-marshal.c +SOURCE tp-conn.c +SOURCE tp-conn-ifaces-signal-setters.c +SOURCE tp-connmgr.c +SOURCE tp-connmgr-signals-marshal.c +SOURCE tp-conn-signals-marshal.c +SOURCE tp-helpers.c +SOURCE tp-ifaces-signals-marshal.c +SOURCE tp-props-iface.c + +// User include paths +USERINCLUDE ../inc + +// System include paths +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE + +// Library dependencies +#ifdef GCCE +STATICLIBRARY libcrt0_gcce.lib +#else +STATICLIBRARY libcrt0.lib +#endif +LIBRARY libdbus.lib +LIBRARY libc.lib +LIBRARY libglib.lib +LIBRARY libgobject.lib +LIBRARY libdbus-glib.lib + +#ifdef WINSCW +LIBRARY euser.lib // Needed in order to use Symbian services +//wsd solution +LIBRARY ewsd.lib +#endif + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-ch-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-ch-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,71 @@ +/* tp-ch-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ChannelHandler +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ChannelHandler + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ch_handle_channel (DBusGProxy *proxy, const char * IN_bus_name, const char* IN_connection, const char * IN_channel_type, const char* IN_channel, const guint IN_handle_type, const guint IN_handle, GError **error) + +{ + return dbus_g_proxy_call (proxy, "HandleChannel", error, G_TYPE_STRING, IN_bus_name, DBUS_TYPE_G_OBJECT_PATH, IN_connection, G_TYPE_STRING, IN_channel_type, DBUS_TYPE_G_OBJECT_PATH, IN_channel, G_TYPE_UINT, IN_handle_type, G_TYPE_UINT, IN_handle, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ch_handle_channel_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ch_handle_channel_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ch_handle_channel_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ch_handle_channel_async (DBusGProxy *proxy, const char * IN_bus_name, const char* IN_connection, const char * IN_channel_type, const char* IN_channel, const guint IN_handle_type, const guint IN_handle, tp_ch_handle_channel_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "HandleChannel", tp_ch_handle_channel_async_callback, stuff, g_free, G_TYPE_STRING, IN_bus_name, DBUS_TYPE_G_OBJECT_PATH, IN_connection, G_TYPE_STRING, IN_channel_type, DBUS_TYPE_G_OBJECT_PATH, IN_channel, G_TYPE_UINT, IN_handle_type, G_TYPE_UINT, IN_handle, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ChannelHandler */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,186 @@ +/* tp-chan.gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_close (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Close", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_close_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_close_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_close_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_close_async (DBusGProxy *proxy, tp_chan_close_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Close", tp_chan_close_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_get_channel_type (DBusGProxy *proxy, char ** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetChannelType", error, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_get_channel_type_reply) (DBusGProxy *proxy, char * OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_get_channel_type_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char * OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_get_channel_type_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_get_channel_type_async (DBusGProxy *proxy, tp_chan_get_channel_type_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetChannelType", tp_chan_get_channel_type_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_get_handle (DBusGProxy *proxy, guint* OUT_arg0, guint* OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetHandle", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_UINT, OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_get_handle_reply) (DBusGProxy *proxy, guint OUT_arg0, guint OUT_arg1, GError *error, gpointer userdata); + +static void +tp_chan_get_handle_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + guint OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_UINT, &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_get_handle_reply)data->cb) (proxy, OUT_arg0, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_get_handle_async (DBusGProxy *proxy, tp_chan_get_handle_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetHandle", tp_chan_get_handle_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_get_interfaces (DBusGProxy *proxy, char *** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetInterfaces", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_get_interfaces_reply) (DBusGProxy *proxy, char * *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_get_interfaces_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_get_interfaces_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_get_interfaces_async (DBusGProxy *proxy, tp_chan_get_interfaces_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetInterfaces", tp_chan_get_interfaces_async_callback, stuff, g_free, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-dtmf-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-dtmf-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,71 @@ +/* tp-chan-iface-dtmf-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_DTMF +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_DTMF + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_dtmf_send_dt_mf (DBusGProxy *proxy, const guint IN_signal, const guint IN_duration, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SendDTMF", error, G_TYPE_UINT, IN_signal, G_TYPE_UINT, IN_duration, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_dtmf_send_dt_mf_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_iface_dtmf_send_dt_mf_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_iface_dtmf_send_dt_mf_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_dtmf_send_dt_mf_async (DBusGProxy *proxy, const guint IN_signal, const guint IN_duration, tp_chan_iface_dtmf_send_dt_mf_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SendDTMF", tp_chan_iface_dtmf_send_dt_mf_async_callback, stuff, g_free, G_TYPE_UINT, IN_signal, G_TYPE_UINT, IN_duration, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_DTMF */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-group-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-group-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,376 @@ +/* tp-chan-iface-group-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Group +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Group + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_add_members (DBusGProxy *proxy, const GArray* IN_contacts, const char * IN_message, GError **error) + +{ + return dbus_g_proxy_call (proxy, "AddMembers", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_STRING, IN_message, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_add_members_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_add_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_iface_group_add_members_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_add_members_async (DBusGProxy *proxy, const GArray* IN_contacts, const char * IN_message, tp_chan_iface_group_add_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "AddMembers", tp_chan_iface_group_add_members_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_STRING, IN_message, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_all_members (DBusGProxy *proxy, GArray** OUT_arg0, GArray** OUT_arg1, GArray** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetAllMembers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg0, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg1, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_all_members_reply) (DBusGProxy *proxy, GArray *OUT_arg0, GArray *OUT_arg1, GArray *OUT_arg2, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_all_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg0; + GArray* OUT_arg1; + GArray* OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg0, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg1, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg2, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_all_members_reply)data->cb) (proxy, OUT_arg0, OUT_arg1, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_all_members_async (DBusGProxy *proxy, tp_chan_iface_group_get_all_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetAllMembers", tp_chan_iface_group_get_all_members_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_group_flags (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetGroupFlags", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_group_flags_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_group_flags_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_group_flags_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_group_flags_async (DBusGProxy *proxy, tp_chan_iface_group_get_group_flags_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetGroupFlags", tp_chan_iface_group_get_group_flags_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_handle_owners (DBusGProxy *proxy, const GArray* IN_handles, GArray** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetHandleOwners", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_handle_owners_reply) (DBusGProxy *proxy, GArray *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_handle_owners_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_handle_owners_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_handle_owners_async (DBusGProxy *proxy, const GArray* IN_handles, tp_chan_iface_group_get_handle_owners_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetHandleOwners", tp_chan_iface_group_get_handle_owners_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_local_pending_members (DBusGProxy *proxy, GArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetLocalPendingMembers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_local_pending_members_reply) (DBusGProxy *proxy, GArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_local_pending_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_local_pending_members_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_local_pending_members_async (DBusGProxy *proxy, tp_chan_iface_group_get_local_pending_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetLocalPendingMembers", tp_chan_iface_group_get_local_pending_members_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_members (DBusGProxy *proxy, GArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetMembers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_members_reply) (DBusGProxy *proxy, GArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_members_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_members_async (DBusGProxy *proxy, tp_chan_iface_group_get_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetMembers", tp_chan_iface_group_get_members_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_remote_pending_members (DBusGProxy *proxy, GArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetRemotePendingMembers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_remote_pending_members_reply) (DBusGProxy *proxy, GArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_remote_pending_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_remote_pending_members_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_remote_pending_members_async (DBusGProxy *proxy, tp_chan_iface_group_get_remote_pending_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetRemotePendingMembers", tp_chan_iface_group_get_remote_pending_members_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_get_self_handle (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetSelfHandle", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_get_self_handle_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_get_self_handle_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_group_get_self_handle_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_get_self_handle_async (DBusGProxy *proxy, tp_chan_iface_group_get_self_handle_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetSelfHandle", tp_chan_iface_group_get_self_handle_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_group_remove_members (DBusGProxy *proxy, const GArray* IN_contacts, const char * IN_message, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RemoveMembers", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_STRING, IN_message, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_group_remove_members_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_iface_group_remove_members_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_iface_group_remove_members_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_group_remove_members_async (DBusGProxy *proxy, const GArray* IN_contacts, const char * IN_message, tp_chan_iface_group_remove_members_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RemoveMembers", tp_chan_iface_group_remove_members_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_STRING, IN_message, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Group */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-hold-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-hold-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,109 @@ +/* tp-chan-iface-hold-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Hold +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Hold + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_hold_get_hold_state (DBusGProxy *proxy, const guint IN_member, guint* OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetHoldState", error, G_TYPE_UINT, IN_member, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_hold_get_hold_state_reply) (DBusGProxy *proxy, guint OUT_arg1, GError *error, gpointer userdata); + +static void +tp_chan_iface_hold_get_hold_state_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_iface_hold_get_hold_state_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_hold_get_hold_state_async (DBusGProxy *proxy, const guint IN_member, tp_chan_iface_hold_get_hold_state_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetHoldState", tp_chan_iface_hold_get_hold_state_async_callback, stuff, g_free, G_TYPE_UINT, IN_member, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_hold_request_hold (DBusGProxy *proxy, const guint IN_member, const gboolean IN_hold, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestHold", error, G_TYPE_UINT, IN_member, G_TYPE_BOOLEAN, IN_hold, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_hold_request_hold_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_iface_hold_request_hold_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_iface_hold_request_hold_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_hold_request_hold_async (DBusGProxy *proxy, const guint IN_member, const gboolean IN_hold, tp_chan_iface_hold_request_hold_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestHold", tp_chan_iface_hold_request_hold_async_callback, stuff, g_free, G_TYPE_UINT, IN_member, G_TYPE_BOOLEAN, IN_hold, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Hold */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-ice-signalling-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-ice-signalling-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,72 @@ +/* tp-chan-iface-ice-signalling-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_IceSignalling +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_IceSignalling + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_ice_signalling_get_session_handlers (DBusGProxy *proxy, GPtrArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetSessionHandlers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_INVALID)), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_ice_signalling_get_session_handlers_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_ice_signalling_get_session_handlers_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_INVALID)), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_ice_signalling_get_session_handlers_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_ice_signalling_get_session_handlers_async (DBusGProxy *proxy, tp_chan_iface_ice_signalling_get_session_handlers_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetSessionHandlers", tp_chan_iface_ice_signalling_get_session_handlers_async_callback, stuff, g_free, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_IceSignalling */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-password-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-password-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,110 @@ +/* tp-chan-iface-password-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Password +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Password + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_password_get_password_flags (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetPasswordFlags", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_password_get_password_flags_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_iface_password_get_password_flags_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_iface_password_get_password_flags_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_password_get_password_flags_async (DBusGProxy *proxy, tp_chan_iface_password_get_password_flags_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetPasswordFlags", tp_chan_iface_password_get_password_flags_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_password_provide_password (DBusGProxy *proxy, const char * IN_password, gboolean* OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ProvidePassword", error, G_TYPE_STRING, IN_password, G_TYPE_INVALID, G_TYPE_BOOLEAN, OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_password_provide_password_reply) (DBusGProxy *proxy, gboolean OUT_arg1, GError *error, gpointer userdata); + +static void +tp_chan_iface_password_provide_password_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + gboolean OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_BOOLEAN, &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_iface_password_provide_password_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_password_provide_password_async (DBusGProxy *proxy, const char * IN_password, tp_chan_iface_password_provide_password_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ProvidePassword", tp_chan_iface_password_provide_password_async_callback, stuff, g_free, G_TYPE_STRING, IN_password, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Password */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-iface-transfer-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-iface-transfer-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,71 @@ +/*tp-chan-iface-transfer-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Transfer +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Transfer + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_iface_transfer_transfer (DBusGProxy *proxy, const guint IN_member, const guint IN_destination, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Transfer", error, G_TYPE_UINT, IN_member, G_TYPE_UINT, IN_destination, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_iface_transfer_transfer_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_iface_transfer_transfer_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_iface_transfer_transfer_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_iface_transfer_transfer_async (DBusGProxy *proxy, const guint IN_member, const guint IN_destination, tp_chan_iface_transfer_transfer_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Transfer", tp_chan_iface_transfer_transfer_async_callback, stuff, g_free, G_TYPE_UINT, IN_member, G_TYPE_UINT, IN_destination, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Interface_Transfer */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-ifaces-signal-setters.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-ifaces-signal-setters.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +/* tp-chan-ifaces-signal-setters.h + * + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef TP_CHAN_IFACES_SETTERS_H +#define TP_CHAN_IFACES_SETTERS_H + +#include + +/* This header file contains definitions for the signal signature setters + * for the various interfaces provided by Channel */ + + +void tp_chan_set_contactsearch_signatures(DBusGProxy *proxy); + +void tp_chan_set_streamedmedia_signatures(DBusGProxy *proxy); + +void tp_chan_set_roomlist_signatures(DBusGProxy *proxy); + +void tp_chan_set_text_signatures(DBusGProxy *proxy); + +void tp_chan_set_dtmf_signatures(DBusGProxy *proxy); + +void tp_chan_set_group_signatures(DBusGProxy *proxy); + +void tp_chan_set_hold_signatures(DBusGProxy *proxy); + +void tp_chan_set_password_signatures(DBusGProxy *proxy); + +void tp_chan_set_icesignalling_signatures(DBusGProxy *proxy); + +#endif diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,34 @@ +/* tp-chan-signals-marshal.h + * + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __tp_chan_signals_marshal_MARSHAL_H__ +#define __tp_chan_signals_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:VOID (tp-chan-signals-marshal.list:1) */ +#define tp_chan_signals_marshal_VOID__VOID g_cclosure_marshal_VOID__VOID + +G_END_DECLS + +#endif /* __tp_chan_signals_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-type-contact-list-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-type-contact-list-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,29 @@ +/* tp-chan-type-contact-list-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-type-room-list-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-type-room-list-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,109 @@ +/* tp-chan-type-room-list-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_RoomList +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_RoomList + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_room_list_get_listing_rooms (DBusGProxy *proxy, gboolean* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetListingRooms", error, G_TYPE_INVALID, G_TYPE_BOOLEAN, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_room_list_get_listing_rooms_reply) (DBusGProxy *proxy, gboolean OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_type_room_list_get_listing_rooms_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + gboolean OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_BOOLEAN, &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_type_room_list_get_listing_rooms_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_room_list_get_listing_rooms_async (DBusGProxy *proxy, tp_chan_type_room_list_get_listing_rooms_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetListingRooms", tp_chan_type_room_list_get_listing_rooms_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_room_list_list_rooms (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListRooms", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_room_list_list_rooms_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_type_room_list_list_rooms_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_type_room_list_list_rooms_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_room_list_list_rooms_async (DBusGProxy *proxy, tp_chan_type_room_list_list_rooms_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListRooms", tp_chan_type_room_list_list_rooms_async_callback, stuff, g_free, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_RoomList */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-type-search-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-type-search-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,166 @@ +/* tp-chan-type-search-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Search +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Search + + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_search (DBusGProxy *proxy, const GHashTable* IN_terms, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Search", error, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_terms, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_search_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_type_search_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error,G_TYPE_INVALID); + (*(tp_chan_type_search_reply)data->cb) (proxy, error, data->userdata); + return; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_search_async (DBusGProxy *proxy, const GHashTable *IN_params, tp_chan_type_search_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Search", tp_chan_type_search_async_callback, stuff, g_free, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_params, G_TYPE_INVALID); +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_search_get_search_state (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetSearchState", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_search_get_search_state_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_type_search_get_search_state_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error,G_TYPE_UINT, &OUT_arg2, G_TYPE_INVALID); + (*(tp_chan_type_search_get_search_state_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_search_get_search_state_async (DBusGProxy *proxy, tp_chan_type_search_get_search_state_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetSearchState", tp_chan_type_search_get_search_state_async_callback, stuff, g_free, G_TYPE_INVALID); +} + + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_search_get_search_keys (DBusGProxy *proxy, char ** OUT_arg0, char *** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetSearchKeys", error, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg0, G_TYPE_STRV, OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_search_get_search_keys_reply) (DBusGProxy *proxy, char * OUT_arg0, char * *OUT_arg1, GError *error, gpointer userdata); + + +static void +tp_chan_type_search_get_search_keys_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + char * OUT_arg0; + char ** OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg0, G_TYPE_STRV, &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_type_search_get_search_keys_reply)data->cb) (proxy, OUT_arg0, OUT_arg1, error, data->userdata); + return; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_search_get_search_keys_async (DBusGProxy *proxy, tp_chan_type_search_get_search_keys_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetSearchKeys", tp_chan_type_search_get_search_keys_async_callback, stuff, g_free, G_TYPE_INVALID); +} + + + +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Search */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-type-streamed-media-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-type-streamed-media-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,110 @@ +/* tp-chan-type-streamed-media-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_StreamedMedia +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_StreamedMedia + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_streamed_media_list_streams (DBusGProxy *proxy, GPtrArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListStreams", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_streamed_media_list_streams_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_type_streamed_media_list_streams_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_type_streamed_media_list_streams_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_streamed_media_list_streams_async (DBusGProxy *proxy, tp_chan_type_streamed_media_list_streams_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListStreams", tp_chan_type_streamed_media_list_streams_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_streamed_media_request_streams (DBusGProxy *proxy, const guint IN_contact_handle, const GArray* IN_types, GArray** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestStreams", error, G_TYPE_UINT, IN_contact_handle, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_types, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_streamed_media_request_streams_reply) (DBusGProxy *proxy, GArray *OUT_arg2, GError *error, gpointer userdata); + +static void +tp_chan_type_streamed_media_request_streams_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg2, G_TYPE_INVALID); + (*(tp_chan_type_streamed_media_request_streams_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_streamed_media_request_streams_async (DBusGProxy *proxy, const guint IN_contact_handle, const GArray* IN_types, tp_chan_type_streamed_media_request_streams_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestStreams", tp_chan_type_streamed_media_request_streams_async_callback, stuff, g_free, G_TYPE_UINT, IN_contact_handle, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_types, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_StreamedMedia */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan-type-text-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan-type-text-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,189 @@ +/* tp-chan-type-text-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Text +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Text + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_text_acknowledge_pending_messages (DBusGProxy *proxy, const GArray* IN_ids, GError **error) + +{ + return dbus_g_proxy_call (proxy, "AcknowledgePendingMessages", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_ids, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_text_acknowledge_pending_messages_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_type_text_acknowledge_pending_messages_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_type_text_acknowledge_pending_messages_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_text_acknowledge_pending_messages_async (DBusGProxy *proxy, const GArray* IN_ids, tp_chan_type_text_acknowledge_pending_messages_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "AcknowledgePendingMessages", tp_chan_type_text_acknowledge_pending_messages_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_ids, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_text_get_message_types (DBusGProxy *proxy, GArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetMessageTypes", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_text_get_message_types_reply) (DBusGProxy *proxy, GArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_chan_type_text_get_message_types_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg0, G_TYPE_INVALID); + (*(tp_chan_type_text_get_message_types_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_text_get_message_types_async (DBusGProxy *proxy, tp_chan_type_text_get_message_types_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetMessageTypes", tp_chan_type_text_get_message_types_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_text_list_pending_messages (DBusGProxy *proxy, const gboolean IN_clear, GPtrArray** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListPendingMessages", error, G_TYPE_BOOLEAN, IN_clear, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID)), OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_text_list_pending_messages_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_chan_type_text_list_pending_messages_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID)), &OUT_arg1, G_TYPE_INVALID); + (*(tp_chan_type_text_list_pending_messages_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_text_list_pending_messages_async (DBusGProxy *proxy, const gboolean IN_clear, tp_chan_type_text_list_pending_messages_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListPendingMessages", tp_chan_type_text_list_pending_messages_async_callback, stuff, g_free, G_TYPE_BOOLEAN, IN_clear, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_chan_type_text_send (DBusGProxy *proxy, const guint IN_type, const char * IN_text, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Send", error, G_TYPE_UINT, IN_type, G_TYPE_STRING, IN_text, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_chan_type_text_send_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_chan_type_text_send_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_chan_type_text_send_reply)data->cb) (proxy, error, data->userdata); + return; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_chan_type_text_send_async (DBusGProxy *proxy, const guint IN_type, const char * IN_text, tp_chan_type_text_send_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + GError *error = NULL; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + //callback(proxy, error, userdata); + return dbus_g_proxy_begin_call (proxy, "Send", tp_chan_type_text_send_async_callback, stuff, g_free, G_TYPE_UINT, IN_type, G_TYPE_STRING, IN_text, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Channel_Type_Text */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-chan.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-chan.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,209 @@ +/* tp-chan.h + * + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef TP_CHAN_H +#define TP_CHAN_H + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +#include "tp-chan-gen.h" +#include "tp-interfaces.h" +#include "tp-chan-signals-marshal.h" +#include "tp-ifaces-signals-marshal.h" +#include "tp-chan-ifaces-signal-setters.h" + +#include +#include + + +#define TELEPATHY_CHAN_TYPE (tp_chan_get_type ()) + +#define TELEPATHY_CHAN(obj) (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), TELEPATHY_CHAN_TYPE, \ + TpChan)) + +#define TELEPATHY_CHAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \ + ((klass), TELEPATHY_CHAN_TYPE, \ + TpChanClass)) + +#define TELEPATHY_IS_CHAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), TELEPATHY_CHAN_TYPE)) + +#define TELEPATHY_IS_CHAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE \ + ((klass), TELEPATHY_CHAN_TYPE)) + +#define TELEPATHY_CHAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), TELEPATHY_CHAN_TYPE, \ + TpChanClass)) + +#define TELEPATHY_CHAN_IFACE_QUARK (tp_get_chan_interface()) +#define TELEPATHY_CHAN_IFACE_CONTACTLIST_QUARK (tp_get_chan_contactlist_interface()) +#define TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK (tp_get_chan_contactsearch_interface()) +#define TELEPATHY_CHAN_IFACE_STREAMED_QUARK (tp_get_chan_streamed_interface()) +#define TELEPATHY_CHAN_IFACE_ROOMLIST_QUARK (tp_get_chan_roomlist_interface()) +#define TELEPATHY_CHAN_IFACE_TEXT_QUARK (tp_get_chan_text_interface()) +#define TELEPATHY_CHAN_IFACE_DTMF_QUARK (tp_get_chan_dtmf_interface()) +#define TELEPATHY_CHAN_IFACE_GROUP_QUARK (tp_get_chan_group_interface()) +#define TELEPATHY_CHAN_IFACE_HOLD_QUARK (tp_get_chan_hold_interface()) +#define TELEPATHY_CHAN_IFACE_PASSWORD_QUARK (tp_get_chan_password_interface()) +#define TELEPATHY_CHAN_IFACE_TRANSFER_QUARK (tp_get_chan_transfer_interface()) + +/* The signal name for the synthesized Closed signal */ +#define TP_IFACE_CHAN_SIGNAL_CLOSED_SYNTHESIZED \ + "received::org-freedesktop-Telepathy-Channel-Closed" + +typedef struct _tp_chan TpChan; +typedef struct _tp_chanclass TpChanClass; + +struct _tp_chan +{ + DBusGProxy parent; + gchar *type; + guint handle_type; + guint handle; + GData *interface_list; + gboolean first_run; +}; + +struct _tp_chanclass +{ + DBusGProxyClass parent_class; + GData *iface_signal_sigs; +}; + +GType tp_chan_get_type(void); + +/* Actual function definitions */ + + +/* + * Creates a new channel object. + * + * @param connection: The D-BUS connection for this channel. + * @param bus_name: The D-BUS bus name for this channel. + * @param object_name: The name of the D-BUS path for this channel. + * @param type: The type string for this channel. + * @param handle_type: The type of this channel. + * @param handle: The handle of this channel, will be filled by this call. + * @return A new TpChan (channel) object, or NULL if unsuccesfull + */ +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +TpChan *tp_chan_new(DBusGConnection *connection, const gchar *bus_name, + const gchar *object_path, const gchar *type, + guint handle_type, guint handle); +#ifdef __cplusplus +} +#endif + + +/* Create and store the D-BUS proxy objects for the interfaces provided + * by this channel. Expects data provided by the GetInterfaces method. + * + * @param self: The channel object whose interfaces will be stored. + * @param interfaces: The array of strings containing the interface names + * + */ + + +void tp_chan_local_set_interfaces(TpChan *self, gchar **interfaces); + + +/* + * This function checks whether the channel has the specified + * interface and returns a proxy object that can be used to call + * its methods, if it exists. The supported interfaces are listed + * in the beginning of this header as macros. + * + * @param self The channel object that is queried for the interface + * proxy object + * @param iface_quark GQuark corresponding to the interface name + * string. + * @return A DBusGProxy object for the interface, or NULL if not found + */ +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +DBusGProxy *tp_chan_get_interface(TpChan *self, GQuark iface_quark); + +#ifdef __cplusplus +} +#endif + + +GQuark tp_get_chan_interface(void); +GQuark tp_get_chan_contactlist_interface(void); + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark tp_get_chan_contactsearch_interface(void); +#ifdef __cplusplus +} +#endif +GQuark tp_get_chan_streamed_interface(void); +GQuark tp_get_chan_roomlist_interface(void); + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark tp_get_chan_group_interface(void); +#ifdef __cplusplus +} +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark tp_get_chan_text_interface(void); +GQuark tp_get_chan_dtmf_interface(void); +GQuark tp_get_chan_hold_interface(void); +GQuark tp_get_chan_password_interface(void); +GQuark tp_get_chan_transfer_interface(void); +#ifdef __cplusplus +} +#endif +#endif + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,486 @@ +/* tp-conn-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_connect (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Connect", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_connect_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_connect_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_connect_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_connect_async (DBusGProxy *proxy, tp_conn_connect_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Connect", tp_conn_connect_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_disconnect (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_disconnect_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_disconnect_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_disconnect_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_disconnect_async (DBusGProxy *proxy, tp_conn_disconnect_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Disconnect", tp_conn_disconnect_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_get_interfaces (DBusGProxy *proxy, char *** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetInterfaces", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_get_interfaces_reply) (DBusGProxy *proxy, char * *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_get_interfaces_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_get_interfaces_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_get_interfaces_async (DBusGProxy *proxy, tp_conn_get_interfaces_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetInterfaces", tp_conn_get_interfaces_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_get_protocol (DBusGProxy *proxy, char ** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetProtocol", error, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_get_protocol_reply) (DBusGProxy *proxy, char * OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_get_protocol_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char * OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_get_protocol_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_get_protocol_async (DBusGProxy *proxy, tp_conn_get_protocol_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetProtocol", tp_conn_get_protocol_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_get_self_handle (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetSelfHandle", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_get_self_handle_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_get_self_handle_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_get_self_handle_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_get_self_handle_async (DBusGProxy *proxy, tp_conn_get_self_handle_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetSelfHandle", tp_conn_get_self_handle_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_get_status (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetStatus", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_get_status_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_get_status_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_get_status_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_get_status_async (DBusGProxy *proxy, tp_conn_get_status_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetStatus", tp_conn_get_status_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_hold_handles (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, GError **error) + +{ + return dbus_g_proxy_call (proxy, "HoldHandles", error, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_hold_handles_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_hold_handles_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_hold_handles_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_hold_handles_async (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, tp_conn_hold_handles_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "HoldHandles", tp_conn_hold_handles_async_callback, stuff, g_free, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_inspect_handles (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, char *** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "InspectHandles", error, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_conn_inspect_handles_reply) (DBusGProxy *proxy, char * *OUT_arg2, GError *error, gpointer userdata); + +static void +tp_conn_inspect_handles_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg2, G_TYPE_INVALID); + (*(tp_conn_inspect_handles_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_inspect_handles_async (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, tp_conn_inspect_handles_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "InspectHandles", tp_conn_inspect_handles_async_callback, stuff, g_free, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_list_channels (DBusGProxy *proxy, GPtrArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListChannels", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_list_channels_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_list_channels_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_list_channels_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_list_channels_async (DBusGProxy *proxy, tp_conn_list_channels_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListChannels", tp_conn_list_channels_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_release_handles (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ReleaseHandles", error, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_release_handles_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_release_handles_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_release_handles_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_release_handles_async (DBusGProxy *proxy, const guint IN_handle_type, const GArray* IN_handles, tp_conn_release_handles_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ReleaseHandles", tp_conn_release_handles_async_callback, stuff, g_free, G_TYPE_UINT, IN_handle_type, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_request_channel (DBusGProxy *proxy, const char * IN_type, const guint IN_handle_type, const guint IN_handle, const gboolean IN_suppress_handler, char** OUT_arg4, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestChannel", error, G_TYPE_STRING, IN_type, G_TYPE_UINT, IN_handle_type, G_TYPE_UINT, IN_handle, G_TYPE_BOOLEAN, IN_suppress_handler, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_arg4, G_TYPE_INVALID); +} + +typedef void (*tp_conn_request_channel_reply) (DBusGProxy *proxy, char *OUT_arg4, GError *error, gpointer userdata); + +static void +tp_conn_request_channel_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char* OUT_arg4; + dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_arg4, G_TYPE_INVALID); + (*(tp_conn_request_channel_reply)data->cb) (proxy, OUT_arg4, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_request_channel_async (DBusGProxy *proxy, const char * IN_type, const guint IN_handle_type, const guint IN_handle, const gboolean IN_suppress_handler, tp_conn_request_channel_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestChannel", tp_conn_request_channel_async_callback, stuff, g_free, G_TYPE_STRING, IN_type, G_TYPE_UINT, IN_handle_type, G_TYPE_UINT, IN_handle, G_TYPE_BOOLEAN, IN_suppress_handler, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_request_handles (DBusGProxy *proxy, const guint IN_handle_type, const char ** IN_names, GArray** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestHandles", error, G_TYPE_UINT, IN_handle_type, G_TYPE_STRV, IN_names, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_conn_request_handles_reply) (DBusGProxy *proxy, GArray *OUT_arg2, GError *error, gpointer userdata); + +static void +tp_conn_request_handles_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GArray* OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), &OUT_arg2, G_TYPE_INVALID); + (*(tp_conn_request_handles_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_request_handles_async (DBusGProxy *proxy, const guint IN_handle_type, const char ** IN_names, tp_conn_request_handles_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestHandles", tp_conn_request_handles_async_callback, stuff, g_free, G_TYPE_UINT, IN_handle_type, G_TYPE_STRV, IN_names, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-aliasing-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-aliasing-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,147 @@ +/* tp-conn-iface-aliasing-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Aliasing +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Aliasing + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_aliasing_get_alias_flags (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetAliasFlags", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_aliasing_get_alias_flags_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_aliasing_get_alias_flags_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_aliasing_get_alias_flags_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_aliasing_get_alias_flags_async (DBusGProxy *proxy, tp_conn_iface_aliasing_get_alias_flags_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetAliasFlags", tp_conn_iface_aliasing_get_alias_flags_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_aliasing_request_aliases (DBusGProxy *proxy, const GArray* IN_contacts, char *** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestAliases", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_aliasing_request_aliases_reply) (DBusGProxy *proxy, char * *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_conn_iface_aliasing_request_aliases_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg1, G_TYPE_INVALID); + (*(tp_conn_iface_aliasing_request_aliases_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_aliasing_request_aliases_async (DBusGProxy *proxy, const GArray* IN_contacts, tp_conn_iface_aliasing_request_aliases_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestAliases", tp_conn_iface_aliasing_request_aliases_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_aliasing_set_aliases (DBusGProxy *proxy, const GHashTable* IN_aliases, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetAliases", error, dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, G_TYPE_STRING), IN_aliases, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_aliasing_set_aliases_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_aliasing_set_aliases_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_aliasing_set_aliases_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_aliasing_set_aliases_async (DBusGProxy *proxy, const GHashTable* IN_aliases, tp_conn_iface_aliasing_set_aliases_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetAliases", tp_conn_iface_aliasing_set_aliases_async_callback, stuff, g_free, dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, G_TYPE_STRING), IN_aliases, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Aliasing */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-avatars-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-avatars-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,222 @@ +/* tp-conn-iface-avatars-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Avatars +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Avatars + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_avatars_get_avatar_requirements (DBusGProxy *proxy, char *** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetAvatarRequirements", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_avatars_get_avatar_requirements_reply) (DBusGProxy *proxy, char * *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_avatars_get_avatar_requirements_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + char ** OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_avatars_get_avatar_requirements_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_avatars_get_avatar_requirements_async (DBusGProxy *proxy, tp_conn_iface_avatars_get_avatar_requirements_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetAvatarRequirements", tp_conn_iface_avatars_get_avatar_requirements_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_avatars_get_known_avatar_tokens (DBusGProxy *proxy, const GArray* IN_contacts, GHashTable** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetKnownAvatarTokens", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, G_TYPE_STRING), OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_avatars_get_known_avatar_tokens_reply) (DBusGProxy *proxy, GHashTable *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_conn_iface_avatars_get_known_avatar_tokens_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + GHashTable* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, G_TYPE_STRING), &OUT_arg1, G_TYPE_INVALID); + (*(tp_conn_iface_avatars_get_known_avatar_tokens_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_avatars_get_known_avatar_tokens_async (DBusGProxy *proxy, const GArray* IN_contacts, tp_conn_iface_avatars_get_known_avatar_tokens_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetKnownAvatarTokens", tp_conn_iface_avatars_get_known_avatar_tokens_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_avatars_request_avatars (DBusGProxy *proxy, const GArray* IN_contact, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestAvatars", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contact, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_avatars_request_avatars_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_avatars_request_avatars_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_avatars_request_avatars_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_avatars_request_avatars_async (DBusGProxy *proxy, const GArray* IN_contact, tp_conn_iface_avatars_request_avatars_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestAvatars", tp_conn_iface_avatars_request_avatars_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contact, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_avatars_set_avatar (DBusGProxy *proxy, const GArray* IN_avatar, const char * IN_mime_type, char ** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetAvatar", error, dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR), IN_avatar, G_TYPE_STRING, IN_mime_type, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_avatars_set_avatar_reply) (DBusGProxy *proxy, char * OUT_arg2, GError *error, gpointer userdata); + +static void +tp_conn_iface_avatars_set_avatar_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + char * OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg2, G_TYPE_INVALID); + (*(tp_conn_iface_avatars_set_avatar_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_avatars_set_avatar_async (DBusGProxy *proxy, const GArray* IN_avatar, const char * IN_mime_type, tp_conn_iface_avatars_set_avatar_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetAvatar", tp_conn_iface_avatars_set_avatar_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR), IN_avatar, G_TYPE_STRING, IN_mime_type, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_avatars_clear_avatar (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ClearAvatar", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_avatars_clear_avatar_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_avatars_clear_avatar_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_avatars_clear_avatar_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_avatars_clear_avatar_async (DBusGProxy *proxy, tp_conn_iface_avatars_clear_avatar_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ClearAvatar", tp_conn_iface_avatars_clear_avatar_async_callback, stuff, g_free, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Avatars */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-capabilities-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-capabilities-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,110 @@ +/* tp-conn-iface-capabilities-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Capabilities +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Capabilities + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_capabilities_advertise_capabilities (DBusGProxy *proxy, const char ** IN_add, const char ** IN_remove, char *** OUT_arg2, GError **error) + +{ + return dbus_g_proxy_call (proxy, "AdvertiseCapabilities", error, G_TYPE_STRV, IN_add, G_TYPE_STRV, IN_remove, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg2, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_capabilities_advertise_capabilities_reply) (DBusGProxy *proxy, char * *OUT_arg2, GError *error, gpointer userdata); + +static void +tp_conn_iface_capabilities_advertise_capabilities_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg2; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg2, G_TYPE_INVALID); + (*(tp_conn_iface_capabilities_advertise_capabilities_reply)data->cb) (proxy, OUT_arg2, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_capabilities_advertise_capabilities_async (DBusGProxy *proxy, const char ** IN_add, const char ** IN_remove, tp_conn_iface_capabilities_advertise_capabilities_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "AdvertiseCapabilities", tp_conn_iface_capabilities_advertise_capabilities_async_callback, stuff, g_free, G_TYPE_STRV, IN_add, G_TYPE_STRV, IN_remove, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_capabilities_get_capabilities (DBusGProxy *proxy, const GArray* IN_handles, GPtrArray** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetCapabilities", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)), OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_capabilities_get_capabilities_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_conn_iface_capabilities_get_capabilities_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)), &OUT_arg1, G_TYPE_INVALID); + (*(tp_conn_iface_capabilities_get_capabilities_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_capabilities_get_capabilities_async (DBusGProxy *proxy, const GArray* IN_handles, tp_conn_iface_capabilities_get_capabilities_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetCapabilities", tp_conn_iface_capabilities_get_capabilities_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_handles, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Capabilities */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-contact-info-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-contact-info-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,71 @@ +/* tp-conn-iface-contact-info-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_ContactInfo +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_ContactInfo + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_contact_info_request_contact_info (DBusGProxy *proxy, const guint IN_contact, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestContactInfo", error, G_TYPE_UINT, IN_contact, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_contact_info_request_contact_info_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_contact_info_request_contact_info_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_contact_info_request_contact_info_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_contact_info_request_contact_info_async (DBusGProxy *proxy, const guint IN_contact, tp_conn_iface_contact_info_request_contact_info_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestContactInfo", tp_conn_iface_contact_info_request_contact_info_async_callback, stuff, g_free, G_TYPE_UINT, IN_contact, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_ContactInfo */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-forwarding-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-forwarding-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,109 @@ +/* tp-conn-iface-forwarding-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Forwarding +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Forwarding + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_forwarding_get_forwarding_handle (DBusGProxy *proxy, guint* OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetForwardingHandle", error, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_forwarding_get_forwarding_handle_reply) (DBusGProxy *proxy, guint OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_forwarding_get_forwarding_handle_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + guint OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_forwarding_get_forwarding_handle_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_forwarding_get_forwarding_handle_async (DBusGProxy *proxy, tp_conn_iface_forwarding_get_forwarding_handle_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetForwardingHandle", tp_conn_iface_forwarding_get_forwarding_handle_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_forwarding_set_forwarding_handle (DBusGProxy *proxy, const guint IN_forward_to, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetForwardingHandle", error, G_TYPE_UINT, IN_forward_to, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_forwarding_set_forwarding_handle_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_forwarding_set_forwarding_handle_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_forwarding_set_forwarding_handle_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_forwarding_set_forwarding_handle_async (DBusGProxy *proxy, const guint IN_forward_to, tp_conn_iface_forwarding_set_forwarding_handle_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetForwardingHandle", tp_conn_iface_forwarding_set_forwarding_handle_async_callback, stuff, g_free, G_TYPE_UINT, IN_forward_to, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Forwarding */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-presence-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-presence-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,294 @@ +/* tp-conn-iface-presence-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Presence +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Presence + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_add_status (DBusGProxy *proxy, const char * IN_status, const GHashTable* IN_parms, GError **error) + +{ + return dbus_g_proxy_call (proxy, "AddStatus", error, G_TYPE_STRING, IN_status, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_parms, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_add_status_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_add_status_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_add_status_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_add_status_async (DBusGProxy *proxy, const char * IN_status, const GHashTable* IN_parms, tp_conn_iface_presence_add_status_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "AddStatus", tp_conn_iface_presence_add_status_async_callback, stuff, g_free, G_TYPE_STRING, IN_status, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_parms, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_clear_status (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ClearStatus", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_clear_status_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_clear_status_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_clear_status_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_clear_status_async (DBusGProxy *proxy, tp_conn_iface_presence_clear_status_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ClearStatus", tp_conn_iface_presence_clear_status_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_get_statuses (DBusGProxy *proxy, GHashTable** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetStatuses", error, G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_get_statuses_reply) (DBusGProxy *proxy, GHashTable *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_get_statuses_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GHashTable* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_presence_get_statuses_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_get_statuses_async (DBusGProxy *proxy, tp_conn_iface_presence_get_statuses_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetStatuses", tp_conn_iface_presence_get_statuses_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_remove_status (DBusGProxy *proxy, const char * IN_status, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RemoveStatus", error, G_TYPE_STRING, IN_status, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_remove_status_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_remove_status_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_remove_status_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_remove_status_async (DBusGProxy *proxy, const char * IN_status, tp_conn_iface_presence_remove_status_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RemoveStatus", tp_conn_iface_presence_remove_status_async_callback, stuff, g_free, G_TYPE_STRING, IN_status, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_request_presence (DBusGProxy *proxy, const GArray* IN_contacts, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestPresence", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_request_presence_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_request_presence_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_request_presence_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_request_presence_async (DBusGProxy *proxy, const GArray* IN_contacts, tp_conn_iface_presence_request_presence_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestPresence", tp_conn_iface_presence_request_presence_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_contacts, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_set_last_activity_time (DBusGProxy *proxy, const guint IN_time, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetLastActivityTime", error, G_TYPE_UINT, IN_time, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_set_last_activity_time_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_set_last_activity_time_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_set_last_activity_time_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_set_last_activity_time_async (DBusGProxy *proxy, const guint IN_time, tp_conn_iface_presence_set_last_activity_time_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetLastActivityTime", tp_conn_iface_presence_set_last_activity_time_async_callback, stuff, g_free, G_TYPE_UINT, IN_time, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_presence_set_status (DBusGProxy *proxy, const GHashTable* IN_statuses, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetStatus", error, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)), IN_statuses, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_presence_set_status_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_presence_set_status_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_presence_set_status_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_presence_set_status_async (DBusGProxy *proxy, const GHashTable* IN_statuses, tp_conn_iface_presence_set_status_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetStatus", tp_conn_iface_presence_set_status_async_callback, stuff, g_free, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)), IN_statuses, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Presence */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-privacy-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-privacy-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,147 @@ +/* tp-conn-iface-privacy-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Privacy +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Privacy + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_privacy_get_privacy_mode (DBusGProxy *proxy, char ** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetPrivacyMode", error, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_privacy_get_privacy_mode_reply) (DBusGProxy *proxy, char * OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_privacy_get_privacy_mode_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char * OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_privacy_get_privacy_mode_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_privacy_get_privacy_mode_async (DBusGProxy *proxy, tp_conn_iface_privacy_get_privacy_mode_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetPrivacyMode", tp_conn_iface_privacy_get_privacy_mode_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_privacy_get_privacy_modes (DBusGProxy *proxy, char *** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetPrivacyModes", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_privacy_get_privacy_modes_reply) (DBusGProxy *proxy, char * *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_conn_iface_privacy_get_privacy_modes_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg0, G_TYPE_INVALID); + (*(tp_conn_iface_privacy_get_privacy_modes_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_privacy_get_privacy_modes_async (DBusGProxy *proxy, tp_conn_iface_privacy_get_privacy_modes_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetPrivacyModes", tp_conn_iface_privacy_get_privacy_modes_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_privacy_set_privacy_mode (DBusGProxy *proxy, const char * IN_mode, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetPrivacyMode", error, G_TYPE_STRING, IN_mode, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_privacy_set_privacy_mode_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_privacy_set_privacy_mode_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_privacy_set_privacy_mode_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_privacy_set_privacy_mode_async (DBusGProxy *proxy, const char * IN_mode, tp_conn_iface_privacy_set_privacy_mode_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetPrivacyMode", tp_conn_iface_privacy_set_privacy_mode_async_callback, stuff, g_free, G_TYPE_STRING, IN_mode, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Privacy */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-iface-renaming-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-iface-renaming-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,71 @@ +/* tp-conn-iface-renaming-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Renaming +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Renaming + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_conn_iface_renaming_request_rename (DBusGProxy *proxy, const char * IN_name, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestRename", error, G_TYPE_STRING, IN_name, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_conn_iface_renaming_request_rename_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_conn_iface_renaming_request_rename_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_conn_iface_renaming_request_rename_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_conn_iface_renaming_request_rename_async (DBusGProxy *proxy, const char * IN_name, tp_conn_iface_renaming_request_rename_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestRename", tp_conn_iface_renaming_request_rename_async_callback, stuff, g_free, G_TYPE_STRING, IN_name, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Connection_Interface_Renaming */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-ifaces-signal-setters.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-ifaces-signal-setters.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +/* tp-conn-ifaces-signal-setters.h + * + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef TP_CONN_IFACES_SETTERS_H +#define TP_CONN_IFACES_SETTERS_H + +#include + +/* This header file contains definitions for the signal signature setters + * for the various interfaces provided by Connections */ + +void tp_conn_set_aliasing_signatures(DBusGProxy *proxy); + +void tp_conn_set_capabilities_signatures(DBusGProxy *proxy); + +void tp_conn_set_contactinfo_signatures(DBusGProxy *proxy); + +void tp_conn_set_forwarding_signatures(DBusGProxy *proxy); + +void tp_conn_set_presence_signatures(DBusGProxy *proxy); + +void tp_conn_set_privacy_signatures(DBusGProxy *proxy); + +void tp_conn_set_renaming_signatures(DBusGProxy *proxy); + +void tp_conn_set_avatar_signatures(DBusGProxy *proxy); +#endif diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,50 @@ +/* + * tp-conn-signals-marshal.h - Header for Telepathy interface names + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __tp_conn_signals_marshal_MARSHAL_H__ +#define __tp_conn_signals_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:OBJECT,STRING,UINT,UINT,BOOLEAN (tp-conn-signals-marshal.list:1) */ +extern void tp_conn_signals_marshal_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT (tp-conn-signals-marshal.list:2) */ +extern void tp_conn_signals_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:BOXED (tp-conn-signals-marshal.list:3) */ +#define tp_conn_signals_marshal_VOID__BOXED g_cclosure_marshal_VOID__BOXED + +G_END_DECLS + +#endif /* __tp_conn_signals_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-conn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-conn.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,220 @@ +/* tp-conn.h + * + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +#ifndef TP_CONN_H +#define TP_CONN_H + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + +#include "tp-conn-gen.h" +#include "tp-conn-iface-forwarding-gen.h" +#include "tp-chan.h" +#include "tp-conn-signals-marshal.h" +#include "tp-ifaces-signals-marshal.h" +#include "tp-conn-ifaces-signal-setters.h" +#include "tp-interfaces.h" +#include "tp-constants.h" + +#include + +#define DBUS_TYPE_G_ARRAY_OF_STRUCTS dbus_g_type_get_collection ("GPtrArray", G_TYPE_VALUE_ARRAY); + +#define TELEPATHY_CONN_TYPE (tp_conn_get_type ()) + +#define TELEPATHY_CONN(obj) (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), TELEPATHY_CONN_TYPE, \ + TpConn)) + +#define TELEPATHY_CONN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \ + ((klass), TELEPATHY_CONN_TYPE, \ + TpConnClass)) + +#define TELEPATHY_IS_CONN(obj) (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), TELEPATHY_CONN_TYPE)) + +#define TELEPATHY_IS_CONN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE \ + ((klass), TELEPATHY_CONN_TYPE)) + +#define TELEPATHY_CONN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), TELEPATHY_CONN_TYPE, \ + TpConnClass)) + +#define TELEPATHY_CONN_IFACE_QUARK (tp_get_conn_interface()) +#define TELEPATHY_CONN_IFACE_ALIASING_QUARK (tp_get_conn_aliasing_interface()) +#define TELEPATHY_CONN_IFACE_CAPABILITIES_QUARK (tp_get_conn_capabilities_interface()) +#define TELEPATHY_CONN_IFACE_CONTACTINFO_QUARK (tp_get_conn_contactinfo_interface()) +#define TELEPATHY_CONN_IFACE_FORWARDING_QUARK (tp_get_conn_forwarding_interface()) +#define TELEPATHY_CONN_IFACE_PRESENCE_QUARK (tp_get_conn_presence_interface()) +#define TELEPATHY_CONN_IFACE_PRIVACY_QUARK (tp_get_conn_privacy_interface()) +#define TELEPATHY_CONN_IFACE_RENAMING_QUARK (tp_get_conn_renaming_interface()) +#define TELEPATHY_CONN_IFACE_AVATAR_QUARK (tp_get_conn_avatar_interface()) + + +/* The signal name for the synthesized StatusChanged signal */ +#define TP_IFACE_CONN_SIGNAL_STATUSCHANGED_SYNTHESIZED \ + "received::org-freedesktop-Telepathy-Connection-StatusChanged" + +typedef struct _tp_conn TpConn; +typedef struct _tp_connclass TpConnClass; + +struct _tp_conn +{ + DBusGProxy parent; + GData *interface_list; + gboolean first_run; +}; + + +struct _tp_connclass +{ + DBusGProxyClass parent_class; + GData *iface_signal_sigs; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GType tp_conn_get_type(void); +#ifdef __cplusplus +} +#endif + +/* Actual function definitions */ + +/* + * Create a new TpConn (Connection) object. + * + * @param connection The D-BUS connection + * @param name: The D-BUS service name for the connection object + * @param path_name: The D-BUS path name for the connection object + * @param interface_name: The D-BUS interface name for the connection object + * @return A new TpConn connection object, or NULL if unsuccesful. + */ + +TpConn *tp_conn_new(DBusGConnection *connection, + const char *bus_name, + const char *object_path); + +/* Create a TpChan channel object for this connection. Also initialises + * the proxy object that is used for the actual method calls. + * + * @param connection: The DBusGConnection for the channel + * @param tpconn: The Connection object for which the channel is done + * @param bus_name: The D-Bus interface name for the channel + * @param type: The channel type string + * @param handle_type: The type of the channel handle + * @param handle: The channel handle value is set and stored here after + * @param the call returns. + * @param supress_handler: if TRUE, indicates that no handler needs to be + * launched + * + * @return A new TpChan (channel) object + */ + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +TpChan *tp_conn_new_channel(DBusGConnection *connection, TpConn *tpconn, + const gchar *bus_name, + gchar *type, guint handle_type, + guint handle, gboolean supress_handler); +#ifdef __cplusplus +} +#endif + +/* Creates the proxy objects for the channel interfaces. GetInterfaces + * method should be called before this to acquire the interface name + * list. + * + * @param self: The connection object + * @param interfaces: An array of the interface name strings + */ + +void tp_conn_local_set_interfaces(TpConn *self, gchar **interfaces); + + +/* + * Provides access to the connection proxy object to use for actual + * method calls + * + * @param self: The connection object whose proxy should be retrieved + * @return The D-BUS proxy object + */ + +DBusGProxy *tp_conn_get_proxy(TpConn *self); + +/* + * This function checks whether the Connection has the specified + * interface and returns a proxy object that can be used to call + * its methods, if it exists. The supported interfaces are listed + * in the beginning of this header as macros. + * + * @param self The connection object that is queried for the + * interface proxy object + * @param iface_quark GQuark corresponding to the interface name + * string. + * @return A DBusGProxy object for the interface, or NULL if not found + */ +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +DBusGProxy *tp_conn_get_interface(TpConn *self, GQuark iface_quark); +#ifdef __cplusplus +} +#endif + +GQuark tp_get_conn_interface(void); +GQuark tp_get_conn_aliasing_interface(void); +GQuark tp_get_conn_capabilities_interface(void); +GQuark tp_get_conn_contactinfo_interface(void); +GQuark tp_get_conn_forwarding_interface(void); +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark tp_get_conn_presence_interface(void); +GQuark tp_get_conn_avatar_interface(void); +#ifdef __cplusplus +} +#endif +GQuark tp_get_conn_privacy_interface(void); +GQuark tp_get_conn_renaming_interface(void); + + + +#endif diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-connmgr-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-connmgr-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,153 @@ +/* tp-connmgr-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ConnectionManager +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ConnectionManager + +/* Vinod commented out +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_connmgr_get_parameters (DBusGProxy *proxy, const char * IN_proto, GPtrArray** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetParameters", error, G_TYPE_STRING, IN_proto, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID)), OUT_arg1, G_TYPE_INVALID); +} +*/ +typedef void (*tp_connmgr_get_parameters_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_connmgr_get_parameters_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID)), &OUT_arg1, G_TYPE_INVALID); + (*(tp_connmgr_get_parameters_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_connmgr_get_parameters_async (DBusGProxy *proxy, const char * IN_proto, tp_connmgr_get_parameters_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetParameters", tp_connmgr_get_parameters_async_callback, stuff, g_free, G_TYPE_STRING, IN_proto, G_TYPE_INVALID); +} + +/*MTa - commenting out for now +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_connmgr_list_protocols (DBusGProxy *proxy, char *** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListProtocols", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_arg0, G_TYPE_INVALID); +} +*/ + +typedef void (*tp_connmgr_list_protocols_reply) (DBusGProxy *proxy, char * *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_connmgr_list_protocols_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char ** OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_arg0, G_TYPE_INVALID); + (*(tp_connmgr_list_protocols_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_connmgr_list_protocols_async (DBusGProxy *proxy, tp_connmgr_list_protocols_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListProtocols", tp_connmgr_list_protocols_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_connmgr_request_connection (DBusGProxy *proxy, const char * IN_proto, const GHashTable* IN_parameters, char ** OUT_arg2, char** OUT_arg3, GError **error) + +{ + return dbus_g_proxy_call (proxy, "RequestConnection", error, G_TYPE_STRING, IN_proto, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_parameters, G_TYPE_INVALID, G_TYPE_STRING, OUT_arg2, DBUS_TYPE_G_OBJECT_PATH, OUT_arg3, G_TYPE_INVALID); +} + +typedef void (*tp_connmgr_request_connection_reply) (DBusGProxy *proxy, char * OUT_arg2, char *OUT_arg3, GError *error, gpointer userdata); + +static void +tp_connmgr_request_connection_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + char * OUT_arg2; + char* OUT_arg3; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_arg2, DBUS_TYPE_G_OBJECT_PATH, &OUT_arg3, G_TYPE_INVALID); + (*(tp_connmgr_request_connection_reply)data->cb) (proxy, OUT_arg2, OUT_arg3, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_connmgr_request_connection_async (DBusGProxy *proxy, const char * IN_proto, const GHashTable* IN_parameters, tp_connmgr_request_connection_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "RequestConnection", tp_connmgr_request_connection_async_callback, stuff, g_free, G_TYPE_STRING, IN_proto, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), IN_parameters, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_ConnectionManager */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-connmgr-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-connmgr-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,39 @@ +/* + * tp-connmgr-signals-marshal.h - Header for Telepathy interface names + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __tp_connmgr_signals_marshal_MARSHAL_H__ +#define __tp_connmgr_signals_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:STRING,OBJECT,STRING (tp-connmgr-signals-marshal.list:1) */ +extern void tp_connmgr_signals_marshal_VOID__STRING_OBJECT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __tp_connmgr_signals_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-connmgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-connmgr.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,167 @@ +/* tp-connmgr.h + * + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + + +#ifndef TP_CONNMGR_H +#define TP_CONNMGR_H + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + +#include "tp-connmgr-gen.h" +#include "tp-conn.h" +#include +#include +#include +#include + + + +#define TELEPATHY_CONNMGR_TYPE (tp_connmgr_get_type ()) + +#define TELEPATHY_CONNMGR(obj) (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), TELEPATHY_CONNMGR_TYPE, \ + TpConnMgr)) + +#define TELEPATHY_CONNMGR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \ + ((klass), TELEPATHY_CONNMGR_TYPE, \ + TpConnMgrClass)) + +#define TELEPATHY_IS_CONNMGR(obj) (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), TELEPATHY_CONNMGR_TYPE)) + +#define TELEPATHY_IS_CONNMGR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE \ + ((klass), TELEPATHY_CONNMGR_TYPE)) + +#define TELEPATHY_CONNMGR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), TELEPATHY_CONNMGR_TYPE, \ + TpConnMgrClass)) + +typedef struct _tp_connmgr TpConnMgr; +typedef struct _tp_connmgrclass TpConnMgrClass; + +struct _tp_connmgr +{ + DBusGProxy parent; + + gboolean first_run; +}; + +struct _tp_connmgrclass +{ + DBusGProxyClass parent_class; +}; + +GType tp_connmgr_get_type(void); + +/* Actual function definitions */ + + +/* +* Creates a new TpConnmgr (Connection Manager) object. +* @param connection: A connection to the D-BUS. +* @param name: The service name for the connection manager +* @param path_name: The path name for the connection manager +* @param interface_name: The interface name for the connection manager +* @return A new Connection Manager object, or NULL if failed +*/ + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +TpConnMgr *tp_connmgr_new(DBusGConnection *connection, + const char *bus_name, + const char *object_path, + const char *interface_name); + #ifdef __cplusplus +} +#endif + + + +/* + * Creates a new TpConn object for this connection manager. + * Also initializes a DBusGProxy object that is used to perform the + * actual method calls. Thus, the connection should be usable + * if this succeeds. + * + * @param self: The connection manager object that the new connection + * object is created for. + * @param connection_parameters: The parameters for the connection. + * @protocol: The protocol for the connection. + * + * @return A TpConn object, or NULL if object could not be created. + */ + + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +TpConn *tp_connmgr_new_connection(TpConnMgr *self, + GHashTable *connection_parameters, + gchar *protocol); +#ifdef __cplusplus +} +#endif + + + + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +gboolean tp_connmgr_list_protocols(TpConnMgr *self, char *** proto); +#ifdef __cplusplus +} +#endif + + + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +gboolean tp_connmgr_get_parameters (TpConnMgr *self, const char * IN_proto, GPtrArray** OUT_arg1); +#ifdef __cplusplus +} +#endif + + + + +#endif + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-constants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-constants.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,193 @@ +/* + * tp-constants.h - constants used in telepathy + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_CONSTANTS_H__ +#define __TELEPATHY_CONSTANTS_H__ + +#include +G_BEGIN_DECLS + +typedef enum { +TP_CONN_ALIAS_FLAG_USER_SET = 1, +LAST_TP_CONN_ALIAS_FLAG +} ConnectionAliasFlags; + +typedef enum { +TP_CONN_CAPABILITY_TYPE_CREATE = 0, +TP_CONN_CAPABILITY_TYPE_INVITE = 1, +LAST_TP_CONN_CAPABILITY_TYPE +} TelepathyConnectionCapabilityType; + +typedef enum { +TP_CONN_HANDLE_TYPE_NONE = 0, +TP_CONN_HANDLE_TYPE_CONTACT = 1, +TP_CONN_HANDLE_TYPE_ROOM = 2, +TP_CONN_HANDLE_TYPE_LIST = 3, +LAST_TP_CONN_HANDLE_TYPE +} TelepathyConnectionHandleType; + +typedef enum { +TP_CONN_PRESENCE_TYPE_UNSET = 0, +TP_CONN_PRESENCE_TYPE_OFFLINE = 1, +TP_CONN_PRESENCE_TYPE_AVAILABLE = 2, +TP_CONN_PRESENCE_TYPE_AWAY = 3, +TP_CONN_PRESENCE_TYPE_EXTENDED_AWAY = 4, +TP_CONN_PRESENCE_TYPE_HIDDEN = 5, +LAST_TP_CONN_PRESENCE_TYPE +} TelepathyConnectionPresenceType; + +typedef enum { +TP_CONN_STATUS_CONNECTED = 0, +TP_CONN_STATUS_CONNECTING = 1, +TP_CONN_STATUS_DISCONNECTED = 2, +LAST_TP_CONN_STATUS +} TelepathyConnectionStatus; + +typedef enum { +TP_CONN_STATUS_REASON_NONE_SPECIFIED = 0, +TP_CONN_STATUS_REASON_REQUESTED = 1, +TP_CONN_STATUS_REASON_NETWORK_ERROR = 2, +TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED = 3, +TP_CONN_STATUS_REASON_ENCRYPTION_ERROR = 4, +TP_CONN_STATUS_REASON_NAME_IN_USE = 5, +TP_CONN_STATUS_REASON_CERT_NOT_PROVIDED = 6, +TP_CONN_STATUS_REASON_CERT_UNTRUSTED = 7, +TP_CONN_STATUS_REASON_CERT_EXPIRED = 8, +TP_CONN_STATUS_REASON_CERT_NOT_ACTIVATED = 9, +TP_CONN_STATUS_REASON_CERT_HOSTNAME_MISMATCH = 10, +TP_CONN_STATUS_REASON_CERT_FINGERPRINT_MISMATCH = 11, +TP_CONN_STATUS_REASON_CERT_SELF_SIGNED = 12, +TP_CONN_STATUS_REASON_CERT_OTHER_ERROR = 13, +LAST_TP_CONN_STATUS_REASON +} TelepathyConnectionStatusReason; + +typedef enum { +TP_CHANNEL_CONTACT_SEARCH_STATE_BEFORE = 0, +TP_CHANNEL_CONTACT_SEARCH_STATE_DURING = 1, +TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER = 2, +LAST_TP_CHANNEL_CONTACT_SEARCH_STATE +} TelepathyChannelContactSearchState; + +typedef enum { +TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL = 0, +TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION = 1, +TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE = 2, +TP_CHANNEL_TEXT_MESSAGE_TYPE_AUTO_REPLY = 3, +LAST_TP_CHANNEL_TEXT_MESSAGE_TYPE +} TelepathyChannelTextMessageType; + +typedef enum { +TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN = 0, +TP_CHANNEL_TEXT_SEND_ERROR_OFFLINE = 1, +TP_CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT = 2, +TP_CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED = 3, +TP_CHANNEL_TEXT_SEND_ERROR_TOO_LONG = 4, +LAST_TP_CHANNEL_TEXT_SEND_ERROR +} TelepathyChannelTextSendError; + +typedef enum { +TP_CHANNEL_GROUP_FLAG_CAN_ADD = 1, +TP_CHANNEL_GROUP_FLAG_CAN_REMOVE = 2, +TP_CHANNEL_GROUP_FLAG_CAN_RESCIND = 4, +TP_CHANNEL_GROUP_FLAG_MESSAGE_ADD = 8, +TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE = 16, +TP_CHANNEL_GROUP_FLAG_MESSAGE_ACCEPT = 32, +TP_CHANNEL_GROUP_FLAG_MESSAGE_REJECT = 64, +TP_CHANNEL_GROUP_FLAG_MESSAGE_RESCIND = 128, +TP_CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES = 256, +LAST_TP_CHANNEL_GROUP_FLAG +} TelepathyChannelGroupFlags; + +typedef enum { +TP_CHANNEL_HOLD_STATE_NONE = 0, +TP_CHANNEL_HOLD_STATE_SEND_ONLY = 1, +TP_CHANNEL_HOLD_STATE_RECV_ONLY = 2, +TP_CHANNEL_HOLD_STATE_BOTH = 3, +LAST_TP_CHANNEL_HOLD_STATE +} TelepathyChannelHoldState; + +typedef enum { +TP_CHANNEL_PASSWORD_FLAG_REQUIRED = 1, +TP_CHANNEL_PASSWORD_FLAG_VISIBLE = 2, +TP_CHANNEL_PASSWORD_FLAG_MODIFIABLE = 4, +TP_CHANNEL_PASSWORD_FLAG_PROVIDE = 8, +LAST_TP_CHANNEL_PASSWORD_FLAG +} TelepathyChannelPasswordFlags; + +typedef enum { +TP_CHANNEL_SUBJECT_FLAG_PRESENT = 1, +TP_CHANNEL_SUBJECT_FLAG_MODIFIABLE = 2, +LAST_TP_CHANNEL_SUBJECT_FLAG +} TelepathyChannelSubjectFlags; + +typedef enum { +TP_MEDIA_STREAM_TYPE_AUDIO = 0, +TP_MEDIA_STREAM_TYPE_VIDEO = 1, +LAST_TP_MEDIA_STREAM_TYPE +} TelepathyMediaStreamType; + +typedef enum { +TP_MEDIA_STREAM_DIRECTION_NONE = 0, +TP_MEDIA_STREAM_DIRECTION_SEND = 1, +TP_MEDIA_STREAM_DIRECTION_RECIEVE = 2, +TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL = 3, +LAST_TP_MEDIA_STREAM_DIRECTION +} TelepathyMediaStreamDirection; + +typedef enum { +TP_MEDIA_STREAM_ERROR_UNKNOWN = 0, +TP_MEDIA_STREAM_ERROR_EOS = 1, +LAST_TP_MEDIA_STREAM_ERROR +} TelepathyMediaStreamError; + +typedef enum { +TP_MEDIA_STREAM_PROTO_UDP = 0, +TP_MEDIA_STREAM_PROTO_TCP = 1, +LAST_TP_MEDIA_STREAM_PROTO +} TelepathyMediaStreamProto; + +typedef enum { +TP_MEDIA_STREAM_TRANSPORT_TYPE_LOCAL = 0, +TP_MEDIA_STREAM_TRANSPORT_TYPE_DERIVED = 1, +TP_MEDIA_STREAM_TRANSPORT_TYPE_RELAY = 2, +LAST_TP_MEDIA_STREAM_TRANSPORT_TYPE +} TelepathyMediaStreamTransportType; + +typedef enum { +TP_CODEC_MEDIA_TYPE_AUDIO = 0, +TP_CODEC_MEDIA_TYPE_VIDEO = 1, +} TelepathyCodecMediaType; + +typedef enum { +TP_MEDIA_STREAM_STATE_STOPPED = 0, +TP_MEDIA_STREAM_STATE_PLAYING = 1, +TP_MEDIA_STREAM_STATE_CONNECTING = 2, +TP_MEDIA_STREAM_STATE_CONNECTED = 3 +} TelepathyMediaStreamState; + +typedef enum { +TP_PROPERTY_FLAG_READ = 1, +TP_PROPERTY_FLAG_WRITE = 2 +} TelepathyPropertyFlags; + +G_END_DECLS + + +#endif diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-helpers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-helpers.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,82 @@ +/* + * tp-helpers.h - Header for various helper functions + * for telepathy implementation + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_HELPERS_H__ +#define __TELEPATHY_HELPERS_H__ + +#include + +G_BEGIN_DECLS + +typedef struct +{ + gpointer key; + gpointer value; +} TpKeyValue; + +DBusGConnection * tp_get_bus (); +DBusGProxy * tp_get_bus_proxy (); +GSList *tp_hash_to_key_value_list(GHashTable *hashtable); +void tp_key_value_list_free(GSList *list); + + +typedef struct _tp_connmgr_info TpConnMgrInfo; +typedef struct _tp_connmgr_protocol_info TpConnMgrProtInfo; + +struct _tp_connmgr_protocol_info +{ + gchar **mandatory_params; + gchar **optional_params; + + /* defaul value hash */ + GHashTable *default_params; +}; + +struct _tp_connmgr_info +{ + gchar *name; + gchar *bus_name; + gchar *object_path; + gchar **protocols; + + /* hash of protocol infos */ + GHashTable *protocol_info; +}; + +/* + * Lists all the connection manager files. + * @return A list of connection manager names + */ +GSList *tp_connmgr_list_cms(void); + +/* + * Returns the connection manager information for the given connection manager + * @param cm: the connection manager name string + * @return A struct containing all the information read from the connection + * manager file. + */ +TpConnMgrInfo *tp_connmgr_get_info(gchar *cm); + + +G_END_DECLS + +#endif /* __TELEPATHY_HELPERS_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-ice-session-handler-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-ice-session-handler-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,108 @@ +/* tp-ice-session-handler-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_SessionHandler +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_SessionHandler + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_session_handler_error (DBusGProxy *proxy, const guint IN_errno, const char * IN_message, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Error", error, G_TYPE_UINT, IN_errno, G_TYPE_STRING, IN_message, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_session_handler_error_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_session_handler_error_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_session_handler_error_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_session_handler_error_async (DBusGProxy *proxy, const guint IN_errno, const char * IN_message, tp_ice_session_handler_error_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Error", tp_ice_session_handler_error_async_callback, stuff, g_free, G_TYPE_UINT, IN_errno, G_TYPE_STRING, IN_message, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_session_handler_ready (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Ready", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_session_handler_ready_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_session_handler_ready_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_session_handler_ready_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_session_handler_ready_async (DBusGProxy *proxy, tp_ice_session_handler_ready_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Ready", tp_ice_session_handler_ready_async_callback, stuff, g_free, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_SessionHandler */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-ice-stream-handler-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-ice-stream-handler-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,330 @@ +/* tp-ice-stream-handler-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_StreamHandler +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_StreamHandler + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_codec_choice (DBusGProxy *proxy, const guint IN_codec_id, GError **error) + +{ + return dbus_g_proxy_call (proxy, "CodecChoice", error, G_TYPE_UINT, IN_codec_id, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_codec_choice_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_codec_choice_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_codec_choice_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_codec_choice_async (DBusGProxy *proxy, const guint IN_codec_id, tp_ice_stream_handler_codec_choice_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "CodecChoice", tp_ice_stream_handler_codec_choice_async_callback, stuff, g_free, G_TYPE_UINT, IN_codec_id, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_error (DBusGProxy *proxy, const guint IN_errno, const char * IN_message, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Error", error, G_TYPE_UINT, IN_errno, G_TYPE_STRING, IN_message, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_error_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_error_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_error_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_error_async (DBusGProxy *proxy, const guint IN_errno, const char * IN_message, tp_ice_stream_handler_error_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Error", tp_ice_stream_handler_error_async_callback, stuff, g_free, G_TYPE_UINT, IN_errno, G_TYPE_STRING, IN_message, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_native_candidates_prepared (DBusGProxy *proxy, GError **error) + +{ + return dbus_g_proxy_call (proxy, "NativeCandidatesPrepared", error, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_native_candidates_prepared_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_native_candidates_prepared_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_native_candidates_prepared_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_native_candidates_prepared_async (DBusGProxy *proxy, tp_ice_stream_handler_native_candidates_prepared_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "NativeCandidatesPrepared", tp_ice_stream_handler_native_candidates_prepared_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_new_active_candidate_pair (DBusGProxy *proxy, const char * IN_native_candidate_id, const char * IN_remote_candidate_id, GError **error) + +{ + return dbus_g_proxy_call (proxy, "NewActiveCandidatePair", error, G_TYPE_STRING, IN_native_candidate_id, G_TYPE_STRING, IN_remote_candidate_id, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_new_active_candidate_pair_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_new_active_candidate_pair_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_new_active_candidate_pair_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_new_active_candidate_pair_async (DBusGProxy *proxy, const char * IN_native_candidate_id, const char * IN_remote_candidate_id, tp_ice_stream_handler_new_active_candidate_pair_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "NewActiveCandidatePair", tp_ice_stream_handler_new_active_candidate_pair_async_callback, stuff, g_free, G_TYPE_STRING, IN_native_candidate_id, G_TYPE_STRING, IN_remote_candidate_id, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_new_native_candidate (DBusGProxy *proxy, const char * IN_candidate_id, const GPtrArray* IN_transports, GError **error) + +{ + return dbus_g_proxy_call (proxy, "NewNativeCandidate", error, G_TYPE_STRING, IN_candidate_id, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)), IN_transports, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_new_native_candidate_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_new_native_candidate_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_new_native_candidate_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_new_native_candidate_async (DBusGProxy *proxy, const char * IN_candidate_id, const GPtrArray* IN_transports, tp_ice_stream_handler_new_native_candidate_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "NewNativeCandidate", tp_ice_stream_handler_new_native_candidate_async_callback, stuff, g_free, G_TYPE_STRING, IN_candidate_id, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)), IN_transports, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_ready (DBusGProxy *proxy, const GPtrArray* IN_codecs, GError **error) + +{ + return dbus_g_proxy_call (proxy, "Ready", error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), IN_codecs, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_ready_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_ready_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_ready_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_ready_async (DBusGProxy *proxy, const GPtrArray* IN_codecs, tp_ice_stream_handler_ready_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "Ready", tp_ice_stream_handler_ready_async_callback, stuff, g_free, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), IN_codecs, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_stream_state (DBusGProxy *proxy, const guint IN_state, GError **error) + +{ + return dbus_g_proxy_call (proxy, "StreamState", error, G_TYPE_UINT, IN_state, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_stream_state_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_stream_state_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_stream_state_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_stream_state_async (DBusGProxy *proxy, const guint IN_state, tp_ice_stream_handler_stream_state_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "StreamState", tp_ice_stream_handler_stream_state_async_callback, stuff, g_free, G_TYPE_UINT, IN_state, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_ice_stream_handler_supported_codecs (DBusGProxy *proxy, const GPtrArray* IN_codecs, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SupportedCodecs", error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), IN_codecs, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_ice_stream_handler_supported_codecs_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_ice_stream_handler_supported_codecs_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_ice_stream_handler_supported_codecs_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_ice_stream_handler_supported_codecs_async (DBusGProxy *proxy, const GPtrArray* IN_codecs, tp_ice_stream_handler_supported_codecs_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SupportedCodecs", tp_ice_stream_handler_supported_codecs_async_callback, stuff, g_free, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING), G_TYPE_INVALID)), IN_codecs, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Ice_StreamHandler */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-ifaces-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-ifaces-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,142 @@ +/* + * tp-ifaces-signals-marshal.h - Header for Telepathy interface names + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __tp_ifaces_signals_marshal_MARSHAL_H__ +#define __tp_ifaces_signals_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,STRING (tp-ifaces-signals-marshal.list:3) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,BOXED,BOXED (tp-ifaces-signals-marshal.list:5) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_BOXED_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING (tp-ifaces-signals-marshal.list:7) */ +#define tp_ifaces_signals_marshal_VOID__STRING g_cclosure_marshal_VOID__STRING + +/* VOID:INT,BOXED (tp-ifaces-signals-marshal.list:11) */ +extern void tp_ifaces_signals_marshal_VOID__INT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + + +/* VOID:STRING,BOXED */ +//Added for search +extern void +tp_ifaces_signals_marshal_VOID__UINT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT (tp-ifaces-signals-marshal.list:13) */ +#define tp_ifaces_signals_marshal_VOID__UINT g_cclosure_marshal_VOID__UINT + +/* VOID:UINT,STRING,STRING (tp-ifaces-signals-marshal.list:15) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT,UINT (tp-ifaces-signals-marshal.list:17) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:BOOLEAN (tp-ifaces-signals-marshal.list:19) */ +#define tp_ifaces_signals_marshal_VOID__BOOLEAN g_cclosure_marshal_VOID__BOOLEAN + +/* VOID:UINT,UINT,UINT,UINT,UINT,STRING (tp-ifaces-signals-marshal.list:21) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT,STRING (tp-ifaces-signals-marshal.list:23) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT (tp-ifaces-signals-marshal.list:27) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING,BOXED,BOXED,BOXED,BOXED,UINT,UINT (tp-ifaces-signals-marshal.list:29) */ +extern void tp_ifaces_signals_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:BOXED (tp-ifaces-signals-marshal.list:33) */ +#define tp_ifaces_signals_marshal_VOID__BOXED g_cclosure_marshal_VOID__BOXED + +/* VOID:UINT,UINT,UINT,STRING (tp-ifaces-signals-marshal.list:35) */ +extern void tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:OBJECT,STRING (tp-ifaces-signals-marshal.list:37) */ +extern void tp_ifaces_signals_marshal_VOID__OBJECT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __tp_ifaces_signals_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-interfaces.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-interfaces.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,83 @@ +/* + * tp-interfaces.h - Header for Telepathy interface names + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_INTERFACES_H__ +#define __TELEPATHY_INTERFACES_H__ + +#include + +G_BEGIN_DECLS + +#define TP_IFACE_CHANNEL_INTERFACE \ + "org.freedesktop.Telepathy.Channel" +#define TP_IFACE_CHANNEL_INTERFACE_DTMF \ + "org.freedesktop.Telepathy.Channel.Interface.DTMF" +#define TP_IFACE_CHANNEL_INTERFACE_GROUP \ + "org.freedesktop.Telepathy.Channel.Interface.Group" +#define TP_IFACE_CHANNEL_INTERFACE_HOLD \ + "org.freedesktop.Telepathy.Channel.Interface.Hold" +#define TP_IFACE_CHANNEL_INTERFACE_PASSWORD \ + "org.freedesktop.Telepathy.Channel.Interface.Password" +#define TP_IFACE_CHANNEL_INTERFACE_SUBJECT \ + "org.freedesktop.Telepathy.Channel.Interface.Subject" +#define TP_IFACE_CHANNEL_INTERFACE_TRANSFER \ + "org.freedesktop.Telepathy.Channel.Interface.Transfer" +#define TP_IFACE_CHANNEL_TYPE_CONTACT_LIST \ + "org.freedesktop.Telepathy.Channel.Type.ContactList" + +#define TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH \ + "org.freedesktop.Telepathy.Channel.Type.ContactSearch" + +#define TP_IFACE_CHANNEL_TYPE_ROOM_LIST \ + "org.freedesktop.Telepathy.Channel.Type.RoomList" +#define TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA \ + "org.freedesktop.Telepathy.Channel.Type.StreamedMedia" +#define TP_IFACE_CHANNEL_TYPE_TEXT \ + "org.freedesktop.Telepathy.Channel.Type.Text" +#define TP_IFACE_CONN_INTERFACE \ + "org.freedesktop.Telepathy.Connection" +#define TP_IFACE_CONN_INTERFACE_ALIASING \ + "org.freedesktop.Telepathy.Connection.Interface.Aliasing" +#define TP_IFACE_CONN_INTERFACE_CAPABILITIES \ + "org.freedesktop.Telepathy.Connection.Interface.Capabilities" +#define TP_IFACE_CONN_INTERFACE_CONTACT_INFO \ + "org.freedesktop.Telepathy.Connection.Interface.ContactInfo" +#define TP_IFACE_CONN_INTERFACE_FORWARDING \ + "org.freedesktop.Telepathy.Connection.Interface.Forwarding" +#define TP_IFACE_CONN_INTERFACE_PRESENCE \ + "org.freedesktop.Telepathy.Connection.Interface.Presence" +#define TP_IFACE_CONN_INTERFACE_PRIVACY \ + "org.freedesktop.Telepathy.Connection.Interface.Privacy" +#define TP_IFACE_CONN_INTERFACE_AVATAR \ + "org.freedesktop.Telepathy.Connection.Interface.Avatars" +#define TP_IFACE_CONN_INTERFACE_RENAMING \ + "org.freedesktop.Telepathy.Connection.Interface.Renaming" +#define TP_IFACE_CONN_MGR_INTERFACE \ + "org.freedesktop.Telepathy.ConnectionManager" +#define TP_IFACE_MEDIA_SESSION_HANDLER \ + "org.freedesktop.Telepathy.Media.SessionHandler" +#define TP_IFACE_MEDIA_STREAM_HANDLER \ + "org.freedesktop.Telepathy.Media.StreamHandler" +#define TP_IFACE_PROPERTIES \ + "org.freedesktop.Telepathy.Properties" + +G_END_DECLS + +#endif /* #ifndef __TELEPATHY_INTERFACES_H__*/ diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-props-iface-gen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-props-iface-gen.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,147 @@ +/* tp-props-iface-gen.h + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + +#include +#include +#include + +G_BEGIN_DECLS + +#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Properties +#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Properties + +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_props_iface_get_properties (DBusGProxy *proxy, const GArray* IN_properties, GPtrArray** OUT_arg1, GError **error) + +{ + return dbus_g_proxy_call (proxy, "GetProperties", error, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_properties, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_VALUE, G_TYPE_INVALID)), OUT_arg1, G_TYPE_INVALID); +} + +typedef void (*tp_props_iface_get_properties_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg1, GError *error, gpointer userdata); + +static void +tp_props_iface_get_properties_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg1; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_VALUE, G_TYPE_INVALID)), &OUT_arg1, G_TYPE_INVALID); + (*(tp_props_iface_get_properties_reply)data->cb) (proxy, OUT_arg1, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_props_iface_get_properties_async (DBusGProxy *proxy, const GArray* IN_properties, tp_props_iface_get_properties_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "GetProperties", tp_props_iface_get_properties_async_callback, stuff, g_free, dbus_g_type_get_collection ("GArray", G_TYPE_UINT), IN_properties, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_props_iface_list_properties (DBusGProxy *proxy, GPtrArray** OUT_arg0, GError **error) + +{ + return dbus_g_proxy_call (proxy, "ListProperties", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)), OUT_arg0, G_TYPE_INVALID); +} + +typedef void (*tp_props_iface_list_properties_reply) (DBusGProxy *proxy, GPtrArray *OUT_arg0, GError *error, gpointer userdata); + +static void +tp_props_iface_list_properties_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + GPtrArray* OUT_arg0; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)), &OUT_arg0, G_TYPE_INVALID); + (*(tp_props_iface_list_properties_reply)data->cb) (proxy, OUT_arg0, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_props_iface_list_properties_async (DBusGProxy *proxy, tp_props_iface_list_properties_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "ListProperties", tp_props_iface_list_properties_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +tp_props_iface_set_properties (DBusGProxy *proxy, const GPtrArray* IN_properties, GError **error) + +{ + return dbus_g_proxy_call (proxy, "SetProperties", error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_VALUE, G_TYPE_INVALID)), IN_properties, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*tp_props_iface_set_properties_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +tp_props_iface_set_properties_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*)user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(tp_props_iface_set_properties_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +tp_props_iface_set_properties_async (DBusGProxy *proxy, const GPtrArray* IN_properties, tp_props_iface_set_properties_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "SetProperties", tp_props_iface_set_properties_async_callback, stuff, g_free, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_VALUE, G_TYPE_INVALID)), IN_properties, G_TYPE_INVALID); +} +#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Telepathy_Properties */ + +G_END_DECLS diff -r 000000000000 -r d0f3a028347a libtelepathy/inc/tp-props-iface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/inc/tp-props-iface.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,121 @@ +/* tp-props-iface.h + * + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef TP_PROPS_IFACE_H +#define TP_PROPS_IFACE_H + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + +#include + +#include "tp-constants.h" +#include "tp-props-iface-gen.h" + +#define TELEPATHY_PROPS_IFACE_QUARK (tp_get_props_interface()) + +typedef struct _TpPropsIface TpPropsIface; +typedef struct _TpPropsIfaceClass TpPropsIfaceClass; + +struct _TpPropsIface +{ + DBusGProxy parent; + gpointer priv; +}; + +struct _TpPropsIfaceClass +{ + DBusGProxyClass parent_class; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GType tp_props_iface_get_type (void); +#ifdef __cplusplus +} +#endif + +#define TELEPATHY_PROPS_IFACE_TYPE (tp_props_iface_get_type ()) + +#define TELEPATHY_PROPS_IFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), TELEPATHY_PROPS_IFACE_TYPE, \ + TpPropsIface)) + +#define TELEPATHY_PROPS_IFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \ + ((klass), TELEPATHY_PROPS_IFACE_TYPE, \ + TpPropsIfaceClass)) + +#define TELEPATHY_IS_PROPS_IFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), TELEPATHY_PROPS_IFACE_TYPE)) + +#define TELEPATHY_IS_PROPS_IFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE \ + ((klass), TELEPATHY_PROPS_IFACE_TYPE)) + +#define TELEPATHY_PROPS_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), TELEPATHY_PROPS_IFACE_TYPE, \ + TpPropsIfaceClass)) + +/** + * TpPropsChangedFlags: + * @TP_PROPS_CHANGED_VALUE: The value of the property changed. + * @TP_PROPS_CHANGED_FLAGS: The flags of the property changed. + */ +typedef enum +{ + TP_PROPS_CHANGED_VALUE = 0x01, + TP_PROPS_CHANGED_FLAGS = 0x02 +} TpPropsChanged; + +TpPropsIface * tp_props_iface_new (DBusGConnection *connection, + const char *name, + const char *path_name); + +void tp_props_iface_set_mapping (TpPropsIface *iface, + const gchar *first_name, ...); +gboolean tp_props_iface_get_value (TpPropsIface* iface, guint prop_id, + GValue *return_value); + +gboolean tp_props_iface_set_value (TpPropsIface* iface, guint prop_id, + const GValue *value); + +TelepathyPropertyFlags tp_props_iface_property_flags (TpPropsIface* iface, guint prop_id); + +#ifdef __cplusplus +extern "C" +{ +#endif +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark tp_get_props_interface(void); +#ifdef __cplusplus +} +#endif + +void tp_props_interface_set_signatures (DBusGProxy *proxy); +#endif diff -r 000000000000 -r d0f3a028347a libtelepathy/rom/libtelepathy.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/rom/libtelepathy.iby Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,34 @@ + +/* libtelepathy.iby + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __LIBTELEPATHY_IBY__ +#define __LIBTELEPATHY_IBY__ + + +//Telepathy DLLs +file=ABI_DIR\BUILD_DIR\libtelepathy.dll SHARED_LIB_DIR\libtelepathy.dll + +// mecostub SIS, provides support for SIS upgrading +//data=DATAZ_\system\install\meco_stub.sis system\install\meco_stub.sis + +#endif + + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/Makefile.am Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,100 @@ +# Move this back to GENHEADERS once dbus-binding-tool supports 'g' type +# tp-chan-type-contact-search-gen.h + +GENHEADERS = \ + tp-connmgr-gen.h \ + tp-conn-gen.h \ + tp-chan-gen.h \ + tp-conn-iface-avatars-gen.h \ + tp-chan-iface-dtmf-gen.h \ + tp-chan-iface-group-gen.h \ + tp-chan-iface-hold-gen.h \ + tp-chan-iface-password-gen.h \ + tp-chan-iface-transfer-gen.h \ + tp-chan-iface-ice-signalling-gen.h \ + tp-chan-type-contact-list-gen.h \ + tp-chan-type-room-list-gen.h \ + tp-chan-type-streamed-media-gen.h \ + tp-chan-type-text-gen.h \ + tp-conn-iface-aliasing-gen.h \ + tp-conn-iface-capabilities-gen.h \ + tp-conn-iface-contact-info-gen.h \ + tp-conn-iface-forwarding-gen.h \ + tp-conn-iface-presence-gen.h \ + tp-conn-iface-privacy-gen.h \ + tp-conn-iface-renaming-gen.h \ + tp-props-iface-gen.h \ + tp-ch-gen.h \ + tp-ice-session-handler-gen.h \ + tp-ice-stream-handler-gen.h \ + tp-ifaces-signals-marshal.h \ + tp-chan-signals-marshal.h \ + tp-conn-signals-marshal.h \ + tp-connmgr-signals-marshal.h + +MARSHALLER_SOURCES = \ + tp-ifaces-signals-marshal.c \ + tp-chan-signals-marshal.c \ + tp-conn-signals-marshal.c \ + tp-connmgr-signals-marshal.c + + +BUILT_SOURCES = \ + $(GENHEADERS) \ + $(MARSHALLER_SOURCES) + + +# Correctly clean the generated headers, but keep the xml description +CLEANFILES = $(BUILT_SOURCES) +#Rule to generate the binding headers +%-gen.h: $(top_builddir)/xml/%.xml Makefile.am + dbus-binding-tool --prefix=$* --mode=glib-client $< > $*-gen.h + +# Create the necessary marshallers for the signals implemented by the +# library + +%-marshal.h: %-marshal.list Makefile.am + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.h + +%-marshal.c: %-marshal.list Makefile.am + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.c + +lib_LTLIBRARIES = libtelepathy.la + +libtelepathy_la_CFLAGS = $(DBUS_CFLAGS) $(ERROR_CFLAGS) $(GLIB_CFLAGS) +libtelepathy_la_LIBADD = $(DBUS_LIBS) $(GLIB_LIBS) +libtelepathy_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-symbols-regex '^tp_' \ + -export-dynamic + +CORESOURCES = \ + tp-chan.c \ + tp-conn.c \ + tp-connmgr.c \ + tp-helpers.c \ + tp-props-iface.c + +COREHEADERS = \ + tp-chan-ifaces-signal-setters.h \ + tp-conn-ifaces-signal-setters.h \ + tp-chan.h \ + tp-conn.h \ + tp-connmgr.h \ + tp-constants.h \ + tp-helpers.h \ + tp-interfaces.h \ + tp-props-iface.h + +libtelepathy_la_SOURCES = \ + tp-chan-ifaces-signal-setters.c \ + tp-conn-ifaces-signal-setters.c \ + $(MARSHALLER_SOURCES) \ + $(CORESOURCES) \ + $(COREHEADERS) + +telepathyincdir=$(includedir)/telepathy-1.0/libtelepathy + +telepathyinc_HEADERS = \ + $(COREHEADERS) \ + $(GENHEADERS) diff -r 000000000000 -r d0f3a028347a libtelepathy/src/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/Makefile.in Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,695 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Move this back to GENHEADERS once dbus-binding-tool supports 'g' type +# tp-chan-type-contact-search-gen.h + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(telepathyinc_HEADERS) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(telepathyincdir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libtelepathy_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__objects_1 = libtelepathy_la-tp-ifaces-signals-marshal.lo \ + libtelepathy_la-tp-chan-signals-marshal.lo \ + libtelepathy_la-tp-conn-signals-marshal.lo \ + libtelepathy_la-tp-connmgr-signals-marshal.lo +am__objects_2 = libtelepathy_la-tp-chan.lo libtelepathy_la-tp-conn.lo \ + libtelepathy_la-tp-connmgr.lo libtelepathy_la-tp-helpers.lo \ + libtelepathy_la-tp-props-iface.lo +am__objects_3 = +am_libtelepathy_la_OBJECTS = \ + libtelepathy_la-tp-chan-ifaces-signal-setters.lo \ + libtelepathy_la-tp-conn-ifaces-signal-setters.lo \ + $(am__objects_1) $(am__objects_2) $(am__objects_3) +libtelepathy_la_OBJECTS = $(am_libtelepathy_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libtelepathy_la_SOURCES) +DIST_SOURCES = $(libtelepathy_la_SOURCES) +telepathyincHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(telepathyinc_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTELEPATHY_BINARY_AGE = @LIBTELEPATHY_BINARY_AGE@ +LIBTELEPATHY_INTERFACE_AGE = @LIBTELEPATHY_INTERFACE_AGE@ +LIBTELEPATHY_MAJORMINOR = @LIBTELEPATHY_MAJORMINOR@ +LIBTELEPATHY_MAJOR_VERSION = @LIBTELEPATHY_MAJOR_VERSION@ +LIBTELEPATHY_MICRO_VERSION = @LIBTELEPATHY_MICRO_VERSION@ +LIBTELEPATHY_MINOR_VERSION = @LIBTELEPATHY_MINOR_VERSION@ +LIBTELEPATHY_VERSION = @LIBTELEPATHY_VERSION@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +GENHEADERS = \ + tp-connmgr-gen.h \ + tp-conn-gen.h \ + tp-chan-gen.h \ + tp-conn-iface-avatars-gen.h \ + tp-chan-iface-dtmf-gen.h \ + tp-chan-iface-group-gen.h \ + tp-chan-iface-hold-gen.h \ + tp-chan-iface-password-gen.h \ + tp-chan-iface-transfer-gen.h \ + tp-chan-iface-ice-signalling-gen.h \ + tp-chan-type-contact-list-gen.h \ + tp-chan-type-room-list-gen.h \ + tp-chan-type-streamed-media-gen.h \ + tp-chan-type-text-gen.h \ + tp-conn-iface-aliasing-gen.h \ + tp-conn-iface-capabilities-gen.h \ + tp-conn-iface-contact-info-gen.h \ + tp-conn-iface-forwarding-gen.h \ + tp-conn-iface-presence-gen.h \ + tp-conn-iface-privacy-gen.h \ + tp-conn-iface-renaming-gen.h \ + tp-props-iface-gen.h \ + tp-ch-gen.h \ + tp-ice-session-handler-gen.h \ + tp-ice-stream-handler-gen.h \ + tp-ifaces-signals-marshal.h \ + tp-chan-signals-marshal.h \ + tp-conn-signals-marshal.h \ + tp-connmgr-signals-marshal.h + +MARSHALLER_SOURCES = \ + tp-ifaces-signals-marshal.c \ + tp-chan-signals-marshal.c \ + tp-conn-signals-marshal.c \ + tp-connmgr-signals-marshal.c + +BUILT_SOURCES = \ + $(GENHEADERS) \ + $(MARSHALLER_SOURCES) + + +# Correctly clean the generated headers, but keep the xml description +CLEANFILES = $(BUILT_SOURCES) +lib_LTLIBRARIES = libtelepathy.la +libtelepathy_la_CFLAGS = $(DBUS_CFLAGS) $(ERROR_CFLAGS) $(GLIB_CFLAGS) +libtelepathy_la_LIBADD = $(DBUS_LIBS) $(GLIB_LIBS) +libtelepathy_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-symbols-regex '^tp_' \ + -export-dynamic + +CORESOURCES = \ + tp-chan.c \ + tp-conn.c \ + tp-connmgr.c \ + tp-helpers.c \ + tp-props-iface.c + +COREHEADERS = \ + tp-chan-ifaces-signal-setters.h \ + tp-conn-ifaces-signal-setters.h \ + tp-chan.h \ + tp-conn.h \ + tp-connmgr.h \ + tp-constants.h \ + tp-helpers.h \ + tp-interfaces.h \ + tp-props-iface.h + +libtelepathy_la_SOURCES = \ + tp-chan-ifaces-signal-setters.c \ + tp-conn-ifaces-signal-setters.c \ + $(MARSHALLER_SOURCES) \ + $(CORESOURCES) \ + $(COREHEADERS) + +telepathyincdir = $(includedir)/telepathy-1.0/libtelepathy +telepathyinc_HEADERS = \ + $(COREHEADERS) \ + $(GENHEADERS) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libtelepathy.la: $(libtelepathy_la_OBJECTS) $(libtelepathy_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libtelepathy_la_LDFLAGS) $(libtelepathy_la_OBJECTS) $(libtelepathy_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-chan-ifaces-signal-setters.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-chan-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-chan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-conn-ifaces-signal-setters.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-conn-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-conn.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-connmgr-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-connmgr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-helpers.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-ifaces-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtelepathy_la-tp-props-iface.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libtelepathy_la-tp-chan-ifaces-signal-setters.lo: tp-chan-ifaces-signal-setters.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-chan-ifaces-signal-setters.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-chan-ifaces-signal-setters.Tpo" -c -o libtelepathy_la-tp-chan-ifaces-signal-setters.lo `test -f 'tp-chan-ifaces-signal-setters.c' || echo '$(srcdir)/'`tp-chan-ifaces-signal-setters.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-chan-ifaces-signal-setters.Tpo" "$(DEPDIR)/libtelepathy_la-tp-chan-ifaces-signal-setters.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-chan-ifaces-signal-setters.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-chan-ifaces-signal-setters.c' object='libtelepathy_la-tp-chan-ifaces-signal-setters.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-chan-ifaces-signal-setters.lo `test -f 'tp-chan-ifaces-signal-setters.c' || echo '$(srcdir)/'`tp-chan-ifaces-signal-setters.c + +libtelepathy_la-tp-conn-ifaces-signal-setters.lo: tp-conn-ifaces-signal-setters.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-conn-ifaces-signal-setters.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-conn-ifaces-signal-setters.Tpo" -c -o libtelepathy_la-tp-conn-ifaces-signal-setters.lo `test -f 'tp-conn-ifaces-signal-setters.c' || echo '$(srcdir)/'`tp-conn-ifaces-signal-setters.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-conn-ifaces-signal-setters.Tpo" "$(DEPDIR)/libtelepathy_la-tp-conn-ifaces-signal-setters.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-conn-ifaces-signal-setters.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-conn-ifaces-signal-setters.c' object='libtelepathy_la-tp-conn-ifaces-signal-setters.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-conn-ifaces-signal-setters.lo `test -f 'tp-conn-ifaces-signal-setters.c' || echo '$(srcdir)/'`tp-conn-ifaces-signal-setters.c + +libtelepathy_la-tp-ifaces-signals-marshal.lo: tp-ifaces-signals-marshal.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-ifaces-signals-marshal.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-ifaces-signals-marshal.Tpo" -c -o libtelepathy_la-tp-ifaces-signals-marshal.lo `test -f 'tp-ifaces-signals-marshal.c' || echo '$(srcdir)/'`tp-ifaces-signals-marshal.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-ifaces-signals-marshal.Tpo" "$(DEPDIR)/libtelepathy_la-tp-ifaces-signals-marshal.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-ifaces-signals-marshal.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-ifaces-signals-marshal.c' object='libtelepathy_la-tp-ifaces-signals-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-ifaces-signals-marshal.lo `test -f 'tp-ifaces-signals-marshal.c' || echo '$(srcdir)/'`tp-ifaces-signals-marshal.c + +libtelepathy_la-tp-chan-signals-marshal.lo: tp-chan-signals-marshal.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-chan-signals-marshal.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-chan-signals-marshal.Tpo" -c -o libtelepathy_la-tp-chan-signals-marshal.lo `test -f 'tp-chan-signals-marshal.c' || echo '$(srcdir)/'`tp-chan-signals-marshal.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-chan-signals-marshal.Tpo" "$(DEPDIR)/libtelepathy_la-tp-chan-signals-marshal.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-chan-signals-marshal.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-chan-signals-marshal.c' object='libtelepathy_la-tp-chan-signals-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-chan-signals-marshal.lo `test -f 'tp-chan-signals-marshal.c' || echo '$(srcdir)/'`tp-chan-signals-marshal.c + +libtelepathy_la-tp-conn-signals-marshal.lo: tp-conn-signals-marshal.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-conn-signals-marshal.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-conn-signals-marshal.Tpo" -c -o libtelepathy_la-tp-conn-signals-marshal.lo `test -f 'tp-conn-signals-marshal.c' || echo '$(srcdir)/'`tp-conn-signals-marshal.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-conn-signals-marshal.Tpo" "$(DEPDIR)/libtelepathy_la-tp-conn-signals-marshal.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-conn-signals-marshal.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-conn-signals-marshal.c' object='libtelepathy_la-tp-conn-signals-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-conn-signals-marshal.lo `test -f 'tp-conn-signals-marshal.c' || echo '$(srcdir)/'`tp-conn-signals-marshal.c + +libtelepathy_la-tp-connmgr-signals-marshal.lo: tp-connmgr-signals-marshal.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-connmgr-signals-marshal.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-connmgr-signals-marshal.Tpo" -c -o libtelepathy_la-tp-connmgr-signals-marshal.lo `test -f 'tp-connmgr-signals-marshal.c' || echo '$(srcdir)/'`tp-connmgr-signals-marshal.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-connmgr-signals-marshal.Tpo" "$(DEPDIR)/libtelepathy_la-tp-connmgr-signals-marshal.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-connmgr-signals-marshal.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-connmgr-signals-marshal.c' object='libtelepathy_la-tp-connmgr-signals-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-connmgr-signals-marshal.lo `test -f 'tp-connmgr-signals-marshal.c' || echo '$(srcdir)/'`tp-connmgr-signals-marshal.c + +libtelepathy_la-tp-chan.lo: tp-chan.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-chan.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-chan.Tpo" -c -o libtelepathy_la-tp-chan.lo `test -f 'tp-chan.c' || echo '$(srcdir)/'`tp-chan.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-chan.Tpo" "$(DEPDIR)/libtelepathy_la-tp-chan.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-chan.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-chan.c' object='libtelepathy_la-tp-chan.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-chan.lo `test -f 'tp-chan.c' || echo '$(srcdir)/'`tp-chan.c + +libtelepathy_la-tp-conn.lo: tp-conn.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-conn.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-conn.Tpo" -c -o libtelepathy_la-tp-conn.lo `test -f 'tp-conn.c' || echo '$(srcdir)/'`tp-conn.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-conn.Tpo" "$(DEPDIR)/libtelepathy_la-tp-conn.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-conn.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-conn.c' object='libtelepathy_la-tp-conn.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-conn.lo `test -f 'tp-conn.c' || echo '$(srcdir)/'`tp-conn.c + +libtelepathy_la-tp-connmgr.lo: tp-connmgr.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-connmgr.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-connmgr.Tpo" -c -o libtelepathy_la-tp-connmgr.lo `test -f 'tp-connmgr.c' || echo '$(srcdir)/'`tp-connmgr.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-connmgr.Tpo" "$(DEPDIR)/libtelepathy_la-tp-connmgr.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-connmgr.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-connmgr.c' object='libtelepathy_la-tp-connmgr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-connmgr.lo `test -f 'tp-connmgr.c' || echo '$(srcdir)/'`tp-connmgr.c + +libtelepathy_la-tp-helpers.lo: tp-helpers.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-helpers.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-helpers.Tpo" -c -o libtelepathy_la-tp-helpers.lo `test -f 'tp-helpers.c' || echo '$(srcdir)/'`tp-helpers.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-helpers.Tpo" "$(DEPDIR)/libtelepathy_la-tp-helpers.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-helpers.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-helpers.c' object='libtelepathy_la-tp-helpers.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-helpers.lo `test -f 'tp-helpers.c' || echo '$(srcdir)/'`tp-helpers.c + +libtelepathy_la-tp-props-iface.lo: tp-props-iface.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -MT libtelepathy_la-tp-props-iface.lo -MD -MP -MF "$(DEPDIR)/libtelepathy_la-tp-props-iface.Tpo" -c -o libtelepathy_la-tp-props-iface.lo `test -f 'tp-props-iface.c' || echo '$(srcdir)/'`tp-props-iface.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libtelepathy_la-tp-props-iface.Tpo" "$(DEPDIR)/libtelepathy_la-tp-props-iface.Plo"; else rm -f "$(DEPDIR)/libtelepathy_la-tp-props-iface.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tp-props-iface.c' object='libtelepathy_la-tp-props-iface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtelepathy_la_CFLAGS) $(CFLAGS) -c -o libtelepathy_la-tp-props-iface.lo `test -f 'tp-props-iface.c' || echo '$(srcdir)/'`tp-props-iface.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-telepathyincHEADERS: $(telepathyinc_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(telepathyincdir)" || $(mkdir_p) "$(DESTDIR)$(telepathyincdir)" + @list='$(telepathyinc_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(telepathyincHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(telepathyincdir)/$$f'"; \ + $(telepathyincHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(telepathyincdir)/$$f"; \ + done + +uninstall-telepathyincHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(telepathyinc_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(telepathyincdir)/$$f'"; \ + rm -f "$(DESTDIR)$(telepathyincdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(telepathyincdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-telepathyincHEADERS + +install-exec-am: install-libLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ + uninstall-telepathyincHEADERS + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-strip \ + install-telepathyincHEADERS installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am uninstall-libLTLIBRARIES \ + uninstall-telepathyincHEADERS + +#Rule to generate the binding headers +%-gen.h: $(top_builddir)/xml/%.xml Makefile.am + dbus-binding-tool --prefix=$* --mode=glib-client $< > $*-gen.h + +# Create the necessary marshallers for the signals implemented by the +# library + +%-marshal.h: %-marshal.list Makefile.am + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.h + +%-marshal.c: %-marshal.list Makefile.am + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.c +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -r 000000000000 -r d0f3a028347a libtelepathy/src/libtelepathy_wsd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/libtelepathy_wsd.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,88 @@ +/* + * + * Copyright (C) 2008 Nokia Corporation. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include +#include "libtelepathy_wsd_solution.h" +#include // For emulator WSD API + +const TUid KLibTelUid3 = {0x2000F850}; // This is the UID of the library + +struct libtelepathy_global_struct* libtelepathy_ImpurePtr() +{ + #if defined(__WINSCW__) || defined(__WINS__) + + // Access the PLS of this process + struct libtelepathy_global_struct *g = Pls(KLibTelUid3, &libtelepathy_Init); + return g; + + #else + + return NULL; + + #endif + +} + +int libtelepathy_Init(libtelepathy_global_struct *g) +{ + if(g) + { + + g->GET_WSD_VAR_NAME(parent_class,tp_chan,s) = NULL; + g->GET_WSD_VAR_NAME(type1,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret1,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret2,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret3,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret4,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret5,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret6,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret7,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret8,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret9,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret10,tp_chan,s) = 0; + g->GET_WSD_VAR_NAME(ret11,tp_chan,s) = 0; + + g->GET_WSD_VAR_NAME(parent_class,tp_conn,s) = NULL; + g->GET_WSD_VAR_NAME(type1,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret1,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret2,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret3,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret4,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret5,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret6,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret7,tp_conn,s) = 0; + g->GET_WSD_VAR_NAME(ret8,tp_conn,s) = 0; + + g->GET_WSD_VAR_NAME(parent_class,tp_connmgr,s) = NULL; + g->GET_WSD_VAR_NAME(type1,tp_connmgr,s) = 0; + + g->GET_WSD_VAR_NAME(bus_proxy,tp_helpers,s) = NULL; + g->GET_WSD_VAR_NAME(bus1,tp_helpers,s) = NULL; + + + g->GET_WSD_VAR_NAME(parent_class,tp_props_iface,s) = NULL; + g->GET_WSD_VAR_NAME(type1,tp_props_iface,s) = 0; + g->GET_WSD_VAR_NAME(ret,tp_props_iface,s) = 0; + + memset(&(g->GET_WSD_VAR_NAME(signals,tp_props_iface,s)),0,LAST_SIGNAL_TP_PROPS_IFACE*sizeof(guint)); + + return 0; + } + return 1; +} + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/libtelepathy_wsd_macros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/libtelepathy_wsd_macros.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,66 @@ +/* libtelepathy_wsd_macros.h + * + * + * Copyright (C) 2008 Nokia Corporation. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +#ifndef _LIBTELEPATHY_WSD_DEFS_H_ +#define _LIBTELEPATHY_WSD_DEFS_H_ + +#if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#if EMULATOR +#undef EMULATOR +#endif +#ifdef GET_WSD_VAR_NAME +#undef GET_WSD_VAR_NAME +#endif + +#define EMULATOR (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#define GET_WSD_VAR_NAME(var,filename,prefix) _##prefix##_##filename##_##var + +#define RETURN_WSD_VAR(var,filename,prefix) (libtelepathy_ImpurePtr()->GET_WSD_VAR_NAME(var,filename,prefix)) + +#define GET_WSD_VAR_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (&RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define GET_WSD_ARRAY_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define VARIABLE_DECL(var,varprefix,filename,datatype)\ +datatype GET_WSD_VAR_NAME(var,filename,varprefix); + +#define VARIABLE_DECL_ARRAY(var,prefix,filename,datatype,size) \ +datatype GET_WSD_VAR_NAME(var,filename,prefix)[size]; + + +#define GET_STATIC_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,g) + +#define GET_STATIC_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,g) + +#endif +#endif //_LIBTELEPATHY_WSD_DEFS_H_ diff -r 000000000000 -r d0f3a028347a libtelepathy/src/libtelepathy_wsd_solution.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/libtelepathy_wsd_solution.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,96 @@ +/* libtelepathy_wsd_solution.h part of libtelepathy + * + * + * Copyright (C) 2007 Nokia Corporation. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +#ifndef _LIBTELEPATHY_WSD_H +#define _LIBTELEPATHY_WSD_H +#include "libtelepathy_wsd_macros.h" + +#include +#include +#include +#include "glibconfig.h" +#include + +#include +#include +#include + + +#define LAST_SIGNAL_TP_PROPS_IFACE 2 + +#if EMULATOR +#ifdef __cplusplus +extern "C" +{ +#endif + +struct libtelepathy_global_struct +{ + + VARIABLE_DECL(parent_class,s,tp_chan,GObjectClass *) + VARIABLE_DECL(type1,s,tp_chan,GType) + VARIABLE_DECL(ret1,s,tp_chan,GQuark) + VARIABLE_DECL(ret2,s,tp_chan,GQuark) + VARIABLE_DECL(ret3,s,tp_chan,GQuark) + VARIABLE_DECL(ret4,s,tp_chan,GQuark) + VARIABLE_DECL(ret5,s,tp_chan,GQuark) + VARIABLE_DECL(ret6,s,tp_chan,GQuark) + VARIABLE_DECL(ret7,s,tp_chan,GQuark) + VARIABLE_DECL(ret8,s,tp_chan,GQuark) + VARIABLE_DECL(ret9,s,tp_chan,GQuark) + VARIABLE_DECL(ret10,s,tp_chan,GQuark) + VARIABLE_DECL(ret11,s,tp_chan,GQuark) + + VARIABLE_DECL(parent_class,s,tp_conn,GObjectClass *) + VARIABLE_DECL(type1,s,tp_conn,GType) + VARIABLE_DECL(ret1,s,tp_conn,GQuark) + VARIABLE_DECL(ret2,s,tp_conn,GQuark) + VARIABLE_DECL(ret3,s,tp_conn,GQuark) + VARIABLE_DECL(ret4,s,tp_conn,GQuark) + VARIABLE_DECL(ret5,s,tp_conn,GQuark) + VARIABLE_DECL(ret6,s,tp_conn,GQuark) + VARIABLE_DECL(ret7,s,tp_conn,GQuark) + VARIABLE_DECL(ret8,s,tp_conn,GQuark) + VARIABLE_DECL(ret9,s,tp_conn,GQuark) + + VARIABLE_DECL(parent_class,s,tp_connmgr,GObjectClass *) + VARIABLE_DECL(type1,s,tp_connmgr,GType) + + VARIABLE_DECL(bus_proxy,s,tp_helpers,DBusGProxy *) + VARIABLE_DECL(bus1,s,tp_helpers,DBusGConnection *) + + VARIABLE_DECL(parent_class,s,tp_props_iface,GObjectClass *) + VARIABLE_DECL(type1,s,tp_props_iface,GType) + VARIABLE_DECL(ret,s,tp_props_iface,GQuark) + VARIABLE_DECL_ARRAY(signals,s,tp_props_iface,guint,LAST_SIGNAL_TP_PROPS_IFACE) + + /*END-global vars*/ + + }; + +struct libtelepathy_global_struct * libtelepathy_ImpurePtr(); +int libtelepathy_Init(struct libtelepathy_global_struct *); +#ifdef __cplusplus +} +#endif +#endif //EMULATOR +#endif //header guard _LIBTELEPATHY_WSD_H + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-chan-ifaces-signal-setters.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-chan-ifaces-signal-setters.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,103 @@ +/* tp-chan-ifaces-signal-setters.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "tp-chan-ifaces-signal-setters.h" + + +void tp_chan_set_contactsearch_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "SearchResultReceived", G_TYPE_UINT, + (dbus_g_type_get_map ("GHashTable", + G_TYPE_STRING, G_TYPE_VALUE)), G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "SearchStateChanged", + G_TYPE_UINT, G_TYPE_INVALID); +} + + +void tp_chan_set_streamedmedia_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "StreamStateChanged", + G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID); + /* FIXME: Outdated + dbus_g_proxy_add_signal(proxy, "ReceivedMediaParameters", + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_INVALID); + */ +} + +void tp_chan_set_roomlist_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "GotRooms", + (dbus_g_type_get_struct ("GValueArray", + G_TYPE_UINT, G_TYPE_STRING, + (dbus_g_type_get_map ("GHashTable", + G_TYPE_STRING, G_TYPE_VALUE)))), G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "ListingRooms", + G_TYPE_BOOLEAN, G_TYPE_INVALID); +} + +void tp_chan_set_text_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "Received", G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "Sent", G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "SendError", G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "LostMessage", G_TYPE_INVALID); +} + +void tp_chan_set_dtmf_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "ReceivedDTMF", G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID); +} + +void tp_chan_set_group_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "GroupFlagsChanged", G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "MembersChanged", G_TYPE_STRING, + DBUS_TYPE_G_UINT_ARRAY, DBUS_TYPE_G_UINT_ARRAY, + DBUS_TYPE_G_UINT_ARRAY, DBUS_TYPE_G_UINT_ARRAY, + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); +} + +void tp_chan_set_hold_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "HoldStateChanged", G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID); +} + +void tp_chan_set_password_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "PasswordFlagsChanged", + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); +} + +void tp_chan_set_icesignalling_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "NewIceSessionHandler", + DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, + G_TYPE_INVALID); +} diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-chan-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-chan-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,70 @@ +/* tp-chan-signals-marshal.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:VOID (tp-chan-signals-marshal.list:1) */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-chan.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-chan.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,649 @@ +/* tp-chan.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include "tp-chan.h" +#include "tp-chan-signals-marshal.h" +#include "tp-props-iface.h" +#include "tp-helpers.h" + +#ifdef EMULATOR +#include "libtelepathy_wsd_solution.h" +#endif + +#ifdef EMULATOR + + GET_STATIC_VAR_FROM_TLS(parent_class,tp_chan,GObjectClass *) + #define parent_class (*GET_WSD_VAR_NAME(parent_class,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(type1,tp_chan,GType) + #define type1 (*GET_WSD_VAR_NAME(type1,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret1,tp_chan,GQuark) + #define ret1 (*GET_WSD_VAR_NAME(ret1,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret2,tp_chan,GQuark) + #define ret2 (*GET_WSD_VAR_NAME(ret2,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret3,tp_chan,GQuark) + #define ret3 (*GET_WSD_VAR_NAME(ret3,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret4,tp_chan,GQuark) + #define ret4 (*GET_WSD_VAR_NAME(ret4,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret5,tp_chan,GQuark) + #define ret5 (*GET_WSD_VAR_NAME(ret5,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret6,tp_chan,GQuark) + #define ret6 (*GET_WSD_VAR_NAME(ret6,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret7,tp_chan,GQuark) + #define ret7 (*GET_WSD_VAR_NAME(ret7,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret8,tp_chan,GQuark) + #define ret8 (*GET_WSD_VAR_NAME(ret8,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret9,tp_chan,GQuark) + #define ret9 (*GET_WSD_VAR_NAME(ret9,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret10,tp_chan,GQuark) + #define ret10 (*GET_WSD_VAR_NAME(ret10,tp_chan,s)()) + + GET_STATIC_VAR_FROM_TLS(ret11,tp_chan,GQuark) + #define ret11 (*GET_WSD_VAR_NAME(ret11,tp_chan,s)()) + + +#else + static GObjectClass *parent_class = NULL; +#endif + +static void synthesize_closed(TpChan *chan); + +static void _tp_chan_register_signal_marshallers() +{ + /* Register marshaller for the Close signal */ + dbus_g_object_register_marshaller(tp_chan_signals_marshal_VOID__VOID, + G_TYPE_NONE, G_TYPE_INVALID); +} + +static void _tp_chan_register_interface_signal_marshallers() +{ + + /* Register marshaller for ContactSearch interface signal + SearchResultReceived*/ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_BOXED, + G_TYPE_NONE, G_TYPE_UINT, G_TYPE_BOXED, G_TYPE_INVALID); + + /* Register marshaller for ContactSearch interface signal + * SearchStateChanged */ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT, + G_TYPE_NONE, G_TYPE_UINT, G_TYPE_INVALID); + + /* Register marshaller for StreamedMedia interface signal + ReceivedMediaParameters */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + /* Register marshaller for StreamedMedia interface signal + StreamStateChanged */ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); + + /* Register marshaller for RoomList interface signal GotRooms */ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__BOXED, + G_TYPE_NONE, G_TYPE_BOXED, G_TYPE_INVALID); + + /* Register marshaller for RoomList interface signal ListingRooms */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__BOOLEAN, + G_TYPE_NONE, G_TYPE_BOOLEAN, + G_TYPE_INVALID); + + /* Register marshaller for channel type Text interface signal Received */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, + G_TYPE_INVALID); + + /* Register marshaller for channel type Text interface Sent */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT_STRING, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + + /* Register marshaller used by the following iface/signal pairs: + * DTFM/ReceivedDTMF, Group/GroupFlagsChanged, Hold/HoldStateChanged, + * Password/PasswordFlagsChanged, Subject/SubjectFlagsChanged */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT, + G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, + G_TYPE_INVALID); + /* Register marshaller for Group interface signal MembersChanged */ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_BOXED, + G_TYPE_BOXED, G_TYPE_BOXED, G_TYPE_BOXED, + G_TYPE_UINT, G_TYPE_UINT,G_TYPE_INVALID); + + /* Register marshaller for Text Channel interface signal SendError */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_STRING, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + + /* Register marshaller for IceSignalling interface signal + NewIceSessionHandler */ + + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_INVALID); + +} + + +/* We initialize the list of signatures here, so that we can use + * it to add them for new interface instances later.*/ + +/* FIXME: This should be replaced by a more automatic way of doing + * this. The reason for using a set of function pointers is that there is no + * apparent cleaner way of doing this, unless DBusGProxy gains a non-varargs + * version of dbus_g_proxy_add_signal... + */ + + +static void _tp_chan_init_interface_signal_signatures(GData **signal_sigs) +{ + g_datalist_init(signal_sigs); + + + /* Create and store contact search iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK, + (gpointer)tp_chan_set_contactsearch_signatures); + + /* Store streamed media iface signal signatures */ + g_datalist_id_set_data(signal_sigs, + TELEPATHY_CHAN_IFACE_STREAMED_QUARK, + (gpointer)tp_chan_set_streamedmedia_signatures); + /* Store roomlist signal iface signal parameters */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_ROOMLIST_QUARK, + (gpointer)tp_chan_set_roomlist_signatures); + /* Store text iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_TEXT_QUARK, + (gpointer)tp_chan_set_text_signatures); + /* Store DTMF iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_DTMF_QUARK, + (gpointer)tp_chan_set_dtmf_signatures); + /* Store group iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_GROUP_QUARK, + (gpointer)tp_chan_set_group_signatures); + /* Store hold iface signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_HOLD_QUARK, + (gpointer)tp_chan_set_hold_signatures); + /* Store password iface signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CHAN_IFACE_PASSWORD_QUARK, + (gpointer)tp_chan_set_password_signatures); +} + +static void tp_chan_init(GTypeInstance *instance, gpointer g_class) +{ + TpChan *self = TELEPATHY_CHAN(instance); + self->type = NULL; + self->first_run = TRUE; +} + + +static void tp_chan_dispose(GObject *obj) +{ + TpChan *self = TELEPATHY_CHAN(obj); + + if (self->first_run) + { + self->first_run = FALSE; + synthesize_closed(self); + g_datalist_clear(&(self->interface_list)); + } + + /* Chain up to the parent class dispose */ + if (G_OBJECT_CLASS(parent_class)->dispose) + { + G_OBJECT_CLASS(parent_class)->dispose(obj); + } + +} + + +static void tp_chan_finalize(GObject *obj) +{ + TpChan *self = TELEPATHY_CHAN(obj); + + if (self->type) + { + g_free(self->type); + } + + if (G_OBJECT_CLASS(parent_class)->finalize) + { + G_OBJECT_CLASS(parent_class)->finalize(obj); + } +} + + +static void tp_chan_class_init(TpChanClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + parent_class = g_type_class_peek_parent(klass); + + obj->set_property = parent_class->set_property; + obj->get_property = parent_class->get_property; + obj->dispose = tp_chan_dispose; + obj->finalize = tp_chan_finalize; + _tp_chan_register_signal_marshallers(); + _tp_chan_register_interface_signal_marshallers(); + _tp_chan_init_interface_signal_signatures(&(klass->iface_signal_sigs)); +} + + +GType tp_chan_get_type(void) +{ +#ifndef EMULATOR + static GType type1 = 0; +#endif + + if (type1 == 0) + { + static const GTypeInfo info = + { + sizeof(TpChanClass), + NULL, + NULL, + (GClassInitFunc)tp_chan_class_init, + NULL, + NULL, + sizeof(TpChan), + 0, + (GInstanceInitFunc)tp_chan_init + }; + type1 = g_type_register_static(DBUS_TYPE_G_PROXY, + "TpChan", &info, 0); + } + return type1; +} + + + +/* Public functions begin */ + +GQuark tp_get_chan_interface() +{ +#ifndef EMULATOR + static GQuark ret1 = 0; +#endif + + if (ret1 == 0) + { + ret1 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE); + } + + return ret1; +} + +GQuark tp_get_chan_contactlist_interface() +{ +#ifndef EMULATOR + static GQuark ret2 = 0; +#endif + + if (ret2 == 0) + { + ret2 = g_quark_from_static_string(TP_IFACE_CHANNEL_TYPE_CONTACT_LIST); + } + + return ret2; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark tp_get_chan_contactsearch_interface() +{ +#ifndef EMULATOR + static GQuark ret3 = 0; +#endif + + if (ret3 == 0) + { + ret3 = g_quark_from_static_string(TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH); + } + + return ret3; +} + + +GQuark tp_get_chan_streamed_interface() +{ +#ifndef EMULATOR + static GQuark ret4 = 0; +#endif + + if (ret4 == 0) + { + ret4 = g_quark_from_static_string(TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA); + } + + return ret4; +} + + +GQuark tp_get_chan_roomlist_interface() +{ +#ifndef EMULATOR + static GQuark ret5 = 0; +#endif + + if (ret5 == 0) + { + ret5 = g_quark_from_static_string(TP_IFACE_CHANNEL_TYPE_ROOM_LIST); + } + + return ret5; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark tp_get_chan_text_interface() +{ +#ifndef EMULATOR + static GQuark ret6 = 0; +#endif + + if (ret6 == 0) + { + ret6 = g_quark_from_static_string(TP_IFACE_CHANNEL_TYPE_TEXT); + } + + return ret6; +} + + +GQuark tp_get_chan_dtmf_interface() +{ +#ifndef EMULATOR + static GQuark ret7 = 0; +#endif + + if (ret7 == 0) + { + ret7 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE_DTMF); + } + + return ret7; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark tp_get_chan_group_interface() +{ +#ifndef EMULATOR + static GQuark ret8 = 0; +#endif + + if (ret8 == 0) + { + ret8 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE_GROUP); + } + + return ret8; +} + + +GQuark tp_get_chan_hold_interface() +{ +#ifndef EMULATOR + static GQuark ret9 = 0; +#endif + + if (ret9 == 0) + { + ret9 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE_HOLD); + } + + return ret9; +} + + +GQuark tp_get_chan_password_interface() +{ +#ifndef EMULATOR + static GQuark ret10 = 0; +#endif + + if (ret10 == 0) + { + ret10 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE_PASSWORD); + } + + return ret10; +} + +GQuark tp_get_chan_transfer_interface() +{ +#ifndef EMULATOR + static GQuark ret11 = 0; +#endif + + if (ret11 == 0) + { + ret11 = g_quark_from_static_string(TP_IFACE_CHANNEL_INTERFACE_TRANSFER); + } + + return ret11; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +TpChan *tp_chan_new(DBusGConnection *connection, const gchar *bus_name, + const gchar *object_path, const gchar *type, + guint handle_type, guint handle) +{ + GError *error = NULL; + gchar *unique_name; + gchar **interfaces; + TpChan *chan; + g_return_val_if_fail(connection != NULL, NULL); + g_return_val_if_fail(bus_name != NULL, NULL); + g_return_val_if_fail(object_path != NULL, NULL); + g_return_val_if_fail(type != NULL, NULL); + + if (!dbus_g_proxy_call (tp_get_bus_proxy (), + "GetNameOwner", &error, G_TYPE_STRING, bus_name, + G_TYPE_INVALID, G_TYPE_STRING, &unique_name, + G_TYPE_INVALID)) + { + g_warning("tp_chan_new: getting unique name failed: %s", error->message); + g_error_free(error); + return NULL; + } + + /* Create the channel object */ + chan = g_object_new(TELEPATHY_CHAN_TYPE, + "name", unique_name, "path", object_path, + "interface", TP_IFACE_CHANNEL_INTERFACE, + "connection", connection, NULL); + + g_free(unique_name); + + dbus_g_proxy_add_signal(DBUS_G_PROXY(chan), "Closed", G_TYPE_INVALID); + + g_datalist_init(&(chan->interface_list)); + + /* Store interface information for the channel */ + if (tp_chan_get_interfaces(DBUS_G_PROXY(chan), &interfaces, &error)) + { + tp_chan_local_set_interfaces(chan, interfaces); + + /* Free the strings used for interface object creation */ + g_strfreev(interfaces); + } + else + { + g_warning("GetInterfaces for channel failed: %s\n", error->message); + g_error_free(error); + } + + /* Store necessary information for this object */ + chan->type = g_strdup(type); + chan->handle_type = handle_type; + chan->handle = handle; + + return chan; +} + + +void tp_chan_local_set_interfaces(TpChan *self, gchar **interfaces) +{ + gchar **temp_ifaces; + gchar *chan_type = NULL; + GError *error = NULL; + GData **sig_list = &(TELEPATHY_CHAN_GET_CLASS(self)->iface_signal_sigs); + void (*signature_setter_func)(DBusGProxy *proxy); + DBusGConnection *connection; + /*const*/ gchar *name, *path; + + if (interfaces == NULL) + { + return; + } + + /* Create and store proxy objects corresponding to the + interfaces */ + + g_object_get (G_OBJECT(self), + "connection", &connection, + "name", &name, + "path", &path, + NULL); + + g_debug ("%s: %p, %s, %s", G_STRFUNC, connection, name, path); + + for (temp_ifaces = interfaces; *temp_ifaces; temp_ifaces++) + { + GQuark key = g_quark_from_string(*temp_ifaces); + DBusGProxy *if_proxy; + + if (key == TELEPATHY_PROPS_IFACE_QUARK) + { + if_proxy = DBUS_G_PROXY (tp_props_iface_new (connection, name, path)); + } + else + { + if_proxy = dbus_g_proxy_new_for_name (connection, name, + path, *temp_ifaces); + + if (if_proxy != NULL) + { + /* Does the interface have signals? If yes, add their signatures + for the interface instance by calling the + corresponding setter function */ + + signature_setter_func = + g_datalist_id_get_data(sig_list, key); + + if (signature_setter_func != NULL) + { + (*signature_setter_func)(if_proxy); + } + } + } + if (if_proxy != NULL) + { + g_datalist_id_set_data_full(&(self->interface_list), key, + if_proxy, g_object_unref); + } + } + + /* Finally, add the channel type interface */ + + if (!tp_chan_get_channel_type(DBUS_G_PROXY(self), &chan_type, &error)) + { + g_warning("GetChannelType failed: %s\n", error->message); + g_error_free(error); + } + else + { + DBusGProxy *chan_proxy = + dbus_g_proxy_new_from_proxy(DBUS_G_PROXY(self), chan_type, NULL); + + g_datalist_id_set_data(&(self->interface_list), + g_quark_from_string(chan_type), chan_proxy); + + /* If the particular channel type interface has signals defined, + call the corresponding setter function */ + + signature_setter_func = + g_datalist_id_get_data(sig_list, g_quark_from_string(chan_type)); + + if (signature_setter_func != NULL) + { + (*signature_setter_func)(chan_proxy); + } + + g_free(chan_type); + } + + g_free (name); + g_free (path); + dbus_g_connection_unref (connection); +} + +#ifdef SYMBIAN +EXPORT_C +#endif +DBusGProxy *tp_chan_get_interface(TpChan *self, GQuark iface_quark) +{ + DBusGProxy *iface_proxy = NULL; + + iface_proxy = (DBusGProxy *)g_datalist_id_get_data(&(self->interface_list), + iface_quark); + return iface_proxy; +} + +static void synthesize_closed(TpChan *chan) +{ + DBusMessage *msg = NULL; + GArray *closed_signal_types = g_array_new(FALSE, FALSE, sizeof(GType)); + + if (!closed_signal_types) + { + g_warning("%s: Could not allocate the type array for Closed signal", + G_STRFUNC); + return; + } + + msg = dbus_message_new_signal(dbus_g_proxy_get_path(DBUS_G_PROXY(chan)), + TP_IFACE_CHANNEL_INTERFACE, "Closed"); + if (!msg) + { + g_warning("%s: Could not create the synthetic Closed signal message.", + G_STRFUNC); + g_array_free(closed_signal_types, FALSE); + return; + } + g_signal_emit_by_name(DBUS_G_PROXY(chan), + TP_IFACE_CHAN_SIGNAL_CLOSED_SYNTHESIZED, msg, + closed_signal_types); + g_array_free(closed_signal_types, FALSE); + dbus_message_unref(msg); +} diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-conn-ifaces-signal-setters.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-conn-ifaces-signal-setters.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,75 @@ +/* tp-conn-ifaces-signal-setters.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "tp-conn-ifaces-signal-setters.h" + +void tp_conn_set_aliasing_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "AliasesChanged", + dbus_g_type_get_struct ("GValueArray", + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID), + G_TYPE_INVALID); +} + +void tp_conn_set_capabilities_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "CapabilitiesChanged", + dbus_g_type_get_struct ("GValueArray", + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID), + G_TYPE_INVALID); +} + +void tp_conn_set_contactinfo_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "GotContactInfo", + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); +} +void tp_conn_set_forwarding_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "ForwardingChanged", + G_TYPE_UINT, G_TYPE_INVALID); +} +void tp_conn_set_presence_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "PresenceUpdate", + dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, + (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, + (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, + (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, + G_TYPE_VALUE)))), G_TYPE_INVALID))), G_TYPE_INVALID); +} +void tp_conn_set_privacy_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "PrivacyModeChanged", + G_TYPE_STRING, G_TYPE_INVALID); +} +void tp_conn_set_renaming_signatures(DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "Renamed", + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); +} +void tp_conn_set_avatar_signatures(DBusGProxy *proxy) +{ + //dbus_g_proxy_add_signal( proxy, "AvatarUpdated", ) + dbus_g_proxy_add_signal(proxy, "AvatarUpdated", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "AvatarRetrieved", G_TYPE_UINT, G_TYPE_STRING, DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_STRING,G_TYPE_INVALID); +} diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-conn-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-conn-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,148 @@ +/* tp-conn-signals-marshal.c + * + * Copyright (C) 2005 Collabora Ltd. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:OBJECT,STRING,UINT,UINT,BOOLEAN (tp-conn-signals-marshal.list:1) */ +void +tp_conn_signals_marshal_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + guint arg_3, + guint arg_4, + gboolean arg_5, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_uint (param_values + 4), + g_marshal_value_peek_boolean (param_values + 5), + data2); +} + +/* VOID:UINT,UINT (tp-conn-signals-marshal.list:2) */ +void +tp_conn_signals_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + +/* VOID:BOXED (tp-conn-signals-marshal.list:3) */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-conn.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-conn.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,734 @@ +/* tp-conn.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include "tp-conn.h" +#include "tp-helpers.h" +#include "tp-connmgr.h" +#include "tp-props-iface.h" + + + +#ifdef EMULATOR +#include "libtelepathy_wsd_solution.h" +#endif + +#ifdef EMULATOR + + GET_STATIC_VAR_FROM_TLS(parent_class,tp_conn,GObjectClass *) + #define parent_class (*GET_WSD_VAR_NAME(parent_class,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(type1,tp_conn,GType) + #define type1 (*GET_WSD_VAR_NAME(type1,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret1,tp_conn,GQuark) + #define ret1 (*GET_WSD_VAR_NAME(ret1,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret2,tp_conn,GQuark) + #define ret2 (*GET_WSD_VAR_NAME(ret2,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret3,tp_conn,GQuark) + #define ret3 (*GET_WSD_VAR_NAME(ret3,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret4,tp_conn,GQuark) + #define ret4 (*GET_WSD_VAR_NAME(ret4,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret5,tp_conn,GQuark) + #define ret5 (*GET_WSD_VAR_NAME(ret5,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret6,tp_conn,GQuark) + #define ret6 (*GET_WSD_VAR_NAME(ret6,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret7,tp_conn,GQuark) + #define ret7 (*GET_WSD_VAR_NAME(ret7,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret8,tp_conn,GQuark) + #define ret8 (*GET_WSD_VAR_NAME(ret8,tp_conn,s)()) + + GET_STATIC_VAR_FROM_TLS(ret9,tp_conn,GQuark) + #define ret9 (*GET_WSD_VAR_NAME(ret9,tp_conn,s)()) + +#else + static GObjectClass *parent_class = NULL; +#endif + + + +static gboolean tp_conn_status_change_handler(DBusGProxy *proxy, + guint status, guint reason, + gpointer user_data); + +static void _tp_conn_connect_req_handler(DBusGProxy *proxy, + GError *error, gpointer user_data); + +static void _tp_conn_register_signal_marshallers() +{ + /* Register marshaller for NewChannel signal */ + dbus_g_object_register_marshaller(tp_conn_signals_marshal_VOID__OBJECT_STRING_UINT_UINT_BOOLEAN, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_INVALID); + /* Register marshaller for StatusChanged signal */ + dbus_g_object_register_marshaller(tp_conn_signals_marshal_VOID__UINT_UINT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); +} + +static void _tp_conn_register_interface_signal_marshallers() +{ + /* Register marshaller for Aliasing interface signal AliasUpdate and + ContactInfo interface signal GotContactInfo*/ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_STRING, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); + /* Register marshaller for Forwarding interface signal ForwardingChanged */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_INVALID); + /* Register marshaller for Presence interface signal PresenceUpdate */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__BOXED, G_TYPE_NONE, G_TYPE_BOXED, G_TYPE_INVALID); + /* Register marshaller for Privacy interface signal PrivacyModeChanged */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INVALID); + /* Register marshaller for Renaming interface signal Renamed */ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); +} + + +/* We initialize the list of signatures here, so that we can use + * it to add them for new interface instances later. + */ + +/* FIXME: This should be replaced by a more automatic way of doing + * this. The reason for using a set of function pointers is that there is no + * apparent cleaner way of doing this, unless DBusGProxy gains a non-varargs + * version of dbus_g_proxy_add_signal... + */ + +static void _tp_conn_init_interface_signal_signatures(GData **signal_sigs) +{ + g_datalist_init(signal_sigs); + + /* Create and store aliasing iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_ALIASING_QUARK, + (gpointer)&tp_conn_set_aliasing_signatures); + /* Create and store capabilities iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_CAPABILITIES_QUARK, + (gpointer)&tp_conn_set_capabilities_signatures); + /* Create and store contactinfo iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_CONTACTINFO_QUARK, + (gpointer)&tp_conn_set_contactinfo_signatures); + /* Create and store forwarding iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_FORWARDING_QUARK, + (gpointer)&tp_conn_set_forwarding_signatures); + /* Create and store presence iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_PRESENCE_QUARK, + (gpointer)&tp_conn_set_presence_signatures); + /* Create and store privacy iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_PRIVACY_QUARK, + (gpointer)&tp_conn_set_privacy_signatures); + /* Create and store renaming iface signal signatures */ + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_RENAMING_QUARK, + (gpointer)&tp_conn_set_renaming_signatures); + g_datalist_id_set_data(signal_sigs, TELEPATHY_CONN_IFACE_AVATAR_QUARK, + (gpointer)&tp_conn_set_avatar_signatures); +} + +static void synthesize_status_changed(TpConn *conn); + +static void tp_conn_init(GTypeInstance *instance, gpointer g_class) +{ + TpConn *self = TELEPATHY_CONN(instance); + + self->first_run = TRUE; +} + + +static void tp_conn_dispose(GObject *obj) +{ + TpConn *self = TELEPATHY_CONN(obj); + + if (self->first_run == TRUE) + { + self->first_run = FALSE; + synthesize_status_changed(self); + g_datalist_clear(&(self->interface_list)); + } + + /* Call parent class dispose method */ + if (G_OBJECT_CLASS(parent_class)->dispose) + { + G_OBJECT_CLASS(parent_class)->dispose(obj); + } + +} + + +static void tp_conn_finalize(GObject *obj) +{ + if (G_OBJECT_CLASS(parent_class)->finalize) + { + G_OBJECT_CLASS(parent_class)->finalize(obj); + } + +} + + +static void tp_conn_class_init(TpConnClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + parent_class = g_type_class_peek_parent(klass); + + obj->set_property = parent_class->set_property; + obj->get_property = parent_class->get_property; + + obj->dispose = tp_conn_dispose; + obj->finalize = tp_conn_finalize; + _tp_conn_register_signal_marshallers(); + _tp_conn_register_interface_signal_marshallers(); + _tp_conn_init_interface_signal_signatures(&(klass->iface_signal_sigs)); +} + +#ifdef SYMBIAN +EXPORT_C +#endif +GType tp_conn_get_type(void) +{ +#ifndef EMULATOR + static GType type1 = 0; +#endif + + if (type1 == 0) + { + static const GTypeInfo info = + { + sizeof(TpConnClass), + NULL, + NULL, + (GClassInitFunc)tp_conn_class_init, + NULL, + NULL, + sizeof(TpConn), + 0, + (GInstanceInitFunc)tp_conn_init + + }; + type1 = g_type_register_static(DBUS_TYPE_G_PROXY, + "TpConn", &info, 0); + } + return type1; +} + +/* The interface name getters */ + +GQuark tp_get_conn_interface() +{ +#ifndef EMULATOR + static GQuark ret1 = 0; +#endif + + if (ret1 == 0) + { + /* FIXME: The naming conventions should be unified */ + ret1 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE); + } + + return ret1; +} + +GQuark tp_get_conn_aliasing_interface() +{ +#ifndef EMULATOR + static GQuark ret2 = 0; +#endif + + if (ret2 == 0) + { + ret2 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_ALIASING); + } + + return ret2; +} + +GQuark tp_get_conn_capabilities_interface() +{ +#ifndef EMULATOR + static GQuark ret3 = 0; +#endif + + if (ret3 == 0) + { + ret3 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_CAPABILITIES); + } + + return ret3; +} + +GQuark tp_get_conn_contactinfo_interface() +{ +#ifndef EMULATOR + static GQuark ret4 = 0; +#endif + + if (ret4 == 0) + { + ret4 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_CONTACT_INFO); + } + + return ret4; +} + +GQuark tp_get_conn_forwarding_interface() +{ +#ifndef EMULATOR + static GQuark ret5 = 0; +#endif + + if (ret5 == 0) + { + ret5 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_FORWARDING); + } + + return ret5; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark tp_get_conn_presence_interface() +{ +#ifndef EMULATOR + static GQuark ret6 = 0; +#endif + + if (ret6 == 0) + { + ret6 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_PRESENCE); + } + + return ret6; +} + + +GQuark tp_get_conn_privacy_interface() +{ +#ifndef EMULATOR + static GQuark ret7 = 0; +#endif + + if (ret7 == 0) + { + ret7 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_PRIVACY); + } + + return ret7; +} + + + +GQuark tp_get_conn_renaming_interface() +{ +#ifndef EMULATOR + static GQuark ret8 = 0; +#endif + + if (ret8 == 0) + { + ret8 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_RENAMING); + } + + return ret8; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark tp_get_conn_avatar_interface(void) + { +#ifndef EMULATOR + static GQuark ret9 = 0; +#endif + + if (ret9 == 0) + { + ret9 = g_quark_from_static_string(TP_IFACE_CONN_INTERFACE_AVATAR); + } + + return ret9; + } + +TpConn * +tp_conn_new_without_connect (DBusGConnection *connection, + const gchar *bus_name, + const gchar *object_path, + guint *status, + GError **error) +{ + gchar *unique_name; + gchar **interfaces; + guint conn_status = TP_CONN_STATUS_DISCONNECTED; + TpConn *obj; + GError *err = NULL; + + g_return_val_if_fail (connection != NULL, NULL); + g_return_val_if_fail (bus_name != NULL, NULL); + g_return_val_if_fail (object_path, NULL); + + /* Create the proxy object for this connection. It will be used to + perform the actual method calls over D-BUS. */ + + if (!dbus_g_proxy_call (tp_get_bus_proxy (), "GetNameOwner", error, + G_TYPE_STRING, bus_name, G_TYPE_INVALID, + G_TYPE_STRING, &unique_name, G_TYPE_INVALID)) + { + return NULL; + } + + obj = g_object_new (TELEPATHY_CONN_TYPE, + "name", unique_name, + "path", object_path, + "interface", TP_IFACE_CONN_INTERFACE,//TP_IFACE_CONNECTION, + "connection", connection, + NULL); + g_free (unique_name); + + g_datalist_init (&(obj->interface_list)); + + //ADD_SIGNALS_FOR_CONNECTION (DBUS_G_PROXY (obj)); //commenting this bcoz header file not found + //equivalent of above stmt + dbus_g_proxy_add_signal (DBUS_G_PROXY (obj), "NewChannel",\ + DBUS_TYPE_G_OBJECT_PATH,\ + G_TYPE_STRING,\ + G_TYPE_UINT,\ + G_TYPE_UINT,\ + G_TYPE_BOOLEAN,\ + G_TYPE_INVALID);\ + dbus_g_proxy_add_signal (DBUS_G_PROXY (obj), "StatusChanged",\ + G_TYPE_UINT,\ + G_TYPE_UINT,\ + G_TYPE_INVALID); + + /* Check if the connection is already connected. If so, we can + * already perform GetInterfaces(). */ + + if (!tp_conn_get_status (DBUS_G_PROXY (obj), &conn_status, &err)) + { + if (err != NULL) + g_propagate_error (error, err); + + g_object_unref (obj); + return NULL; + } + + if (conn_status == TP_CONN_STATUS_CONNECTED) + { + if (!tp_conn_get_interfaces (DBUS_G_PROXY (obj), &interfaces, &err)) + { + if (err != NULL) + g_propagate_error (error, err); + + g_object_unref (obj); + return NULL; + } + + /* Initialize the interface objects for this TpConn object */ + tp_conn_local_set_interfaces (obj, interfaces); + + g_strfreev (interfaces); + } + else + { + /* Not connected yet, so this is really a new connection. Thus, we + have to hook up to StatusChanged signal to perform the + GetInterfaces when it goes Connected */ + + dbus_g_proxy_connect_signal (DBUS_G_PROXY (obj), "StatusChanged", + G_CALLBACK (tp_conn_status_change_handler), NULL, NULL); + } + + if (status != NULL) + *status = conn_status; + return obj; +} + + +TpConn * +tp_conn_new (DBusGConnection *connection, + const gchar *bus_name, + const gchar *object_path) +{ + GError *error = NULL; + guint status; + TpConn *obj; + + g_return_val_if_fail (connection != NULL, NULL); + g_return_val_if_fail (bus_name != NULL, NULL); + g_return_val_if_fail (object_path, NULL); + + obj = tp_conn_new_without_connect (connection, bus_name, object_path, + &status, &error); + + if (obj == NULL) + { + /* either GetNameOwner, GetStatus or GetInterfaces failed */ + if (error != NULL) + { + g_warning ("Failed to create connection for %s %s: %s", bus_name, + object_path, error->message); + g_error_free (error); + } + else + { + g_warning ("Failed to create connection for %s %s: error is NULL", + bus_name, object_path); + } + + return NULL; + } + + if (status != TP_CONN_STATUS_CONNECTED) + { + tp_conn_connect_async (DBUS_G_PROXY (obj), _tp_conn_connect_req_handler, + NULL); + } + + return obj; +} + +#ifdef SYMBIAN +EXPORT_C +#endif +TpChan *tp_conn_new_channel(DBusGConnection *connection, + TpConn *tp_conn, const gchar *bus_name, + gchar *type, guint handle_type, + guint handle, gboolean supress_handler) +{ + GError *error = NULL; + gchar *chan_object_path = NULL; + TpChan *new_chan = NULL; + + g_return_val_if_fail(connection, NULL); + g_return_val_if_fail(TELEPATHY_IS_CONN(tp_conn), NULL); + g_return_val_if_fail(bus_name, NULL); + g_return_val_if_fail(type, NULL); + + /* Request a new channel to be created by using the proxy object. + We also retrieve the object path for it here. */ + + if (!tp_conn_request_channel(DBUS_G_PROXY(tp_conn), + type, handle_type, handle, supress_handler, + &chan_object_path, &error)) + { + g_warning("RequestChannel() failed: %s\n", error -> message); + + g_error_free(error); + return NULL; + } + + + /* Create the object to represent the channel */ + + new_chan = tp_chan_new(connection, bus_name, chan_object_path, type, + handle_type, handle); + + + g_free(chan_object_path); + + + + return new_chan; +} + + +void tp_conn_local_set_interfaces(TpConn *self, gchar **interfaces) +{ + gchar **temp_ifaces = NULL; + const gchar *bus_name = dbus_g_proxy_get_bus_name(DBUS_G_PROXY(self)); + const gchar *object_path = dbus_g_proxy_get_path(DBUS_G_PROXY(self)); + + DBusGConnection *connection = tp_get_bus (); + + if (interfaces == NULL || connection == NULL) + { + return; + } + + /* Create and store the proxy objects for the connection interfaces. */ + for (temp_ifaces = interfaces; *temp_ifaces; temp_ifaces++) + { + DBusGProxy *if_proxy; + GQuark key = g_quark_from_string(*temp_ifaces); + + if (key == TELEPATHY_PROPS_IFACE_QUARK) + { + if_proxy = DBUS_G_PROXY (tp_props_iface_new (connection, + bus_name, object_path)); + } + else + { + if_proxy = dbus_g_proxy_new_for_name(connection, bus_name, object_path, + *temp_ifaces); + if (if_proxy != NULL) + { + GData *sig_list = TELEPATHY_CONN_GET_CLASS(self)->iface_signal_sigs; + void (*signature_setter_func)(); + + /* Does the interface have signals? If yes, add their signatures + for the interface instance */ + signature_setter_func = + g_datalist_id_get_data(&sig_list, key); + + if (signature_setter_func != NULL) + { + signature_setter_func(if_proxy); + } + } + } + + if (if_proxy != NULL) + { + g_datalist_id_set_data_full(&(self->interface_list), + key, if_proxy, g_object_unref); + } + + } +} + +#ifdef SYMBIAN +EXPORT_C +#endif +DBusGProxy * +tp_conn_get_interface (TpConn *self, + GQuark iface_quark) +{ + DBusGProxy *iface_proxy = NULL; + + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (iface_quark != 0, NULL); + + iface_proxy = (DBusGProxy *) g_datalist_id_get_data ( + &(self->interface_list), iface_quark); + + return iface_proxy; +} + +void +_tp_conn_connect_req_handler (DBusGProxy *proxy, + GError *error, + gpointer user_data) +{ + /* The interfaces for the TpConn are set on the StatusChanged + handler when we get connected. Just print errors (if any) + here. */ + + if (error) + { + g_warning ("Could not perform Connect() for the connection, because: %s", + error->message); + g_error_free (error); + return; + } + +} + +static gboolean +tp_conn_status_change_handler (DBusGProxy *proxy, + guint status, + guint reason, + gpointer user_data) +{ + gchar **interfaces = NULL; + GError *error = NULL; + TpConn *tp_conn = (TpConn *) proxy; + + /* If the connection is up, we can get the list of interfaces */ + /* FIXME: At some point, we should switch to doing this asynchronously */ + + if (status == TP_CONN_STATUS_CONNECTED) + { + if (!tp_conn_get_interfaces (DBUS_G_PROXY (proxy), &interfaces, &error)) + { + g_warning ("GetInterfaces failed: %s\n", error->message); + g_error_free (error); + return TRUE; + } + + /* Initialize the interface objects for this TpConn object */ + + tp_conn_local_set_interfaces (tp_conn, interfaces); + + g_strfreev (interfaces); + + dbus_g_proxy_disconnect_signal (proxy, "StatusChanged", + G_CALLBACK (tp_conn_status_change_handler), NULL); + } + + return TRUE; +} + + +static void synthesize_status_changed(TpConn *conn) +{ + + DBusMessageIter iter; + DBusMessage *msg = NULL; + guint value; + GType uint_type = G_TYPE_UINT; + GArray *statuschanged_signal_types = g_array_new(FALSE, FALSE, + sizeof(GType)); + + + if (!statuschanged_signal_types) + { + g_warning("%s: Could not allocate type array for StatusChanged", + G_STRFUNC); + return; + } + + msg = dbus_message_new_signal(dbus_g_proxy_get_path(DBUS_G_PROXY(conn)), + TP_IFACE_CONN_INTERFACE, "StatusChanged"); + + if (!msg) + { + g_warning("%s: Could not allocate message for StatusChanged signal", + G_STRFUNC); + g_array_free(statuschanged_signal_types, FALSE); + return; + } + + dbus_message_iter_init_append(msg, &iter); + value = TP_CONN_STATUS_DISCONNECTED; + dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &value); + value = TP_CONN_STATUS_REASON_NONE_SPECIFIED; + dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &value); + + /* TODO: It might be worth considering to setup/remove the array in + base_init/base_deinit to make it persist for the whole class */ + + if (statuschanged_signal_types) + { + g_array_insert_val(statuschanged_signal_types, 0, uint_type); + g_array_insert_val(statuschanged_signal_types, 1, uint_type); + } + else + { + g_warning("%s: Could not allocate array for StatusChanged types", + G_STRFUNC); + dbus_message_unref(msg); + return; + } + + g_signal_emit_by_name(DBUS_G_PROXY(conn), + TP_IFACE_CONN_SIGNAL_STATUSCHANGED_SYNTHESIZED, msg, + statuschanged_signal_types); + g_array_free(statuschanged_signal_types, TRUE); + dbus_message_unref(msg); +} diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-connmgr-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-connmgr-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:STRING,OBJECT,STRING (tp-connmgr-signals-marshal.list:1) */ +void +tp_connmgr_signals_marshal_VOID__STRING_OBJECT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_OBJECT_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__STRING_OBJECT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_OBJECT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_object (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-connmgr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-connmgr.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,217 @@ +/* tp-connmgr.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "tp-connmgr.h" +#include "tp-connmgr-signals-marshal.h" +#include "tp-conn.h" +#include "tp-helpers.h" + +#ifdef EMULATOR +#include "libtelepathy_wsd_solution.h" +#endif + +#ifdef EMULATOR + + GET_STATIC_VAR_FROM_TLS(parent_class,tp_connmgr,GObjectClass *) + #define parent_class (*GET_WSD_VAR_NAME(parent_class,tp_connmgr,s)()) + + GET_STATIC_VAR_FROM_TLS(type1,tp_connmgr,GType) + #define type1 (*GET_WSD_VAR_NAME(type1,tp_connmgr,s)()) +#else + static GObjectClass *parent_class = NULL; +#endif + + +static void _tp_connmgr_register_signal_marshallers() +{ + /* Register marshaller for the NewConnection signal */ + dbus_g_object_register_marshaller(tp_connmgr_signals_marshal_VOID__STRING_OBJECT_STRING, G_TYPE_NONE, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_INVALID); +} + +static void tp_connmgr_dispose(GObject *obj) +{ + TpConnMgr *self = TELEPATHY_CONNMGR(obj); + + if (self->first_run) + { + self->first_run = FALSE; + } + + /* Call the parent dispose method */ + if (G_OBJECT_CLASS(parent_class)->dispose) + { + G_OBJECT_CLASS(parent_class)->dispose(obj); + } + +} + + +static void tp_connmgr_finalize(GObject *obj) +{ + if(G_OBJECT_CLASS(parent_class)->finalize) + { + G_OBJECT_CLASS(parent_class)->finalize(obj); + } +} + + +static void tp_connmgr_init(GTypeInstance *instance, gpointer g_class) +{ + TpConnMgr *self = TELEPATHY_CONNMGR(instance); + + self->first_run = TRUE; +} + + +static void tp_connmgr_class_init(TpConnMgrClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + parent_class = g_type_class_peek_parent(klass); + + obj->set_property = parent_class->set_property; + obj->get_property = parent_class->get_property; + + obj->dispose = tp_connmgr_dispose; + obj->finalize = tp_connmgr_finalize; + + _tp_connmgr_register_signal_marshallers(); +} + + +GType tp_connmgr_get_type(void) +{ +#ifndef EMULATOR + static GType type1 = 0; +#endif + + if (type1 == 0) + { + static const GTypeInfo info = + { + sizeof(TpConnMgrClass), + NULL, + NULL, + (GClassInitFunc)tp_connmgr_class_init, + NULL, + NULL, + sizeof(TpConnMgr), + 0, + (GInstanceInitFunc)tp_connmgr_init + + }; + type1 = g_type_register_static(DBUS_TYPE_G_PROXY, + "TpConnMgr", &info, 0); + } + return type1; +} + + + + +#ifdef SYMBIAN +EXPORT_C +#endif +TpConnMgr *tp_connmgr_new(DBusGConnection *connection, + const char *bus_name, + const char *object_path, + const char *interface_name) +{ + TpConnMgr *obj; + g_return_val_if_fail(connection != NULL, NULL); + g_return_val_if_fail(bus_name != NULL, NULL); + g_return_val_if_fail(object_path, NULL); + g_return_val_if_fail(interface_name, NULL); + + obj = g_object_new(TELEPATHY_CONNMGR_TYPE, + "name", bus_name, + "path", object_path, + "interface", interface_name, + "connection", connection, NULL); + + dbus_g_proxy_add_signal(DBUS_G_PROXY(obj), + "NewConnection", + G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, + G_TYPE_STRING, G_TYPE_INVALID); + + return obj; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +TpConn *tp_connmgr_new_connection(TpConnMgr *self, + GHashTable *connection_parameters, + gchar *protocol) +{ + GError *error = NULL; + TpConn *tp_conn_obj = NULL; + DBusGConnection *connection = tp_get_bus (); + gchar *bus_name = NULL, *object_path = NULL; + g_return_val_if_fail(TELEPATHY_IS_CONNMGR(self), NULL); + g_return_val_if_fail(connection_parameters != NULL, NULL); + + /* Create the actual connection and acquire service and path + information that the TpConn object will need */ + + if (!tp_connmgr_request_connection(DBUS_G_PROXY(self), protocol, + connection_parameters, &bus_name, + &object_path, &error)) + { + g_warning("Connect() failed: %s\n", error -> message); + g_error_free(error); + return NULL; + } + + if (bus_name == NULL || object_path == NULL) + { + return NULL; + } + + /* Create the TpConn object */ + + tp_conn_obj = tp_conn_new(connection, bus_name, object_path); + + return tp_conn_obj; +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +gboolean tp_connmgr_list_protocols(TpConnMgr *self, char *** proto) +{ + GError *error = NULL; + + return dbus_g_proxy_call (DBUS_G_PROXY(self), "ListProtocols", &error, G_TYPE_INVALID, G_TYPE_STRV, proto, G_TYPE_INVALID); +} + + +#ifdef SYMBIAN +EXPORT_C +#endif +gboolean +tp_connmgr_get_parameters (TpConnMgr *self, const char * IN_proto, GPtrArray** OUT_arg1) + +{ + return dbus_g_proxy_call (DBUS_G_PROXY(self), "GetParameters", NULL, G_TYPE_STRING, IN_proto, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID)), OUT_arg1, G_TYPE_INVALID); +} + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-helpers.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-helpers.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,292 @@ +/* + * tp-helpers.c - Source for various helper functions + * for telepathy implementation + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "tp-helpers.h" + + +#define CM_CONFS_DIR "/usr/share/telepathy/managers/" +#define CM_CONF_SUFFIX ".manager" +#define CM_CONF_GROUP "ConnectionManager" +#define FILE_SEPARATOR ',' +#define PROTO "Proto " + + +#ifdef EMULATOR +#include "libtelepathy_wsd_solution.h" +#endif + +#ifdef EMULATOR + + GET_STATIC_VAR_FROM_TLS(bus_proxy,tp_helpers,DBusGProxy *) + #define bus_proxy (*GET_WSD_VAR_NAME(bus_proxy,tp_helpers,s)()) + + GET_STATIC_VAR_FROM_TLS(bus1,tp_helpers,DBusGConnection *) + #define bus1 (*GET_WSD_VAR_NAME(bus1,tp_helpers,s)()) + +#endif + +static void _list_builder(gpointer key, gpointer value, gpointer data); + +DBusGConnection * +tp_get_bus () +{ +#ifndef EMULATOR + static DBusGConnection *bus1 = NULL; +#endif + + + if (bus1 == NULL) + { + GError *error = NULL; + + bus1 = dbus_g_bus_get (/*DBUS_BUS_STARTER*/DBUS_BUS_SESSION, &error); + + if (bus1 == NULL) + g_error ("Failed to connect to starter bus: %s", error->message); + } + + return bus1; +} + +DBusGProxy * +tp_get_bus_proxy () +{ +#ifndef EMULATOR + static DBusGProxy *bus_proxy = NULL; +#endif + + if (bus_proxy == NULL) + { + DBusGConnection *bus = tp_get_bus (); + + bus_proxy = dbus_g_proxy_new_for_name (bus, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + + if (bus_proxy == NULL) + g_error ("Failed to get proxy object for bus."); + } + + return bus_proxy; +} + +GSList * +tp_hash_to_key_value_list(GHashTable *hash) +{ + GSList *ret = NULL; + g_hash_table_foreach(hash, _list_builder, &ret); + return ret; +} + +void +tp_key_value_list_free(GSList *list) +{ + GSList *iter; + + for (iter = list; iter; iter = g_slist_next(iter)) + { + g_free(iter->data); + } + g_slist_free(list); +} + +static void _list_builder(gpointer key, gpointer value, gpointer data) +{ + GSList **list = (GSList **)data; + TpKeyValue *kv = g_new0(TpKeyValue, 1); + kv->key = key; + kv->value = value; + *list = g_slist_prepend(*list, kv); +} + +GSList *tp_connmgr_list_cms(void) +{ + GError *error = NULL; + GDir *dir; + const gchar *filename; + gchar **name; + gchar *absolute_filepath; + GSList *cms = NULL; + + + /* Read the configuration file directory */ + if ((dir = g_dir_open(CM_CONFS_DIR, 0, &error)) == NULL) + { + g_printerr("Error opening directory %s: %s", CM_CONFS_DIR, + error->message); + return NULL; + } + + while ((filename = g_dir_read_name(dir)) != NULL) + /* Skip the file if it doesn't contain the required file suffix */ + if (g_str_has_suffix(filename, CM_CONF_SUFFIX)) + { + absolute_filepath = g_strconcat(CM_CONFS_DIR, filename, NULL); + name = g_strsplit(filename, ".", 0); + cms = g_slist_append(cms, *name); + } + + return cms; +} + +TpConnMgrInfo *tp_connmgr_get_info(gchar *cm) +{ + GError *error = NULL; + GKeyFile *file; + gsize len; + gchar *absolute_filepath; + gchar **protocols; + TpConnMgrInfo *cm_info = (TpConnMgrInfo *)malloc(sizeof(TpConnMgrInfo)); + cm_info->protocol_info = g_hash_table_new(g_str_hash, g_str_equal); + + absolute_filepath = g_strconcat(CM_CONFS_DIR, cm, CM_CONF_SUFFIX, NULL); + + file = g_key_file_new(); + if (!g_key_file_load_from_file + (file, absolute_filepath, G_KEY_FILE_NONE, &error)) + { + /* handle error */ + g_printerr("%s", error->message); + g_error_free(error); + return NULL; + } + g_key_file_set_list_separator(file, FILE_SEPARATOR); + + cm_info->name = g_key_file_get_string(file, CM_CONF_GROUP, + "Name", &error); + if (!(cm_info->name)) + { + /* handle error and free dynamic memory */ + g_printerr("%s", error->message); + g_error_free(error); + g_key_file_free(file); + g_free(absolute_filepath); + free(cm_info); + return NULL; + } + cm_info->bus_name = g_key_file_get_string(file, CM_CONF_GROUP, + "BusName", &error); + if (!(cm_info->bus_name)) + { + /* handle error and free dynamic memory */ + g_printerr("%s", error->message); + g_error_free(error); + g_key_file_free(file); + g_free(absolute_filepath); + g_free(cm_info->name); + free(cm_info); + return NULL; + } + cm_info->object_path = g_key_file_get_string(file,CM_CONF_GROUP, + "ObjectPath", &error); + if (!(cm_info->object_path)) + { + /* handle error and free dynamic memory */ + g_printerr("%s", error->message); + g_error_free(error); + g_key_file_free(file); + g_free(absolute_filepath); + g_free(cm_info->name); + g_free(cm_info->bus_name); + free(cm_info); + return NULL; + } + cm_info->protocols = g_key_file_get_string_list(file, CM_CONF_GROUP, + "Protos", &len, &error); + if (!(cm_info->protocols)) + { + /* handle error and free dynamic memory */ + g_printerr("%s", error->message); + g_error_free(error); + g_key_file_free(file); + g_free(absolute_filepath); + g_free(cm_info->name); + g_free(cm_info->bus_name); + g_free(cm_info->object_path); + free(cm_info); + return NULL; + } + + for(protocols=cm_info->protocols; *protocols; protocols++) + { + gchar **keys; + gchar *key_value; + gchar *proto_group = g_strconcat(PROTO, *protocols, NULL); + TpConnMgrProtInfo *cm_prot_info = + (TpConnMgrProtInfo *)malloc(sizeof(TpConnMgrProtInfo)); + cm_prot_info->default_params = g_hash_table_new(g_str_hash, g_str_equal); + + cm_prot_info->mandatory_params = g_key_file_get_string_list(file, + proto_group, "MandatoryParams", &len, &error); + if (!(cm_prot_info->mandatory_params)) + { + g_printerr("%s", error->message); + g_error_free(error); + } + cm_prot_info->optional_params = g_key_file_get_string_list(file, + proto_group, "OptionalParams", &len, &error); + if (!(cm_prot_info->optional_params)) + { + g_printerr("%s", error->message); + g_error_free(error); + } + + keys = g_key_file_get_keys (file, proto_group, &len, &error); + if (!(keys)) + { + g_printerr("%s", error->message); + g_error_free(error); + } + else + { + for(; *keys; keys++) + { + if(g_str_has_prefix(*keys, "default")) + { + key_value = g_key_file_get_string(file, proto_group, + *keys, &error); + if (!(key_value)) + { + g_printerr("%s", error->message); + g_error_free(error); + } + else + g_hash_table_insert(cm_prot_info->default_params, + g_strdup(*keys), key_value); + } + } + } + + + g_hash_table_insert(cm_info->protocol_info, g_strdup(*protocols), + cm_prot_info); + + } + + g_key_file_free(file); + g_free(absolute_filepath); + return cm_info; + +} diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-ifaces-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-ifaces-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,591 @@ +/* + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,STRING (tp-ifaces-signals-marshal.list:3) */ +void +tp_ifaces_signals_marshal_VOID__UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_STRING) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + data2); +} + +/* VOID:UINT,BOXED,BOXED (tp-ifaces-signals-marshal.list:5) */ +void +tp_ifaces_signals_marshal_VOID__UINT_BOXED_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_BOXED_BOXED) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_BOXED_BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_BOXED_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_boxed (param_values + 3), + data2); +} + +/* VOID:STRING (tp-ifaces-signals-marshal.list:7) */ + +/* VOID:INT,BOXED (tp-ifaces-signals-marshal.list:11) */ +void +tp_ifaces_signals_marshal_VOID__INT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT_BOXED) (gpointer data1, + gint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__INT_BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__INT_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + data2); +} + + +/* VOID:STRING,BOXED (tp-ifaces-signals-marshal.list:11) */ +//Added for search +void +tp_ifaces_signals_marshal_VOID__UINT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_BOXED) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + data2); +} + +/* VOID:UINT (tp-ifaces-signals-marshal.list:13) */ + +/* VOID:UINT,STRING,STRING (tp-ifaces-signals-marshal.list:15) */ +void +tp_ifaces_signals_marshal_VOID__UINT_STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_STRING_STRING) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_STRING_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_STRING_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + +/* VOID:UINT,UINT,UINT (tp-ifaces-signals-marshal.list:17) */ +void +tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + data2); +} + +/* VOID:BOOLEAN (tp-ifaces-signals-marshal.list:19) */ + +/* VOID:UINT,UINT,UINT,UINT,UINT,STRING (tp-ifaces-signals-marshal.list:21) */ +void +tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + guint arg_4, + guint arg_5, + gpointer arg_6, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 7); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_uint (param_values + 4), + g_marshal_value_peek_uint (param_values + 5), + g_marshal_value_peek_string (param_values + 6), + data2); +} + +/* VOID:UINT,UINT,STRING (tp-ifaces-signals-marshal.list:23) */ +void +tp_ifaces_signals_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + +/* VOID:UINT,UINT (tp-ifaces-signals-marshal.list:27) */ +void +tp_ifaces_signals_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + +/* VOID:STRING,BOXED,BOXED,BOXED,BOXED,UINT,UINT (tp-ifaces-signals-marshal.list:29) */ +void +tp_ifaces_signals_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer arg_5, + guint arg_6, + guint arg_7, + gpointer data2); + register GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 8); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_boxed (param_values + 3), + g_marshal_value_peek_boxed (param_values + 4), + g_marshal_value_peek_boxed (param_values + 5), + g_marshal_value_peek_uint (param_values + 6), + g_marshal_value_peek_uint (param_values + 7), + data2); +} + +/* VOID:BOXED (tp-ifaces-signals-marshal.list:33) */ + +/* VOID:UINT,UINT,UINT,STRING (tp-ifaces-signals-marshal.list:35) */ +void +tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_string (param_values + 4), + data2); +} + +/* VOID:OBJECT,STRING (tp-ifaces-signals-marshal.list:37) */ +void +tp_ifaces_signals_marshal_VOID__OBJECT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + data2); +} + +void +tp_ifaces_signals_marshal_VOID__UINT_STRING_BOXED_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_STRING_BOXED_STRING) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_VOID__UINT_STRING_BOXED_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_STRING_BOXED_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_boxed (param_values + 3), + g_marshal_value_peek_string (param_values + 4), + data2); +} + diff -r 000000000000 -r d0f3a028347a libtelepathy/src/tp-props-iface.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/src/tp-props-iface.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,653 @@ +/* tp-props-iface.c + * + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include "tp-interfaces.h" +#include "tp-ifaces-signals-marshal.h" +#include "tp-props-iface-gen.h" +#include "tp-props-iface.h" + +#ifdef EMULATOR +#include "libtelepathy_wsd_solution.h" +#endif + + +#define TP_TYPE_PROPERTY_DESCRIPTION (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_STRING, \ + G_TYPE_UINT, \ + G_TYPE_INVALID)) + +#define TP_TYPE_PROPERTY_CHANGE (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_VALUE, \ + G_TYPE_INVALID)) + +#define TP_TYPE_PROPERTY_FLAGS_CHANGE (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_INVALID)) + + + + +/*signal enum*/ +enum +{ + PROPERTIES_READY, + PROPERTY_CHANGED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_TP_PROPS_IFACE +#endif + +}; + +#ifndef EMULATOR + static guint signals[LAST_SIGNAL] = {0}; +#endif + +/* looking up properties is linear time on the grounds that number of properties + * will always be small, so this will be more cache-friendly + */ +typedef struct _PropertyMapping PropertyMapping; +struct _PropertyMapping +{ + guint user_id; + guint32 server_id; + gchar *name; + GValue *value; + guint32 flags; +}; + +typedef struct _TpPropsPrivate TpPropsPrivate; + +struct _TpPropsPrivate +{ + gboolean properties_ready; + + int mappings_len; + PropertyMapping *mappings; +}; + +#ifndef EMULATOR + static GObjectClass *parent_class = NULL; +#endif + + +#ifdef EMULATOR + + GET_STATIC_ARRAY_FROM_TLS(signals,tp_props_iface,guint) + #define signals (GET_WSD_VAR_NAME(signals,tp_props_iface, s)()) + + GET_STATIC_VAR_FROM_TLS(parent_class,tp_props_iface,GObjectClass *) + #define parent_class (*GET_WSD_VAR_NAME(parent_class,tp_props_iface,s)()) + + GET_STATIC_VAR_FROM_TLS(type1,tp_props_iface,GType) + #define type1 (*GET_WSD_VAR_NAME(type1,tp_props_iface,s)()) + + GET_STATIC_VAR_FROM_TLS(ret,tp_props_iface,GQuark) + #define ret (*GET_WSD_VAR_NAME(ret,tp_props_iface,s)()) + +#endif + + +#define PRIV(o) ((TpPropsPrivate*)(o->priv)) + +static void properties_listed_cb (DBusGProxy *proxy, GPtrArray *properties, GError *error, gpointer user_data); + +static void tp_props_iface_init(GTypeInstance *instance, gpointer g_class) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE(instance); + + self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), + TELEPATHY_PROPS_IFACE_TYPE, TpPropsPrivate); + +} + +static GObject * +tp_props_iface_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + + obj = G_OBJECT_CLASS (parent_class)-> + constructor (type, n_props, props); + + dbus_g_proxy_add_signal(DBUS_G_PROXY(obj), "PropertiesChanged", + dbus_g_type_get_collection ("GPtrArray", TP_TYPE_PROPERTY_CHANGE), + G_TYPE_INVALID); + dbus_g_proxy_add_signal(DBUS_G_PROXY(obj), "PropertyFlagsChanged", + dbus_g_type_get_collection ("GPtrArray", TP_TYPE_PROPERTY_FLAGS_CHANGE), + G_TYPE_INVALID); + + return obj; +} + +static void tp_props_iface_dispose(GObject *obj) +{ + + /* Call parent class dispose method */ + if (G_OBJECT_CLASS(parent_class)->dispose) + { + G_OBJECT_CLASS(parent_class)->dispose(obj); + } + +} + + +static void tp_props_iface_finalize(GObject *obj) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE(obj); + int i; + for (i=0; i < PRIV(self)->mappings_len; i++) + { + if (PRIV(self)->mappings[i].value) + { + g_value_unset (PRIV(self)->mappings[i].value); + g_free (PRIV(self)->mappings[i].value); + } + if (PRIV(self)->mappings[i].name) + g_free (PRIV(self)->mappings[i].name); + } + + g_free (PRIV(self)->mappings); + + if (G_OBJECT_CLASS(parent_class)->finalize) + { + G_OBJECT_CLASS(parent_class)->finalize(obj); + } +} + + +static void tp_props_iface_class_init(TpPropsIfaceClass *klass) +{ + GObjectClass *obj = G_OBJECT_CLASS(klass); + parent_class = g_type_class_peek_parent(klass); + + obj->set_property = parent_class->set_property; + obj->get_property = parent_class->get_property; + + obj->constructor = tp_props_iface_constructor; + obj->dispose = tp_props_iface_dispose; + obj->finalize = tp_props_iface_finalize; + + g_type_class_add_private (klass, sizeof (TpPropsPrivate)); + /** + * TpPropsIface::properties-ready: + * @self: #TpPropsIface that emmitted the signal + * @property_id: property that changed + * @change_flags: #TpPropsChanged for what changed on the property + * + * This signal is emitted when the properties 1st become avaible for + * reading or writing. + */ + + signals[PROPERTIES_READY] = + g_signal_new ("properties-ready", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + + + /** + * TpPropsIface::properties-changed: + * @self: #TpPropsIface that emmitted the signal + * @property_id: property that changed + * @change_flags: #TpPropsChanged for what changed on the property + * + * This signal is emitted when a property changes. + */ + + signals[PROPERTY_CHANGED] = + g_signal_new ("properties-changed", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + tp_ifaces_signals_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + + /* register marshaller for PropertiesChanged and PropertyFlagsChanged*/ + dbus_g_object_register_marshaller(tp_ifaces_signals_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); + +} + +#ifdef SYMBIAN +EXPORT_C +#endif +GType tp_props_iface_get_type(void) +{ +#ifndef EMULATOR + static GType type1 = 0; +#endif + + if (type1 == 0) + { + static const GTypeInfo info = + { + sizeof(TpPropsIfaceClass), + NULL, + NULL, + (GClassInitFunc)tp_props_iface_class_init, + NULL, + NULL, + sizeof(TpPropsIface), + 0, + (GInstanceInitFunc)tp_props_iface_init + }; + type1 = g_type_register_static(DBUS_TYPE_G_PROXY, + "TpPropsIface", &info, 0); + } + return type1; +} + +/* The interface name getters */ +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark +tp_get_props_interface (void) +{ +#ifndef EMULATOR + static GQuark ret = 0; +#endif + + if (ret == 0) + { + ret = g_quark_from_static_string(TP_IFACE_PROPERTIES); + } + + return ret; +} + +TpPropsIface * +tp_props_iface_new (DBusGConnection *connection, + const char *name, + const char *path_name) +{ + /* The properties are order dependant in dbus <= 0.61. Thanks dbus*/ + return g_object_new (TELEPATHY_PROPS_IFACE_TYPE, + "name", name, + "path", path_name, + "interface",TP_IFACE_PROPERTIES, + "connection", connection, + NULL); +} + +static void properties_changed_cb (DBusGProxy *proxy, GPtrArray *properties, gpointer user_data); +static void property_flags_changed_cb (DBusGProxy *proxy, GPtrArray *properties, gpointer user_data); + +/** + * tp_props_iface_set_mapping: + * @iface: #TpPropsIface on which to set mapping + * @first_name: First name in list to set a mapping for + * + * Set a mapping between propery names and your chosen ID's for these + * names. Takes a list of property name, id pairs, terminated by NULL. + * + * Typically the user will define an enum of properties that they're + * interested in, and set a mapping like: + * tp_props_iface_set_mapping (props, "foo", FOO, + * "bar", BAR, + * "baz", BAZ, + * NULL); + * the user should bind to the + * properties-ready signal + * before calling this. Property queries will only be possible *after* this + * signal has been emitted. + */ +void tp_props_iface_set_mapping (TpPropsIface *self, + const gchar *first_property_name, + ...) +{ + va_list var_args; + const gchar *name = first_property_name; + guint id; + GArray *array; + PropertyMapping map = {0,0,NULL,NULL,0}; + + g_return_if_fail (TELEPATHY_IS_PROPS_IFACE (self)); + g_return_if_fail (PRIV(self)->mappings == NULL); + + va_start (var_args, first_property_name); + + array = g_array_new (FALSE, FALSE, sizeof (PropertyMapping)); + + while (name) + { + id = va_arg (var_args, guint); + map.user_id = id; + map.name = g_strdup (name); + g_array_append_val (array, map); + name = va_arg (var_args, gchar *); + } + + va_end (var_args); + + PRIV (self)->mappings_len = array->len; + PRIV (self)->mappings = (PropertyMapping*) g_array_free (array, FALSE); + + dbus_g_proxy_connect_signal (DBUS_G_PROXY (self), "PropertiesChanged", + G_CALLBACK(properties_changed_cb), self, NULL); + dbus_g_proxy_connect_signal (DBUS_G_PROXY (self), "PropertyFlagsChanged", + G_CALLBACK(property_flags_changed_cb), + self, NULL); + + tp_props_iface_list_properties_async (DBUS_G_PROXY (self), + properties_listed_cb, self); +} + +/** + * tp_props_iface_get_value: + * @self: #TpPropsIface on which to get a property value + * @prop_id: Identifier for property as set in #tp_props_iface_set_mapping + * @value: GValue to return the property's value in. + * + * Get the value of a property on this interface + */ +gboolean tp_props_iface_get_value (TpPropsIface* self, guint prop_id, + GValue *return_value) +{ + int i; + + if (!PRIV (self)->properties_ready) + return FALSE; + + for (i = 0; i < PRIV (self)->mappings_len; i++) + { + if (PRIV (self)->mappings[i].user_id == prop_id) + { + if (PRIV (self)->mappings[i].value) + { + g_value_copy (PRIV (self)->mappings[i].value, return_value); + return TRUE; + } + else + { + return FALSE; + } + } + } + + return FALSE; +} + +/* dummy callback handler for async calling calls with no return values */ +static void +dummy_callback (DBusGProxy *proxy, GError *error, gpointer user_data) +{ + if (error) + { + g_warning ("%s calling %s", error->message, (char*)user_data); + g_error_free (error); + } +} + +/** + * tp_props_iface_set_value: + * @self: #TpPropsIface on which to set a property value + * @prop_id: Identifier for property as set in #tp_props_iface_set_mapping + * @value: GValue to use to set the property's value + * + * Set the value of a property on this interface + */ +gboolean tp_props_iface_set_value (TpPropsIface* self, guint prop_id, + const GValue *value) +{ + /*TODO add option for an error callback*/ + int i; + GPtrArray *props; + + if (!PRIV(self)->properties_ready) + return FALSE; + + for (i=0; i < PRIV(self)->mappings_len; i++) + { + if (PRIV(self)->mappings[i].user_id == prop_id) + { + GValue prop = {0,}; + g_value_init (&prop, TP_TYPE_PROPERTY_CHANGE); + g_value_take_boxed (&prop, + dbus_g_type_specialized_construct (TP_TYPE_PROPERTY_CHANGE)); + + dbus_g_type_struct_set (&prop, + 0, PRIV(self)->mappings[i].server_id, + 1, value, + G_MAXUINT); + + props = g_ptr_array_sized_new (1); + g_ptr_array_add (props, g_value_get_boxed (&prop)); + tp_props_iface_set_properties_async (DBUS_G_PROXY(self), props, + dummy_callback, "SetProperties"); + g_value_unset (&prop); + g_ptr_array_free (props, TRUE); + return TRUE; + } + } + return FALSE; +} + + +static void +set_properties_values (TpPropsIface *self, GPtrArray *properties) +{ + int i,j; + + for (i = 0; i < properties->len; i++) + { + GValue property = {0}; + guint32 id; + GValue *value; + + g_value_init (&property, TP_TYPE_PROPERTY_CHANGE); + g_value_set_static_boxed (&property, g_ptr_array_index (properties, i)); + dbus_g_type_struct_get (&property, 0, &id, G_MAXUINT); + + for (j = 0; j < PRIV(self)->mappings_len; j++) + { + PropertyMapping *mapping = &(PRIV (self)->mappings[j]); + + if (mapping->server_id == id) + { + dbus_g_type_struct_get (&property, 1, &value, G_MAXUINT); + g_assert (value); + + if (mapping->value) + { + g_value_unset (mapping->value); + g_free (mapping->value); + } + + mapping->value = value; + value = NULL; /* just to be on the safe side... */ + + if (PRIV (self)->properties_ready) + g_signal_emit (self, signals[PROPERTY_CHANGED], 0, + mapping->user_id, TP_PROPS_CHANGED_VALUE); + + break; + } + } + } + +} + +static void +properties_changed_cb (DBusGProxy *proxy, GPtrArray *properties, + gpointer user_data) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE (user_data); + if (!PRIV(self)->properties_ready) + return; + set_properties_values (self, properties); +} + +static void +properties_got_cb (DBusGProxy *proxy, GPtrArray *properties, GError *error, gpointer user_data) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE (user_data); + + if (error) + { + g_debug ("getting properties failed: %s (%s)", error->message, + dbus_g_error_get_name (error)); + g_error_free (error); + return; + } + + set_properties_values (self, properties); + + if (!PRIV (self)->properties_ready) + { + PRIV (self)->properties_ready = TRUE; + g_signal_emit (self, signals[PROPERTIES_READY], 0); + } +} + +static void +property_flags_changed_cb (DBusGProxy *proxy, GPtrArray *properties, + gpointer user_data) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE (user_data); + GArray *get_props; + int i, j; + + if (!PRIV(self)->properties_ready) + return; + + get_props = g_array_sized_new (FALSE, FALSE, sizeof (guint32), + properties->len); + + for (i = 0; i < properties->len; i++) + { + GValue property = {0}; + guint32 id, flags; + + g_value_init (&property, TP_TYPE_PROPERTY_CHANGE); + g_value_set_static_boxed (&property, g_ptr_array_index (properties, i)); + dbus_g_type_struct_get (&property, 0, &id, G_MAXUINT); + + for (j = 0; j < PRIV (self)->mappings_len; j++) + { + PropertyMapping *mapping = &(PRIV (self)->mappings[j]); + + if (mapping->server_id == id) + { + dbus_g_type_struct_get (&property, 1, &flags, G_MAXUINT); + + if (!(mapping->flags & TP_PROPERTY_FLAG_READ) && + flags & TP_PROPERTY_FLAG_READ) + /* property has become readable; fetch it */ + g_array_append_val (get_props, mapping->server_id); + + mapping->flags = flags; + g_signal_emit (self, signals[PROPERTY_CHANGED], 0, + mapping->user_id, TP_PROPS_CHANGED_FLAGS); + break; + } + } + } + + tp_props_iface_get_properties_async (DBUS_G_PROXY (self), get_props, + properties_got_cb, self); + g_array_free (get_props, TRUE); +} + +static void +properties_listed_cb (DBusGProxy *proxy, GPtrArray *properties, GError *error, gpointer user_data) +{ + TpPropsIface *self = TELEPATHY_PROPS_IFACE (user_data); + int i,j; + guint32 id, flags; + gchar *name; + GArray *get_props; + + if (error) + { + g_debug ("listing properties failed: %s (%s)", error->message, + dbus_g_error_get_name (error)); + g_error_free (error); + return; + } + + for (i = 0; i < properties->len; i++) + { + GValue property = {0}; + g_value_init (&property, TP_TYPE_PROPERTY_DESCRIPTION); + g_value_set_static_boxed (&property, g_ptr_array_index (properties, i)); + + dbus_g_type_struct_get (&property, + 0, &id, + 1, &name, + 3, &flags, + G_MAXUINT); + + for (j = 0; j < PRIV (self)->mappings_len; j++) + { + if (0 == strcmp (PRIV (self)->mappings[j].name, name)) + { + PRIV (self)->mappings[j].server_id = id; + PRIV (self)->mappings[j].flags = flags; + } + } + + g_free (name); + } + + get_props = g_array_sized_new (FALSE, FALSE, sizeof (guint32), + properties->len); + + for (i = 0; i < PRIV(self)->mappings_len; i++) + { + PropertyMapping *mapping = &(PRIV(self)->mappings[i]); + + if (mapping->flags & TP_PROPERTY_FLAG_READ) + g_array_append_val (get_props, mapping->server_id); + } + + tp_props_iface_get_properties_async (DBUS_G_PROXY (self), get_props, + properties_got_cb, self); + g_array_free (get_props, TRUE); +} + +void +tp_props_interface_set_signatures (DBusGProxy *proxy) +{ + dbus_g_proxy_add_signal(proxy, "PropertiesChanged", + dbus_g_type_get_collection ("GPtrArray", + dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, + G_TYPE_VALUE, G_TYPE_INVALID)), + G_TYPE_INVALID); + dbus_g_proxy_add_signal(proxy, "PropertyFlagsChanged", + dbus_g_type_get_collection ("GPtrArray", + dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, + G_TYPE_UINT, G_TYPE_INVALID)), + G_TYPE_INVALID); +} + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/bmarm/telepathygabbletest.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/bmarm/telepathygabbletest.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1 @@ + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/bmarm/telepathygabbletestu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/bmarm/telepathygabbletestu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1 @@ + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/bwins/telepathygabbletest.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/bwins/telepathygabbletest.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1 @@ + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/bwins/telepathygabbletestu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/bwins/telepathygabbletestu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,7 @@ +EXPORTS + ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &) + tp_chan_type_text_send_async @ 2 NONAME + tp_chan_type_search_async @ 3 NONAME + tp_chan_type_search_get_search_keys_async @ 4 NONAME + tp_chan_type_search_get_search_state_async @ 5 NONAME + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/conf/telepathygabbletest.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/conf/telepathygabbletest.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,409 @@ +// Definitions +[Define] +SERVER_GIZMO chat.gizmoproject.com +SSL_FLAG_GIZMO 0 +USERNAME_GIZMO testlmnokia@chat.gizmoproject.com +PASSWORD_GIZMO loudmouth +RESOURCE mytptestresource_another1 +PROXY_SERVER 172.16.42.135 +//PROXY_SERVER 172.16.9.181 +//PROXY_SERVER 172.16.9.103 +PROXY_PORT 8080 +PORT 443 +//PORT_INVALID 4430 + +//EMPTYCONTACT Emptycontact@chat.gizmoproject.com +//EMPTYPASSWORD test + + +//KEY-VALUES for search with gizmo +KEY_FIRST_INVALID xmpp_user_invalid +VALUE_FIRST_INVALID rak* + +KEY_ANY_INVALID first_name_invalid +VALUE_ANY rakesh +KEY_FIRST first_name +VALUE_FIRST rakesh +VALUE_FIRST_WILDCHAR_1 r* +VALUE_FIRST_WILDCHAR_2 *r* +KEY_LAST last_name +VALUE_LAST b +KEY_CITY city +VALUE_CITY moneteau +KEY_COUNTRY country +VALUE_COUNTRY india +KEY_STATE state +VALUE_STATE SP +KEY_ACCOUNTNAME xmpp_user +VALUE_ACCOUNTNAME rakeshongizmo +KEY_EMAIL email_address +VALUE_EMAIL r*@chat.gizmoproject.com +VALUE_ALL_KEYS a +VALUE_FIRST_NAME_MAX abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx +VALUE_FIRST_SPECIAL_CHAR a_b&c#2^!abc + +//own name as the receipient +OWN_RECIPIENT_GIZMO testlmnokia@chat.gizmoproject.com + +//invalied username +USERNAME_INVALID_GIZMO abcd_ad@chat.gizmoproject.com +USERNAME_SPL_CHRS_GIZMO abcd_2@chat.gizmoproject.com + +//invalid passwd +PASSWORD_INVALID abcd_gh1_2_pwd + +//invalid server +BADSERVER talktalk.gooooogle.com + + +//contact not there in the contact list +RECIPIENT_NOT_CONTACT_GTALK usernotincontactlist@gmail.com +RECIPIENT_ALREADYADDED_GTALK testcm6@gmail.com + +//RECIPIENT testlmnokia@chat.gizmoproject.com +RECIPIENT testcm6@gmail.com +//RECIPIENT voting@chat.gizmoproject.com + +//contact in the friend list +RECIPIENT_FRIEND testgb123@gmail.com +RECIPIENT_INVALID a_b@chat.gizmoproject.com +RECIPIENT_SPL_CHRS a$$b@chat.gizmoproject.com + +MESSAGE Hello +MESSAGE_SPL_CHARS ab$$&&()!@#%*~`?<>,./\[]{}1234 +REPEATED_MESSAGE ThisIsTestForRepeatedMessage +MESSAGE_EMOTICONS :-) + + +//GTalk Server Settings +SERVER_GTALK talk.google.com +SSL_FLAG_GTALK 1 +USERNAME_GTALK testgb123@gmail.com +PASSWORD_GTALK testgb1234 +OWN_RECIPIENT_GTALK testgb123@gmail.com +OWN_RECIPIENT_GTALK_WITH_RESOURCE testgb123@gmail.com/mytptestresource_another1 +RECIPIENT_INVALID_GTALK a_b@gmail.com +DELETE_INVALID_GTALK usernotincontactlist_123@gmail.com +RECIPIENT_GTALK testcm6@gmail.com +RECIPIENT_GTALK_SEND_MSG testcm6@gmail.com +//RECIPIENT_GTALK_SEND_MSG lalita.kapur@gmail.com +RECIPIENT_OFFLINE_GTALK userIDWithZeroContact@gmail.com + +//TODO: Check the Max/Min length of userid +//min len - 6 chars in gtalk +//max len - 30 chars in gtalk +MAXLENGTH_USERID abcd123456abcd123456abcd123456@gmail.com +MINLENGTH_USERID ab123d@gmail.com +MAXMINLEN_PWD nokia123 +USERNAMEWITHZEROCONTACT UserWithZeroContact@gmail.com +USERNAMEWITHZEROCONTACT_PWD UserWithZeroContact123 +USERNAME_INVALID_GTALK abcd_ad@gmail.com +USERNAME_SPL_CHRS_GTALK abcd_2@gmail.com +RECIPIENT_SPL_CHRS_GTALK a$$b@gmail.com + +USERNAMEWITHZEROCONTACT_GTALK userIDWithZeroContact@gmail.com +PWDWITHZEROCONTACT_GTALK userIDWithZeroContact123 + +USERALREADYDELETED_GTALK UserAlreadyDeleted@gmail.com + +[Enddefine] + +// Login related test cases +[Test] +title Login Test +create TelepathyGabbleTest TgObj +TgObj LoginTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +// Logout related test cases +[Test] +title Logout Test +create TelepathyGabbleTest TgObj +TgObj LogoutTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with invalid userid +[Test] +title LoginInvalidUserid Test +create TelepathyGabbleTest TgObj +TgObj LoginInvalidUseridTest SERVER_GTALK USERNAME_INVALID_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with invalid passwd +[Test] +title LoginInvalidPasswd Test +create TelepathyGabbleTest TgObj +TgObj LoginInvalidPasswdTest SERVER_GTALK USERNAME_GTALK PASSWORD_INVALID RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with invalid userid and passwd test +[Test] +title LoginInvalidUseridPasswd Test +create TelepathyGabbleTest TgObj +TgObj LoginInvalidUseridPasswdTest SERVER_GTALK USERNAME_INVALID_GTALK PASSWORD_INVALID RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with blank userid and correct passwd +[Test] +title LoginblankUserid Test +create TelepathyGabbleTest TgObj +TgObj LoginblankUseridTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with correct userid and blank passwd +[Test] +title LoginblankPasswd Test +create TelepathyGabbleTest TgObj +TgObj LoginblankPasswdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//login with blank userid and blank passwd +[Test] +title LoginblankUseridblankPasswd Test +create TelepathyGabbleTest TgObj +TgObj LoginblankUseridblankPasswdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with maxlength userid +[Test] +title LoginWithMaxLengthUserID Test +create TelepathyGabbleTest TgObj +TgObj LoginWithMaxLengthUserIDTest SERVER_GTALK MAXLENGTH_USERID MAXMINLEN_PWD RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with minlength userid +[Test] +title LoginWithMinLengthUserID Test +create TelepathyGabbleTest TgObj +TgObj LoginWithMinLengthUserIDTest SERVER_GTALK MINLENGTH_USERID MAXMINLEN_PWD RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//login with special chars in the user name +[Test] +title LoginUseridWithSplChrs Test +create TelepathyGabbleTest TgObj +TgObj LoginUseridWithSplChrsTest SERVER_GTALK USERNAME_SPL_CHRS_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Cancel login test +[Test] +title LoginCancel Test +create TelepathyGabbleTest TgObj +TgObj LoginCancelTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +// Send Message related test case +[Test] +title SendMesasge Test +create TelepathyGabbleTest TgObj +TgObj SendMessageTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +// Send Message to a contact with Max Length UserId +// Check if this will pass or not +[Test] +title SendMesasgeToMaxLengthUserID Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgeToMaxLengthUserIDTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK MAXLENGTH_USERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//Send Message to offline contact +[Test] +title SendMesasgetoofflinecontact Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgetoofflinecontactTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_OFFLINE_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +// Send Message 400 characters related test case +[Test] +title SendMesasgeWith400 Test +create TelepathyGabbleTest TgObj +TgObj SendMessageWith400Test SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +// Send Message blank characters related test case +[Test] +title SendMesasgeBlank Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgeBlankTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + + +// SendMesasgeToBlankUserIdTest +[Test] +title SendMesasgeToBlankUserIdTest Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgeToBlankUserIdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//SendMessage special +[Test] +title SendMesasgeSplChars Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgeSplCharsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE_SPL_CHARS RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//SendMessage emoticons +[Test] +title SendMesasgeEmoticons Test +create TelepathyGabbleTest TgObj +TgObj SendMesasgeEmoticonsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG MESSAGE_EMOTICONS RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Send Repeated Messages +[Test] +title SendMessageRepeated Test +create TelepathyGabbleTest TgObj +TgObj SendMessageRepeatedTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK_SEND_MSG REPEATED_MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//SendMessage to user who is not a contact +[Test] +title SendMessagetoUserNotInContactList Test +create TelepathyGabbleTest TgObj +TgObj SendMessagetoUserNotInContactListTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_NOT_CONTACT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//SendMessage to Invalid user_id +[Test] +title SendMessagetoinvalidUserid Test +create TelepathyGabbleTest TgObj +TgObj SendMessagetoinvalidUseridTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_INVALID_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//Add Contact test +[Test] +title AddContact Test +create TelepathyGabbleTest TgObj +TgObj AddContactTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Add Contact with Max length UserId test +[Test] +title AddContactWithMaxLengthUserId Test +create TelepathyGabbleTest TgObj +TgObj AddContactWithMaxLengthUserIdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK MAXLENGTH_USERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Add Contact with blank userid +[Test] +title AddContactWithBlankUserId Test +create TelepathyGabbleTest TgObj +TgObj AddContactWithBlankUserIdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//Add Invalid Contact test +[Test] +title AddContactinvalid Test +create TelepathyGabbleTest TgObj +TgObj AddContactinvalidTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_INVALID_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Add Invalid Contact with special characters test +[Test] +title AddContactinvalidWithSplChars Test +create TelepathyGabbleTest TgObj +TgObj AddContactinvalidWithSplCharsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_SPL_CHRS_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Add AlreadyAddedContact test +[Test] +title AddContactAlreadyInRoster Test +create TelepathyGabbleTest TgObj +TgObj AddContactAlreadyInRosterTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_ALREADYADDED_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Remove Contact test +[Test] +title RemoveContact Test +create TelepathyGabbleTest TgObj +TgObj RemoveContactTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Remove Contact with Max Length UserID test +[Test] +title RemoveContactWithMaxLengthUserID Test +create TelepathyGabbleTest TgObj +TgObj RemoveContactWithMaxLengthUserIDTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK MAXLENGTH_USERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Remove an unexisting contact_id from the contactlist +[Test] +title RemoveInvalidContact Test +create TelepathyGabbleTest TgObj +TgObj RemoveInvalidContactTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK DELETE_INVALID_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Remove Contact With BlankUserId from the contactlist +[Test] +title RemoveContactWithBlankUserId Test +create TelepathyGabbleTest TgObj +TgObj RemoveContactWithBlankUserIdTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Remove a contact_id which is already deleted from the contactlist +[Test] +title RemoveContactAlreadyRemoved Test +create TelepathyGabbleTest TgObj +TgObj RemoveContactAlreadyRemovedTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK USERALREADYDELETED_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Fetch Contacts test +[Test] +title FetchContacts Test +create TelepathyGabbleTest TgObj +TgObj FetchContactsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//FetchEmptyContactList test +[Test] +title FetchEmptyContactList Test +create TelepathyGabbleTest TgObj +TgObj FetchZeroContactTest SERVER_GTALK USERNAMEWITHZEROCONTACT_GTALK PWDWITHZEROCONTACT_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/conf/telepathygabbletest_mannual.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/conf/telepathygabbletest_mannual.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,426 @@ +// Definitions +[Define] +SERVER_GIZMO chat.gizmoproject.com +SSL_FLAG_GIZMO 0 +USERNAME_GIZMO testlmnokia@chat.gizmoproject.com +PASSWORD_GIZMO loudmouth +RESOURCE mytptestresource_another1 +PROXY_SERVER 172.16.42.135 +//PROXY_SERVER 172.16.9.181 +//PROXY_SERVER 172.16.9.103 +PROXY_PORT 8080 +PORT 443 +//PORT_INVALID 4430 + +//EMPTYCONTACT Emptycontact@chat.gizmoproject.com +//EMPTYPASSWORD test + + +//KEY-VALUES for search with gizmo +KEY_FIRST_INVALID xmpp_user_invalid +VALUE_FIRST_INVALID rak* + +KEY_ANY_INVALID first_name_invalid +VALUE_ANY rakesh +KEY_FIRST first_name +VALUE_FIRST rakesh +VALUE_FIRST_WILDCHAR_1 r* +VALUE_FIRST_WILDCHAR_2 *r* +KEY_LAST last_name +VALUE_LAST b +KEY_CITY city +VALUE_CITY moneteau +KEY_COUNTRY country +VALUE_COUNTRY india +KEY_STATE state +VALUE_STATE SP +KEY_ACCOUNTNAME xmpp_user +VALUE_ACCOUNTNAME rakeshongizmo +KEY_EMAIL email_address +VALUE_EMAIL r*@chat.gizmoproject.com +VALUE_ALL_KEYS a +VALUE_FIRST_NAME_MAX abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx +VALUE_FIRST_SPECIAL_CHAR a_b&c#2^!abc +VALUE_FIRST_MULTIPLE bh +VALUE_FIRST_STRING lk +VALUE_SECOND_STRING lkmn + + + + +SERVER_YUKON chat.ovi.com +SSL_FLAG_YUKON 1 +USERNAME_YUKON nikumb@ovi.com +PASSWORD_YUKON pinkearth +RESOURCE_YUKON mytptestresource_yukon + +PORT_YUKON 5222 + +KEY_FULLNAME_YUKON fn +VALUE_FULLNAME_YUKON shrikumar + +KEY_FIRST_YUKON first +VALUE_FIRST_YUKON a + + + + + +//own name as the receipient +OWN_RECIPIENT_GIZMO testlmnokia@chat.gizmoproject.com + +//invalied username +USERNAME_INVALID_GIZMO abcd_ad@chat.gizmoproject.com +USERNAME_SPL_CHRS_GIZMO abcd_2@chat.gizmoproject.com + +//invalid passwd +PASSWORD_INVALID abcd_gh1_2_pwd + +//invalid server +BADSERVER talktalk.gooooogle.com + + +//contact not there in the contact list +RECIPIENT_NOT_CONTACT_GTALK usernotincontactlist@gmail.com +RECIPIENT_ALREADYADDED_GTALK testcm6@gmail.com + +//RECIPIENT testlmnokia@chat.gizmoproject.com +RECIPIENT testcm6@gmail.com +//RECIPIENT voting@chat.gizmoproject.com + +//contact in the friend list +RECIPIENT_FRIEND testgb123@gmail.com +RECIPIENT_INVALID a_b@chat.gizmoproject.com +RECIPIENT_SPL_CHRS a$$b@chat.gizmoproject.com + +MESSAGE Hello +MESSAGE_SPL_CHARS ab$$&&()!@#%*~`?<>,./\[]{}1234 +REPEATED_MESSAGE ThisIsTestForRepeatedMessage +MESSAGE_EMOTICONS :-) + + +//GTalk Server Settings +SERVER_GTALK talk.google.com +SSL_FLAG_GTALK 1 +USERNAME_GTALK testgb123@gmail.com +PASSWORD_GTALK testgb1234 +OWN_RECIPIENT_GTALK testgb123@gmail.com +OWN_RECIPIENT_GTALK_WITH_RESOURCE testgb123@gmail.com/mytptestresource_another1 +RECIPIENT_INVALID_GTALK a_b@gmail.com +DELETE_INVALID_GTALK usernotincontactlist_123@gmail.com +RECIPIENT_GTALK testcm6@gmail.com +RECIPIENT_GTALK_SEND_MSG testcm6@gmail.com +//RECIPIENT_GTALK_SEND_MSG lalita.kapur@gmail.com +RECIPIENT_OFFLINE_GTALK userIDWithZeroContact@gmail.com + +//TODO: Check the Max/Min length of userid +//min len - 6 chars in gtalk +//max len - 30 chars in gtalk +MAXLENGTH_USERID abcd123456abcd123456abcd123456@gmail.com +MINLENGTH_USERID ab123d@gmail.com +MAXMINLEN_PWD nokia123 +USERNAMEWITHZEROCONTACT UserWithZeroContact@gmail.com +USERNAMEWITHZEROCONTACT_PWD UserWithZeroContact123 +USERNAME_INVALID_GTALK abcd_ad@gmail.com +USERNAME_SPL_CHRS_GTALK abcd_2@gmail.com +RECIPIENT_SPL_CHRS_GTALK a$$b@gmail.com + +USERNAMEWITHZEROCONTACT_GTALK userIDWithZeroContact@gmail.com +PWDWITHZEROCONTACT_GTALK userIDWithZeroContact123 + +USERALREADYDELETED_GTALK UserAlreadyDeleted@gmail.com + +[Enddefine] + + +// Login related test cases +// test case for bad server - getting hung, no callback comes,don't run +//[Test] +//title LoginWithBadServer Test +//create TelepathyGabbleTest TgObj +//TgObj LoginBadServerTest BADSERVER USERNAME_GTALK PASSWORD_GTALK RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +//delete TgObj +//[Endtest] + + +//Recieve Message test +[Test] +title ReceiveMesasge Test +create TelepathyGabbleTest TgObj +TgObj ReceiveMessageTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +//TgObj ReceiveMessageTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//Recieve MaxLengthMessage test +[Test] +title ReceiveMaxLengthMessage Test +create TelepathyGabbleTest TgObj +TgObj ReceiveMessageMaxLengthTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +//TgObj ReceiveMessageMaxLengthTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + + +//Recieve Message special characters test +[Test] +title ReceiveMessageWithSplChrs Test +create TelepathyGabbleTest TgObj +//TgObj ReceiveMessageWithSplChrsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +TgObj ReceiveMessageWithSplChrsTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Recieve Message emoticons test +[Test] +title ReceiveMessageWithEmoticons Test +create TelepathyGabbleTest TgObj +//TgObj ReceiveMessageWithEmoticonsTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +TgObj ReceiveMessageWithEmoticonsTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Receive RepeatedMessages test +[Test] +title ReceiveRepeatedMessages Test +create TelepathyGabbleTest TgObj +//TgObj ReceiveRepeatedMessageTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +TgObj ReceiveRepeatedMessageTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + + +//Recieve BlankMessage test +[Test] +title ReceiveBlankMesasge Test +create TelepathyGabbleTest TgObj +TgObj ReceiveMessageBlankTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO OWN_RECIPIENT_GIZMO MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +//TgObj ReceiveMessageBlankTest SERVER_GTALK USERNAME_GTALK PASSWORD_GTALK OWN_RECIPIENT_GTALK MESSAGE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GTALK +delete TgObj +[Endtest] + +//Search FirstName test +[Test] +title Search FirstName Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search LastName test +[Test] +title Search LastName Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_LAST VALUE_LAST RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search City test +[Test] +title Search City Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_CITY VALUE_CITY RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search Country test +[Test] +title Search Country Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_COUNTRY VALUE_COUNTRY RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search State test +[Test] +title Search State Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_STATE VALUE_STATE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search AccountName test +[Test] +title Search AccountName Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_ACCOUNTNAME VALUE_ACCOUNTNAME RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search Email test +[Test] +title Search Email Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_EMAIL VALUE_EMAIL RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search FirstNameWithWildChar* test +[Test] +title Search FirstNameWithWildChar* Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_WILDCHAR_1 RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search FirstNameWith*string* test +[Test] +title Search FirstNameWith*string* Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_WILDCHAR_2 RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search GetSearchKeys test +//KEY_FIRST, VALUE_FIRST params will not be used for GetSearchKeys +[Test] +title Search GetSearchKeys Test +create TelepathyGabbleTest TgObj +TgObj GetSearchKeysTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//SearchWithAllKeys test +//KEY_FIRST will not be used for SearchWithAllKeysTest +//All the keys will be searched for value VALUE_ALL_KEYS +[Test] +title Search WithAllKeys Test +create TelepathyGabbleTest TgObj +TgObj SearchWithAllKeysTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_ALL_KEYS RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchAnyKeyInvalid Test +[Test] +title Search AnyKeyInvalid Test +create TelepathyGabbleTest TgObj +TgObj SearchInvalidKeyTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_ANY_INVALID VALUE_ANY RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchFirstKeyInvalid Test +[Test] +title Search FirstKeyInvalid Test +create TelepathyGabbleTest TgObj +TgObj SearchInvalidKeyTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST_INVALID VALUE_FIRST_INVALID RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchTwoInvalidKeys Test +[Test] +title Search SearchTwoInvalidKeysTest +create TelepathyGabbleTest TgObj +TgObj SearchTwoInvalidKeysTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST_INVALID VALUE_FIRST RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO KEY_ANY_INVALID VALUE_ANY +delete TgObj +[Endtest] + +//Search SearchNoKeyValue Test +[Test] +title Search NoKeyValue Test +create TelepathyGabbleTest TgObj +TgObj SearchNoKeyValueTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_ANY_INVALID VALUE_ANY RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchMaxLenSearchString Test +[Test] +title SearchMaxLenSearchString Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_NAME_MAX PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchSpecialCharSearchString Test +[Test] +title SearchSpecialCharSearchString Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_SPECIAL_CHAR PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchNoResults Test +//Passed strings for key_first and value_first will not be used +[Test] +title SearchNoResults Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search SearchBlankString Test +//Passed strings for key_first and value_first will not be used +[Test] +title SearchBlankString Test +create TelepathyGabbleTest TgObj +TgObj SearchBlankStringTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + +//Search Twice Test +[Test] +title SearchTwiceTest +create TelepathyGabbleTest TgObj +TgObj SearchTwiceTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_MULTIPLE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + + +//Search SearchTwiceWithDiffStrings Test +[Test] +title SearchTwiceWithDiffStrings Test +create TelepathyGabbleTest TgObj +TgObj SearchTwiceWithDiffStringsTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_STRING RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO KEY_FIRST VALUE_SECOND_STRING +delete TgObj +[Endtest] + + +//Search FiveTimes Test +[Test] +title SearchFiveTimesTest +create TelepathyGabbleTest TgObj +TgObj SearchFiveTimesTest SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_FIRST_MULTIPLE RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + + +//SearchAfterGetSearchKeys test +//KEY_FIRST will not be used for SearchAfterGetSearchKeys +//All the keys will be searched for value VALUE_ALL_KEYS +[Test] +title SearchAfterGetSearchKeys Test +create TelepathyGabbleTest TgObj +TgObj SearchAfterGetSearchKeys SERVER_GIZMO USERNAME_GIZMO PASSWORD_GIZMO KEY_FIRST VALUE_ALL_KEYS RESOURCE PROXY_SERVER PROXY_PORT PORT SSL_FLAG_GIZMO +delete TgObj +[Endtest] + + +//Search related test cases with yukon + + +//Search GetSearchKeys test +//KEY_FIRST_YUKON, VALUE_FIRST_YUKON params will not be used for GetSearchKeys +[Test] +title Search Yukon GetSearchKeys Test +create TelepathyGabbleTest TgObj +TgObj GetSearchKeysTest SERVER_YUKON USERNAME_YUKON PASSWORD_YUKON KEY_FIRST_YUKON VALUE_FIRST_YUKON RESOURCE_YUKON PROXY_SERVER PROXY_PORT PORT_YUKON SSL_FLAG_YUKON +delete TgObj +[Endtest] + + +//Search FirstName test +[Test] +title Search Yukon FirstName Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_YUKON USERNAME_YUKON PASSWORD_YUKON KEY_FIRST_YUKON VALUE_FIRST_YUKON RESOURCE_YUKON PROXY_SERVER PROXY_PORT PORT_YUKON SSL_FLAG_YUKON +delete TgObj +[Endtest] + + +//Search FullName test +[Test] +title Search Yukon FullName Test +create TelepathyGabbleTest TgObj +TgObj SearchTest SERVER_YUKON USERNAME_YUKON PASSWORD_YUKON KEY_FULLNAME_YUKON VALUE_FULLNAME_YUKON RESOURCE_YUKON PROXY_SERVER PROXY_PORT PORT_YUKON SSL_FLAG_YUKON +delete TgObj +[Endtest] \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/eabi/telepathygabbletest.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/eabi/telepathygabbletest.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1 @@ + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/eabi/telepathygabbletestu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/eabi/telepathygabbletestu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,5 @@ +EXPORTS + _Z9LibEntryLR13CTestModuleIf @ 1 NONAME + _ZTI9CTestData @ 2 NONAME ; ## + _ZTV9CTestData @ 3 NONAME ; ## + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Contanis the MMP file name +* +*/ + + + + + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these +DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + + + +PRJ_EXPORTS +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in /epoc32/include +// Example: +/* +/agnmodel/inc/AGMCOMON.H +*/ + +PRJ_TESTMMPFILES +// NOTE: If using ARS requirements .mmp file operation should be done under this. +// 'abld test build' + +PRJ_MMPFILES +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: +/* +/agnmodel/group/agnmodel.mmp +#if defined(MARM) +/agnmodel/group/agsvexe.mmp +#endif +*/ +telepathygabbletest.mmp + +// End of File \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/group/telepathygabbletest.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/group/telepathygabbletest.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,119 @@ +/* +* Copyright (c) 2002 - 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: MMP FILE +* +*/ + + + +#if defined(__S60_) + // To get the OSEXT_LAYER_SYSTEMINCLUDE-definition + #include +#endif + +TARGET telepathygabbletest.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E3 + +CAPABILITY ALL -TCB +//CAPABILITY NetworkServices + +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +// SECUREID 0x00000000 + +#ifdef WINSCW +MACRO EMULATOR +#endif + + +EPOCHEAPSIZE 0x6000 0x1A000 +/*#ifndef WINSCW +// Allow global writeable static data +EPOCALLOWDLLDATA +#endif*/ + +DEFFILE telepathygabbletest.def +//VENDORID 0x101FB657 +//SECUREID 0x102073DB + +//User Include Path +USERINCLUDE ../inc + + + + +MACRO SYMBIAN + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_BOOST_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE +OS_LAYER_LIBUTILITY_SYSTEMINCLUDE + +USERINCLUDE ../../inc +// + + +SOURCEPATH ../src +//utils file +SOURCE telepathygabbleutils.cpp +//login , logout +SOURCE telepathygabblelogintest.cpp +//send message +SOURCE telepathygabblesendmessage.cpp + +//Add Delete Contact related +SOURCE telepathygabbleadddeletecontact.cpp +//Fetch contact related +SOURCE telepathygabblefetchcontacts.cpp + +SOURCE telepathygabblesearch.cpp +//Presence Related +//SOURCE telepathy-presence.c +//SOURCE telepathygabblepresencetest.cpp +//stif related +SOURCE telepathygabbletest.cpp +SOURCE telepathygabbletestblocks.cpp +SOURCE telepathygabbletestdata.cpp + + +LIBRARY euser.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib + +// Library dependencies +#ifdef GCCE +STATICLIBRARY libcrt0_gcce.lib +#else +STATICLIBRARY libcrt0.lib +#endif + +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libm.lib +LIBRARY libglib.lib +LIBRARY libgobject.lib +LIBRARY libssl.lib +LIBRARY libcrypto.lib +LIBRARY libdbus-glib.lib +LIBRARY libdbus.lib +LIBRARY libtelepathy.lib + +LANG SC \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/group/telepathygabbletest.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/group/telepathygabbletest.pkg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,34 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of the License "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: telepathygabbletest.pkg +; +&EN + +;Header +#{"telepathygabbletest"}, (0x101FB3E5), 1, 0, 0, TYPE=SA + + +;Localised VendorID +%{"Nokia"} + +;VendorID +:"Nokia" + +(0x101F7961), 0, 0, 0, {"Series60ProductID"} + +;CFG File +"\epoc32\winscw\c\testframework\telepathygabbletest.cfg" - "c:\testframework\telepathygabbletest.cfg" + +;test dll +"\EPOC32\RELEASE\ARMV5\urel\telepathygabbletest.dll"-"!:\sys\bin\telepathygabbletest.dll" diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathy-presence.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathy-presence.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Presence related Test Cases. +* +*/ + + + +#ifndef __TELEPATHY_PRESENCE_H__ +#define __TELEPATHY_PRESENCE_H__ + +#include + +G_BEGIN_DECLS + +#define TELEPATHY_TYPE_PRESENCE (telepathy_presence_get_type ()) +#define TELEPATHY_PRESENCE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TELEPATHY_TYPE_PRESENCE, TelepathyPresence)) +#define TELEPATHY_PRESENCE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TELEPATHY_TYPE_PRESENCE, TelepathyPresenceClass)) +#define TELEPATHY_IS_PRESENCE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TELEPATHY_TYPE_PRESENCE)) +#define TELEPATHY_IS_PRESENCE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TELEPATHY_TYPE_PRESENCE)) +#define TELEPATHY_PRESENCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TELEPATHY_TYPE_PRESENCE, TelepathyPresenceClass)) + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct _TelepathyPresence TelepathyPresence; +typedef struct _TelepathyPresenceClass TelepathyPresenceClass; + +#ifdef __cplusplus +} +#endif + +struct _TelepathyPresence { + GObject parent; +}; + +struct _TelepathyPresenceClass { + GObjectClass parent_class; +}; + +#ifdef __cplusplus +extern "C" +{ +#endif +typedef enum { + TELEPATHY_PRESENCE_STATE_AVAILABLE, + TELEPATHY_PRESENCE_STATE_BUSY, + TELEPATHY_PRESENCE_STATE_AWAY, + TELEPATHY_PRESENCE_STATE_EXT_AWAY, + TELEPATHY_PRESENCE_STATE_HIDDEN, /* When you appear offline to others */ + TELEPATHY_PRESENCE_STATE_UNAVAILABLE, +} TelepathyPresenceState; + +#ifdef __cplusplus +} +#endif +GType telepathy_presence_get_type (void) G_GNUC_CONST; + +TelepathyPresence * telepathy_presence_new (void); +TelepathyPresence * telepathy_presence_new_full (TelepathyPresenceState state, + const gchar *status); + +const gchar * telepathy_presence_get_resource (TelepathyPresence *presence); +TelepathyPresenceState telepathy_presence_get_state (TelepathyPresence *presence); +const gchar * telepathy_presence_get_status (TelepathyPresence *presence); +gint telepathy_presence_get_priority (TelepathyPresence *presence); + +void telepathy_presence_set_resource (TelepathyPresence *presence, + const gchar *resource); +void telepathy_presence_set_state (TelepathyPresence *presence, + TelepathyPresenceState state); +void telepathy_presence_set_status (TelepathyPresence *presence, + const gchar *status); +void telepathy_presence_set_priority (TelepathyPresence *presence, + gint priority); +gboolean telepathy_presence_resource_equal (gconstpointer a, + gconstpointer b); +gint telepathy_presence_sort_func (gconstpointer a, + gconstpointer b); + +/*static*/ const gchar *telepathy_presence_state_to_str (TelepathyPresenceState presence_state); + + + +G_END_DECLS + +#endif /* __TELEPATHY_PRESENCE_H__ */ + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabbleadddeletecontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabbleadddeletecontact.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for Contact Managemnet Test Cases. +* +*/ + + + + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include +//for the global data +#include "telepathygabbletestdata.h" + +#define VERBOSE + + +// FORWARD DECLARATION +class CTestData; + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabbleAddDeleteContact) : public CBase + { + + private: + /* + * C++ default constructor. + */ + + CTelepathyGabbleAddDeleteContact(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabbleAddDeleteContact* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabbleAddDeleteContact(); + + + public: // Member functions + + TInt add_contact ( const gchar *contact_id, const gchar *message, + CTestData* aTestData ); + TInt remove_contact ( const gchar *contact_id, const gchar *message, + CTestData* aTestData ); + + public : //Callback functions + + static void add_contact_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + static void remove_contact_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + + static void roster_members_changed_cb (DBusGProxy *group_iface, + gchar *message, + GArray *added, + GArray *removed, + GArray *local_pending, + GArray *remote_pending, + guint actor, + guint reason, + gpointer userdata); + }; + + + + + + + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabblefetchcontacts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabblefetchcontacts.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,111 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for Fetch Test Cases. +* +*/ + + + + +//Include files +#include +#include +#include + +#include + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include +//for the global data +#include "telepathygabbletestdata.h" + + +const guint KMaxContactFetchCount = 500; + + +// FORWARD DECLARATION +class CTelepathyGabbleLoginTest; + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabbleFetchContacts) : public CBase + { + + private: + /** + * C++ default constructor. + */ + + CTelepathyGabbleFetchContacts(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabbleFetchContacts* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabbleFetchContacts(); + + public: // Member functions + TInt test_request_roster ( CTestData* aTestData ); + + public : //Callback functions + + static void get_roster_member_cb( DBusGProxy *proxy,GArray* current_members, GArray* local_pending_members, GArray* remote_pending_members, GError *error, gpointer userdata ); + static void inspect_handles_cb( DBusGProxy *proxy,char **handles_names, GError *error, gpointer userdata ) ; + + + + + }; diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabblelogintest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabblelogintest.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for Login Test Cases. +* +*/ + + + + + + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include + +#define VERBOSE + +#include "telepathygabbletestdata.h" + + +#define CONNMGR_NAME "telepathy-gabble" +#define CONNMGR_BUS "org.freedesktop.Telepathy.ConnectionManager.gabble" +#define CONNMGR_PATH "/org/freedesktop/Telepathy/ConnectionManager/gabble" +#define CHANNEL_BUS "org.freedesktop.Telepathy.Channel.Type.Text" +#define CHANNEL_PATH "/org/freedesktop/Telepathy/Channel/Type/Text" +#define PROTOCOL "jabber" + + + +//forward decalration +class CTestData; + +//class declaration +NONSHARABLE_CLASS(CTelepathyGabbleLoginTest) : public CBase + { + + private: + /** + * C++ default constructor. + */ + + CTelepathyGabbleLoginTest(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabbleLoginTest* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabbleLoginTest(); + + + + public: // Member functions + + //Login and Logout functions + TInt action_login(char* username,char* password, + char* server,char* resource,char* ssl_flag, + char *port,char *proxy_server, char *proxy_port, + CTestData* aTestData); + + TInt action_logout( CTestData* aTestData ); + + TInt action_cancel(char* username,char* password, + char* server, char* resource,char* ssl_flag, + char *port,char *proxy_server, char *proxy_port, + CTestData* aTestData ); + + + public : //Callback functions + //Callback function for the status change + + static gboolean status_changed_cb(DBusGProxy *proxy, + guint status, guint reason, + gpointer user_data); + + //Callback for the creation of a new channel on succeccful login. + static void new_channel_handler(DBusGProxy *proxy, const char *object_path, + const char *channel_type, guint handle_type, + guint channel_handle, gboolean suppress_handler, + gpointer user_data); + + + //Init the text_channel + static void text_channel_init ( TpChan *text_chan ); + + + }; + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabblepresencetest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabblepresencetest.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for Presence Test Cases. +* +*/ + + + + +//Include files +#include +#include +#include + +#include + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include "tp-conn-iface-presence-gen.h" + +#include +#include +#include +#include + +#include "telepathy-presence.h" + +// FORWARD DECLARATION +class CTestData; + + +#define VERBOSE + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabblePresenceTest) : public CBase + { + + private: + /** + * C++ default constructor. + */ + + CTelepathyGabblePresenceTest(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabblePresenceTest* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabblePresenceTest(); + public: //members + + TpConn *iTpConn; + + public : + + //presence related functions + + static TelepathyPresenceState telepathy_presence_state_from_str (const gchar *str); + void telepathy_contacts_send_presence (DBusGProxy *pres_iface, + TelepathyPresence *presence/*, CTestData *aTestData*/); + + + static void telepathy_presences_foreach (gpointer *key,gpointer *value, + TelepathyPresence **presence); + + + //Callback functions + static void telepathy_presence_handle_foreach (gpointer *key,gpointer *value); + + void telepathy_presence_handler(DBusGProxy *proxy,GHashTable *handle_hash); + + + }; + + + + + + + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabblesearch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabblesearch.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for Search +* +*/ + + + + + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-search-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" +#include + + +// FORWARD DECLARATION +class CTestData; + + +#define VERBOSE + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabbleSearch) : public CBase + { + public: + + struct Search_UserData + { + GHashTable* data_to_search; + CTestData* testData; + }; + + private: + /** + * C++ default constructor. + */ + + CTelepathyGabbleSearch(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabbleSearch* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabbleSearch(); + + + + public: // Member functions + + + TInt SearchL( GHashTable *aDataToSearch, CTestData* aTestData ); + + TInt GetSearchKeysL( CTestData* aTestData ); + + void SearchAgainL( GHashTable *aDataToSearch, CTestData* aTestData ); + + CTestData* GetTestData(); + + void DoSearchL(GHashTable *aDataToSearch,CTestData *testData); + + void CloseChannel( CTestData* aTestdata ); + + public : //Callback functions + + static void search_chan_closed_cb ( DBusGProxy *proxy, + GError *error, + gpointer user_data + ); + static void search_result_received_cb ( DBusGProxy *proxy, + guint contact_handle, + GHashTable *values, + gpointer user_data + ); + static void search_state_changed_cb ( DBusGProxy *proxy, + guint search_state, + gpointer user_data + ); + + + static void searchreply_cb( DBusGProxy *proxy, GError *error, gpointer user_data ); + + //static void setfield_foreach (gpointer key, gpointer value, gpointer user_data); + + static void do_search_reply( DBusGProxy *proxy, char *chan_object_path, + GError *error, gpointer user_data ); + static void getsearchkeys_cb( DBusGProxy *proxy, gchar * instr, + gchar ** keys, GError *error, gpointer user_data ); + private: + + CTestData *iTestData; + }; + + + + + + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabblesendmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabblesendmessage.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for SendMessage. +* +*/ + + + + + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" +#include + + +// FORWARD DECLARATION +class CTestData; + + +#define VERBOSE + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabbleSendRecvMessage) : public CBase + { + + private: + /** + * C++ default constructor. + */ + + CTelepathyGabbleSendRecvMessage(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTelepathyGabbleSendRecvMessage* NewL(); + + /** + * Destructor. + */ + ~CTelepathyGabbleSendRecvMessage(); + + + + public: // Member functions + + // Member function to send the message. + TInt SendMessage( const char *contact_id, const char *message, + CTestData* aTestData ); + + TInt ReceiveMessage(const char *contact_id, const char *message, + CTestData* aTestData ); + + + public : //Callback functions + + //Callback function for sendmessage + static void sendmessage_cb( DBusGProxy *proxy, GError *error, gpointer userdata ); + + + //Callback for receive message + static void receivedMessage_cb ( DBusGProxy *proxy,guint message_id, + guint timestamp,guint from_handle, + guint message_type,guint message_flags, + gchar *message_body,gpointer user_data ); + + + static void SendError_cb ( DBusGProxy *proxy, + guint error, + guint timestamp, + guint message_type, + gchar *message_body, + gpointer user_data ) ; + + + //Callback for the text_channel_find for a particular contact_id. + static gboolean text_channels_find_func(gchar *key,TpChan *text_channel, guint *contact_handle); + + + }; + + + + + + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabbletest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabbletest.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,238 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: For Stif fw related functions. +* +*/ + + + + + +#ifndef TELEPATHYGABBLETEST_H +#define TELEPATHYGABBLETEST_H + +// INCLUDES +#include +#include +#include +#include + + + +// Logging path +_LIT( KTelepathyGabbleTestLogPath, "\\logs\\testframework\\TelepathyGabbleTest\\" ); +// Log file +_LIT( KTelepathyGabbleTestLogFile, "TelepathyGabbleTest.txt" ); +_LIT( KTelepathyGabbleTestLogFileWithTitle, "TelepathyGabbleTest_[%S].txt" ); + +// FUNCTION PROTOTYPES +//?type ?function_name(?arg_list); + +// FORWARD DECLARATIONS +class CTelepathyGabbleTest; + +class CTelepathyGabbleLoginTest; +class CTelepathyGabbleSendRecvMessage; +class CTelepathyGabbleAddDeleteContact; +class CTelepathyGabbleFetchContacts; +class CTelepathyGabbleSearch; +class CTestData; + + +// CLASS DECLARATION + +/** +* CTelepathyGabbleTest test class for STIF Test Framework TestScripter. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(CTelepathyGabbleTest) : public CScriptBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CTelepathyGabbleTest* NewL( CTestModuleIf& aTestModuleIf ); + + /** + * Destructor. + */ + virtual ~CTelepathyGabbleTest(); + + public: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + protected: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + protected: // Functions from base classes + + + private: + + /** + * C++ default constructor. + */ + CTelepathyGabbleTest( CTestModuleIf& aTestModuleIf ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + void Delete(); + + /** + * Test methods are listed below. + */ + + /** + * Example test method. + * @since ?Series60_version + * @param aItem Script line containing parameters. + * @return Symbian OS error code. + */ + //virtual TInt ExampleL( CStifItemParser& aItem ); + //ADD NEW METHOD DEC HERE + //[TestMethods] - Do not remove + + + //Login + virtual TInt LoginTestL( CStifItemParser& aItem ); + + //Logout + virtual TInt LogoutTestL(CStifItemParser& aItem ); + + //Login related other test cases + + virtual TInt LoginInvalidUseridTestL( CStifItemParser& aItem ); + virtual TInt LoginInvalidPasswdTestL( CStifItemParser& aItem ); + virtual TInt LoginInvalidUseridPasswdTestL( CStifItemParser& aItem ); + virtual TInt LoginblankUseridTestL( CStifItemParser& aItem ) ; + virtual TInt LoginblankPasswdTestL( CStifItemParser& aItem ); + virtual TInt LoginblankUseridblankPasswdTestL( CStifItemParser& aItem ); + virtual TInt LoginCancelTestL( CStifItemParser& aItem ); + + + + //Send Message + virtual TInt SendMessageTestL(CStifItemParser& aItem ); + virtual TInt SendMessageWith400TestL(CStifItemParser& aItem ); + virtual TInt SendMesasgeBlankTestL( CStifItemParser& aItem ); + virtual TInt SendMesasgeToBlankUserIdTestL( CStifItemParser& aItem ); + virtual TInt SendMessageRepeatedTestL( CStifItemParser& aItem ); + virtual TInt SendMessagetoinvalidUseridTestL( CStifItemParser& aItem ); + + + //Receive Message + virtual TInt ReceiveMessageTestL(CStifItemParser& aItem); + virtual TInt ReceiveMessageMaxLengthTestL(CStifItemParser& aItem); + virtual TInt ReceiveMessageBlankTestL(CStifItemParser& aItem); + virtual TInt ReceiveRepeatedMessageTestL(CStifItemParser& aItem); + + + //Add Contact related test cases + virtual TInt AddContactTestL(CStifItemParser& aItem); + virtual TInt AddContactWithBlankUserIdTestL(CStifItemParser& aItem); + virtual TInt AddContactAlreadyInRosterTestL(CStifItemParser& aItem); + + //Remove Contact related test cases + virtual TInt RemoveContactTestL(CStifItemParser& aItem ); + virtual TInt RemoveInvalidContactTestL( CStifItemParser& aItem ); + virtual TInt RemoveContactAlreadyRemovedTestL( CStifItemParser& aItem ); + virtual TInt RemoveContactWithBlankUserIdTestL( CStifItemParser& aItem ); + + //Fetch Contact related test cases + virtual TInt FetchContactsTestL(CStifItemParser& aItem ); + + //Search related test cases + virtual TInt SearchTestL(CStifItemParser& aItem ); + virtual TInt GetSearchKeysTestL(CStifItemParser& aItem ); + virtual TInt SearchWithAllKeysTestL( CStifItemParser& aItem ); + + virtual TInt SearchTwoInvalidKeysTestL( CStifItemParser& aItem ); + virtual TInt SearchInvalidKeyTestL(CStifItemParser& aItem ); + virtual TInt SearchNoKeyValueTestL(CStifItemParser& aItem ); + virtual TInt SearchBlankStringTestL(CStifItemParser& aItem ); + virtual TInt SearchAfterGetSearchKeysL( CStifItemParser& aItem ); + virtual TInt SearchTwiceTestL( CStifItemParser& aItem ); + virtual TInt SearchFiveTimesTestL( CStifItemParser& aItem ); + virtual TInt SearchTwiceWithDiffStringsTestL( CStifItemParser& aItem ); + + + gchar* GetSearchLabelForGizmoL(gchar* search_key); + gchar* GetSearchLabelForYukonL(gchar* search_key); + gchar* GetSearchLabelL(gchar* aService,gchar* aSearchKey); + /*static gboolean search_hash_remove( gpointer key, gpointer value, + gpointer user_data );*/ + + + private: //Some data members + + //Login class object + CTelepathyGabbleLoginTest *iLoginObj; + //Send Message class object + CTelepathyGabbleSendRecvMessage *iSendMsgObj; + + //used for adding/deleting contact + CTelepathyGabbleAddDeleteContact *iAddDelContactObj; + + //used for fetching contacts + CTelepathyGabbleFetchContacts *iFetchContactObj; + + //used for searching contacts + CTelepathyGabbleSearch *iSearchObj; + CTestData* iTestData; + + }; + +#endif // TELEPATHYGABBLETEST_H + +// End of File + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabbletestdata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabbletestdata.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,225 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: test utility for having the global data +* +*/ + + + +#ifndef __TELEPATHYGABBLETESTDATA_H__ +#define __TELEPATHYGABBLETESTDATA_H__ + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + + + + +#include + +#define VERBOSE + + +#define CONNMGR_NAME "telepathy-gabble" +#define CONNMGR_BUS "org.freedesktop.Telepathy.ConnectionManager.gabble" +#define CONNMGR_PATH "/org/freedesktop/Telepathy/ConnectionManager/gabble" +#define CHANNEL_BUS "org.freedesktop.Telepathy.Channel.Type.Text" +#define CHANNEL_PATH "/org/freedesktop/Telepathy/Channel/Type/Text" +#define PROTOCOL "jabber" + +class CStifLogger; + +class CTestData : public CBase +{ + public: + enum TConnectionState + { + ECONNECTED =0, + EDISCONNECTED, + ECONNECTING, + }; + enum TTestType + { + ELogin = 0, + ECancel, + ESend, + ESendErr, + EReceive, + ERecvBlank, + EGetSearchKeys, + ESearch, + EOther + }; + enum TSendRecvState + { + EMessageNotSent =0, + EMessageSent, + EMessageRecvd, + EMessageRecvErr, + EMessageSendErr + }; + + enum TAddDeleteContactStatus + { + EADD_SUCCESS =0, + EADD_FAIL , + EDELETE_SUCCESS, + EDELETE_FAIL + }; + + + enum TSearchState + { + ESearchStarted =0, + ESearchError , + ESearchCompleted, + ESearchKeysFound + }; + + private: + /** + * C++ default constructor. + */ + + CTestData( CStifLogger* aLogger ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CTestData* NewL( CStifLogger* aLogger ); + + /** + * Destructor. + */ + ~CTestData(); + + + +public://Set funtions + + DBusGProxy* GetGroupSubscribeInterface(); + DBusGProxy* GetGroupPublishInterface(); + DBusGProxy* GetGroupKnownInterface(); + DBusGProxy* GetGroupDenyInterface(); + GMainLoop* GetMainLoop(); + GHashTable* GetTextChannelsHT(); + DBusGConnection* GetDBusConnection(); + TpConn* GetTpConn(); + TTestType GetTestType(); + TInt GetLoginCompleteFlag(); + TInt GetTotalFetchCount(); + TInt GetLastIndexInFetch(); + TConnectionState GetConnectionState(); + TSendRecvState GetSendRecvMsgState(); + TAddDeleteContactStatus GetAddDeleteContactStatus(); + CStifLogger* GetStifLogger(); + TSearchState GetSearchState(); + + void SetGroupSubscribeInterface( DBusGProxy* aGroupSubscribeInterface ); + void SetGroupPublishInterface( DBusGProxy* aGroupPublishInterface ); + void SetGroupKnownInterface( DBusGProxy* aGroupKnownInterface ); + void SetGroupDenyInterface( DBusGProxy* aGroupDenyInterface ); + void SetTextChannelsHT( GHashTable* aTextChannelHashTable ); + void IncLoginCompleteFlag(); + void ResetLoginCompleteFlag(); + void SetTotalFetchCount( TInt aValue ); + void SetLastIndexInFetch( TInt aLastIndex ); + void SetConnectionState( TConnectionState aloginState ); + void SetTestType( TTestType aTestType ); + void SetSendRecvMsgState( TSendRecvState aSendRecvState ); + void SetAddDeleteContactStatus(TAddDeleteContactStatus aAddDeleteContactStatus); + void SetTpConn(TpConn* aTpConn); + void SetTpConnMgr(TpConnMgr* aTpConnMgr); + void SetDBusConnection( DBusGConnection* aDBusConnection ); + void SetSearchState(TSearchState aSearchState); + void SetSearchKeys( gchar **aKeys ); + gchar** GetSearchKeys( ); + void SetSearchChan(TpChan* aSearchChan ); + TpChan* GetSearchChan( ); + +private://Data members + + GMainLoop *iMainLoop; + + //Hash Table for the text channels. + GHashTable *iTextChannelHashTable; + + TpConn *iTpConn; + + TpConnMgr *iTpConnMgr; + + //Global dbus-connection object + DBusGConnection *iDBusConnection; + + + DBusGProxy *iGroupSubscribeInterface; //used for adding a contact + DBusGProxy *iGroupKnownInterface; //used for removing a contact + DBusGProxy *iGroupPublishInterface; //gives local pending members + DBusGProxy *iGroupDenyInterface; //used to deny the contacts. + + TInt iLoginComplete; + TInt iTotalFetchCount; + TConnectionState iConnectionState; + TSendRecvState iSendRecvState; + TAddDeleteContactStatus iAddDeleteContactStatus; + TSearchState iSearchState; + TTestType iTestType; + + CStifLogger *iLogger; + + //Used in Fetch Contacts Test Case + TInt iLastIndex; + gchar** iSearchKeys; + + TpChan* iSearchChan; +};//End of class + +#endif //__TELEPATHYGABBLETESTDATA_H__ + diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/inc/telepathygabbleutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/inc/telepathygabbleutils.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Utility class for telepathy Test Cases. +* +*/ + + + + +//Include files +#include +#include +#include + +#include + +#ifndef DBUS_API_SUBJECT_TO_CHANGE +#define DBUS_API_SUBJECT_TO_CHANGE +#endif + + +//Include files +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include "tp-conn.h" +#include "tp-connmgr.h" +#include "tp-chan.h" +#include "tp-chan-gen.h" +#include "tp-ch-gen.h" +#include "tp-chan-iface-group-gen.h" +#include "tp-chan-type-text-gen.h" +#include "tp-chan-type-streamed-media-gen.h" +#include "tp-props-iface.h" +#include "tp-constants.h" +#include "tp-interfaces.h" + +#include + +// FORWARD DECLARATION +class CTestData; + + +// CLASS DECLARATION +NONSHARABLE_CLASS(CTelepathyGabbleUtils) + { + + + public: // static Member functions + static guint get_handle_from_contact ( const gchar *contact_id, + CTestData* aTestData); + + }; diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/init/TestFramework.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/init/TestFramework.ini Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +# +# This is STIFTestFramework initialization file +# Comment lines start with '#'-character. +# See STIF TestFramework users guide.doc for instructions + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Engine_Defaults] + +TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment', + 'TestCases' or 'FullReport' + +CreateTestReport= YES # Possible values: YES or NO + +TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFileName= TestReport + +TestReportFormat= TXT # Possible values: TXT or HTML +TestReportOutput= FILE # Possible values: FILE or RDEBUG +TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting + +[End_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Module configurations start + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\telepathygabbletest.cfg +[End_Module] + + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Logger_Defaults] + +[End_Logger_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# End of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathy-presence.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathy-presence.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,459 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Presence related Test Cases +* +*/ + + + + +//#include "config.h" + +#include +#include "telepathy-presence.h" +//#include "telepathy-time.h" + +//#include //below code is replacement of this header +//+++++++++++++++++++++++++++++++++++++++++++++++++ +#include + +#define _(String) gettext (String) +#define Q_(String) g_strip_context ((String), gettext (String)) +#ifdef gettext_noop +#define N_(String) gettext_noop (String) +#else +#define N_(String) (String) +#endif +//++++++++++++++++++++++++++++++++++++++++++++++++++ + + + + +#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TELEPATHY_TYPE_PRESENCE, TelepathyPresencePriv)) + + +typedef long TelepathyTime; /* Note: Always in UTC. */ +typedef struct _TelepathyPresencePriv TelepathyPresencePriv; + +struct _TelepathyPresencePriv { + TelepathyPresenceState state; + + gchar *status; + gchar *resource; + + gint priority; + TelepathyTime timestamp; +}; + +static void presence_finalize (GObject *object); +static void presence_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); +static void presence_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +enum { + PROP_0, + PROP_STATE, + PROP_STATUS, + PROP_RESOURCE, + PROP_PRIORITY +}; + +G_DEFINE_TYPE (TelepathyPresence, telepathy_presence, G_TYPE_OBJECT); + +TelepathyTime +telepathy_time_get_current (void) +{ + return time (NULL); +} + +static void +telepathy_presence_class_init (TelepathyPresenceClass *class) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (class); + + object_class->finalize = presence_finalize; + object_class->get_property = presence_get_property; + object_class->set_property = presence_set_property; + + g_object_class_install_property (object_class, + PROP_STATE, + g_param_spec_int ("state", + "Presence State", + "The current state of the presence", + TELEPATHY_PRESENCE_STATE_AVAILABLE, + TELEPATHY_PRESENCE_STATE_EXT_AWAY, + TELEPATHY_PRESENCE_STATE_AVAILABLE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_STATUS, + g_param_spec_string ("status", + "Presence Status", + "Status string set on presence", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_RESOURCE, + g_param_spec_string ("resource", + "Presence Resource", + "Resource that this presence is for", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_PRIORITY, + g_param_spec_int ("priority", + "Presence Priority", + "Priority value of presence", + G_MININT, + G_MAXINT, + 0, + G_PARAM_READWRITE)); + + g_type_class_add_private (object_class, sizeof (TelepathyPresencePriv)); +} + +static void +telepathy_presence_init (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (presence); + + priv->state = TELEPATHY_PRESENCE_STATE_AVAILABLE; + + priv->status = NULL; + priv->resource = NULL; + + priv->priority = 0; + + priv->timestamp = telepathy_time_get_current (); +} + +static void +presence_finalize (GObject *object) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + g_free (priv->status); + g_free (priv->resource); + + (G_OBJECT_CLASS (telepathy_presence_parent_class)->finalize) (object); +} + +static void +presence_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + switch (param_id) { + case PROP_STATE: + g_value_set_int (value, priv->state); + break; + case PROP_STATUS: + g_value_set_string (value, + telepathy_presence_get_status (TELEPATHY_PRESENCE (object))); + break; + case PROP_RESOURCE: + g_value_set_string (value, + telepathy_presence_get_resource (TELEPATHY_PRESENCE (object))); + break; + case PROP_PRIORITY: + g_value_set_int (value, priv->priority); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} +static void +presence_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (object); + + switch (param_id) { + case PROP_STATE: + priv->state = g_value_get_int (value); + break; + case PROP_STATUS: + telepathy_presence_set_status (TELEPATHY_PRESENCE (object), + g_value_get_string (value)); + break; + case PROP_RESOURCE: + telepathy_presence_set_resource (TELEPATHY_PRESENCE (object), + g_value_get_string (value)); + break; + case PROP_PRIORITY: + priv->priority = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +TelepathyPresence * +telepathy_presence_new (void) +{ + return g_object_new (TELEPATHY_TYPE_PRESENCE, NULL); +} + +TelepathyPresence * +telepathy_presence_new_full (TelepathyPresenceState state, + const gchar *status) +{ + return g_object_new (TELEPATHY_TYPE_PRESENCE, + "state", state, + "status", status, + NULL); +} + +const gchar * +telepathy_presence_get_resource (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), NULL); + + priv = GET_PRIV (presence); + + if (priv->resource) { + return priv->resource; + } + + return NULL; +} + +const gchar * +telepathy_presence_get_status (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + /*g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), + _("Offline"));*/ + + priv = GET_PRIV (presence); + + return priv->status; +} + +gint +telepathy_presence_get_priority (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (presence); + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), 0); + + return priv->priority; +} + +void +telepathy_presence_set_resource (TelepathyPresence *presence, + const gchar *resource) +{ + TelepathyPresencePriv *priv; + + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + g_return_if_fail (resource != NULL); + + priv = GET_PRIV (presence); + + g_free (priv->resource); + priv->resource = g_strdup (resource); + + g_object_notify (G_OBJECT (presence), "resource"); +} + +TelepathyPresenceState +telepathy_presence_get_state (TelepathyPresence *presence) +{ + TelepathyPresencePriv *priv; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (presence), + TELEPATHY_PRESENCE_STATE_AVAILABLE); + + priv = GET_PRIV (presence); + + return priv->state; +} + +void +telepathy_presence_set_state (TelepathyPresence *presence, + TelepathyPresenceState state) +{ + TelepathyPresencePriv *priv; + + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + + priv = GET_PRIV (presence); + + priv->state = state; + + g_object_notify (G_OBJECT (presence), "state"); +} + +void +telepathy_presence_set_status (TelepathyPresence *presence, + const gchar *status) +{ + TelepathyPresencePriv *priv; + + priv = GET_PRIV (presence); + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + + g_free (priv->status); + + if (status) { + priv->status = g_strdup (status); + } else { + priv->status = NULL; + } + + g_object_notify (G_OBJECT (presence), "status"); +} + +void +telepathy_presence_set_priority (TelepathyPresence *presence, + gint priority) +{ + TelepathyPresencePriv *priv; + + g_return_if_fail (TELEPATHY_IS_PRESENCE (presence)); + + priv = GET_PRIV (presence); + + priv->priority = priority; + + g_object_notify (G_OBJECT (presence), "priority"); +} + +gboolean +telepathy_presence_resource_equal (gconstpointer a, + gconstpointer b) +{ + TelepathyPresencePriv *priv1; + TelepathyPresencePriv *priv2; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (a), FALSE); + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (b), FALSE); + + priv1 = GET_PRIV (a); + priv2 = GET_PRIV (b); + + if (!priv1->resource) { + if (!priv2->resource) { + return TRUE; + } + + return FALSE; + } + + if (!priv2->resource) { + return FALSE; + } + + if (strcmp (priv1->resource, priv2->resource) == 0) { + return TRUE; + } + + return FALSE; +} + +gint +telepathy_presence_sort_func (gconstpointer a, + gconstpointer b) +{ + TelepathyPresencePriv *priv_a; + TelepathyPresencePriv *priv_b; + gint diff; + + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (a), 0); + g_return_val_if_fail (TELEPATHY_IS_PRESENCE (b), 0); + + /* We sort here by priority AND status, in theory, the + * priority would be enough for JUST Jabber contacts which + * actually abide to the protocol, but for other protocols and + * dodgy clients, we will sort by: + * + * 1. State + * 2. Priority + * 3. Time it was set (most recent first). + */ + + priv_a = GET_PRIV (a); + priv_b = GET_PRIV (b); + + /* 1. State */ + diff = priv_a->state - priv_b->state; + if (diff != 0) { + return diff < 1 ? -1 : +1; + } + + /* 2. Priority */ + diff = priv_a->priority - priv_b->priority; + if (diff != 0) { + return diff < 1 ? -1 : +1; + } + + /* 3. Time (newest first) */ + diff = priv_b->timestamp - priv_a->timestamp; + if (diff != 0) { + return diff < 1 ? -1 : +1; + } + + /* No real difference, except maybe resource */ + return 0; +} + + +/*static*/ const gchar * +telepathy_presence_state_to_str (TelepathyPresenceState presence_state) +{ + switch (presence_state) { + case TELEPATHY_PRESENCE_STATE_AVAILABLE: + return "available"; + case TELEPATHY_PRESENCE_STATE_BUSY: + return "dnd"; + case TELEPATHY_PRESENCE_STATE_AWAY: + return "away"; + case TELEPATHY_PRESENCE_STATE_EXT_AWAY: + return "xa"; + case TELEPATHY_PRESENCE_STATE_HIDDEN: + return "hidden"; + case TELEPATHY_PRESENCE_STATE_UNAVAILABLE: + return "offline"; + default: + return NULL; + } + + return NULL; +} diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabbleadddeletecontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabbleadddeletecontact.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,316 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Contact management(add/delete etc) related Test Cases +* +*/ + + + + +//Include files +#include +#include +#include +#include +#include + +#include "telepathygabbleutils.h" +#include "telepathygabbleadddeletecontact.h" +#include "telepathygabblelogintest.h" + + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleAddDeleteContact +// description : constructor +//----------------------------------------------------------------------------- +CTelepathyGabbleAddDeleteContact::CTelepathyGabbleAddDeleteContact() +{ +} + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : constructor +//----------------------------------------------------------------------------- +void CTelepathyGabbleAddDeleteContact::ConstructL() +{ + //do nothing +} + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : constructor +//----------------------------------------------------------------------------- +CTelepathyGabbleAddDeleteContact* CTelepathyGabbleAddDeleteContact::NewL() +{ + CTelepathyGabbleAddDeleteContact* self = new(ELeave) CTelepathyGabbleAddDeleteContact; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; +} + +// Destructor +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabbleAddDeleteContact +// description : Destructor +//----------------------------------------------------------------------------- +CTelepathyGabbleAddDeleteContact::~CTelepathyGabbleAddDeleteContact() +{ + +} + +//----------------------------------------------------------------------------- +// function_name : add_contact +// description : adding a contact +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleAddDeleteContact::add_contact ( const gchar *contact_id, + const gchar *message, + CTestData* aTestData ) +{ + guint handle; + GArray *handles = NULL; + //gpointer userdata = (gpointer)contact_id; + + //first check the contact_id. + if( contact_id == NULL ) + { + return CTestData::EADD_FAIL; + } + + aTestData->SetAddDeleteContactStatus(CTestData::EADD_FAIL); + + //acess the utils class function to get the contact handle. + handle = CTelepathyGabbleUtils::get_handle_from_contact ( contact_id, aTestData ); + + if ( handle == KErrNotFound ) + { + return CTestData::EADD_FAIL; + } + + handles = g_array_new (FALSE, FALSE, sizeof (guint)); + + g_array_append_val (handles, handle); + + DBusGProxy *group_iface_subscribe = aTestData->GetGroupSubscribeInterface(); + DBusGProxy *group_iface_publish = aTestData->GetGroupPublishInterface(); + DBusGProxy *group_iface_known = aTestData->GetGroupKnownInterface(); + + + //register the callback, commented for now. + dbus_g_proxy_connect_signal (group_iface_subscribe, "MembersChanged", + G_CALLBACK (roster_members_changed_cb ), + aTestData, NULL); + + dbus_g_proxy_connect_signal (group_iface_publish, "MembersChanged", + G_CALLBACK (roster_members_changed_cb ), + aTestData, NULL); + + + dbus_g_proxy_connect_signal (group_iface_known, "MembersChanged", + G_CALLBACK (roster_members_changed_cb ), + aTestData, NULL); + + + tp_chan_iface_group_add_members_async ( group_iface_subscribe, handles, message, add_contact_cb, aTestData ); + + //Start the main loop + g_main_loop_run (aTestData->GetMainLoop()); + + g_array_free (handles, TRUE); + + //return the status was updated in the callback. + return aTestData->GetAddDeleteContactStatus(); +} + + +//----------------------------------------------------------------------------- +// function_name : remove_contact +// description : remove the contact. +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleAddDeleteContact::remove_contact ( const gchar *contact_id, + const gchar *message, + CTestData* aTestData + ) +{ + + guint handle; + GArray *handles = NULL; + + //first check the contact_id. + if( contact_id == NULL ) + { + return CTestData::EDELETE_FAIL; + } + + aTestData->SetAddDeleteContactStatus( CTestData::EDELETE_FAIL ); + + handle = CTelepathyGabbleUtils::get_handle_from_contact ( contact_id, aTestData); + + if ( handle == KErrNotFound ) + { + return CTestData::EDELETE_FAIL; + } + + + DBusGProxy *group_iface_known = aTestData->GetGroupKnownInterface(); + + handles = g_array_new (FALSE, FALSE, sizeof (guint)); + + g_array_append_val (handles, handle); + + tp_chan_iface_group_remove_members_async ( group_iface_known, handles, message, remove_contact_cb, aTestData ); + + //Start the main loop + g_main_loop_run (aTestData->GetMainLoop()); + + g_array_free (handles, TRUE); + + return (aTestData->GetAddDeleteContactStatus()); +} + + +//----------------------------------------------------------------------------- +// function_name : add_contact_cb +// description :Callback for add contact +//----------------------------------------------------------------------------- +void CTelepathyGabbleAddDeleteContact::add_contact_cb( DBusGProxy* /*proxy*/, GError* error, gpointer userdata ) +{ + CTestData* testdata = static_cast (userdata); + if ( !error ) + { + testdata->SetAddDeleteContactStatus(CTestData::EADD_SUCCESS); + } + else + { + testdata->SetAddDeleteContactStatus(CTestData::EADD_FAIL); + + } + + //Quit the main loop + g_main_loop_quit(testdata->GetMainLoop()); + +} + +//----------------------------------------------------------------------------- +// function_name : remove_contact_cb +// description : Callback for remove contact. +//----------------------------------------------------------------------------- + +void CTelepathyGabbleAddDeleteContact::remove_contact_cb( DBusGProxy* proxy, GError *error, gpointer userdata ) +{ + + CTestData* testdata = static_cast (userdata); + if ( error ) + { + testdata->GetStifLogger()->Log( _L("CTelepathyGabbleTest::deleting already removed contact,it should give some error \n") ); + testdata->SetAddDeleteContactStatus( CTestData::EDELETE_FAIL ); + } + else + { + testdata->GetStifLogger()->Log( _L("CTelepathyGabbleTest::deleted successfully \n") ); + testdata->SetAddDeleteContactStatus( CTestData::EDELETE_SUCCESS ); + } + //Quit the main loop started in Delete contact. + g_main_loop_quit(testdata->GetMainLoop()); +} + +//----------------------------------------------------------------------------- +// function_name : roster_members_changed_cb +// description : Callback for change in the contacts. +//----------------------------------------------------------------------------- + +void CTelepathyGabbleAddDeleteContact::roster_members_changed_cb (DBusGProxy* /*group_iface*/, + gchar* /*message */, + GArray *added, + GArray *removed, + GArray *local_pending, + GArray *remote_pending, + guint /*actor*/, + guint /*reason*/, + gpointer userdata) +{ + + gchar **contact_name = NULL; + + + + CTestData* atestData = static_cast (userdata); + + //TInt return_value = KErrNone; + + + + if (added->len > 0) + { + + //this is not working, use async api later + /*tp_conn_inspect_handles( DBUS_G_PROXY(atestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,added, + &contact_name,NULL);*/ + if(contact_name) + { + //The contact has been added. + // Must verify this against the contact_name for which the request was sent? + // This will depend on whether we will hit callback for one contact at a time + // or multiple callbacks for all contacts at a single time. ? + //return_value = KErrNone; + //atestData->SetAddDeleteContactStatus(CTestData::EADD_SUCCESS); + + } + } + if (removed->len > 0) + { + /*tp_conn_inspect_handles( DBUS_G_PROXY(atestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,removed, + &contact_name,NULL);*/ + if(contact_name) + { + //The contact_name was deleted + //Must verify this against the contact_name for which the request was sent? + //return_value == KErrNone; + } + } + if (local_pending->len > 0) + { + /*tp_conn_inspect_handles( DBUS_G_PROXY(atestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,local_pending, + &contact_name,NULL);*/ + if(contact_name) + { + //what should be tested here ? + //like what is next action expected ? + //since the contact is still local_pending, is the test case failed ? + //return_value = KErrNone; + //atestData->GetAddDeleteContactStatus(); + } + + } + if (remote_pending->len > 0) + { + /*tp_conn_inspect_handles( DBUS_G_PROXY(atestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,remote_pending, + &contact_name,NULL);*/ + if(contact_name) + { + //return_value = KErrNone; + //atestData->GetAddDeleteContactStatus(); + } + + } + + //dont quit from here right now. +} + +// End of File diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblefetchcontacts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblefetchcontacts.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,246 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Fetch contacts related Test Cases +* +*/ + + + + +//Include files +#include +#include +#include +#include + +#include "telepathygabblefetchcontacts.h" +#include "telepathygabbletestdata.h" + + + + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleFetchContacts +// description : constructor +//----------------------------------------------------------------------------- +CTelepathyGabbleFetchContacts::CTelepathyGabbleFetchContacts() +{ +} + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : constructor +//----------------------------------------------------------------------------- +void CTelepathyGabbleFetchContacts::ConstructL() +{ + //do nothing +} + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : constructor +//----------------------------------------------------------------------------- +CTelepathyGabbleFetchContacts* CTelepathyGabbleFetchContacts::NewL() + { + + CTelepathyGabbleFetchContacts* self = new(ELeave) CTelepathyGabbleFetchContacts; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabbleFetchContacts +// description : Destructor +//----------------------------------------------------------------------------- +CTelepathyGabbleFetchContacts::~CTelepathyGabbleFetchContacts() + { + + } + +//----------------------------------------------------------------------------- +// function_name : test_request_roster +// description : Function for fetching the contacts. +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleFetchContacts::test_request_roster( CTestData* aTestData ) +{ + + DBusGProxy * group_iface_subscribe = aTestData->GetGroupSubscribeInterface(); + + tp_chan_iface_group_get_all_members_async(group_iface_subscribe, get_roster_member_cb, aTestData); + + //Run the mainloop + g_main_loop_run (aTestData->GetMainLoop()); + + //retrun some error code here + if ( aTestData->GetTotalFetchCount() != KErrGeneral ) + { + return KErrNone; + } + else + { + return KErrGeneral; + } +} + +//----------------------------------------------------------------------------- +// function_name : get_roster_member_cb +// description : callback for getting the roster member. +//----------------------------------------------------------------------------- +void CTelepathyGabbleFetchContacts::get_roster_member_cb( DBusGProxy* /*proxy*/,GArray* current_members, GArray* local_pending_members, GArray* remote_pending_members, GError* /*error*/, gpointer userdata ) +{ + guint fetch_count=0; + guint fetch_loop_count=0; + GArray* fetch_members = NULL; + guint i; + guint total_len =0; + CTestData* testData = static_cast (userdata); + + + total_len = current_members->len + local_pending_members->len + remote_pending_members->len; + + testData->SetTotalFetchCount(total_len); + + if( !total_len ) + { + g_main_loop_quit(testData->GetMainLoop()); + return; + + } + + fetch_members = g_array_new (FALSE, FALSE, sizeof (guint32)); + + + if( current_members->len > 0) + { + fetch_count = 0; + fetch_loop_count = (current_members->len) / KMaxContactFetchCount + ( (current_members->len % KMaxContactFetchCount)? 1 : 0); + + for( i=0; ilen <= KMaxContactFetchCount)? current_members->len : KMaxContactFetchCount; + + g_array_append_vals (fetch_members,current_members->data,fetch_count); + + g_array_remove_range(current_members,0,fetch_count); + + //we will quit the main loop in inspect_handles_cb + tp_conn_inspect_handles_async( DBUS_G_PROXY(testData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,fetch_members, + inspect_handles_cb,userdata); + } + } + + if( local_pending_members->len > 0) + { + fetch_count = 0; + + g_array_remove_range(fetch_members,0,fetch_members->len); + + fetch_loop_count = (local_pending_members->len) / KMaxContactFetchCount + ( (local_pending_members->len % KMaxContactFetchCount)? 1 : 0); + + for( i=0; ilen <= KMaxContactFetchCount)? local_pending_members->len : KMaxContactFetchCount; + + + g_array_append_vals (fetch_members,local_pending_members->data,fetch_count); + + g_array_remove_range(local_pending_members,0,fetch_count); + + tp_conn_inspect_handles_async( DBUS_G_PROXY(testData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,fetch_members, + inspect_handles_cb,userdata); + } + + } + + if( remote_pending_members->len > 0) + { + fetch_count = 0; + g_array_remove_range(fetch_members,0,fetch_members->len); + fetch_loop_count = (remote_pending_members->len) / KMaxContactFetchCount + ( (remote_pending_members->len % KMaxContactFetchCount)? 1 : 0); + + for( i=0; ilen <= KMaxContactFetchCount)? remote_pending_members->len : KMaxContactFetchCount; + + g_array_append_vals (fetch_members,remote_pending_members->data,fetch_count); + g_array_remove_range(remote_pending_members,0,fetch_count); + tp_conn_inspect_handles_async( DBUS_G_PROXY(testData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT ,fetch_members, + inspect_handles_cb,userdata); + } + + } + return; + +} + +//----------------------------------------------------------------------------- +// function_name : inspect_handles_cb +// description : inspect the handle for the contact, return the contact handle +//----------------------------------------------------------------------------- +void CTelepathyGabbleFetchContacts::inspect_handles_cb( DBusGProxy* /*proxy*/,char **handles_names, + GError *error, gpointer userdata ) +{ + CTestData* testData = static_cast (userdata); + TInt last_index = testData->GetLastIndexInFetch(); + guint total_len = testData->GetTotalFetchCount(); + + if(!last_index) + { + //allmembers_names = g_new0 ( char *, total_len + 1); + } + + if(!handles_names || error ) + { + //error condition in inspect_handles_cb + testData->SetTotalFetchCount(KErrGeneral); + g_main_loop_quit(testData->GetMainLoop()); + return; + } + + for( TInt i=0; handles_names[i]; i++ ) + { + + //handle_names can be logged to the log file + last_index++; + } + + testData->SetLastIndexInFetch(last_index); + + if (last_index == total_len ) + { + //inspect_handle_cb for all the contacts has been receieved. + //Quit the main loop. + + //Set the flag that inspect_handles_cb has been completed successfully. + g_main_loop_quit(testData->GetMainLoop()); + } + + return ; +} +// End of File diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblelogintest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblelogintest.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,680 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Login-Logout related Test Cases +* +*/ + + + + +//Include files +#include +#include +#include + +#include +#include + +#include "telepathygabbleutils.h" +#include "telepathygabblelogintest.h" +#include "telepathygabbletestdata.h" +#include "telepathygabbleadddeletecontact.h" + +static void test_log_handler1 ( + const gchar *message + ) +{ + FILE* fp; + + fp = fopen("c:\\tplogs.txt","a"); + if(fp) + { + fprintf(fp,message); + fprintf(fp,"\n"); + fclose(fp); + } + + +} + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleLoginTest +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +CTelepathyGabbleLoginTest::CTelepathyGabbleLoginTest() + { + } + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +void CTelepathyGabbleLoginTest::ConstructL() + { + + } + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- +CTelepathyGabbleLoginTest* CTelepathyGabbleLoginTest::NewL() + { + + CTelepathyGabbleLoginTest* self = new(ELeave) CTelepathyGabbleLoginTest; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabbleLoginTest +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +CTelepathyGabbleLoginTest::~CTelepathyGabbleLoginTest() + { + + //class variables + //delete conn; + //conn = NULL; + + } + +//----------------------------------------------------------------------------- +// function_name : action_login +// description : login +// Returns : gboolean +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleLoginTest::action_login(char* username,char* password, + char* server, char* resource, char* ssl_flag, + char *port, char *proxy_server, char *proxy_port, + CTestData* aTestData) +{ + + + TpConnMgr *connmgr = NULL; + GError *error = NULL; + + test_log_handler1(username); + test_log_handler1(password); + test_log_handler1(server); + test_log_handler1(resource); + test_log_handler1(ssl_flag); + test_log_handler1(port); + + + GHashTable *connection_parameters = g_hash_table_new(g_str_hash, g_str_equal); + + DBusGConnection *dbus_connection; + TpConn *tp_conn; + + //Use the values passed from the cfg file. + gchar* def1 = g_strdup(username); + gchar* def2 = g_strdup(password); + + gchar* def3 = g_strdup(server); + gchar* def4 = g_strdup(resource); + + guint def5 = atoi(port); //443; + + #ifdef __WINSCW__ + gchar* def6 = g_strdup(proxy_server); //g_strdup("172.16.42.135"); //for emulater + guint def7 = atoi(proxy_port); //8080; //for emulater + #endif + + GValue *value1 = g_new0(GValue, 1); + GValue *value2 = g_new0(GValue, 1); + GValue *value3 = g_new0(GValue, 1); + GValue *value4 = g_new0(GValue, 1); + GValue *value5 = g_new0(GValue, 1); + + #ifdef __WINSCW__ + GValue *value6 = g_new0(GValue, 1); + GValue *value7 = g_new0(GValue, 1); + #endif + + GValue *value8 = g_new0(GValue, 1); + g_type_init(); + + + // just use system bus and do not bother about others + dbus_connection = dbus_g_bus_get( DBUS_BUS_SESSION , &error); + + aTestData->GetStifLogger()->Log( _L("after dbus_g_bus_get") ); + /* bsr 4 sep: this was null as host parsing failed -> transport was zero -> connectionw as 0 */ + if (dbus_connection == NULL) + { + // if we get error as part of above step, connection variable is NULL, so we are here + //_dbus_verboseerr("Failed to open connection to bus: %s\n", error->message); + //test_log_handler("Found Error in dbus_g_bus_get exiting.\n"); + aTestData->GetStifLogger()->Log( _L("dbus_connection == NULL") ); + g_error_free(error); + return (aTestData->GetConnectionState()); + } + else + { + aTestData->SetDBusConnection(dbus_connection); + } + + aTestData->GetStifLogger()->Log( _L("b4 tp_connmgr_new") ); + /* Create a connection manager object */ + connmgr = tp_connmgr_new(dbus_connection, CONNMGR_BUS, CONNMGR_PATH, + /*CONNMGR_BUS*/ TP_IFACE_CONN_MGR_INTERFACE); + aTestData->GetStifLogger()->Log( _L("after tp_connmgr_new") ); + if (connmgr == NULL) + { + aTestData->GetStifLogger()->Log( _L("connmgr == NULL") ); + g_error("Failed to create a connection manager, skipping manager startup."); + return (aTestData->GetConnectionState()); + } + else + { + aTestData->SetTpConnMgr(connmgr); + } + + g_value_init(value1, G_TYPE_STRING); + g_value_set_string (value1, def1); + g_hash_table_insert(connection_parameters, (gpointer)"account", (gpointer)value1); + + g_value_init(value2, G_TYPE_STRING); + g_value_set_string (value2, def2); + g_hash_table_insert(connection_parameters,(gpointer) "password",(gpointer) value2); + + g_value_init(value3, G_TYPE_STRING); + g_value_set_string (value3, def3); + g_hash_table_insert(connection_parameters,(gpointer) "server",(gpointer)value3 ); + + g_value_init(value4, G_TYPE_STRING); + g_value_set_string (value4, def4); + g_hash_table_insert(connection_parameters, (gpointer)"resource", (gpointer)value4); + + + g_value_init(value5, G_TYPE_UINT); + g_value_set_uint (value5, def5); + g_hash_table_insert(connection_parameters, (gpointer)"port", (gpointer)value5); + + //convert the ssl_flag to ascii + TInt ssl_bool = atoi(ssl_flag); + + //if (ssl_flag == "1") //def8 ==1 + if (ssl_bool == 1) //i.e. only for gtalk, not for gizmo + { + gboolean def8 = TRUE; //for gtalk + g_value_init(value8, G_TYPE_BOOLEAN); + g_value_set_boolean (value8, def8); + g_hash_table_insert(connection_parameters, (gpointer)"old-ssl", (gpointer)value8); + } + +#ifdef __WINSCW__ + g_value_init(value6, G_TYPE_STRING); + g_value_set_string (value6, def6); + g_hash_table_insert(connection_parameters, (gpointer)"https-proxy-server", (gpointer)value6); + + + g_value_init(value7, G_TYPE_UINT); + g_value_set_uint (value7, def7); + g_hash_table_insert(connection_parameters, (gpointer)"https-proxy-port",(gpointer) value7); +#endif + + + // Create a new actual connection with the connection manager + //Ensure that conn is global. + // The same conn object is used for logout. + aTestData->GetStifLogger()->Log( _L("b4 tp_connmgr_new_connection") ); + tp_conn = tp_connmgr_new_connection(connmgr,connection_parameters, PROTOCOL); + aTestData->GetStifLogger()->Log( _L("after tp_connmgr_new_connection") ); + if( tp_conn == NULL ) + { + aTestData->GetStifLogger()->Log( _L("tp_conn is null") ); + return (aTestData->GetConnectionState()); + } + else + { + aTestData->SetTpConn(tp_conn); + } + + + + // add a callback for StatusChange signal + dbus_g_proxy_connect_signal(DBUS_G_PROXY(tp_conn), "StatusChanged", + (G_CALLBACK(status_changed_cb)), + aTestData,NULL ); + + g_hash_table_destroy(connection_parameters); + + //Run the mainloop + g_main_loop_run (aTestData->GetMainLoop()); + + //Quit of main loop happened in thecallback. + //unref this mainloop + // same main loop can be used for all classes, + // unref after logout in each test case when logintest object gets destroyed + //g_main_loop_unref ( mainloop ); + + //After the status_changed_cb , the control back here + //Check the value of global variable that was updated + //in the callback and return the same. + + + //Get the connected state for login and return the same. + return (aTestData->GetConnectionState()); +} + +//----------------------------------------------------------------------------- +// function_name : action_logout +// description : Does logout +// Returns : None +//----------------------------------------------------------------------------- + +TInt CTelepathyGabbleLoginTest::action_logout(CTestData* aTestData) +{ + GError *error = NULL; + + //Do the disconnect + tp_conn_disconnect (DBUS_G_PROXY( aTestData->GetTpConn()), &error); + + //g_hash_table_destroy(global_data_ptr->Getptrhashtable_textchan()); + + //Start the main loop + g_main_loop_run (aTestData->GetMainLoop()); + + + //After this see that the callback status_changed_cb + //is hit with TP_CONN_STATUS_DISCONNECTED as the status. + + //After the status_changed_cb , the control back here + //Check the value of global variable that was updated in the + //callback and return the same. + + if (error) + { + // There is some error + g_error_free (error); + // Update the global to connected + //global_connected = TRUE; + } + //else global_connected is made FALSE in the status_changed_cb + + + //return global_connected; + //Get the connected state for login and return the same. + return (aTestData->GetConnectionState()); +} + +//----------------------------------------------------------------------------- +// function_name : action_cancel +// description : cancel login +// Returns : None +//----------------------------------------------------------------------------- + +TInt CTelepathyGabbleLoginTest::action_cancel(char* username, + char* password, char* server,char* resource, char* ssl_flag, + char *port,char *proxy_server, char *proxy_port, + CTestData* aTestData) +{ + aTestData->SetTestType(CTestData::ECancel) ; + aTestData->GetStifLogger()->Log( _L("inside action_cancel\n") ); + action_login(username,password,server,resource,ssl_flag, + port, proxy_server, proxy_port, aTestData); + + action_logout(aTestData);//Do tp_disconnected. + + return (aTestData->GetConnectionState()); +} + +//----------------------------------------------------------------------------- +// function_name : status_changed_cb +//----------------------------------------------------------------------------- +gboolean CTelepathyGabbleLoginTest::status_changed_cb(DBusGProxy* /*proxy*/, + guint status, guint reason, + gpointer user_data) +{ + GHashTable* textChannelsHT = NULL; + CTestData* testData = static_cast (user_data); + CStifLogger* logger = testData->GetStifLogger(); + logger->Log( _L("status_changed_cb\n") ); + + if (status == TP_CONN_STATUS_CONNECTED ) + { + + + logger->Log( _L("status_changed_cb::connected\n") ); + + + if( testData->GetTestType() != CTestData::ELogin ) + { + + + textChannelsHT = + g_hash_table_new_full(g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_object_unref); + + testData->SetTextChannelsHT(textChannelsHT); + //Register the callback for new channel + //Commented for now has been put in the SendMessage function, + dbus_g_proxy_connect_signal(DBUS_G_PROXY(testData->GetTpConn()), "NewChannel", + (G_CALLBACK(new_channel_handler)), + user_data,NULL); + } + else + { + // if the test case is login related test case, new channel callback not required + //so dont register for NewChannel + g_main_loop_quit(testData->GetMainLoop()); + testData->ResetLoginCompleteFlag(); + } + //update the state_of_conenction enum + testData->SetConnectionState(CTestData::ECONNECTED ); + + } + else if (status == TP_CONN_STATUS_CONNECTING) + { + //if the test case is for cancel disconnect here, meaning cancel the login here. + //if cancel test case, do disconnect in connecting state + testData->SetConnectionState(CTestData::ECONNECTING); + if ( testData->GetTestType() == CTestData::ECancel) + { + //quit from this callback so that we return to point from where + //action_login was called. + g_main_loop_quit(testData->GetMainLoop()); + } + + } + else if ( status == TP_CONN_STATUS_DISCONNECTED ) + { + + + if ( testData->GetTestType() == CTestData::ECancel) + { + //this disconnect was initiated from the cancel test case + logger->Log( _L("status_changed_cb :cancelled \n") ); + testData->SetConnectionState(CTestData::EDISCONNECTED); + //quit the main loop. + g_main_loop_quit(testData->GetMainLoop()); + } + else + { + + if(reason == TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED) + { + // Here disconnect is received as the authentication has failed. + //it could be because of invalid user_id or invalid passwd issued + //while passing the login parameters. + //Here we are checking for TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED since + // the gabblelogs show the reason value as 3 if invalid user_id and passwd are given. + + testData->SetConnectionState(CTestData::EDISCONNECTED); + + //Quit the main loop started in action_login. + g_main_loop_quit(testData->GetMainLoop()); + + } + else + { + //this was initiated in the logout testcase, + //update the state_of_connection + //LOGOUT AFTER SUCCESSFUL LOGIN + + if( testData->GetConnectionState() != CTestData::EDISCONNECTED ) + { + + logger->Log( _L("status_changed_cb::not disconnected\n") ); + + testData->IncLoginCompleteFlag(); + + //currently for all the reasons except TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED + //disconencted will come here. + //This code can be updated for variuos "reason" values + //based on the scenarios and the need for the test cases for those scenarios. + } + + if( testData->GetLoginCompleteFlag() && testData->GetConnectionState() == CTestData::EDISCONNECTED ) + { + logger->Log( _L("status_changed_cb::disconnected\n") ); + testData->ResetLoginCompleteFlag(); + //Quit the main loop started in action_login. + g_main_loop_quit(testData->GetMainLoop()); + + } + logger->Log( _L("status_changed_cb::before SetConnectionState\n") ); + testData->SetConnectionState(CTestData::EDISCONNECTED); + + } + } + + } + logger->Log( _L("status_changed_cb out\n") ); + return TRUE; +} + +//----------------------------------------------------------------------------- +// function_name : new_channel_handler +// description : callback function for NewChannel signal +//----------------------------------------------------------------------------- +void CTelepathyGabbleLoginTest::new_channel_handler(DBusGProxy* /*proxy*/, const char *object_path, + const char *channel_type, guint handle_type, + guint channel_handle, gboolean /*suppress_handler*/, + gpointer user_data) +{ +CTestData* testData = static_cast (user_data); +CStifLogger* logger = testData->GetStifLogger(); +logger->Log( _L("new_channel_handler\n") ); + +//Use the class data member new_text_channel. +TpChan *new_chan; + +//Get the new_chan +new_chan = tp_chan_new(testData->GetDBusConnection(), + CONNMGR_BUS, object_path, + channel_type, handle_type, channel_handle); + + +//channel_type == TP_IFACE_CHANNEL_TYPE_TEXT +if ((strcmp(channel_type, TP_IFACE_CHANNEL_TYPE_TEXT) == 0) ) + { + g_hash_table_insert(testData->GetTextChannelsHT(), g_strdup(object_path), new_chan); + //test_log_handler( "b4 text_channel_init" ); + //check for new_chan objects for text channel should be loaclly stored/freed + text_channel_init( new_chan ); + } + + +//channel_type == TP_IFACE_CHANNEL_TYPE_CONTACT_LIST +if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && (g_strrstr(object_path, "RosterChannel/subscribe") ) ) + + { + DBusGProxy* groupInterface = NULL; + //Get the group_iface + groupInterface = + tp_chan_get_interface(new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + + + testData->SetGroupSubscribeInterface(groupInterface); + + //register the callback, commented for now. + dbus_g_proxy_connect_signal (groupInterface, "MembersChanged", + G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ), + NULL, NULL); + + //add_contact("testcm6666@gmail.com",NULL); + + testData->IncLoginCompleteFlag(); + + } + +if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && (g_strrstr(object_path, "RosterChannel/publish") ) ) + + { + + DBusGProxy* groupInterface = NULL; + //Get the group_iface + groupInterface == + tp_chan_get_interface(new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + + testData->SetGroupPublishInterface(groupInterface); + + dbus_g_proxy_connect_signal (groupInterface, "MembersChanged", + G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ), + NULL, NULL); + + + + //Increment the flag. + testData->IncLoginCompleteFlag(); + + } + +if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && (g_strrstr(object_path, "RosterChannel/known") ) ) + + { + DBusGProxy* groupInterface = NULL; + //Get the group_iface + groupInterface = tp_chan_get_interface(new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + + + //remove_contact( "testcm6666@gmail.com", NULL ); + testData->SetGroupKnownInterface(groupInterface); + + dbus_g_proxy_connect_signal (groupInterface, "MembersChanged", + G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ), + NULL, NULL); + + + //increment the flag + testData->IncLoginCompleteFlag(); + + } + +if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0 + && (g_strrstr(object_path, "RosterChannel/deny") ) ) + + { + DBusGProxy* groupInterface = NULL; + //Get the group_iface + groupInterface = tp_chan_get_interface(new_chan, + TELEPATHY_CHAN_IFACE_GROUP_QUARK); + + testData->SetGroupDenyInterface(groupInterface); + + dbus_g_proxy_connect_signal (groupInterface, "MembersChanged", + G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ), + NULL, NULL); + + //remove_contact( "testcm6666@gmail.com", NULL ); + + //increment the flag + testData->IncLoginCompleteFlag(); + + } + //Quit the mainloop started once all the channel-types are recieved. + //check the flag. + + if (testData->GetLoginCompleteFlag() == 3) + //In case of gizmo, the number of channels is 3.gtalk for deny also we get the callback + //we must also store the server name in the login class and check the server name here + { + //Quit the main loop. + testData->ResetLoginCompleteFlag(); + testData->GetStifLogger()->Log( _L("new_channel_handler::after ResetLoginCompleteFlag\n") ); + g_main_loop_quit(testData->GetMainLoop()); + + } + + +} + +//----------------------------------------------------------------------------- +// function_name : text_channel_init +// description : To get pending messages after login +//----------------------------------------------------------------------------- + +void CTelepathyGabbleLoginTest::text_channel_init ( TpChan *text_chan ) + { + GPtrArray *messages_list ; + guint i; + GArray *message_ids; + DBusGProxy *text_iface; + + + text_iface = tp_chan_get_interface(text_chan , + TELEPATHY_CHAN_IFACE_TEXT_QUARK); + + + //check if need to fetch the pending message or simply register for receive only + tp_chan_type_text_list_pending_messages(text_iface, + FALSE, + &messages_list, + NULL); + + + message_ids = g_array_new (FALSE, TRUE, sizeof (guint)); + + + for (i = 0; i < messages_list->len ; i++) + { + guint message_id; + guint timestamp; + guint from_handle; + guint message_type; + guint message_flags; + const gchar *message_body; + GValueArray *message_struct; + + + + message_struct = (GValueArray *) g_ptr_array_index (messages_list, i); + + message_id = g_value_get_uint(g_value_array_get_nth(message_struct, 0)); + + timestamp = g_value_get_uint(g_value_array_get_nth(message_struct, 1)); + + from_handle = g_value_get_uint(g_value_array_get_nth(message_struct, 2)); + + message_type = g_value_get_uint(g_value_array_get_nth(message_struct, 3)); + + message_flags = g_value_get_uint(g_value_array_get_nth(message_struct, 4)); + + message_body = g_value_get_string(g_value_array_get_nth(message_struct, 5)); + + g_array_append_val (message_ids, message_id); + + } + + + tp_chan_type_text_acknowledge_pending_messages(text_iface, message_ids, + NULL); + + + +} + + + +//End of file \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblepresencetest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblepresencetest.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Presence Test Cases +* +*/ + + + + +// INCLUDE FILES +#include "telepathygabblepresencetest.h" +#include "telepathygabbletestdata.h" + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +CTelepathyGabblePresenceTest::CTelepathyGabblePresenceTest() + { + } + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +void CTelepathyGabblePresenceTest::ConstructL() + { + + } + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- +CTelepathyGabblePresenceTest* CTelepathyGabblePresenceTest::NewL() + { + + CTelepathyGabblePresenceTest* self = new(ELeave) CTelepathyGabblePresenceTest; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabblePresenceTest +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +CTelepathyGabblePresenceTest::~CTelepathyGabblePresenceTest() +{ + +} + + +//----------------------------------------------------------------------------- +// function_name : ~CTestData +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +TelepathyPresenceState CTelepathyGabblePresenceTest::telepathy_presence_state_from_str (const gchar *str) +{ + char temp[25]; + strcpy(temp,str); + //roster_log_handler("telepathy_telepathy_presence_state_from_str"); + //roster_log_handler(temp); + + if (strcmp (str, "available") == 0) { + return TELEPATHY_PRESENCE_STATE_AVAILABLE; + } else if ((strcmp (str, "dnd") == 0) || (strcmp (str, "busy") == 0)) { + return TELEPATHY_PRESENCE_STATE_BUSY; + } else if ((strcmp (str, "away") == 0) || (strcmp (str, "brb") == 0)) { + return TELEPATHY_PRESENCE_STATE_AWAY; + } else if (strcmp (str, "xa") == 0) { + return TELEPATHY_PRESENCE_STATE_EXT_AWAY; + } else if (strcmp (str, "hidden") == 0) { + return TELEPATHY_PRESENCE_STATE_HIDDEN; + } else if (strcmp (str, "offline") == 0) { + return TELEPATHY_PRESENCE_STATE_UNAVAILABLE; + } + + return TELEPATHY_PRESENCE_STATE_AVAILABLE; +} + +//----------------------------------------------------------------------------- +// function_name : ~CTestData +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +//vinod: gossip_telepathy_contacts_send_presence +void +CTelepathyGabblePresenceTest::telepathy_contacts_send_presence (DBusGProxy *pres_iface, + TelepathyPresence *presence/*CTestData *aTestData*/) +{ + GHashTable *status_ids; + GHashTable *status_options; + const gchar *status_id; + const gchar *message; + TelepathyPresenceState presence_state; + GError *error = NULL; + GValue value_message = {0, }; + + //iTpConn = aTestData->GetTpConn(); + + //g_return_if_fail (contacts != NULL); + //g_return_if_fail (GOSSIP_IS_PRESENCE (presence)); + + if (!pres_iface) { + return; + } + + status_ids = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_hash_table_destroy); + status_options = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) g_value_unset); + + presence_state = telepathy_presence_get_state (presence); + status_id = telepathy_presence_state_to_str (presence_state); + message = telepathy_presence_get_status (presence); + + if (message) { + g_value_init (&value_message, G_TYPE_STRING); + g_value_set_string (&value_message, message); + g_hash_table_insert (status_options, (gpointer)"message", &value_message); + } + + g_hash_table_insert (status_ids, + g_strdup (status_id), + status_options); + + //Sync way: gossip_debug (DEBUG_DOMAIN, "sending presence..."); + if (! (DBUS_G_PROXY(pres_iface), + status_ids, + &error)) { + //gossip_debug ("Could not set presence: %s", error->message); + //roster_log_handler("Could not set presence\n"); + g_clear_error (&error); + } + //Async way +/*tp_conn_iface_presence_set_status_async(DBUS_G_PROXY(pres_iface), + status_ids, + , + NULL ); +*/ + g_hash_table_destroy (status_ids); +} + +//----------------------------------------------------------------------------- +// function_name : telepathy_presences_foreach +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +void +CTelepathyGabblePresenceTest::telepathy_presences_foreach (gpointer *key, + gpointer *value, + TelepathyPresence **presence) +{ + TelepathyPresenceState state; + const gchar *message; + char temp[100]; + + *presence = telepathy_presence_new(); + + //roster_log_handler("telepathy_presences_foreach"); +// roster_log_handler(key); + + state = telepathy_presence_state_from_str((const gchar *)key); + + telepathy_presence_set_state(*presence, state); + + message = g_value_get_string((GValue *) + g_hash_table_lookup((GHashTable *) + value, "message")); + strcpy(temp,message); + //roster_log_handler(temp); + +} + +//----------------------------------------------------------------------------- +// function_name : telepathy_presence_handle_foreach +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +void +CTelepathyGabblePresenceTest::telepathy_presence_handle_foreach (gpointer *key, + gpointer *value) +{ + gint handle_id; + GHashTable *presences_hash; + GValue *gvalue; + gboolean new_item; + GObject *contact; + GObject *presence; + gchar **handle_name; + GArray *handles; + + CTestData* atestData; + + handle_id = GPOINTER_TO_INT(key); + + handles = g_array_new (FALSE, FALSE, sizeof (gint)); + g_array_append_val (handles, handle_id); + tp_conn_inspect_handles(DBUS_G_PROXY(atestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT, handles, + &handle_name, NULL); + + gvalue = g_value_array_get_nth((GValueArray *) value, 1); + + presences_hash = (GHashTable *) g_value_get_boxed(gvalue); + + g_hash_table_foreach(presences_hash, + (GHFunc) telepathy_presences_foreach, &presence); +} + +//----------------------------------------------------------------------------- +// function_name : ~CTestData +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +void CTelepathyGabblePresenceTest::telepathy_presence_handler(DBusGProxy *proxy, + GHashTable *handle_hash) +{ + //GObject *presence; + TelepathyPresence *presence; + TelepathyPresenceState state; + GSList *data = NULL; + //vinod: setting the new presence status + presence = telepathy_presence_new(); + //here am hard coding the value, this can be taken from ximpfw + state = telepathy_presence_state_from_str("dnd"); + telepathy_presence_set_state(presence, state); + //vinod + //roster_log_handler("telepathy_presence_handler callback\n"); + g_hash_table_foreach(handle_hash, (GHFunc) telepathy_presence_handle_foreach, data); + + + //vinod: call telepathy_set_presence method here + telepathy_contacts_send_presence(proxy, presence); + +} + +// End of File diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblesearch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblesearch.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,430 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Search Related Test Cases +* +*/ + + + + +//Include files +#include +#include +#include +#include +#include +#include "telepathygabbleutils.h" +#include "telepathygabblesearch.h" +#include "telepathygabbletestdata.h" +#include "tp-chan.h" +#include "tp-conn-gen.h" + + + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleSearch +// description : constructor +//----------------------------------------------------------------------------- + +CTelepathyGabbleSearch::CTelepathyGabbleSearch() +{ +} + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : constructor +//----------------------------------------------------------------------------- +void CTelepathyGabbleSearch::ConstructL() +{ + +} + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : NewL +//----------------------------------------------------------------------------- +CTelepathyGabbleSearch* CTelepathyGabbleSearch::NewL() + { + CTelepathyGabbleSearch* self = new(ELeave) CTelepathyGabbleSearch; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabbleSearch +// description : Destructor +//----------------------------------------------------------------------------- +CTelepathyGabbleSearch::~CTelepathyGabbleSearch() + { + } + + +//----------------------------------------------------------------------------- +// function_name : SearchL +// description : Used for searching contacts +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleSearch::SearchL( GHashTable *aDataToSearch, CTestData* aTestData ) +{ + Search_UserData *userData = new(ELeave) Search_UserData; + + userData->data_to_search = aDataToSearch; + userData->testData = aTestData; + + iTestData = aTestData; + + if( iTestData->GetSearchChan() ) + { + SearchAgainL( aDataToSearch, iTestData ); + //Run the mainloop + g_main_loop_run (iTestData->GetMainLoop()); + } + else + { + if (!tp_conn_request_channel_async( DBUS_G_PROXY( aTestData->GetTpConn() ), + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, + TP_CONN_HANDLE_TYPE_NONE, 0, TRUE, + do_search_reply,(gpointer) userData ) ) + + { + return KErrGeneral; + } + //Run the mainloop + g_main_loop_run (iTestData->GetMainLoop()); + DoSearchL( aDataToSearch, aTestData); + } + + + + + if(userData) + { + delete userData; + userData = NULL; + } + + //return the Message_sent that was updated in the callback sendmessage_cb + return iTestData->GetSearchState(); +} + +//----------------------------------------------------------------------------- +// function_name : SearchAgainL +// description : Used for searching contacts second or more number of times +//----------------------------------------------------------------------------- + + void CTelepathyGabbleSearch::SearchAgainL( GHashTable *aDataToSearch, CTestData* aTestData ) + { + + DBusGProxy *search_iface = NULL; + TpChan *search_chan = NULL; + + if(aTestData) + { + search_chan = aTestData->GetSearchChan(); + } + if ( NULL == search_chan ) + { + return ; + } + //Get chan interface + search_iface = tp_chan_get_interface( search_chan , + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + + if ( NULL == search_iface ) + { + return ; + } + + //Call the search on tp + tp_chan_type_search_async( search_iface, aDataToSearch, searchreply_cb, + aTestData ); + + + } + + +//----------------------------------------------------------------------------- +// function_name : GetSearchKeysL +// description : Used for getting search keys +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleSearch::GetSearchKeysL( CTestData* aTestData ) +{ + Search_UserData *userData = new(ELeave) Search_UserData; + + userData->data_to_search = NULL; + userData->testData = aTestData; + + iTestData = aTestData; + + if (!tp_conn_request_channel_async( DBUS_G_PROXY( aTestData->GetTpConn() ), + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, + TP_CONN_HANDLE_TYPE_NONE, 0, TRUE, + do_search_reply,(gpointer) userData ) ) + + { + return KErrGeneral; + } + + //Run the mainloop + g_main_loop_run (aTestData->GetMainLoop()); + + DoSearchL(NULL,aTestData); + + if(userData) + { + delete userData; + userData = NULL; + } + + //return the Message_sent that was updated in the callback sendmessage_cb + return iTestData->GetSearchState(); +} + + +void CTelepathyGabbleSearch::do_search_reply( DBusGProxy* /*proxy*/, char *chan_object_path, + GError *error, gpointer user_data ) + { + Search_UserData* userData = static_cast (user_data); + TpChan *search_chan = NULL; + + TInt search_state = userData->testData->GetSearchState(); + + + /* Create the object to represent the channel */ + if ( error ) + { + userData->testData->SetSearchState(CTestData::ESearchError); + return; + } + search_chan = tp_chan_new( userData->testData->GetDBusConnection(), CONNMGR_BUS, chan_object_path, + TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, TP_CONN_HANDLE_TYPE_NONE, 0 ); + + + g_free(chan_object_path); + + + if ( NULL == search_chan ) + { + userData->testData->SetSearchState(CTestData::ESearchError); + return ; + } + + userData->testData->SetSearchChan( search_chan ); + + g_main_loop_quit(userData->testData->GetMainLoop()); + + + } + + +void CTelepathyGabbleSearch::DoSearchL(GHashTable *aDataToSearch,CTestData *testData) +{ + DBusGProxy *search_iface = NULL; + TInt testType = testData->GetTestType(); + + //Get chan interface + search_iface = tp_chan_get_interface( testData->GetSearchChan(), + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + + if ( NULL == search_iface ) + { + testData->SetSearchState(CTestData::ESearchError); + return ; + } + //Register for the SearchResultReceived signal + //ownership of the srch_result->user_data is transfered + dbus_g_proxy_connect_signal( search_iface, "SearchResultReceived", + G_CALLBACK( search_result_received_cb ), + (gpointer)this, NULL ); + + + //Register for the SearchStateChanged signal + dbus_g_proxy_connect_signal( search_iface, "SearchStateChanged", + G_CALLBACK( search_state_changed_cb ), + (gpointer)this, NULL ); + + if( testType == CTestData::EGetSearchKeys ) + { + //Call the getsearchkeys on tp + tp_chan_type_search_get_search_keys_async(search_iface,getsearchkeys_cb, testData ); + + } + else if( testType == CTestData::ESearch ) + { + //Call the search on tp + tp_chan_type_search_async( search_iface, aDataToSearch, + searchreply_cb, testData); + } + + g_main_loop_run(testData->GetMainLoop()); + +} +void CTelepathyGabbleSearch::getsearchkeys_cb( DBusGProxy* /*proxy*/, gchar* /*instr*/, + gchar** keys, GError *error, gpointer user_data ) +{ +CTestData* testData = static_cast (user_data); + +if(!keys || error ) + { + testData->SetSearchState( CTestData::ESearchError ); + } + +if(keys) + { + testData->GetStifLogger()->Log( _L("getsearchkeys_cb:SearchKeysFound") ); + testData->SetSearchState( CTestData::ESearchKeysFound ); + testData->SetSearchKeys(keys); + } +g_main_loop_quit(testData->GetMainLoop()); + +} + + + +void CTelepathyGabbleSearch::searchreply_cb( DBusGProxy* /*proxy*/, GError *error, gpointer user_data ) +{ + CTestData* testData = static_cast (user_data); + TInt testType = testData->GetTestType(); + + testData->GetStifLogger()->Log( _L("searchreply_cb") ); + + if ( testType == CTestData::ESearch ) + { + if(error) + { + testData->GetStifLogger()->Log( _L("Error in search") ); + testData->SetSearchState(CTestData::ESearchError); + tp_chan_close_async( DBUS_G_PROXY( testData->GetSearchChan() ), search_chan_closed_cb, testData ); + } + } + +} + + + + +void CTelepathyGabbleSearch::search_result_received_cb ( DBusGProxy* /*proxy*/, + guint /*contact_handle*/, + GHashTable *values, + gpointer user_data + ) +{ +CTelepathyGabbleSearch* search_userData = static_cast (user_data); +guint result_count = 0; + +//iTestData->GetStifLogger()->Log( _L("search_result_received_cb") ); +search_userData->GetTestData()->GetStifLogger()->Log( _L("search_result_received_cb") ); + +if(values ) + result_count = g_hash_table_size(values); + + +//do this later +/*if(result_count) + { + g_hash_table_foreach(values,setfield_foreach,NULL); + }*/ + + +} + +void CTelepathyGabbleSearch::search_state_changed_cb ( DBusGProxy* /*proxy*/, + guint search_state, + gpointer user_data + ) +{ +CTelepathyGabbleSearch* search_userData = static_cast (user_data); +DBusGProxy *search_iface = NULL; +GError **err = NULL; +guint *state = NULL; +TpChan *search_chan = NULL; +CTestData* testData = search_userData->GetTestData(); + +if(search_userData && testData ) + { + testData->GetStifLogger()->Log( _L("search_state_changed_cb") ); + search_chan = testData->GetSearchChan(); + } + + +if( search_state == TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER && search_userData && search_chan ) + { + testData->SetSearchState(CTestData::ESearchCompleted); + search_iface = tp_chan_get_interface( search_chan, + TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK ); + tp_chan_type_search_get_search_state( search_iface,state,err); + g_main_loop_quit(testData->GetMainLoop()); + } + +} + +void CTelepathyGabbleSearch::search_chan_closed_cb ( DBusGProxy* /*proxy*/, + GError *error, + gpointer user_data + ) +{ +CTestData* testData = static_cast (user_data); + +testData->GetStifLogger()->Log( _L("search_chan_closed_cb") ); +if(error) + { + testData->GetStifLogger()->Log( _L("search_chan_closed_cb : Error ") ); + testData->SetSearchState(CTestData::ESearchError); + } +else + { + + TInt testType = testData->GetTestType(); + if( testType == CTestData::EGetSearchKeys ) + { + testData->SetSearchState(CTestData::ESearchKeysFound); + testData->GetStifLogger()->Log( _L("search_chan_closed_cb : SearchKeysFound ") ); + } + else if( testType == CTestData::ESearch ) + { + testData->SetSearchState(CTestData::ESearchCompleted); + testData->GetStifLogger()->Log( _L("search_chan_closed_cb : SearchCompleted ") ); + } + } +g_main_loop_quit(testData->GetMainLoop()); +} + +CTestData* CTelepathyGabbleSearch::GetTestData() + { + return iTestData; + } + +/*void CTelepathyGabbleSearch::setfield_foreach (gpointer key, gpointer value, gpointer user_data) +{ + gchar *k = (gchar *) key; + const char *v = g_value_get_string ( (const GValue*)value); + CTestData* testdata = static_cast (user_data); + + //testdata->GetStifLogger()->Log( _L("setfield_foreach") ); + +}*/ + +void CTelepathyGabbleSearch::CloseChannel( CTestData* aTestdata ) + { + if( aTestdata->GetSearchChan() ) + { + tp_chan_close_async( DBUS_G_PROXY( aTestdata->GetSearchChan() ), search_chan_closed_cb, aTestdata ); + } + //Run the mainloop + g_main_loop_run (aTestdata->GetMainLoop()); + } + +// End of File diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblesendmessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblesendmessage.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,350 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Used for Send/Receive Test Cases +* +*/ + + + + +//Include files +#include +#include +#include +#include +#include +#include "telepathygabbleutils.h" +#include "telepathygabblesendmessage.h" +#include "telepathygabbletestdata.h" + + + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleSendRecvMessage +// description : constructor +//----------------------------------------------------------------------------- + +CTelepathyGabbleSendRecvMessage::CTelepathyGabbleSendRecvMessage() +{ +} + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : constructor +//----------------------------------------------------------------------------- +void CTelepathyGabbleSendRecvMessage::ConstructL() +{ + +} + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : NewL +//----------------------------------------------------------------------------- +CTelepathyGabbleSendRecvMessage* CTelepathyGabbleSendRecvMessage::NewL() + { + CTelepathyGabbleSendRecvMessage* self = new(ELeave) CTelepathyGabbleSendRecvMessage; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTelepathyGabbleSendRecvMessage +// description : Destructor +//----------------------------------------------------------------------------- +CTelepathyGabbleSendRecvMessage::~CTelepathyGabbleSendRecvMessage() + { + } + + +//----------------------------------------------------------------------------- +// function_name : SendMessage +// description : To send a message +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleSendRecvMessage::SendMessage( const char *contact_id, + const char *message, + CTestData* aTestData ) +{ + TpChan* text_chan = NULL; //for send msg + + TInt contact_handle; + GArray *handles = NULL; + GError* error = NULL; + DBusGProxy *text_iface = NULL; + + gpointer userdata = NULL; + + + //get the contact handle. + contact_handle = CTelepathyGabbleUtils::get_handle_from_contact(contact_id,aTestData); + + if ( contact_handle == KErrNotFound ) + { + return CTestData::EMessageSendErr; + } + + text_chan = (TpChan*)g_hash_table_find( + aTestData->GetTextChannelsHT(), + (GHRFunc) text_channels_find_func, + &contact_handle ); + + //text_chan for the particular contact does not exist. + //New text_chan must be created. + if (text_chan == NULL) + { + text_chan = tp_conn_new_channel( + (aTestData->GetDBusConnection()), + (aTestData->GetTpConn()),CONNMGR_BUS,TP_IFACE_CHANNEL_TYPE_TEXT, + TP_CONN_HANDLE_TYPE_CONTACT,contact_handle, TRUE ); + + //Insert the new text_chan to the hash table. + + g_hash_table_insert( + (aTestData->GetTextChannelsHT()), + g_strdup(dbus_g_proxy_get_path(DBUS_G_PROXY(text_chan))),text_chan); + + } + + text_iface = tp_chan_get_interface(text_chan,TELEPATHY_CHAN_IFACE_TEXT_QUARK); + + + if( aTestData->GetTestType() == CTestData::ESendErr || + aTestData->GetTestType() == CTestData::EReceive ) + { + //Register the callback to get the error + //when the recipeint_id is invalid. + dbus_g_proxy_connect_signal(text_iface, "SendError", + G_CALLBACK(SendError_cb), + aTestData, NULL); + } + + if( aTestData->GetTestType() == CTestData::EReceive ) + { + //Register for the receive message callback here. + dbus_g_proxy_connect_signal(text_iface, "Received", + (G_CALLBACK(receivedMessage_cb)), + aTestData, NULL); + } + + + + //This callback tells whether the message is sent to the server or not. + + tp_chan_type_text_send_async( text_iface, TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + message,sendmessage_cb, aTestData); + + + // user_data = this i.e. the class pointer + + //Run the mainloop + g_main_loop_run (aTestData->GetMainLoop()); + + + //return the Message_sent that was updated in the callback sendmessage_cb + return aTestData->GetSendRecvMsgState(); +} + +//----------------------------------------------------------------------------- +// function_name : ReceiveMessage +// description : receive message +//----------------------------------------------------------------------------- +TInt CTelepathyGabbleSendRecvMessage::ReceiveMessage( const char *contact_id, + const char *message, + CTestData* aTestData ) +{ + TpChan* text_chan = NULL; //for send msg + DBusGProxy *text_iface; + + guint contact_handle; + + + + //send msg 1 + //For Automation, Do the send message to yourself + //own contact_id received from the cfg file. + TInt msg_status = SendMessage(contact_id,message,aTestData); + if( msg_status == CTestData::EMessageNotSent ) + { + aTestData->GetStifLogger()->Log( _L("ReceiveMessage: Msg is not sent successfully \n") ); + + if( aTestData->GetTestType() == CTestData::ERecvBlank ) + g_main_loop_quit(aTestData->GetMainLoop()); + + return CTestData::EMessageNotSent; + } + + + /*contact_handle = CTelepathyGabbleUtils::get_handle_from_contact(contact_id,aTestData); + + text_chan = (TpChan*)g_hash_table_find( + (aTestData->GetTextChannelsHT()), + (GHRFunc) text_channels_find_func, + &contact_handle ); + text_iface = tp_chan_get_interface(text_chan , + TELEPATHY_CHAN_IFACE_TEXT_QUARK); + + //Register for the receive message callback here. + dbus_g_proxy_connect_signal(text_iface, "Received", + (G_CALLBACK(receivedMessage_cb)), + aTestData, NULL); + + //send msg 2 + //Do the send message to yourself + + msg_status == CTestData::EMessageNotSent ) + { + return CTestData::EMessageNotSent; + }*/ + aTestData->GetStifLogger()->Log( _L("after : register receivedMessage_cb \n") ); + if (aTestData->GetTestType() == CTestData::EReceive && + aTestData->GetSendRecvMsgState() != CTestData::EMessageSendErr ) + { + //there are two callbacks now. + //receivedMessage_cb and sendmessage_cb. + + //Run the mainloop again as it was quit in the callback sendmessage_cb. + //the message_state is not yet MESSAGE_RECEIVED. + //we need to start the main loop again to get the receivedmessage_cb. + aTestData->GetStifLogger()->Log( _L("start mainloop if state not as EMESSAGE_RCVD \n") ); + g_main_loop_run (aTestData->GetMainLoop()); + + } + return aTestData->GetSendRecvMsgState(); +} + +//----------------------------------------------------------------------------- +// function_name : sendmessage_cb +// description : Callback for Send Message +//----------------------------------------------------------------------------- +void CTelepathyGabbleSendRecvMessage::sendmessage_cb( DBusGProxy* /*proxy*/, GError* /*error*/, gpointer userdata ) +{ + CTestData* testdata = static_cast (userdata); + + testdata->GetStifLogger()->Log( _L("inside sendmessage_cb \n") ); + + //This is the test case for sending message to invalid userid. + if ( testdata->GetTestType() != CTestData::ESendErr ) + + { + + testdata->SetSendRecvMsgState(CTestData::EMessageSent); + testdata->GetStifLogger()->Log( _L("sendmessage_cb::msg sent successfully \n") ); + + //Quit the main loop , just for now + g_main_loop_quit(testdata->GetMainLoop()); + } + else if( testdata->GetTestType() == CTestData::ERecvBlank ) + { + + //Quit the main loop , just for now + testdata->GetStifLogger()->Log( _L("sendmessage_cb::test case is for blank msg sending \n") ); + g_main_loop_quit(testdata->GetMainLoop()); + } + + + //otherwise send message error test case, dont quit. + +} + +//----------------------------------------------------------------------------- +// function_name : receivedMessage_cb +// description : Callback for receive message +//----------------------------------------------------------------------------- +void CTelepathyGabbleSendRecvMessage::receivedMessage_cb ( DBusGProxy* /*proxy*/, + guint /* message_id */, + guint /* timestamp */, + guint /* from_handle */, + guint /* message_type */, + guint /* message_flags */, + gchar * /*message_body */, + gpointer user_data ) +{ + //GArray *message_ids; + //GArray *handles = NULL; + CTestData* testdata = static_cast (user_data); + + + /*message_ids = g_array_new (FALSE, FALSE, sizeof (guint)); + + g_array_append_val (message_ids, message_id); + + g_array_free (message_ids, TRUE); + + handles = g_array_new (FALSE, FALSE, sizeof (guint32)); + + g_array_append_val (handles, from_handle); + + g_array_free (handles, TRUE);*/ + testdata->GetStifLogger()->Log( _L("receivedMessage_cb::test case is for receive msg \n") ); + + if( testdata->GetTestType() == CTestData::EReceive ) + { + testdata->SetSendRecvMsgState(CTestData::EMessageRecvd); + + //Quit the main loop once the receive message callback is received. + g_main_loop_quit(testdata->GetMainLoop()); + + } + + + +} + +//----------------------------------------------------------------------------- +// function_name : text_channels_find_func +// description : find whether the text channel +// is existing given the hash table pointer +//----------------------------------------------------------------------------- +gboolean CTelepathyGabbleSendRecvMessage::text_channels_find_func( gchar* /*key*/, + TpChan *text_channel_ht_ptr, + guint *contact_handle) +{ + if ((text_channel_ht_ptr->handle == *contact_handle)) + { + return TRUE; + }//else + return FALSE; +} + +void CTelepathyGabbleSendRecvMessage::SendError_cb ( DBusGProxy* /*proxy*/, + guint error, + guint /*timestamp*/, + guint /*message_type*/, + gchar* /*message_body*/, + gpointer user_data ) +{ + + //Get the testdata + CTestData* testdata = static_cast (user_data); + + FILE* fp; + + fp = fopen("c:\\testlogs.txt","a"); + if(fp) + { + fprintf(fp,"error code is %u", error); + fprintf(fp,"\n"); + fclose(fp); + } + + testdata->GetStifLogger()->Log( _L("inside SendError_cb \n") ); + + + testdata->SetSendRecvMsgState(CTestData::EMessageSendErr); + //quit the main loop + g_main_loop_quit(testdata->GetMainLoop()); +} \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabbletest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabbletest.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,158 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: For Stiff framework related functions +* +*/ + + + + + +// INCLUDE FILES +#include +#include "telepathygabbletest.h" +#include + + + + +// ============================= LOCAL FUNCTIONS =============================== + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::CTelepathyGabbleTest +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CTelepathyGabbleTest::CTelepathyGabbleTest( + CTestModuleIf& aTestModuleIf ): + CScriptBase( aTestModuleIf ) + { + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CTelepathyGabbleTest::ConstructL() + { + //Read logger settings to check whether test case name is to be + //appended to log file name. + RSettingServer settingServer; + TInt ret = settingServer.Connect(); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Struct to StifLogger settigs. + TLoggerSettings loggerSettings; + // Parse StifLogger defaults from STIF initialization file. + ret = settingServer.GetLoggerSettings(loggerSettings); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Close Setting server session + settingServer.Close(); + TFileName logFileName; + + if(loggerSettings.iAddTestCaseTitle) + { + TName title; + TestModuleIf().GetTestCaseTitleL(title); + logFileName.Format(KTelepathyGabbleTestLogFileWithTitle, &title); + } + else + { + logFileName.Copy(KTelepathyGabbleTestLogFile); + } + iLog = CStifLogger::NewL( KTelepathyGabbleTestLogPath, + logFileName, + CStifLogger::ETxt, + CStifLogger::EFile, + EFalse ); + iLog->Log( _L("CTelepathyGabbleTest::Constructl after CStifLogger::NewL") ); + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksMem ); + + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksHandles ); + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksRequests ); + iLog->Log( _L("CTelepathyGabbleTest::Constructl out") ); + + + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CTelepathyGabbleTest* CTelepathyGabbleTest::NewL( + CTestModuleIf& aTestModuleIf ) + { + CTelepathyGabbleTest* self = new (ELeave) CTelepathyGabbleTest( aTestModuleIf ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +CTelepathyGabbleTest::~CTelepathyGabbleTest() + { + iLog->Log( _L("CTelepathyGabbleTest::~CTelepathyGabbleTest in") ); + // Delete resources allocated from test methods + Delete(); + + iLog->Log( _L("CTelepathyGabbleTest::~CTelepathyGabbleTest out") ); + // Delete logger + delete iLog; + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point. +// Returns: CScriptBase: New CScriptBase derived object +// ----------------------------------------------------------------------------- +// +EXPORT_C CScriptBase* LibEntryL( + CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework + { + + return ( CScriptBase* ) CTelepathyGabbleTest::NewL( aTestModuleIf ); + + } + +// ----------------------------------------------------------------------------- +// E32Dll is a DLL entry point function. +// Returns: KErrNone +// ----------------------------------------------------------------------------- +// +#ifndef EKA2 // Hide Dll entry point to EKA2 +GLDEF_C TInt E32Dll( + TDllReason /*aReason*/) // Reason code + { + return(KErrNone); + + } +#endif // EKA2 +// End of File diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabbletestblocks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabbletestblocks.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,4599 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Stif Test Cases Test blocks file. +* RunMethodL mentions all the test cases that will be run. +* +*/ + + + + + +// [INCLUDE FILES] - do not remove +#include +#include +#include +#include "telepathygabbletest.h" +#include "telepathygabbletestdata.h" +//glib related include files +#include +#include // for g_stpcpy +#include +#include + +#include + +//Login related file +#include "telepathygabblelogintest.h" +//Send Message related file +#include "telepathygabblesendmessage.h" +//AddDeleteContact related file +#include "telepathygabbleadddeletecontact.h" +//FetchContacts related files +#include "telepathygabblefetchcontacts.h" +//Search related files +#include "telepathygabblesearch.h" + + +const TInt KRepeatedMessageCount=4; + + + +typedef enum +{ + RC_OK, + RC_ERROR +} RC_Code_t; + +typedef struct +{ + gchar *recipient; + gchar *message; +} MessageData; + +typedef struct +{ + gchar *proxy_server; + gchar *proxy_port; +}ProxyData; + +typedef struct +{ + gchar *key; + gchar *value; +}SearchData; +typedef struct +{ + gchar *server; + gchar *username; + gchar *password; + gchar *resource; + MessageData *msg_data; +#ifdef __WINSCW__ + ProxyData *proxy_data; +#endif + gchar *port; + gchar *ssl_flag; //needed for gizmo and gtalk. + SearchData *search_data; + +} ConnectData; + +typedef struct +{ + ConnectData *connect_data; + GMainLoop *main_loop; + RC_Code_t rCode; +} AuthData; + +typedef struct +{ + GMainLoop *main_loop; + RC_Code_t Test_Success; +} HandleData; + +// Function to read data from the cfg file +static RC_Code_t read_data ( ConnectData*& connect_data, + CStifItemParser& aItem, CStifLogger* aLog ); + +// Function to free the allocated resources +static void free_data ( ConnectData*& connect_data, CStifLogger* aLog); + + + +// ============================= LOCAL FUNCTIONS =============================== + +//----------------------------------------------------------------------------- +// function_name : read_data +// description : Reads data from the CFG file +// Returns : None +//----------------------------------------------------------------------------- +// +static RC_Code_t +read_data ( ConnectData*& connect_data, CStifItemParser& aItem, CStifLogger* aLog ) + { + TPtrC string; + TBuf8 temp; + + //TBuf8 temp; + MessageData *msg_data = NULL; + + SearchData *search_data = NULL; +#ifdef __WINSCW__ + ProxyData *proxy_data = NULL; +#endif + + connect_data = g_new0 ( ConnectData, 1 ); + if ( !connect_data ) + { + return RC_ERROR; + } + + msg_data = g_new0 ( MessageData, 1 ); + if ( !msg_data ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + + connect_data->msg_data = msg_data; + + search_data = g_new0 ( SearchData, 1 ); + if ( !search_data ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + connect_data->search_data = search_data; + +#ifdef __WINSCW__ + proxy_data = g_new0 ( ProxyData, 1 ); + if ( !proxy_data ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + connect_data->proxy_data = proxy_data; +#endif + + // Read server name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->server = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->server ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->server, ( gchar * ) temp.Ptr() ); + } + + // Read Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->username = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->username ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->username, ( gchar * ) temp.Ptr() ); + } + + // Read Password corresponding to Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->password = g_new0 ( gchar, temp.Length () ); + if ( !connect_data->password ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->password, ( gchar *) temp.Ptr() ); + } + + // Read recipient + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->recipient = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->recipient ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( msg_data->recipient, ( gchar * ) temp.Ptr() ); + } + + // Read Message + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->message = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->message ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( msg_data->message, ( gchar * ) temp.Ptr() ); + } + + // Read resource identifier + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->resource = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->resource ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->resource, ( gchar * ) temp.Ptr() ); + } + + + // Read proxy server and proxy port + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + #ifdef __WINSCW__ + proxy_data->proxy_server = g_new0 ( gchar, temp.Length() ); + if ( !proxy_data->proxy_server ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( proxy_data->proxy_server, ( gchar * ) temp.Ptr() ); + #endif + } + + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + #ifdef __WINSCW__ + proxy_data->proxy_port = g_new0 ( gchar, temp.Length() ); + if ( !proxy_data->proxy_port ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( proxy_data->proxy_port, ( gchar * ) temp.Ptr() ); + #endif + } + + /* if ( aItem.GetNextInt ( proxy_port ) == KErrNone ) + { + proxy_data->proxy_port = proxy_port; + } */ + + + + //Read the port + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->port = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->port ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->port, ( gchar * ) temp.Ptr() ); + } + + //Read the ssl_flag value + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->ssl_flag = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->ssl_flag ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( connect_data->ssl_flag, ( gchar * ) temp.Ptr() ); + } + + // Read key + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + search_data->key = g_new0 ( gchar, temp.Length() ); + if ( !search_data->key ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( search_data->key, ( gchar * ) temp.Ptr() ); + } + + // Read value + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + search_data->value = g_new0 ( gchar, temp.Length() ); + if ( !search_data->value ) + { + free_data (connect_data, aLog ); + return RC_ERROR; + } + g_stpcpy ( search_data->value, ( gchar * ) temp.Ptr() ); + } + + return RC_OK; + } + + + +//----------------------------------------------------------------------------- +// function_name : free_data +// description : Deallocates all the data +// Returns : None +//----------------------------------------------------------------------------- +// +static void +free_data ( ConnectData*& connect_data, CStifLogger* aLog ) + { + //iLog->Log( _L("free_data\n") ); + if ( connect_data ) + { + if ( connect_data->server ) + { + //iLog->Log( _L("free server\n") ); + g_free ( connect_data->server ); + connect_data->server = NULL; + } + + if ( connect_data->username ) + { + aLog->Log( _L(" free username\n") ); + g_free ( connect_data->username ); + connect_data->username = NULL; + } + + if ( connect_data->password ) + { + aLog->Log( _L(" free password\n") ); + g_free ( connect_data->password ); + connect_data->password = NULL; + } + + if ( connect_data->msg_data ) + { + if ( connect_data->msg_data->recipient ) + { + aLog->Log( _L(" free recipient\n") ); + g_free ( connect_data->msg_data->recipient ); + connect_data->msg_data->recipient = NULL; + } + if ( connect_data->msg_data->message ) + { + aLog->Log( _L(" free message\n") ); + g_free ( connect_data->msg_data->message ); + connect_data->msg_data->message = NULL; + } + g_free ( connect_data->msg_data ); + connect_data->msg_data = NULL; + } + + if ( connect_data->resource ) + { + aLog->Log( _L(" free resource\n") ); + g_free ( connect_data->resource ); + connect_data->resource = NULL; + } + + #ifdef __WINSCW__ + if ( connect_data->proxy_data ) + { + if ( connect_data->proxy_data->proxy_server ) + { + aLog->Log( _L(" free proxy_server\n") ); + g_free ( connect_data->proxy_data->proxy_server ); + connect_data->proxy_data->proxy_server = NULL; + } + if ( connect_data->proxy_data->proxy_port ) + { + aLog->Log( _L(" free proxy_port\n") ); + g_free ( connect_data->proxy_data->proxy_port ); + connect_data->proxy_data->proxy_port = NULL; + } + g_free ( connect_data->proxy_data ); + connect_data->proxy_data = NULL; + } + #endif + + //port free + if ( connect_data->port ) + { + aLog->Log( _L(" free port\n") ); + g_free ( connect_data->port ); + connect_data->port = NULL; + } + + //ssl_flag free + if ( connect_data->ssl_flag ) + { + aLog->Log( _L(" free ssl_flag\n") ); + g_free ( connect_data->ssl_flag ); + connect_data->ssl_flag = NULL; + } + + if ( connect_data->search_data ) + { + if ( connect_data->search_data->key ) + { + aLog->Log( _L(" free key\n") ); + g_free ( connect_data->search_data->key ); + connect_data->search_data->key = NULL; + } + if ( connect_data->search_data->value ) + { + aLog->Log( _L(" free value\n") ); + g_free ( connect_data->search_data->value ); + connect_data->search_data->value = NULL; + } + g_free ( connect_data->search_data ); + connect_data->search_data = NULL; + } + aLog->Log( _L(" free connect_data\n") ); + g_free ( connect_data ); + connect_data = NULL; + } + aLog->Log( _L(" free connect_data out\n") ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void CTelepathyGabbleTest::Delete() + { + iLog->Log( _L("CTelepathyGabbleTest::Delete in\n") ); + if (iLoginObj) + { + iLog->Log( _L("In Delete iLoginObj \n") ); + delete iLoginObj; + iLoginObj = NULL; + } + + if (iSendMsgObj) + { + delete iSendMsgObj; + iSendMsgObj = NULL; + } + + if (iAddDelContactObj) + { + delete iAddDelContactObj; + iAddDelContactObj = NULL; + } + + if (iFetchContactObj) + { + delete iFetchContactObj; + iFetchContactObj = NULL; + } + + if (iSearchObj) + { + delete iSearchObj; + iSearchObj = NULL; + } + + if (iTestData) + { + iLog->Log( _L("In Delete iTestData \n") ); + delete iTestData; + iTestData = NULL; + + } + iLog->Log( _L("CTelepathyGabbleTest::Delete out\n") ); + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::RunMethodL +// Run specified method. Contains also table of test mothods and their names. +// ----------------------------------------------------------------------------- +// +TInt CTelepathyGabbleTest::RunMethodL( + CStifItemParser& aItem ) + { + + iLog->Log( _L("CTelepathyGabbleTest::RunMethodL in") ); + + + static TStifFunctionInfo const KFunctions[] = + { + // Copy this line for every implemented function. + // First string is the function name used in TestScripter script file. + // Second is the actual implementation member function. + //ENTRY( "Example", CTelepathyGabbleTest::ExampleL ), + //ADD NEW ENTRY HERE + // [test cases entries] - Do not remove + + //Login - Logout related test cases + ENTRY("LoginTest", CTelepathyGabbleTest::LoginTestL ), + ENTRY("LogoutTest", CTelepathyGabbleTest::LogoutTestL ), + ENTRY("LoginInvalidUseridTest", CTelepathyGabbleTest::LoginInvalidUseridTestL ), + ENTRY("LoginInvalidPasswdTest", CTelepathyGabbleTest::LoginInvalidPasswdTestL ), + ENTRY("LoginInvalidUseridPasswdTest", CTelepathyGabbleTest::LoginInvalidUseridPasswdTestL ), + ENTRY("LoginblankUseridTest", CTelepathyGabbleTest::LoginblankUseridTestL ), + ENTRY("LoginblankPasswdTest", CTelepathyGabbleTest::LoginblankPasswdTestL ), + ENTRY("LoginblankUseridblankPasswdTest", CTelepathyGabbleTest::LoginblankUseridblankPasswdTestL ), + ENTRY("LoginWithMaxLengthUserIDTest", CTelepathyGabbleTest::LoginTestL ), + ENTRY("LoginWithMinLengthUserIDTest", CTelepathyGabbleTest::LoginTestL ), + ENTRY("LoginUseridWithSplChrsTest", CTelepathyGabbleTest::LoginInvalidUseridTestL ), + ENTRY("LoginCancelTest", CTelepathyGabbleTest::LoginCancelTestL ), + + + //Send Message related Test Cases + ENTRY("SendMessageTest", CTelepathyGabbleTest::SendMessageTestL ), + ENTRY("SendMesasgeToMaxLengthUserIDTest", CTelepathyGabbleTest::SendMessageTestL ), + ENTRY("SendMesasgetoofflinecontactTest", CTelepathyGabbleTest::SendMessagetoinvalidUseridTestL ), + ENTRY("SendMessageWith400Test", CTelepathyGabbleTest::SendMessageWith400TestL ), + ENTRY("SendMesasgeBlankTest", CTelepathyGabbleTest::SendMesasgeBlankTestL ), + ENTRY("SendMesasgeToBlankUserIdTest", CTelepathyGabbleTest::SendMesasgeToBlankUserIdTestL ), + ENTRY("SendMesasgeSplCharsTest", CTelepathyGabbleTest::SendMessageTestL ), + ENTRY("SendMesasgeEmoticonsTest", CTelepathyGabbleTest::SendMessageTestL ), + ENTRY("SendMessageRepeatedTest",CTelepathyGabbleTest:: SendMessageRepeatedTestL), + ENTRY("SendMessagetoUserNotInContactListTest",CTelepathyGabbleTest:: SendMessageTestL), + ENTRY("SendMessagetoinvalidUseridTest",CTelepathyGabbleTest:: SendMessagetoinvalidUseridTestL), + + //Receive Message related Test Cases + ENTRY("ReceiveMessageTest", CTelepathyGabbleTest::ReceiveMessageTestL ), + ENTRY("ReceiveMessageMaxLengthTest", CTelepathyGabbleTest::ReceiveMessageMaxLengthTestL ), + ENTRY("ReceiveMessageWithSplChrsTest", CTelepathyGabbleTest::ReceiveMessageTestL ), + ENTRY("ReceiveMessageWithEmoticonsTest", CTelepathyGabbleTest::ReceiveMessageTestL ), + ENTRY("ReceiveMessageBlankTest", CTelepathyGabbleTest::ReceiveMessageBlankTestL ), + ENTRY("ReceiveRepeatedMessageTest", CTelepathyGabbleTest::ReceiveRepeatedMessageTestL ), + + //Add Contact related test cases + ENTRY("AddContactTest", CTelepathyGabbleTest::AddContactTestL ), + ENTRY("AddContactWithMaxLengthUserIdTest", CTelepathyGabbleTest::AddContactTestL ), + ENTRY("AddContactWithBlankUserIdTest", CTelepathyGabbleTest::AddContactWithBlankUserIdTestL ), + ENTRY("AddContactinvalidTest", CTelepathyGabbleTest::AddContactTestL ), + ENTRY("AddContactinvalidWithSplCharsTest", CTelepathyGabbleTest::AddContactTestL ), + ENTRY("AddContactAlreadyInRosterTest", CTelepathyGabbleTest::AddContactAlreadyInRosterTestL ), + + + //Remove Contact related test cases + ENTRY("RemoveContactTest", CTelepathyGabbleTest::RemoveContactTestL ), + ENTRY("RemoveInvalidContactTest", CTelepathyGabbleTest::RemoveInvalidContactTestL), + ENTRY("RemoveContactAlreadyRemovedTest", CTelepathyGabbleTest::RemoveInvalidContactTestL ), + ENTRY("RemoveContactWithMaxLengthUserIDTest", CTelepathyGabbleTest::RemoveContactTestL ), + ENTRY("RemoveContactWithBlankUserIdTest", CTelepathyGabbleTest::RemoveContactWithBlankUserIdTestL ), + + //Fetch Contact related test cases + ENTRY("FetchContactsTest", CTelepathyGabbleTest::FetchContactsTestL ), + ENTRY("FetchZeroContactTest", CTelepathyGabbleTest::FetchContactsTestL ), + + //Search related test cases + ENTRY("SearchTest", CTelepathyGabbleTest::SearchTestL ), + ENTRY("GetSearchKeysTest", CTelepathyGabbleTest::GetSearchKeysTestL ), + ENTRY("SearchInvalidKeyTest", CTelepathyGabbleTest::SearchInvalidKeyTestL ), + ENTRY("SearchNoKeyValueTest", CTelepathyGabbleTest::SearchNoKeyValueTestL ), + ENTRY("SearchTwoInvalidKeysTest", CTelepathyGabbleTest::SearchTwoInvalidKeysTestL ), + ENTRY("SearchWithAllKeysTest", CTelepathyGabbleTest::SearchWithAllKeysTestL ), + ENTRY("SearchBlankStringTest", CTelepathyGabbleTest::SearchBlankStringTestL ), + ENTRY("SearchTwiceTest", CTelepathyGabbleTest::SearchTwiceTestL ), + ENTRY("SearchTwiceWithDiffStringsTest", CTelepathyGabbleTest::SearchTwiceWithDiffStringsTestL ), + ENTRY("SearchFiveTimesTest", CTelepathyGabbleTest::SearchFiveTimesTestL ), + ENTRY("SearchAfterGetSearchKeys", CTelepathyGabbleTest::SearchAfterGetSearchKeysL ), + }; + + const TInt count = sizeof( KFunctions ) / + sizeof( TStifFunctionInfo ); + + return RunInternalL( KFunctions, count, aItem ); + + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginTestL +// Test for login. +// ----------------------------------------------------------------------------- +// + +TInt CTelepathyGabbleTest::LoginTestL( + CStifItemParser& aItem ) + { + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + iLog->Log( _L("LoginTestL starting") ); + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog) != RC_OK ) + { + //iLog->Log( _L("read_data failed") ); + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + iTestData = CTestData::NewL(iLog); + + iLog->Log( _L("iTestData created") ); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iLog->Log( _L("iLoginObj created") ); + + iTestData->SetTestType(CTestData::ELogin) ; + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd,servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, iTestData); + + + iLog->Log( _L("after action_login") ); + + if (login_status == CTestData::ECONNECTED) + { + //Do the logout so that all the resources are deallocated properly + login_status = iLoginObj->action_logout(iTestData); + + iLog->Log( _L("after action_logout") ); + + free_data (connect_data, iLog); + + iLog->Log( _L("after free_data") ); + if (login_status != CTestData::EDISCONNECTED) + { + iLog->Log( _L("logout failed") ); + return KErrGeneral; //logout didnot happen successfully. + } + + //we completed login and logout successfully. + iLog->Log( _L("login-logout test case passed\n") ); + + if (iTestData) + { iLog->Log( _L("delete iTestData \n") ); + delete iTestData; + iTestData = NULL; + + } + if (iLoginObj) + { + iLog->Log( _L("delete iLoginObj \n") ); + delete iLoginObj; + iLoginObj = NULL; + } + return KErrNone; + } + else + { + //Login didnot happen successfully. + //return from here itself, no need for a logout + free_data (connect_data, iLog ); + iLog->Log( _L("login test case failed") ); + return KErrGeneral; + + } + + } + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginblankUseridblankPasswdTestL +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::LoginblankUseridblankPasswdTestL( + CStifItemParser& aItem ) + { + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data,iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = ""; //make the username as blank + passwd = ""; //make the username as blank + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iTestData->SetTestType(CTestData::ELogin) ; + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd,servername, resource_login, ssl_flag, + port,proxy_server, proxy_port,iTestData); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //login_status is disconnected(default state) + //which is correct since the username was blank. + + return KErrNone; + } + else + { + //There was some error + return KErrGeneral; + } + + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginblankUseridTestL +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::LoginblankUseridTestL( + CStifItemParser& aItem ) + { + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data,iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = ""; //make the username as blank + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iTestData->SetTestType(CTestData::ELogin) ; + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd,servername, resource_login, ssl_flag, + port,proxy_server, proxy_port,iTestData); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //login_status is disconnected(default state) + //which is correct since the username was blank. + + return KErrNone; + } + else + { + //There was some error + return KErrGeneral; + } + + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginblankPasswdTestL +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::LoginblankPasswdTestL( +CStifItemParser& aItem ) +{ + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = ""; //make the passwd as blank. + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iTestData->SetTestType(CTestData::ELogin) ; + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd,servername, resource_login,ssl_flag, + port,proxy_server, proxy_port,iTestData); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //the status is disconnected which is correct since the + //login didnot happen with blank passwd. + return KErrNone; + } + else + { + return KErrGeneral; + + } +} + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LogoutTestL +// Test for logout +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::LogoutTestL( +CStifItemParser& aItem ) +{ + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iTestData->SetTestType(CTestData::ELogin); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = iLoginObj->action_login(username,passwd,servername, resource_login,ssl_flag, + port,proxy_server, proxy_port,iTestData); + + + if (login_status == CTestData::ECONNECTED) + { + //If the login variable is ECONNECTED + //Do the Logout + login_status = iLoginObj->action_logout(iTestData); + + + if (login_status == CTestData::EDISCONNECTED) + { + + //the logout happened succesfully + free_data ( connect_data, iLog ); + return KErrNone; + } + else + { + //login_status is still connected, there was a problem + //in logging out. + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + } + else + { + //Login itself didnot happen. + free_data ( connect_data, iLog ); + return KErrGeneral; + } + +} + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchAfterGetSearchKeysL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchAfterGetSearchKeysL( CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *value, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + value = connect_data->msg_data->message; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + + iTestData->SetTestType(CTestData::EGetSearchKeys); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + TInt search_state = iSearchObj->GetSearchKeysL( iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in finding search keys + } + else if( search_state == CTestData::ESearchKeysFound) + { + return_value = KErrNone; + + GHashTable *data_to_search = NULL; + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + gchar **keys = iTestData->GetSearchKeys(); + + iTestData->SetTestType(CTestData::ESearch); + for(TInt i=0; i<8 ; i++ ) + { + GValue *gvalue = NULL; + gvalue = g_new0(GValue, 1); + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, g_strdup(value) ); + g_hash_table_insert( data_to_search,keys[i], gvalue); + + } + + search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchCompleted) + { + return_value = KErrNone; + } + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchWithAllKeysTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchWithAllKeysTestL( CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *value, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + value = connect_data->msg_data->message; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::EGetSearchKeys); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + TInt search_state = iSearchObj->GetSearchKeysL( iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in finding search keys + } + else if( search_state == CTestData::ESearchKeysFound) + { + return_value = KErrNone; + + iTestData->SetTestType(CTestData::ESearch); + GHashTable *data_to_search = NULL; + TInt i = 0; + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + gchar **keys = iTestData->GetSearchKeys(); + + for( i=0; i<7 ; i++ ) + { + GValue *gvalue = NULL; + gvalue = g_new0(GValue, 1); + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, g_strdup(value) ); + g_hash_table_insert( data_to_search, keys[i], gvalue); + + } + + GValue *gvalue1 = NULL; + gvalue1 = g_new0(GValue, 1); + + g_value_init(gvalue1, G_TYPE_STRING); + g_value_set_string (gvalue1, g_strdup("5") ); + g_hash_table_insert( data_to_search,keys[i], gvalue1); + + search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchCompleted) + { + return_value = KErrNone; + } + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + g_free(keys); + + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchBlankStringTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchBlankStringTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + iTestData->SetTestType(CTestData::ESearch); + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue = NULL; + + char *key, *value; + + key = connect_data->msg_data->recipient; + //value = connect_data->msg_data->message; + //search for blank string + value = ""; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue = g_new0(GValue, 1); + + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, value ); + g_hash_table_insert( data_to_search, key, gvalue); + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchCompleted) + { + return_value = KErrNone; + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue = NULL; + + char *key, *value; + + key = connect_data->msg_data->recipient; + value = connect_data->msg_data->message; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue = g_new0(GValue, 1); + + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, value ); + g_hash_table_insert( data_to_search, GetSearchLabelL(servername,key), gvalue); + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchCompleted) + { + return_value = KErrNone; + } + + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchTwoInvalidKeysTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchTwoInvalidKeysTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue1, *gvalue2 ; + + char *key1,*key2, *value1, *value2; + + key1 = connect_data->msg_data->recipient; + value1 = connect_data->msg_data->message; + + key2 = connect_data->search_data->key; + value2 = connect_data->search_data->value; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue1 = g_new0(GValue, 1); + + + g_value_init(gvalue1, G_TYPE_STRING); + g_value_set_string (gvalue1, value1 ); + g_hash_table_insert( data_to_search, GetSearchLabelL(servername,key1), gvalue1); + + gvalue2 = g_new0(GValue, 1); + + + g_value_init(gvalue2, G_TYPE_STRING); + g_value_set_string (gvalue2, value2 ); + g_hash_table_insert( data_to_search, GetSearchLabelL(servername,key2), gvalue2); + + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + //Error in Searching, + //as one of the search key passed is wrong + return_value = KErrNone; + } + else + { + return_value = KErrGeneral; + } + + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchTwiceWithDiffStringsTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchTwiceWithDiffStringsTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search_first = NULL; + GHashTable *data_to_search_second = NULL; + + GValue *gvalue1, *gvalue2 ; + + char *key1,*value1, *key2, *value2; + + key1 = connect_data->msg_data->recipient; + value1 = connect_data->msg_data->message; + + key2 = connect_data->search_data->key; + value2 = connect_data->search_data->value; + + data_to_search_first = g_hash_table_new(g_str_hash,g_str_equal); + + data_to_search_second = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue1 = g_new0(GValue, 1); + g_value_init(gvalue1, G_TYPE_STRING); + g_value_set_string (gvalue1, value1 ); + g_hash_table_insert( data_to_search_first, GetSearchLabelL(servername,key1), gvalue1); + + gvalue2 = g_new0(GValue, 1); + g_value_init(gvalue2, G_TYPE_STRING); + g_value_set_string (gvalue2, value2 ); + g_hash_table_insert( data_to_search_second, GetSearchLabelL(servername,key2), gvalue2); + + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search_first, iTestData); + + if( search_state == CTestData::ESearchError) + { + return_value = KErrGeneral; + } + else + { + search_state = iSearchObj->SearchL(data_to_search_second, iTestData); + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + + } + + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search_first ); + g_hash_table_destroy ( data_to_search_second ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchNoKeyValueTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchNoKeyValueTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + //Error in Searching, + //as one of the search key passed is wrong + return_value = KErrNone; + } + else + { + return_value = KErrGeneral; + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchInvalidKeyTest +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchInvalidKeyTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue = NULL; + + char *key, *value; + + key = connect_data->msg_data->recipient; + value = connect_data->msg_data->message; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue = g_new0(GValue, 1); + + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, value ); + //ivalid search key..label has to be passed so no need to pass label + g_hash_table_insert( data_to_search, key, gvalue); + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + //Error in Searching, + //as one of the search key passed is wrong + return_value = KErrNone; + } + else + { + return_value = KErrGeneral; + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::GetSearchKeysTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::GetSearchKeysTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::EGetSearchKeys); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + TInt search_state = iSearchObj->GetSearchKeysL( iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchKeysFound) + { + return_value = KErrNone; + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMessageTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SendMessageTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + + iTestData->SetTestType(CTestData::ESend); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id, *msg; + + + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + + + //call the SendMessage test case + TInt sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData); + + if( sendmsg_state == CTestData::EMessageNotSent ) + { + return_value = KErrGeneral; //Error in Sending message + } + else if( sendmsg_state == CTestData::EMessageSendErr ) + { + // error was not expected + return_value = KErrGeneral; + } + else if( sendmsg_state == CTestData::EMessageSent ) + { + //If message sent to invalid userid or blank userid, state should EMessageSendErr + // This is used in case of SendMessagetoinvalidUseridTestL + return_value = KErrNone; + } + + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMessageRepeatedTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SendMessageRepeatedTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + + iTestData->SetTestType(CTestData::ESend); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id, *msg; + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + //call the SendMessage test case + TInt sendmsg_state = CTestData::EMessageNotSent; + + for( TInt cnt =0 ; cnt < KRepeatedMessageCount ; cnt++ ) + { + sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData); + + if( sendmsg_state != CTestData::EMessageSent ) + { + return_value = KErrGeneral; //Error in Sending message + break; + } + } + + + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::ReceiveRepeatedMessageTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::ReceiveRepeatedMessageTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::EReceive); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + if (login_status == CTestData::ECONNECTED) + { + //Get the contact_id and the message. + char *recipient_id, *msg; + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + + //Do the receive message test case + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + TInt recvmsg_state = CTestData::EMessageNotSent; + + for( TInt cnt =0 ; cnt < KRepeatedMessageCount ; cnt++ ) + { + iTestData->SetSendRecvMsgState(CTestData::EMessageNotSent); + recvmsg_state = iSendMsgObj->ReceiveMessage(recipient_id,msg,iTestData); + + if( recvmsg_state != CTestData::EMessageRecvd ) + { + return_value = KErrGeneral; + break; + } + } + + //do the logout and the cleanup + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //login didnot happen successfully + return_value = KErrGeneral; + } + free_data (connect_data, iLog ); + return return_value; + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::ReceiveMessageTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::ReceiveMessageTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::EReceive); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + if (login_status == CTestData::ECONNECTED) + { + //Get the contact_id and the message. + char *recipient_id, *msg; + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + iLog->Log( _L("ReceiveMessageTestL:: Logged In \n") ); + + //Do the receive message test case + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + TInt recvmsg_state = iSendMsgObj->ReceiveMessage(recipient_id,msg,iTestData); + + if( recvmsg_state != CTestData::EMessageRecvd ) + { + iLog->Log( _L("ReceiveMessageTestL:: receive Error \n") ); + return_value = KErrGeneral; + } + //do the logout and the cleanup + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + iLog->Log( _L("ReceiveMessageTestL:: Logout Error \n") ); + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //login didnot happen successfully + return_value = KErrGeneral; + } + free_data (connect_data, iLog ); + return return_value; + } + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::ReceiveMessageBlankTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::ReceiveMessageBlankTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::ERecvBlank); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + if (login_status == CTestData::ECONNECTED) + { + iLog->Log( _L("ReceiveMessageBlankTestL:: Logged In \n") ); + //Get the contact_id and the message. + char *recipient_id, *msg; + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + //Set the message to blamk string + msg = ""; + + //Do the receive message test case + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + TInt recvmsg_state = iSendMsgObj->ReceiveMessage(recipient_id,msg,iTestData); + + if( recvmsg_state == CTestData::EMessageNotSent ) + { + iLog->Log( _L("ReceiveMessageBlankTestL:: EMESSAGE_NOT_SENT \n") ); + return_value = KErrNone; //Error in Sending message + } + + iLog->Log( _L("ReceiveMessageBlankTestL:: b4 action_logout \n") ); + //do the logout and the cleanup + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + iLog->Log( _L("ReceiveMessageBlankTestL:: logout error \n") ); + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //login didnot happen successfully + return_value = KErrGeneral; + } + free_data (connect_data, iLog ); + return return_value; + + } + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::ReceiveMessageMaxLengthTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::ReceiveMessageMaxLengthTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::EReceive); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + if (login_status == CTestData::ECONNECTED) + { + //Get the contact_id and the message. + char *recipient_id; + //char *msg; + + recipient_id = connect_data->msg_data->recipient; + // msg = connect_data->msg_data->message; //not required + + //Set the message to maxlength string( with 400 chars) + char *max_len_msg = {"abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghij"}; + + //Do the receive message test case + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + TInt recvmsg_state = iSendMsgObj->ReceiveMessage(recipient_id,max_len_msg,iTestData); + + if( recvmsg_state != CTestData::EMessageRecvd ) + { + return_value = KErrGeneral; + } + //do the logout and the cleanup + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //login didnot happen successfully + return_value = KErrGeneral; + } + free_data (connect_data, iLog ); + return return_value; + + } + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginCancelTestL +// Test for Cancelling the login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::LoginCancelTestL( + CStifItemParser& aItem ) + { + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_cancel(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED ) + { + //i.e the login didnot happen successfully + //which is correct, since this is a cancel test case. + return KErrNone; + } + return KErrGeneral; //login status must be disconnceted else an error + } + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginInvalidUseridTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::LoginInvalidUseridTestL( CStifItemParser& aItem ) +{ + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //i.e. login didnot happen with invalid user-id and passwd + return KErrNone; + } + + return KErrGeneral; //login status must be disconnceted else an error +} + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginInvalidPasswdTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::LoginInvalidPasswdTestL( CStifItemParser& aItem ) +{ + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //i.e. login didnot happen with invalid user-id and passwd + return (KErrNone); + } + + return KErrGeneral; //login status must be disconnceted else an error +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::LoginInvalidUseridPasswdTestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::LoginInvalidUseridPasswdTestL( + CStifItemParser& aItem ) +{ + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + free_data (connect_data, iLog ); + + if (login_status == CTestData::EDISCONNECTED) + { + //i.e. login didnot happen with invalid user-id and passwd + return KErrNone; + } + + return KErrGeneral; //login status must be disconnceted else an error +} + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMessageWith400TestL +// Test for login. +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SendMessageWith400TestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::ESend); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login( username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id; + + recipient_id = connect_data->msg_data->recipient; + //msg = connect_data->msg_data->message; + //hardcode the message of 400 characters. + //Set the message to maxlength string( with 400 chars) + char *msg = {"abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghijklmnopqrstuvwxyzabcd \ + abcdefghij"}; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + //call the SendMessage test case + TInt sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData ); + + if( sendmsg_state == CTestData::EMessageNotSent || + sendmsg_state == CTestData::EMessageSendErr ) + { + return_value = KErrGeneral; //Error in Sending message + } + else if( sendmsg_state == CTestData::EMessageSent ) + { + // EMessageSent was expected + return_value = KErrNone; + } + + + //Do the logout. + login_status = iLoginObj->action_logout( iTestData ); + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + + free_data (connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMesasgeToBlankUserIdTestL +// Test for login. +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::SendMesasgeToBlankUserIdTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::ESendErr); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id, *msg; + + recipient_id = "";//hardcode the recipient for blank. + + msg = connect_data->msg_data->message; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + + //call the SendMessage test case + TInt sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData); + + if( sendmsg_state == CTestData::EMessageNotSent + || sendmsg_state == CTestData::EMessageSent ) + { + return_value = KErrGeneral; //Error in Sending message + } + else if( sendmsg_state == CTestData::EMessageSendErr ) + { + //If message sent to invalid userid or blank userid, state should EMessageSendErr + // This is used in case of SendMessagetoinvalidUseridTestL + return_value = KErrNone; + } + + //Do the logout. + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMesasgeBlankTestL +// Test for login. +// ----------------------------------------------------------------------------- +TInt CTelepathyGabbleTest::SendMesasgeBlankTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + + iTestData = CTestData::NewL(iLog); + + iTestData->SetTestType(CTestData::ESend); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id, *msg; + + recipient_id = connect_data->msg_data->recipient; + //msg = connect_data->msg_data->message; + //hardcode the message for blank. + msg = ""; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + //call the SendMessage test case + TInt sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData); + if( sendmsg_state != CTestData::EMessageSent ) + { + //There was some error while sending the message. + return_value = KErrGeneral; + } + + + //Do the logout. + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SendMessagetoinvalidUseridTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SendMessagetoinvalidUseridTestL( + CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + + iTestData->SetTestType(CTestData::ESendErr); + + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + //Send a message + + //for sending a message + char *recipient_id, *msg; + + TInt testType = iTestData->GetTestType(); + + recipient_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + //Create the Object of Send Message class + iSendMsgObj = CTelepathyGabbleSendRecvMessage::NewL(); + + + + //call the SendMessage test case + TInt sendmsg_state = iSendMsgObj->SendMessage(recipient_id,msg,iTestData); + + if( sendmsg_state == CTestData::EMessageNotSent || + sendmsg_state == CTestData::EMessageSent ) + { + // EMessageSendErr was expected + return_value = KErrGeneral; //Error in Sending message + } + + else if( sendmsg_state == CTestData::EMessageSendErr ) + { + //If message sent to invalid userid or blank userid, state should EMessageSendErr + // This is used in case of SendMessagetoinvalidUseridTestL + return_value = KErrNone; + } + + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data (connect_data, iLog ); + return return_value; + } + + + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::RemoveContactWithBlankUserIdTestL +// Test for removing blank userid +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::RemoveContactWithBlankUserIdTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + //iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + + //Get the contact_id and the message. + char *contact_id, *msg; + + contact_id = ""; //make the contactid as blank + msg = connect_data->msg_data->message; + + TInt contact_status = iAddDelContactObj->remove_contact( contact_id, msg, iTestData ); + + if( contact_status == CTestData::EDELETE_FAIL ) + { + return_value = KErrNone; + } + + //Do the logout and then return KErrNone; + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; //logout was not successful + } + + free_data (connect_data, iLog ); + return return_value; + } + + else + { + free_data (connect_data, iLog ); + return KErrGeneral;//login was not successful + } +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::AddContactWithBlankUserIdTestL +// Test for Adding blank userid +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::AddContactWithBlankUserIdTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + //iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + + //Get the contact_id and the message. + char *addcontact_id, *msg; + + addcontact_id = ""; //make the contactid as blank + msg = connect_data->msg_data->message; + + TInt addcontact_status = iAddDelContactObj->add_contact(addcontact_id,msg, iTestData ); + + if( addcontact_status == CTestData::EADD_FAIL ) + { + return_value = KErrNone; + } + + //Do the logout and then return KErrNone; + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; //logout was not successful + } + + free_data (connect_data, iLog ); + return return_value; + } + + else + { + free_data (connect_data, iLog ); + return KErrGeneral;//login was not successful + } +} + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::AddContactTestL +// Test for Adding Contact +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::AddContactTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + //iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + + //Get the contact_id and the message. + char *addcontact_id, *msg; + + addcontact_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + TInt addcontact_status = iAddDelContactObj->add_contact(addcontact_id,msg, iTestData ); + + if( addcontact_status != CTestData::EADD_SUCCESS ) + { + return_value = KErrGeneral; + } + + //Do the logout and then return KErrNone; + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; //logout was not successful + } + + free_data (connect_data, iLog ); + return return_value; + } + + else + { + free_data (connect_data, iLog ); + return KErrGeneral;//login was not successful + } +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::AddContactAlreadyInRosterTestL +// Test for Adding Contact which is already added +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::AddContactAlreadyInRosterTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + //Get the contact_id and the message. + char *addcontact_id, *msg; + + addcontact_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + TInt addcontact_status = iAddDelContactObj->add_contact(addcontact_id,msg, iTestData ); + + if( addcontact_status != CTestData::EADD_SUCCESS ) + { + return_value = KErrGeneral; + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; + } + + } + else + { + //The function add_contact resets iAddDeleteContactStatus (in CTestData) to EADD_FAIL + //to check again that adding a contact already added was successful(EADD_SUCCESS) + //so no need to set here explicitly + + + addcontact_status = iAddDelContactObj->add_contact(addcontact_id,msg, iTestData ); + if( addcontact_status != CTestData::EADD_SUCCESS ) + { + return_value = KErrGeneral; + } + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; + } + } + + free_data (connect_data, iLog ); + return return_value; + } + else + { + free_data (connect_data, iLog ); + return KErrGeneral; //login was not successful + } + +} + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::RemoveContactAlreadyRemovedTestL +// Test for removing Contact which is already removed +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::RemoveContactAlreadyRemovedTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + //Get the contact_id and the message. + char *contact_id, *msg; + + contact_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + TInt contact_status = iAddDelContactObj->add_contact( contact_id, msg, iTestData ); + + if( contact_status != CTestData::EADD_SUCCESS ) + { + iLog->Log( _L("CTelepathyGabbleTest:: contact not added successfully \n") ); + return_value = KErrGeneral; + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; + } + free_data (connect_data, iLog ); + return return_value; + } + + contact_status = iAddDelContactObj->remove_contact( contact_id, msg, iTestData ); + + if( contact_status != CTestData::EDELETE_SUCCESS ) + { + //contact removed first time, so should be removed successfully, otherwise error + iLog->Log( _L("CTelepathyGabbleTest::First Time contact not deleted successfully \n") ); + return_value = KErrGeneral; + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; + } + } + else + { + //The function remove_contact resets iAddDeleteContactStatus (in CTestData) to EDELETE_FAIL + //to check again that removing a contact already removed was not successful, + // so no need to set here explicitly + iLog->Log( _L("CTelepathyGabbleTest::First Time contact deleted successfully \n") ); + contact_status = iAddDelContactObj->remove_contact(contact_id,msg, iTestData ); + + + // because contact to be removed was already deleted, so status should be EDELETE_FAIL + if( contact_status != CTestData::EDELETE_FAIL ) + { + iLog->Log( _L("CTelepathyGabbleTest::Second Time deleted successfully, it should give some error \n") ); + return_value = KErrGeneral; + } + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + iLog->Log( _L("CTelepathyGabbleTest::Error in logout \n") ); + return_value = KErrGeneral; + } + } + + free_data (connect_data, iLog ); + return return_value; + } + else + { + free_data (connect_data, iLog ); + return KErrGeneral; //login was not successful + } + +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::RemoveContactTestL +// Test for removing a contact +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::RemoveContactTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + + + if (login_status == CTestData::ECONNECTED) + { + //login happened successfully. + //Create the AddDelete Contact class object. + + + iAddDelContactObj = CTelepathyGabbleAddDeleteContact::NewL(); + + + //Get the contact_id and the message. + char *contact_id, *msg; + + contact_id = connect_data->msg_data->recipient; + msg = connect_data->msg_data->message; + + TInt removecontact_status = iAddDelContactObj->remove_contact( contact_id, msg, iTestData); + + if( removecontact_status != CTestData::EDELETE_SUCCESS ) + { + return_value = KErrGeneral; + } + + //Do the logout and then return KErrNone; + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; //logout was not successful + } + + free_data (connect_data, iLog ); + return return_value; + } + + else + { + free_data (connect_data, iLog ); + return KErrGeneral; + } +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::RemoveInvalidContactTestL +// Test for removing invalid userid +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::RemoveInvalidContactTestL( + CStifItemParser& aItem ) + +{ + TInt err = RemoveContactTestL(aItem); + if ( err == KErrGeneral + && iTestData->GetAddDeleteContactStatus() == CTestData::EDELETE_FAIL ) + { + // This is correct, since the contact_id was invalid + return KErrNone; + } + + return KErrGeneral; + +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::FetchContactsTestL +// Test for fetching contacts +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::FetchContactsTestL( + CStifItemParser& aItem ) +{ + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data (connect_data, iLog ); + return KErrGeneral; + } + + + char *username, *passwd , *servername , *resource_login,*ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + iTestData = CTestData::NewL(iLog); + + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + TInt login_status = + iLoginObj->action_login(username,passwd, + servername, resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData); + + if (login_status == CTestData::ECONNECTED) + { + + //if successfully logged in + //fetch the contacts + + iFetchContactObj = CTelepathyGabbleFetchContacts::NewL(); + + return_value = iFetchContactObj->test_request_roster( iTestData ); + + //Do the logout and the cleanup. + login_status = iLoginObj->action_logout(iTestData); + if (login_status != CTestData::EDISCONNECTED) + { + return_value = KErrGeneral; //there was error in logout + } + + } + else + { + return_value = KErrGeneral; //login didn't happen successfully + } + + free_data (connect_data, iLog ); + return return_value; + +} + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchTwiceTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchTwiceTestL( CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue = NULL; + + char *key, *value; + + key = connect_data->msg_data->recipient; + value = connect_data->msg_data->message; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue = g_new0(GValue, 1); + + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, value ); + g_hash_table_insert( data_to_search, GetSearchLabelL(servername,key), gvalue); + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + + //call the SendMessage test case + TInt search_state = iSearchObj->SearchL(data_to_search, iTestData); + + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + else if( search_state == CTestData::ESearchCompleted) + { + search_state = iSearchObj->SearchL(data_to_search, iTestData); + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + } + //return_value = KErrNone; + } + + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::SearchFiveTimesTestL +// ----------------------------------------------------------------------------- + +TInt CTelepathyGabbleTest::SearchFiveTimesTestL( CStifItemParser& aItem ) + { + TInt return_value = KErrNone; + //Pass the parameters to action_login() from the + //data mentioned in the cfg file. + + //step 1: Do the login. + ConnectData *connect_data = NULL; + + if ( read_data ( connect_data, aItem, iLog ) != RC_OK ) + { + free_data ( connect_data, iLog ); + return KErrGeneral; + } + + + //for login + char *username, *passwd , *servername , *resource_login, *ssl_flag, *port; + char *proxy_server = NULL; + char *proxy_port = NULL; + + + username = connect_data->username; + passwd = connect_data->password; + servername = connect_data->server; + resource_login = connect_data->resource; + ssl_flag = connect_data->ssl_flag; + port = connect_data->port; + #ifdef __WINSCW__ + proxy_server = connect_data->proxy_data->proxy_server; + proxy_port = connect_data->proxy_data->proxy_port; + #endif + + + if (iTestData == NULL) + { + //Create the iTestData if it is not existing. + + iTestData = CTestData::NewL(iLog); + } + iTestData->SetTestType(CTestData::ESearch); + //Create the login object + iLoginObj = CTelepathyGabbleLoginTest::NewL(); + + //action_login will have parameters + //passed from cfg file + + TInt login_status = + iLoginObj->action_login(username,passwd,servername, + resource_login,ssl_flag, + port,proxy_server, proxy_port, + iTestData ); + + if (login_status == CTestData::ECONNECTED) + { + //login was successful + + GHashTable *data_to_search = NULL; + + GValue *gvalue = NULL; + + char *key, *value; + + key = connect_data->msg_data->recipient; + value = connect_data->msg_data->message; + + data_to_search = g_hash_table_new(g_str_hash,g_str_equal); + + gvalue = g_new0(GValue, 1); + + + g_value_init(gvalue, G_TYPE_STRING); + g_value_set_string (gvalue, value ); + g_hash_table_insert( data_to_search, GetSearchLabelL(servername,key), gvalue); + + + + //Create the Object of Send Message class + iSearchObj = CTelepathyGabbleSearch::NewL(); + + TInt search_state; + + for(TInt i = 0; i<5 ;i++ ) + { + search_state = iSearchObj->SearchL(data_to_search, iTestData); + if( search_state == CTestData::ESearchError ) + { + return_value = KErrGeneral; //Error in Searching + break; + } + } + iSearchObj->CloseChannel(iTestData); + //Do the logout + login_status = iLoginObj->action_logout(iTestData); + + if (login_status != CTestData::EDISCONNECTED) + { + //logout didnot happen successfully + return_value = KErrGeneral; + } + + //do this later + /*g_hash_table_foreach_remove ( data_to_search, + search_hash_remove, NULL );*/ + + //Free the hash table itself + g_hash_table_destroy ( data_to_search ); + + } + else + { + //Login itself didnot happen. + return_value = KErrGeneral; + } + + free_data ( connect_data, iLog ); + return return_value; + } + + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::GetSearchLabelForYukonL +// ----------------------------------------------------------------------------- +gchar* CTelepathyGabbleTest::GetSearchLabelForYukonL(gchar *search_key) +{ +if(strcmp(search_key,"user") == 0) + { + gchar* label= "User"; + return label; + } +else if(strcmp(search_key,"fn") == 0) + { + gchar* label= "Full Name"; + return label; + } +else if(strcmp(search_key,"first") == 0) + { + gchar* label= "Name"; + return label; + } +else if(strcmp(search_key,"middle") == 0) + { + gchar* label= "Middle Name"; + return label; + } +else if(strcmp(search_key,"last") == 0) + { + gchar* label= "Family Name"; + return label; + } +else if(strcmp(search_key,"nick") == 0) + { + gchar* label= "Nickname"; + return label; + } +else if(strcmp(search_key,"email") == 0) + { + gchar* label= "Email"; + return label; + } +else if(strcmp(search_key,"bday") == 0) + { + gchar* label= "Birthday"; + return label; + } +else if(strcmp(search_key,"ctry") == 0) + { + gchar* label= "Country"; + return label; + } +else if(strcmp(search_key,"orgname") == 0) + { + gchar* label= "Organization Name"; + return label; + } +else if(strcmp(search_key,"locality") == 0) + { + gchar* label= "City"; + return label; + } +else if(strcmp(search_key,"orgunit") == 0) + { + gchar* label= "Organization Unit"; + return label; + } +} + + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::GetSearchLabelForGizmoL +// ----------------------------------------------------------------------------- +gchar* CTelepathyGabbleTest::GetSearchLabelForGizmoL(gchar *search_key) +{ +if(strcmp(search_key,"xmpp_user") == 0) + { + gchar* label= "Account Name"; + return label; + } +else if(strcmp(search_key,"email_address") == 0) + { + gchar* label= "Email Address"; + return label; + } +else if(strcmp(search_key,"first_name") == 0) + { + gchar* label= "First Name"; + return label; + } +else if(strcmp(search_key,"last_name") == 0) + { + gchar* label= "Family Name"; + return label; + } +else if(strcmp(search_key,"country") == 0) + { + gchar* label= "Country"; + return label; + } +else if(strcmp(search_key,"state") == 0) + { + gchar* label= "State/Province"; + return label; + } +else if(strcmp(search_key,"city") == 0) + { + gchar* label= "City"; + return label; + } +else if(strcmp(search_key,"max_results") == 0) + { + gchar* label= "Maximum # of Results"; + return label; + } +} + +// ----------------------------------------------------------------------------- +// CTelepathyGabbleTest::GetSearchLabelL +// ----------------------------------------------------------------------------- +gchar* CTelepathyGabbleTest::GetSearchLabelL(gchar* aService,gchar* aSearchKey) +{ +if(strcmp(aService,"chat.gizmoproject.com") == 0) + { + GetSearchLabelForGizmoL(aSearchKey); + } +else if(strcmp(aService,"chat.ovi.com") == 0 ) + { + GetSearchLabelForYukonL(aSearchKey); + } +} + + + +/** +* Free function for the hash key/value pairs +*/ +/*gboolean search_hash_remove( gpointer key, gpointer value, + gpointer user_data ) + { + + //Free function for the hash values + if ( key ) + { + free( key ); + } + if ( value ) + { + free ( value ); + } + + return TRUE; + } +*/ +//End of File \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabbletestdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabbletestdata.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,514 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: File containing Test Data at the global level (used by different test objects) +* +*/ + + + + +// INCLUDE FILES +#include "telepathygabbletestdata.h" +#include + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +CTestData::CTestData(CStifLogger *aLogger) + : iLogger(aLogger) + { + } + +//----------------------------------------------------------------------------- +// function_name : ConstructL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- + +void CTestData::ConstructL() + { + iConnectionState = EDISCONNECTED; //default. + iTestType = EOther; + //Create the mainloop and also add the callback. + iMainLoop = g_main_loop_new (NULL, FALSE); + iSendRecvState = EMessageNotSent; + iAddDeleteContactStatus = EADD_FAIL; + iSearchState = ESearchStarted; + iSearchKeys = g_new0( gchar*, 1); + } + +//----------------------------------------------------------------------------- +// function_name : NewL +// description : Constructor +// Returns : None +//----------------------------------------------------------------------------- +CTestData* CTestData::NewL(CStifLogger *aLogger) + { + + CTestData* self = new(ELeave) CTestData(aLogger); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- +// function_name : ~CTestData +// description : destructor +// Returns : None +//----------------------------------------------------------------------------- +CTestData::~CTestData() + { + + if( iLogger ) + { + iLogger->Log( _L("~CTestData in\n") ); + } + //Destroy the hash table for text channels + + if( iTextChannelHashTable ) + { + g_hash_table_destroy( iTextChannelHashTable ); + iTextChannelHashTable = NULL; + } + + //Dbus connection object + if( iDBusConnection ) + { + dbus_g_connection_unref (iDBusConnection); + iDBusConnection = NULL; + } + + if( iTpConnMgr ) + { + g_object_unref (iTpConnMgr); + iTpConnMgr = NULL; + } + + //tp conn object + if( iTpConn ) + { + g_object_unref (iTpConn); + iTpConn = NULL; + } + + //main loop + if( iMainLoop ) + { + g_main_loop_unref ( iMainLoop ); + iMainLoop = NULL; + } + + + if( iSearchKeys ) + { + for( TInt i=0; iSearchKeys[i]; i++ ) + { + g_free( iSearchKeys[i] ); + iSearchKeys[i] = NULL; + } + g_free( iSearchKeys ); + iSearchKeys = NULL; + } + + if( iLogger ) + { + iLogger->Log( _L("~CTestData out\n") ); + } + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetStifLogger +//----------------------------------------------------------------------------- + +CStifLogger* CTestData::GetStifLogger() + { + return iLogger; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetMainLoop +//----------------------------------------------------------------------------- + +GMainLoop* CTestData::GetMainLoop() + { + return iMainLoop; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupSubscribeInterface +//----------------------------------------------------------------------------- + +DBusGProxy* CTestData::GetGroupSubscribeInterface() + { + return iGroupSubscribeInterface; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupKnownInterface +//----------------------------------------------------------------------------- + +DBusGProxy* CTestData::GetGroupKnownInterface() + { + return iGroupKnownInterface; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupPublishInterface +//----------------------------------------------------------------------------- + +DBusGProxy* CTestData::GetGroupPublishInterface() + { + return iGroupPublishInterface; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupDenyInterface +//----------------------------------------------------------------------------- + +DBusGProxy* CTestData::GetGroupDenyInterface() + { + return iGroupDenyInterface; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetTextChannelsHT +//----------------------------------------------------------------------------- + +GHashTable* CTestData::GetTextChannelsHT() + { + return iTextChannelHashTable; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : SetGroupSubscribeInterface +//----------------------------------------------------------------------------- + +void CTestData::SetGroupSubscribeInterface( DBusGProxy* aGroupSubscribeInterface ) + { + iGroupSubscribeInterface = aGroupSubscribeInterface; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupKnownInterface +//----------------------------------------------------------------------------- + +void CTestData::SetGroupKnownInterface( DBusGProxy* aGroupKnownInterface ) + { + iGroupKnownInterface = aGroupKnownInterface; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupPublishInterface +//----------------------------------------------------------------------------- + +void CTestData::SetGroupPublishInterface( DBusGProxy* aGroupPublishInterface ) + { + iGroupPublishInterface = aGroupPublishInterface; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetGroupDenyInterface +//----------------------------------------------------------------------------- +void CTestData::SetGroupDenyInterface(DBusGProxy* aGroupDenyInterface) + { + iGroupDenyInterface = aGroupDenyInterface; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetTextChannelsHT +//----------------------------------------------------------------------------- + +void CTestData::SetTextChannelsHT( GHashTable* aTextChannelHashTable ) + { + iTextChannelHashTable = aTextChannelHashTable; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : GetDBusConnection +//----------------------------------------------------------------------------- +DBusGConnection* CTestData::GetDBusConnection() + { + return iDBusConnection; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +// description : SetDBusConnection +//----------------------------------------------------------------------------- +void CTestData::SetDBusConnection( DBusGConnection* aDBusConnection ) + { + iDBusConnection = aDBusConnection; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTpConn +//----------------------------------------------------------------------------- + +TpConn* CTestData::GetTpConn() + { + return iTpConn; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTpConn +//----------------------------------------------------------------------------- + +void CTestData::SetTpConn(TpConn* aTpConn) + { + iTpConn = aTpConn; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTpConnMgr +//----------------------------------------------------------------------------- + +void CTestData::SetTpConnMgr(TpConnMgr* aTpConnMgr) + { + iTpConnMgr = aTpConnMgr; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetLoginCompleteFlag +//----------------------------------------------------------------------------- + +TInt CTestData::GetLoginCompleteFlag() + { + return iLoginComplete; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : IncLoginCompleteFlag +//----------------------------------------------------------------------------- + +void CTestData::IncLoginCompleteFlag() + { + iLoginComplete++; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : ResetLoginCompleteFlag +//----------------------------------------------------------------------------- + +void CTestData::ResetLoginCompleteFlag() + { + iLoginComplete = 0; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTotalFetchCount +//----------------------------------------------------------------------------- + +TInt CTestData::GetTotalFetchCount() + { + return iTotalFetchCount; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetLastIndexInFetch +//----------------------------------------------------------------------------- + +TInt CTestData::GetLastIndexInFetch() + { + return iLastIndex; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetLastIndexInFetch +//----------------------------------------------------------------------------- + +void CTestData::SetLastIndexInFetch( TInt aLastIndex ) + { + iLastIndex = aLastIndex; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTotalFetchCount +//----------------------------------------------------------------------------- + +void CTestData::SetTotalFetchCount(TInt aValue) + { + iTotalFetchCount = aValue; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTotalFetchCount +//----------------------------------------------------------------------------- + +CTestData::TConnectionState CTestData::GetConnectionState() + { + return iConnectionState; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTotalFetchCount +//----------------------------------------------------------------------------- + +void CTestData::SetConnectionState(TConnectionState aConnectionState) + { + iConnectionState = aConnectionState; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTotalFetchCount +//----------------------------------------------------------------------------- + +CTestData::TSendRecvState CTestData::GetSendRecvMsgState() + { + return iSendRecvState; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTotalFetchCount +//----------------------------------------------------------------------------- + +void CTestData::SetSendRecvMsgState(TSendRecvState aSendRecvState) + { + iSendRecvState = aSendRecvState; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTotalFetchCount +//----------------------------------------------------------------------------- + +CTestData::TAddDeleteContactStatus CTestData::GetAddDeleteContactStatus() + { + return iAddDeleteContactStatus; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTotalFetchCount +//----------------------------------------------------------------------------- + +void CTestData::SetAddDeleteContactStatus(TAddDeleteContactStatus aAddDeleteContactStatus) + { + iAddDeleteContactStatus = aAddDeleteContactStatus; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetSearchState +//----------------------------------------------------------------------------- + +CTestData::TSearchState CTestData::GetSearchState() + { + return iSearchState; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetSearchState +//----------------------------------------------------------------------------- + +void CTestData::SetSearchState(TSearchState aSearchState) + { + iSearchState = aSearchState; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetTestType +//----------------------------------------------------------------------------- + +CTestData::TTestType CTestData::GetTestType( ) + { + return iTestType; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetTestType +//----------------------------------------------------------------------------- + +void CTestData::SetTestType(TTestType aTestType) + { + iTestType = aTestType; + } +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetSearchKeys +//----------------------------------------------------------------------------- + +void CTestData::SetSearchKeys( gchar **aKeys ) + { + TInt i = 0; + for( i=0; aKeys[i]; i++ ) + { + iSearchKeys[i] = g_strdup(aKeys[i]); + } + iSearchKeys[i] = aKeys[i]; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetSearchKeys +//----------------------------------------------------------------------------- + +gchar** CTestData::GetSearchKeys( ) + { + return iSearchKeys; + } + + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : SetSearchChan +//----------------------------------------------------------------------------- + +void CTestData::SetSearchChan(TpChan *aSearchChan ) + { + iSearchChan = aSearchChan; + } + +//----------------------------------------------------------------------------- +// function_name : CTestData +/// description : GetSearchChan +//----------------------------------------------------------------------------- + +TpChan* CTestData::GetSearchChan( ) + { + return iSearchChan; + } + + +//End of File \ No newline at end of file diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabbleutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabbleutils.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: File containing Utility functions +* +*/ + + + + + +//Include files +#include +#include +#include + +#include + +#include "telepathygabbletestdata.h" +#include "telepathygabbleutils.h" + + + + +//----------------------------------------------------------------------------- +// function_name : CTelepathyGabbleUtils +// description : constructor +//----------------------------------------------------------------------------- +guint CTelepathyGabbleUtils::get_handle_from_contact ( const gchar *contact_id, + CTestData* aTestData) + +{ + + guint handle; + gboolean success; + GError *error = NULL; + + + //check for the return value if 0 is ok or should some negative value to be passed + g_return_val_if_fail (contact_id != NULL, 0); + + GArray *handles = NULL; + const gchar *contact_ids[2] ; //contact_ids initialization here gives error ..may be some compiler issue as otherwise okay to initialze here + + + contact_ids[0]= contact_id; + contact_ids[1]= NULL; + + + success = tp_conn_request_handles (DBUS_G_PROXY (aTestData->GetTpConn()), + TP_CONN_HANDLE_TYPE_CONTACT, + contact_ids, &handles, &error); + if( !handles || error ) + { + //do some error handling here + + g_error_free(error); + return KErrNotFound; + } + + + handle = g_array_index(handles, guint, 0); + g_array_free (handles, TRUE); + + + if (!success) + { + //test_log_handler ( error->message ); + g_clear_error (&error); + + //check for the return value if 0 is ok or should some negative value to be passed + return 0; + } + + return handle; +} + +// End of File diff -r 000000000000 -r d0f3a028347a loudmouth/bwins/loudmouthu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/bwins/loudmouthu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,87 @@ +EXPORTS + lm_connection_authenticate @ 1 NONAME + lm_connection_authenticate_and_block @ 2 NONAME + lm_connection_cancel_open @ 3 NONAME + lm_connection_close @ 4 NONAME + lm_connection_get_full_jid @ 5 NONAME + lm_connection_get_jid @ 6 NONAME + lm_connection_get_keep_alive_rate @ 7 NONAME + lm_connection_get_local_host @ 8 NONAME + lm_connection_get_port @ 9 NONAME + lm_connection_get_proxy @ 10 NONAME + lm_connection_get_server @ 11 NONAME + lm_connection_get_ssl @ 12 NONAME + lm_connection_get_state @ 13 NONAME + lm_connection_is_authenticated @ 14 NONAME + lm_connection_is_open @ 15 NONAME + lm_connection_new @ 16 NONAME + lm_connection_new_with_context @ 17 NONAME + lm_connection_open @ 18 NONAME + lm_connection_open_and_block @ 19 NONAME + lm_connection_ref @ 20 NONAME + lm_connection_register_message_handler @ 21 NONAME + lm_connection_send @ 22 NONAME + lm_connection_send_raw @ 23 NONAME + lm_connection_send_with_reply @ 24 NONAME + lm_connection_send_with_reply_and_block @ 25 NONAME + lm_connection_set_disconnect_function @ 26 NONAME + lm_connection_set_jid @ 27 NONAME + lm_connection_set_keep_alive_rate @ 28 NONAME + lm_connection_set_port @ 29 NONAME + lm_connection_set_proxy @ 30 NONAME + lm_connection_set_server @ 31 NONAME + lm_connection_set_ssl @ 32 NONAME + lm_connection_unref @ 33 NONAME + lm_connection_unregister_message_handler @ 34 NONAME + lm_error_quark @ 35 NONAME + lm_message_get_node @ 36 NONAME + lm_message_get_sub_type @ 37 NONAME + lm_message_get_type @ 38 NONAME + lm_message_handler_invalidate @ 39 NONAME + lm_message_handler_is_valid @ 40 NONAME + lm_message_handler_new @ 41 NONAME + lm_message_handler_ref @ 42 NONAME + lm_message_handler_unref @ 43 NONAME + lm_message_new @ 44 NONAME + lm_message_new_with_sub_type @ 45 NONAME + lm_message_node_add_child @ 46 NONAME + lm_message_node_find_child @ 47 NONAME + lm_message_node_get_attribute @ 48 NONAME + lm_message_node_get_child @ 49 NONAME + lm_message_node_get_raw_mode @ 50 NONAME + lm_message_node_get_value @ 51 NONAME + lm_message_node_ref @ 52 NONAME + lm_message_node_set_attribute @ 53 NONAME + lm_message_node_set_attributes @ 54 NONAME + lm_message_node_set_raw_mode @ 55 NONAME + lm_message_node_set_value @ 56 NONAME + lm_message_node_to_string @ 57 NONAME + lm_message_node_unref @ 58 NONAME + lm_message_ref @ 59 NONAME + lm_message_unref @ 60 NONAME + lm_parser_free @ 61 NONAME + lm_parser_new @ 62 NONAME + lm_parser_parse @ 63 NONAME + lm_proxy_get_password @ 64 NONAME + lm_proxy_get_port @ 65 NONAME + lm_proxy_get_server @ 66 NONAME + lm_proxy_get_type @ 67 NONAME + lm_proxy_get_username @ 68 NONAME + lm_proxy_new @ 69 NONAME + lm_proxy_new_with_server @ 70 NONAME + lm_proxy_ref @ 71 NONAME + lm_proxy_set_password @ 72 NONAME + lm_proxy_set_port @ 73 NONAME + lm_proxy_set_server @ 74 NONAME + lm_proxy_set_type @ 75 NONAME + lm_proxy_set_username @ 76 NONAME + lm_proxy_unref @ 77 NONAME + lm_sha_hash @ 78 NONAME + lm_ssl_get_fingerprint @ 79 NONAME + lm_ssl_is_supported @ 80 NONAME + lm_ssl_new @ 81 NONAME + lm_ssl_ref @ 82 NONAME + lm_ssl_unref @ 83 NONAME + lm_ssl_use_starttls @ 84 NONAME + lm_utils_get_localtime @ 85 NONAME + diff -r 000000000000 -r d0f3a028347a loudmouth/bwinscw/loudmouthu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/bwinscw/loudmouthu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,83 @@ +EXPORTS + lm_connection_authenticate @ 1 NONAME + lm_connection_authenticate_and_block @ 2 NONAME + lm_connection_cancel_open @ 3 NONAME + lm_connection_close @ 4 NONAME + lm_connection_get_jid @ 5 NONAME + lm_connection_get_port @ 6 NONAME + lm_connection_get_proxy @ 7 NONAME + lm_connection_get_server @ 8 NONAME + lm_connection_get_ssl @ 9 NONAME + lm_connection_get_state @ 10 NONAME + lm_connection_is_authenticated @ 11 NONAME + lm_connection_is_open @ 12 NONAME + lm_connection_new @ 13 NONAME + lm_connection_new_with_context @ 14 NONAME + lm_connection_open @ 15 NONAME + lm_connection_open_and_block @ 16 NONAME + lm_connection_ref @ 17 NONAME + lm_connection_register_message_handler @ 18 NONAME + lm_connection_send @ 19 NONAME + lm_connection_send_raw @ 20 NONAME + lm_connection_send_with_reply @ 21 NONAME + lm_connection_send_with_reply_and_block @ 22 NONAME + lm_connection_set_disconnect_function @ 23 NONAME + lm_connection_set_jid @ 24 NONAME + lm_connection_set_keep_alive_rate @ 25 NONAME + lm_connection_set_port @ 26 NONAME + lm_connection_set_proxy @ 27 NONAME + lm_connection_set_server @ 28 NONAME + lm_connection_set_ssl @ 29 NONAME + lm_connection_unref @ 30 NONAME + lm_connection_unregister_message_handler @ 31 NONAME + lm_error_quark @ 32 NONAME + lm_message_get_node @ 33 NONAME + lm_message_get_sub_type @ 34 NONAME + lm_message_get_type @ 35 NONAME + lm_message_handler_invalidate @ 36 NONAME + lm_message_handler_is_valid @ 37 NONAME + lm_message_handler_new @ 38 NONAME + lm_message_handler_ref @ 39 NONAME + lm_message_handler_unref @ 40 NONAME + lm_message_new @ 41 NONAME + lm_message_new_with_sub_type @ 42 NONAME + lm_message_node_add_child @ 43 NONAME + lm_message_node_find_child @ 44 NONAME + lm_message_node_get_attribute @ 45 NONAME + lm_message_node_get_child @ 46 NONAME + lm_message_node_get_raw_mode @ 47 NONAME + lm_message_node_get_value @ 48 NONAME + lm_message_node_ref @ 49 NONAME + lm_message_node_set_attribute @ 50 NONAME + lm_message_node_set_attributes @ 51 NONAME + lm_message_node_set_raw_mode @ 52 NONAME + lm_message_node_set_value @ 53 NONAME + lm_message_node_to_string @ 54 NONAME + lm_message_node_unref @ 55 NONAME + lm_message_ref @ 56 NONAME + lm_message_unref @ 57 NONAME + lm_parser_free @ 58 NONAME + lm_parser_new @ 59 NONAME + lm_parser_parse @ 60 NONAME + lm_proxy_get_password @ 61 NONAME + lm_proxy_get_port @ 62 NONAME + lm_proxy_get_server @ 63 NONAME + lm_proxy_get_type @ 64 NONAME + lm_proxy_get_username @ 65 NONAME + lm_proxy_new @ 66 NONAME + lm_proxy_new_with_server @ 67 NONAME + lm_proxy_ref @ 68 NONAME + lm_proxy_set_password @ 69 NONAME + lm_proxy_set_port @ 70 NONAME + lm_proxy_set_server @ 71 NONAME + lm_proxy_set_type @ 72 NONAME + lm_proxy_set_username @ 73 NONAME + lm_proxy_unref @ 74 NONAME + lm_sha_hash @ 75 NONAME + lm_ssl_get_fingerprint @ 76 NONAME + lm_ssl_is_supported @ 77 NONAME + lm_ssl_new @ 78 NONAME + lm_ssl_ref @ 79 NONAME + lm_ssl_unref @ 80 NONAME + lm_utils_get_localtime @ 81 NONAME + diff -r 000000000000 -r d0f3a028347a loudmouth/eabi/loudmouthu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/eabi/loudmouthu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,83 @@ +EXPORTS + lm_connection_authenticate @ 1 NONAME + lm_connection_authenticate_and_block @ 2 NONAME + lm_connection_cancel_open @ 3 NONAME + lm_connection_close @ 4 NONAME + lm_connection_get_jid @ 5 NONAME + lm_connection_get_port @ 6 NONAME + lm_connection_get_proxy @ 7 NONAME + lm_connection_get_server @ 8 NONAME + lm_connection_get_ssl @ 9 NONAME + lm_connection_get_state @ 10 NONAME + lm_connection_is_authenticated @ 11 NONAME + lm_connection_is_open @ 12 NONAME + lm_connection_new @ 13 NONAME + lm_connection_new_with_context @ 14 NONAME + lm_connection_open @ 15 NONAME + lm_connection_open_and_block @ 16 NONAME + lm_connection_ref @ 17 NONAME + lm_connection_register_message_handler @ 18 NONAME + lm_connection_send @ 19 NONAME + lm_connection_send_raw @ 20 NONAME + lm_connection_send_with_reply @ 21 NONAME + lm_connection_send_with_reply_and_block @ 22 NONAME + lm_connection_set_disconnect_function @ 23 NONAME + lm_connection_set_jid @ 24 NONAME + lm_connection_set_keep_alive_rate @ 25 NONAME + lm_connection_set_port @ 26 NONAME + lm_connection_set_proxy @ 27 NONAME + lm_connection_set_server @ 28 NONAME + lm_connection_set_ssl @ 29 NONAME + lm_connection_unref @ 30 NONAME + lm_connection_unregister_message_handler @ 31 NONAME + lm_error_quark @ 32 NONAME + lm_message_get_node @ 33 NONAME + lm_message_get_sub_type @ 34 NONAME + lm_message_get_type @ 35 NONAME + lm_message_handler_invalidate @ 36 NONAME + lm_message_handler_is_valid @ 37 NONAME + lm_message_handler_new @ 38 NONAME + lm_message_handler_ref @ 39 NONAME + lm_message_handler_unref @ 40 NONAME + lm_message_new @ 41 NONAME + lm_message_new_with_sub_type @ 42 NONAME + lm_message_node_add_child @ 43 NONAME + lm_message_node_find_child @ 44 NONAME + lm_message_node_get_attribute @ 45 NONAME + lm_message_node_get_child @ 46 NONAME + lm_message_node_get_raw_mode @ 47 NONAME + lm_message_node_get_value @ 48 NONAME + lm_message_node_ref @ 49 NONAME + lm_message_node_set_attribute @ 50 NONAME + lm_message_node_set_attributes @ 51 NONAME + lm_message_node_set_raw_mode @ 52 NONAME + lm_message_node_set_value @ 53 NONAME + lm_message_node_to_string @ 54 NONAME + lm_message_node_unref @ 55 NONAME + lm_message_ref @ 56 NONAME + lm_message_unref @ 57 NONAME + lm_parser_free @ 58 NONAME + lm_parser_new @ 59 NONAME + lm_parser_parse @ 60 NONAME + lm_proxy_get_password @ 61 NONAME + lm_proxy_get_port @ 62 NONAME + lm_proxy_get_server @ 63 NONAME + lm_proxy_get_type @ 64 NONAME + lm_proxy_get_username @ 65 NONAME + lm_proxy_new @ 66 NONAME + lm_proxy_new_with_server @ 67 NONAME + lm_proxy_ref @ 68 NONAME + lm_proxy_set_password @ 69 NONAME + lm_proxy_set_port @ 70 NONAME + lm_proxy_set_server @ 71 NONAME + lm_proxy_set_type @ 72 NONAME + lm_proxy_set_username @ 73 NONAME + lm_proxy_unref @ 74 NONAME + lm_ssl_get_fingerprint @ 75 NONAME + lm_ssl_is_supported @ 76 NONAME + lm_ssl_new @ 77 NONAME + lm_ssl_ref @ 78 NONAME + lm_ssl_unref @ 79 NONAME + lm_ssl_use_starttls @ 80 NONAME + lm_utils_get_localtime @ 81 NONAME + diff -r 000000000000 -r d0f3a028347a loudmouth/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,28 @@ +/* + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * Copyright (C) 2006 Collabora Ltd. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +PRJ_PLATFORMS +DEFAULT + +#include +PRJ_EXPORTS +../rom/loudmouth.iby CORE_MW_LAYER_IBY_EXPORT_PATH(loudmouth.iby) + +PRJ_MMPFILES +loudmouth.mmp + diff -r 000000000000 -r d0f3a028347a loudmouth/group/loudmouth.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/group/loudmouth.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,130 @@ +/* + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * Copyright (C) 2006 Collabora Ltd. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +TARGET loudmouth.dll +TARGETTYPE DLL +UID 0x1000008d 0x2000F851 + +VERSION 10.1 +#ifdef EKA2 +LANG SC +CAPABILITY All -TCB +VENDORID VID_DEFAULT + +#endif + +#if !defined(__WINSCW__) && !defined(__WINS__) +EpocAllowDllData +#endif + +MACRO SYMBIAN +MACRO HAVE_CONFIG_H + +MACRO LM_COMPILATION + +MACRO USE_TCP_KEEPALIVES +#ifdef WINSCW +MACRO EMULATOR +#endif + +#ifndef WINSCW +#define LM_NO_DEBUG +#endif + + +//EXPORTUNFROZEN + +USERINCLUDE ../inc +USERINCLUDE ../inc/loudmouth + +SYSTEMINCLUDE ../inc +SYSTEMINCLUDE /epoc32/include + +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_BOOST_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE +OS_LAYER_LIBUTILITY_SYSTEMINCLUDE + +//#endif + + + +/* Loudmouth source files */ +SOURCEPATH ../src + +SOURCE lm-connection.c +SOURCE lm-debug.c +SOURCE lm-error.c +SOURCE lm-message.c +SOURCE lm-message-handler.c +SOURCE lm-message-node.c +SOURCE lm-parser.c +SOURCE lm-proxy.c +SOURCE lm-sha.c +SOURCE lm-sock.c +SOURCE lm-ssl-base.c +SOURCE lm-ssl-generic.c +SOURCE lm-ssl-gnutls.c +SOURCE lm-ssl-openssl.c +SOURCE lm-utils.c +SOURCE lm-socket.c +SOURCE lm-message-queue.c +SOURCE lm-sasl.c +SOURCE lm-misc.c +SOURCE md5.c +SOURCE base64.c +#ifdef WINSCW +SOURCE libloudmouth_wsd.cpp +#endif + + + +LIBRARY libc.lib +LIBRARY libpthread.lib + +LIBRARY libglib.lib +LIBRARY glibbackend.lib +LIBRARY libgmodule.lib +LIBRARY libgobject.lib +LIBRARY libgthread.lib + +LIBRARY libssl.lib +LIBRARY libcrypto.lib +//LIBRARY libresolv.lib +//LIBRARY libglib.lib +#ifdef WINSCW +//wsd solution +LIBRARY ewsd.lib +LIBRARY euser.lib +#endif + + +/* +#if defined(ARMCC) +deffile ../eabi/ +#elif defined(WINSCW) +deffile ../bwinscw/ +#endif +*/ + +//VENDORID VID_DEFAULT + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/Makefile.in Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,645 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = loudmouth +DIST_COMMON = $(libloudmouthinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libloudmouthincludedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libloudmouth_1_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libloudmouth_1_la_SOURCES_DIST = lm-connection.c lm-debug.c \ + lm-debug.h lm-error.c lm-message.c lm-message-handler.c \ + lm-message-node.c lm-message-queue.c lm-message-queue.h \ + lm-misc.c lm-misc.h lm-parser.c lm-parser.h lm-internals.h \ + lm-sha.c lm-sha.h lm-ssl-generic.c lm-ssl-base.c lm-ssl-base.h \ + lm-ssl-internals.h lm-ssl-gnutls.c lm-ssl-openssl.c lm-utils.c \ + lm-proxy.c lm-sock.h lm-sock.c lm-socket.c lm-socket.h \ + asyncns.c asyncns.h lm-sasl.c lm-sasl.h md5.c md5.h base64.c \ + base64.h +@USE_GNUTLS_FALSE@@USE_OPENSSL_TRUE@am__objects_1 = lm-ssl-openssl.lo +@USE_GNUTLS_TRUE@am__objects_1 = lm-ssl-gnutls.lo +am__objects_2 = +am_libloudmouth_1_la_OBJECTS = lm-connection.lo lm-debug.lo \ + lm-error.lo lm-message.lo lm-message-handler.lo \ + lm-message-node.lo lm-message-queue.lo lm-misc.lo lm-parser.lo \ + lm-sha.lo lm-ssl-generic.lo lm-ssl-base.lo $(am__objects_1) \ + lm-utils.lo lm-proxy.lo lm-sock.lo lm-socket.lo asyncns.lo \ + lm-sasl.lo md5.lo base64.lo $(am__objects_2) +libloudmouth_1_la_OBJECTS = $(am_libloudmouth_1_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libloudmouth_1_la_SOURCES) +DIST_SOURCES = $(am__libloudmouth_1_la_SOURCES_DIST) +libloudmouthincludeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(libloudmouthinclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOC_CFLAGS = @DOC_CFLAGS@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_GTK_DOC_FALSE = @ENABLE_GTK_DOC_FALSE@ +ENABLE_GTK_DOC_TRUE = @ENABLE_GTK_DOC_TRUE@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GLIB2_REQUIRED = @GLIB2_REQUIRED@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GNUTLS_REQUIRED = @GNUTLS_REQUIRED@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE_LIBTOOL_FALSE@ +GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@ +HAVE_CHECK_FALSE = @HAVE_CHECK_FALSE@ +HAVE_CHECK_TRUE = @HAVE_CHECK_TRUE@ +HTML_DIR = @HTML_DIR@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ +LIBGNUTLS_CONFIG = @LIBGNUTLS_CONFIG@ +LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ +LIBIDN_CFLAGS = @LIBIDN_CFLAGS@ +LIBIDN_LIBS = @LIBIDN_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTASN1_REQUIRED = @LIBTASN1_REQUIRED@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LOUDMOUTH_CFLAGS = @LOUDMOUTH_CFLAGS@ +LOUDMOUTH_LIBS = @LOUDMOUTH_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_GNUTLS_FALSE = @USE_GNUTLS_FALSE@ +USE_GNUTLS_TRUE = @USE_GNUTLS_TRUE@ +USE_OPENSSL_FALSE = @USE_OPENSSL_FALSE@ +USE_OPENSSL_TRUE = @USE_OPENSSL_TRUE@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +NULL = +TEST_DIR = $(top_srcdir)/ +AM_CPPFLAGS = \ + -I. \ + -I$(top_srcdir) \ + $(LOUDMOUTH_CFLAGS) \ + $(LIBIDN_CFLAGS) \ + -DLM_COMPILATION \ + -DRUNTIME_ENDIAN \ + $(NULL) + +lib_LTLIBRARIES = libloudmouth-1.la +@USE_GNUTLS_TRUE@ssl_sources = \ +@USE_GNUTLS_TRUE@ lm-ssl-gnutls.c + +@USE_OPENSSL_TRUE@ssl_sources = \ +@USE_OPENSSL_TRUE@ lm-ssl-openssl.c + +libloudmouth_1_la_SOURCES = \ + lm-connection.c \ + lm-debug.c \ + lm-debug.h \ + lm-error.c \ + lm-message.c \ + lm-message-handler.c \ + lm-message-node.c \ + lm-message-queue.c \ + lm-message-queue.h \ + lm-misc.c \ + lm-misc.h \ + lm-parser.c \ + lm-parser.h \ + lm-internals.h \ + lm-sha.c \ + lm-sha.h \ + lm-ssl-generic.c \ + lm-ssl-base.c \ + lm-ssl-base.h \ + lm-ssl-internals.h \ + $(ssl_sources) \ + lm-utils.c \ + lm-proxy.c \ + lm-sock.h \ + lm-sock.c \ + lm-socket.c \ + lm-socket.h \ + asyncns.c \ + asyncns.h \ + lm-sasl.c \ + lm-sasl.h \ + md5.c \ + md5.h \ + base64.c \ + base64.h \ + $(NULL) + +libloudmouthinclude_HEADERS = \ + lm-connection.h \ + lm-error.h \ + lm-message.h \ + lm-message-handler.h \ + lm-message-node.h \ + lm-utils.h \ + lm-proxy.h \ + lm-ssl.h \ + loudmouth.h \ + $(NULL) + +libloudmouth_1_la_LIBADD = \ + $(LOUDMOUTH_LIBS) \ + $(LIBIDN_LIBS) \ + -lresolv + +libloudmouth_1_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-symbols $(srcdir)/loudmouth.sym + +libloudmouthincludedir = $(includedir)/loudmouth-1.0/loudmouth +EXTRA_DIST = \ + lm-ssl-gnutls.c \ + lm-ssl-openssl.c \ + loudmouth.sym + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu loudmouth/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu loudmouth/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libloudmouth-1.la: $(libloudmouth_1_la_OBJECTS) $(libloudmouth_1_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libloudmouth_1_la_LDFLAGS) $(libloudmouth_1_la_OBJECTS) $(libloudmouth_1_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncns.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-connection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-error.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-message-handler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-message-node.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-message-queue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-message.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-proxy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-sasl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-sha.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-sock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-socket.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-ssl-base.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-ssl-generic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-ssl-gnutls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-ssl-openssl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-libloudmouthincludeHEADERS: $(libloudmouthinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libloudmouthincludedir)" || $(mkdir_p) "$(DESTDIR)$(libloudmouthincludedir)" + @list='$(libloudmouthinclude_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(libloudmouthincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(libloudmouthincludedir)/$$f'"; \ + $(libloudmouthincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(libloudmouthincludedir)/$$f"; \ + done + +uninstall-libloudmouthincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libloudmouthinclude_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(libloudmouthincludedir)/$$f'"; \ + rm -f "$(DESTDIR)$(libloudmouthincludedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libloudmouthincludedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-libloudmouthincludeHEADERS + +install-exec-am: install-libLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ + uninstall-libloudmouthincludeHEADERS + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am \ + install-libLTLIBRARIES install-libloudmouthincludeHEADERS \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am uninstall-libLTLIBRARIES \ + uninstall-libloudmouthincludeHEADERS + + +# an explicit dependency here so alm generated files get built +$(OBJECTS): $(built_sources) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -r 000000000000 -r d0f3a028347a loudmouth/inc/asyncns.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/asyncns.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,162 @@ + + +/* $Id: asyncns.h 23 2007-02-16 12:49:17Z lennart $ */ + +/*** + This file is part of libasyncns. + Copyright (C) 2006 Collabora Ltd. + * + libasyncns is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + libasyncns 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 Lesser General Public + License along with libasyncns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ +#ifndef fooasyncnshfoo +#define fooasyncnshfoo + +#include +#include +#include + +/** /mainpage + * + * /section moo Method of operation + * + * To use libasyncns allocate an asyncns_t object with + * asyncns_new(). This will spawn a number of worker threads (or processes, depending on what is available) which + * are subsequently used to process the queries the controlling + * program issues via asyncns_getaddrinfo() and + * asyncns_getnameinfo(). Use asyncns_free() to shut down the worker + * threads/processes. + * + * Since libasyncns may fork off new processes you have to make sure that + * your program is not irritated by spurious SIGCHLD signals. + */ + +/** /example asyncns-test.c + * An example program */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** An opaque libasyncns session structure */ +typedef struct asyncns asyncns_t; + +/** An opaque libasyncns query structure */ +typedef struct asyncns_query asyncns_query_t; + +/** Allocate a new libasyncns session with n_proc worker processes */ +asyncns_t* asyncns_new(unsigned n_proc); + +/** Free a libasyncns session. This destroys all attached + * asyncns_query_t objects automatically */ +void asyncns_free(asyncns_t *asyncns); + +/** Return the UNIX file descriptor to select() for readability + * on. Use this function to integrate libasyncns with your custom main + * loop. */ +int asyncns_fd(asyncns_t *asyncns); + +/** Process pending responses. After this function is called you can + * get the next completed query object(s) using asyncns_getnext(). If + * block is non-zero wait until at least one response has been + * processed. If block is zero, process all pending responses and + * return. */ +int asyncns_wait(asyncns_t *asyncns, int block); + +/** Issue a name to address query on the specified session. The + * arguments are compatible with the ones of libc's + * getaddrinfo(3). The function returns a new query object. When the + * query is completed you may retrieve the results using + * asyncns_getaddrinfo_done().*/ +asyncns_query_t* asyncns_getaddrinfo(asyncns_t *asyncns, const char *node, const char *service, const struct addrinfo *hints); + +/** Retrieve the results of a preceding asyncns_getaddrinfo() + * call. Returns a addrinfo structure and a return value compatible + * with libc's getaddrinfo(3). The query object q is destroyed by this + * call and may not be used any further. Make sure to free the + * returned addrinfo structure with asyncns_freeaddrinfo() and not + * libc's freeaddrinfo(3)! If the query is not completed yet EAI_AGAIN + * is returned.*/ +int asyncns_getaddrinfo_done(asyncns_t *asyncns, asyncns_query_t* q, struct addrinfo **ret_res); + +/** Issue an address to name query on the specified session. The +arguments are compatible with the ones of libc's getnameinfo(3). The +function returns a new query object. When the query is completed you +may retrieve the results using asyncns_getnameinfo_done(). Set gethost +(resp. getserv) to non-zero if you want to query the hostname +(resp. the service name). */ +asyncns_query_t* asyncns_getnameinfo(asyncns_t *asyncns, const struct sockaddr *sa, socklen_t salen, int flags, int gethost, int getserv); + +/** Retrieve the results of a preceding asyncns_getnameinfo)( + * call. Returns the hostname and the service name in ret_host and + * ret_serv. The query object q is destroyed by this call and may not + * be used any further. If the query is not completed yet EAI_AGAIN is + * returned. */ +int asyncns_getnameinfo_done(asyncns_t *asyncns, asyncns_query_t* q, char *ret_host, size_t hostlen, char *ret_serv, size_t servlen); + +/** Issue an resolver query on the specified session. The arguments are + * compatible with the ones of libc's res_query(3). The function returns a new + * query object. When the query is completed you may retrieve the results using + * asyncns_res_done(). */ +asyncns_query_t* asyncns_res_query(asyncns_t *asyncns, const char *dname, int class, int type); + +/** Issue an resolver query on the specified session. The arguments are + * compatible with the ones of libc's res_search(3). The function returns a new + * query object. When the query is completed you may retrieve the results using + * asyncns_res_done(). */ +asyncns_query_t* asyncns_res_search(asyncns_t *asyncns, const char *dname, int class, int type); + +/** Retrieve the results of a preceding asyncns_res_query)( or + * asyncns_res_search call. The query object q is destroyed by this call and + * may not be used any further. Returns a pointer to the answer of the + * res_query call. If the query is not completed yet -EAGAIN is returned, on + * failure -errno is returned otherwise the length of answer is returned. */ +int asyncns_res_done(asyncns_t *asyncns, asyncns_query_t* q, unsigned char +**answer); + +/** Return the next completed query object. If no query has been + * completed yet, return NULL. Please note that you need to run + * asyncns_wait() before this function will return sensible data. */ +asyncns_query_t* asyncns_getnext(asyncns_t *asyncns); + +/** Return the number of query objects (completed or not) attached to + * this session */ +int asyncns_getnqueries(asyncns_t *asyncns); + +/** Cancel a currently running query. q is is destroyed by this call + * and may not be used any futher. */ +void asyncns_cancel(asyncns_t *asyncns, asyncns_query_t* q); + +/** Free the addrinfo structure as returned by +asyncns_getaddrinfo_done(). Make sure to use this functions instead of +the libc's freeaddrinfo()! */ +void asyncns_freeaddrinfo(struct addrinfo *ai); + +/** Returns non-zero when the query operation specified by q has been completed */ +int asyncns_isdone(asyncns_t *asyncns, asyncns_query_t*q); + +/** Assign some opaque userdata with a query object */ +void asyncns_setuserdata(asyncns_t *asyncns, asyncns_query_t *q, void *userdata); + +/** Return userdata assigned to a query object. Use + * asyncns_setuserdata() to set this data. If no data has been set + * prior to this call it returns NULL. */ +void* asyncns_getuserdata(asyncns_t *asyncns, asyncns_query_t *q); + +#ifdef __cplusplus +} +#endif + +#endif diff -r 000000000000 -r d0f3a028347a loudmouth/inc/base64.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/base64.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,31 @@ +/* + * base64.h - Base 64 encoding/decoding implementation + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BASE64_H__ +#define __BASE64_H__ + +#include + +gchar *_lm_base64_encode (const gchar *str, gsize n); +gchar *_lm_base64_decode (const gchar *str, gsize *len); + +#define base64_encode _lm_base64_encode +#define base64_decode _lm_base64_decode + +#endif /* __BASE64_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/config.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,120 @@ +/* + * © . All rights reserved. + */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* whether to use GnuTSL support. */ +/* #undef HAVE_GNUTLS */ + +/* Define if IDN support is included */ +/* #define HAVE_IDN 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Have OpenSSL */ +#define HAVE_OPENSSL + +/* Define to 1 if you have the header file. */ +#define HAVE_OPENSSL_SSL_H 1 + +/* whether to use SSL support. */ +#define HAVE_SSL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if libc defines a timezone variable */ +/* #undef HAVE_TIMEZONE */ + +/* Define if struct tm has a tm_gmtoff member */ +#define HAVE_TM_GMTOFF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "loudmouth" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Loudmouth" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Loudmouth 1.2.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "loudmouth" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.2.0" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 diff -r 000000000000 -r d0f3a028347a loudmouth/inc/gdebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/gdebug.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,69 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * . All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_DEBUG_H__ +#define __G_DEBUG_H__ + +#include <_ansi.h> + +G_BEGIN_DECLS + +typedef enum { + G_DEBUG_FATAL_WARNINGS = 1 << 0, + G_DEBUG_FATAL_CRITICALS = 1 << 1 +} GDebugFlag; + + +#ifdef G_ENABLE_DEBUG + +#define G_NOTE(type, action) G_STMT_START { \ + if (!_g_debug_initialized) \ + { _g_debug_init (); } \ + if (_g_debug_flags & G_DEBUG_##type) \ + { action; }; } G_STMT_END + +#else /* !G_ENABLE_DEBUG */ + +#define G_NOTE(type, action) + +#endif /* G_ENABLE_DEBUG */ + +#ifdef SYMBIAN +IMPORT_C gboolean * __g_debug_initialized(); +#endif /* SYMBIAN */ +GLIB_VAR gboolean _g_debug_initialized; + +#ifdef SYMBIAN +IMPORT_C guint * __g_debug_flags(); +#endif /* SYMBIAN */ +GLIB_VAR guint _g_debug_flags; + +void _g_debug_init (void) G_GNUC_INTERNAL; + +G_END_DECLS + +#endif /* __G_DEBUG_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/libloudmouth_wsd_macros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/libloudmouth_wsd_macros.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef _LIBLOUDMOUTHMACROS_WSD_DEFS_H_ +#define _LIBLOUDMOUTHMACROS_WSD_DEFS_H_ + +#if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#if EMULATOR +#undef EMULATOR +#endif +#ifdef GET_WSD_VAR_NAME +#undef GET_WSD_VAR_NAME +#endif + +#define EMULATOR (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#define GET_WSD_VAR_NAME(var,filename,prefix) _##prefix##_##filename##_##var + +#define RETURN_WSD_VAR(var,filename,prefix) (libloudmouth_ImpurePtr()->GET_WSD_VAR_NAME(var,filename,prefix)) + +#define GET_WSD_VAR_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (&RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define GET_WSD_ARRAY_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define VARIABLE_DECL(var,varprefix,filename,datatype)\ +datatype GET_WSD_VAR_NAME(var,filename,varprefix); + +#define VARIABLE_DECL_ARRAY(var,prefix,filename,datatype,size) \ +datatype GET_WSD_VAR_NAME(var,filename,prefix)[size]; + +#define VARIABLE_DECL_2DARRAY(var,prefix,filename,datatype,size,size1) \ +datatype GET_WSD_VAR_NAME(var,filename,prefix)[size][size1]; + + +#define GET_STATIC_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,g) + +#define GET_STATIC_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,g) + +#endif +#endif //_LIBLOUDMOUTHMACROS_WSD_DEFS_H_ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/libloudmouth_wsd_solution.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/libloudmouth_wsd_solution.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef _LIBLOUDMOUTH_WSD_H +#define _LIBLOUDMOUTH_WSD_H +#include "libloudmouth_wsd_macros.h" +#include "lm_enums.h" +#include "ghash.h" +#include +#include "lm-internals.h" +#include +/*#include "lm-debug.h" +#include "lm-message.h" +#include "lm-utils.h" +#include "base64.h" +#include "lm-misc.h" +#include "lm-sha.h"*/ + +#if EMULATOR +#ifdef __cplusplus +extern "C" +{ +#endif +typedef struct _TypeNames TypeNames; + +struct _TypeNames + { + LmMessageType type; + const gchar name[20]; + + }; + + +typedef struct _SubTypeNames SubTypeNames; + +struct _SubTypeNames + { + LmMessageSubType type; + const gchar name[20]; + + }; + + +struct libloudmouth_global_struct + { + VARIABLE_DECL(debug_flags, g, lm_debug,LmLogLevelFlags) + VARIABLE_DECL(initialized, g, lm_debug,gboolean) + VARIABLE_DECL(log_handler_id, g, lm_debug,guint) + VARIABLE_DECL_ARRAY(type_names, s, lm_message,TypeNames,13) + VARIABLE_DECL_ARRAY(sub_type_names, s, lm_message,SubTypeNames,14) + VARIABLE_DECL(initialized, s, lm_ssl_openssl,gboolean) + VARIABLE_DECL(last_id, s, lm_utils,guint) + VARIABLE_DECL_ARRAY(base64chars, s, lm_utils, gchar, 256) + VARIABLE_DECL_ARRAY(ret_val, s, lm_sha, gchar, 256) + VARIABLE_DECL_ARRAY(encoding, s, lm_base64, gchar, 256) + VARIABLE_DECL_ARRAY(buf, s, lm_misc, char, 256) + VARIABLE_DECL(initialised, g, lm_sock,gboolean) + + + /*END-global vars*/ + + }; + +struct libloudmouth_global_struct * libloudmouth_ImpurePtr(); +int libloudmouth_Init(struct libloudmouth_global_struct *); +#ifdef __cplusplus +} +#endif +#endif //EMULATOR +#endif //header guard ifdef _LIBGABBLE_WSD_H + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-debug.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,98 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_DEBUG_H__ +#define __LM_DEBUG_H__ +#include +#include +#include "lm_enums.h" + +//Wsd changes + +/*typedef enum { + + LM_LOG_LEVEL_VERBOSE = 1 << (G_LOG_LEVEL_USER_SHIFT), + LM_LOG_LEVEL_NET = 1 << (G_LOG_LEVEL_USER_SHIFT + 1), + LM_LOG_LEVEL_PARSER = 1 << (G_LOG_LEVEL_USER_SHIFT + 2), + LM_LOG_LEVEL_SSL = 1 << (G_LOG_LEVEL_USER_SHIFT + 3), + LM_LOG_LEVEL_SASL = 1 << (G_LOG_LEVEL_USER_SHIFT + 4), + LM_LOG_LEVEL_ALL = (LM_LOG_LEVEL_NET | + LM_LOG_LEVEL_VERBOSE | + LM_LOG_LEVEL_PARSER | + LM_LOG_LEVEL_SSL | + LM_LOG_LEVEL_SASL) +} LmLogLevelFlags; +*/ +#ifndef LM_LOG_DOMAIN +# define LM_LOG_DOMAIN "LM" +#endif + +#ifndef _DEBUG +#define LM_NO_DEBUG +#endif +#ifdef G_HAVE_ISO_VARARGS +# ifdef LM_NO_DEBUG +# define lm_verbose(...) +# else +# define lm_verbose(...) \ + g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, __VA_ARGS__) +# endif +#elif defined(G_HAVE_GNUC_VARARGS) +# if LM_NO_DEBUG +# define lm_verbose(fmt...) +# else +# define lm_verbose(fmt...) \ + g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, fmt) +# endif +#else +# ifdef LM_NO_DEBUG + static void + lm_verbose(const gchar *format, ...) {}; +# else +static void +lm_verbose (const gchar *format, ...) +{ +//#ifdef HAVELMLOGS + FILE *fp; + va_list args; + va_start (args, format); + // g_logv (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, format, args); + fp = fopen("c:\\lmlogs.txt","a"); + + if(fp) + { + /* fprintf(fp,arg); + fprintf(fp,"\n");*/ + // fprintf (fp, "%lu: 0x%lx: ", _dbus_getpid (), pthread_self ()); + vfprintf (fp, format, args); + fflush(fp); + fclose(fp); + } + va_end (args); + //#endif +} +# endif +#endif + +void lm_debug_init (void); + +#endif /* __LM_DEBUG_H__ */ +#define UNUSED_FORMAL_PARAM(p) (void) p + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-internals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-internals.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,117 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +/* Private functions that are internal to the library */ + +#ifndef __LM_INTERNALS_H__ +#define __LM_INTERNALS_H__ + +#include + +#include + +#include "lm-message.h" +#include "lm-message-handler.h" +#include "lm-message-node.h" +#include "lm-sock.h" +#include "lm-socket.h" + +#ifndef G_OS_WIN32 +typedef int LmSocketT; +#else /* G_OS_WIN32 */ +typedef SOCKET LmSocketT; +#endif /* G_OS_WIN32 */ + +typedef struct { + gpointer func; + gpointer user_data; + GDestroyNotify notify; +} LmCallback; + +typedef struct { + LmConnection *connection; + LmSocket *socket; + + /* struct to save resolved address */ + struct addrinfo *resolved_addrs; + struct addrinfo *current_addr; + LmSocketT fd; + GIOChannel *io_channel; +} LmConnectData; + +gboolean _lm_socket_failed_with_error (LmConnectData *connect_data, + int error); +gboolean _lm_socket_failed (LmConnectData *connect_data); +void _lm_socket_succeeded (LmConnectData *connect_data); +gboolean _lm_connection_async_connect_waiting (LmConnection *connection); +void _lm_connection_set_async_connect_waiting (LmConnection *connection, + gboolean waiting); + +LmCallback * _lm_utils_new_callback (gpointer func, + gpointer data, + GDestroyNotify notify); +void _lm_utils_free_callback (LmCallback *cb); + +gchar * _lm_utils_generate_id (void); +gchar * _lm_utils_base64_encode (const gchar *str); +gchar * _lm_utils_hostname_to_punycode (const gchar *hostname); +const gchar * _lm_message_type_to_string (LmMessageType type); +const gchar * _lm_message_sub_type_to_string (LmMessageSubType type); +LmMessage * _lm_message_new_from_node (LmMessageNode *node); +void _lm_message_node_add_child_node (LmMessageNode *node, + LmMessageNode *child); +LmMessageNode * _lm_message_node_new (const gchar *name); +void _lm_debug_init (void); + + +gboolean _lm_proxy_connect_cb (GIOChannel *source, + GIOCondition condition, + gpointer data); +LmHandlerResult +_lm_message_handler_handle_message (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *messag); +gboolean _lm_sock_library_init (void); +void _lm_sock_library_shutdown (void); +void _lm_sock_set_blocking (LmSocketT sock, + gboolean block); +void _lm_sock_shutdown (LmSocketT sock); +void _lm_sock_close (LmSocketT sock); +LmSocketT _lm_sock_makesocket (int af, + int type, + int protocol); +int _lm_sock_connect (LmSocketT sock, + const struct sockaddr *name, + int namelen); +gboolean _lm_sock_is_blocking_error (int err); +gboolean _lm_sock_is_blocking_success (int err); +int _lm_sock_get_last_error (void); +void _lm_sock_get_error (LmSocketT sock, + void *error, + socklen_t *len); +const gchar * _lm_sock_get_error_str (int err); +const gchar * _lm_sock_addrinfo_get_error_str (int err); +gchar * _lm_sock_get_local_host (LmSocketT sock); + +#ifdef USE_TCP_KEEPALIVES +gboolean _lm_sock_set_keepalive (LmSocketT sock, int delay); +#endif /* USE_TCP_KEEPALIVES */ + +#endif /* __LM_INTERNALS_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-message-queue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-message-queue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,50 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_MESSAGE_QUEUE_H__ +#define __LM_MESSAGE_QUEUE_H__ + +#include +#include "loudmouth/lm-message.h" + +typedef struct _LmMessageQueue LmMessageQueue; + +typedef void (* LmMessageQueueCallback) (LmMessageQueue *queue, + gpointer user_data); + +LmMessageQueue * lm_message_queue_new (LmMessageQueueCallback func, + gpointer data); +void lm_message_queue_attach (LmMessageQueue *queue, + GMainContext *context); + +void lm_message_queue_detach (LmMessageQueue *queue); +void lm_message_queue_push_tail (LmMessageQueue *queue, + LmMessage *m); +LmMessage * lm_message_queue_peek_nth (LmMessageQueue *queue, + guint n); +LmMessage * lm_message_queue_pop_nth (LmMessageQueue *queue, + guint n); +guint lm_message_queue_get_length (LmMessageQueue *queue); +gboolean lm_message_queue_is_empty (LmMessageQueue *queue); + +LmMessageQueue * lm_message_queue_ref (LmMessageQueue *queue); +void lm_message_queue_unref (LmMessageQueue *queue); + +#endif /* __LM_MESSAGE_QUEUE_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-misc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-misc.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_MISC_H__ +#define __LM_MISC_H__ + +#include + +GSource * lm_misc_add_io_watch (GMainContext *context, + GIOChannel *chan, + GIOCondition condition, + GIOFunc function, + gpointer data); +GSource * lm_misc_add_idle (GMainContext *context, + GSourceFunc function, + gpointer data); +GSource * lm_misc_add_timeout (GMainContext *context, + guint interval, + GSourceFunc function, + gpointer data); + +const char * lm_misc_io_condition_to_str (GIOCondition condition); + + +#endif /* __LM_MISC_H__ */ + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-parser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-parser.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_PARSER_H__ +#define __LM_PARSER_H__ + +#include +#include "lm-message.h" + +typedef struct LmParser LmParser; + +typedef void (* LmParserMessageFunction) (LmParser *parser, + LmMessage *message, + gpointer user_data); + +IMPORT_C LmParser * lm_parser_new (LmParserMessageFunction function, + gpointer user_data, + GDestroyNotify notify); +IMPORT_C void lm_parser_parse (LmParser *parser, + const gchar *string); +IMPORT_C void lm_parser_free (LmParser *parser); + +#endif /* __LM_PARSER_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-sasl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-sasl.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2007 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SASL_H__ +#define __LM_SASL_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _LmSASL LmSASL; + +typedef void (*LmSASLResultHandler) (LmSASL *sasl, + LmConnection *connection, + gboolean success, + const gchar *reason); + +LmSASL *lm_sasl_new (LmConnection *connection); + +void lm_sasl_authenticate (LmSASL *sasl, + const gchar *username, + const gchar *password, + const gchar *server, + LmSASLResultHandler handler); + +void lm_sasl_free (LmSASL *sasl); + +void +lm_sasl_get_auth_params (LmSASL *sasl, const gchar **username, + const gchar **password); +G_END_DECLS + +#endif /* __LM_SASL_H__ */ + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-sha.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-sha.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SHA_H__ +#define __LM_SHA_H__ + +#include + +IMPORT_C const gchar * lm_sha_hash (const gchar *str); + +#endif /* __LM_SHA_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-sock.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-sock.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,86 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SOCK_H__ +#define __LM_SOCK_H__ + +G_BEGIN_DECLS + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may di/sappear or change contents." +#endif + +#include + +#ifndef G_OS_WIN32 + +#include +#include +#include +#include +#include +#include + +#define _LM_SOCK_EINPROGRESS EINPROGRESS +#define _LM_SOCK_EWOULDBLOCK EWOULDBLOOK +#define _LM_SOCK_EALREADY EALREADY +#define _LM_SOCK_EISCONN EISCONN +#define _LM_SOCK_EINVAL EINVAL + +//added by prima +//to be removed later when MRT fixes the bug on return of socket connect +#define _LM_SOCK_EEXISTS EEXIST +//end added by prima + +#define _LM_SOCK_VALID(S) ((S) >= 0) + +#else /* G_OS_WIN32 */ + +/* This means that we require Windows XP or above to build on + * Windows, the reason for this, is that getaddrinfo() and + * freeaddrinfo() require ws2tcpip.h functions that are only available + * on these platforms. + * + * This MUST be defined before windows.h is included. + */ + + +#if (_WIN32_WINNT < 0x0501) +#undef WINVER +#define WINVER 0x0501 +#undef _WIN32_WINNT +#define _WIN32_WINNT WINVER +#endif + +#include +#include + +#define _LM_SOCK_EINPROGRESS WSAEINPROGRESS +#define _LM_SOCK_EWOULDBLOCK WSAEWOULDBLOCK +#define _LM_SOCK_EALREADY WSAEALREADY +#define _LM_SOCK_EISCONN WSAEISCONN +#define _LM_SOCK_EINVAL WSAEINVAL +#define _LM_SOCK_VALID(S) ((S) != INVALID_SOCKET) + +#endif /* G_OS_WIN32 */ + +G_END_DECLS + +#endif /* __LM_SOCK__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-socket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-socket.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,77 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SOCKET_H__ +#define __LM_SOCKET_H__ + +#include + +#include "lm-internals.h" + +typedef struct _LmSocket LmSocket; + +typedef void (* IncomingDataFunc) (LmSocket *socket, + const gchar *buf, + gpointer user_data); + +typedef void (* SocketClosedFunc) (LmSocket *socket, + LmDisconnectReason reason, + gpointer user_data); + +typedef void (* ConnectResultFunc) (LmSocket *socket, + gboolean result, + gpointer user_data); + +gboolean lm_socket_output_is_buffered (LmSocket *socket, + const gchar *buffer, + gint len); +void lm_socket_setup_output_buffer (LmSocket *socket, + const gchar *buffer, + gint len); +gint lm_socket_do_write (LmSocket *socket, + const gchar *buf, + gint len); + +LmSocket * lm_socket_create (GMainContext *context, + IncomingDataFunc data_func, + SocketClosedFunc closed_func, + ConnectResultFunc connect_func, + gpointer user_data, + LmConnection *connection, + gboolean blocking, + const gchar *server, + const gchar *domain, + guint port, + LmSSL *ssl, + LmProxy *proxy, + GError **error); +void lm_socket_flush (LmSocket *socket); +void lm_socket_close (LmSocket *socket); +LmSocket * lm_socket_ref (LmSocket *socket); +void lm_socket_unref (LmSocket *socket); +#ifdef HAVE_ASYNCNS +void _asyncns_cancel (LmSocket *socket); +#endif +gboolean lm_socket_starttls (LmSocket *socket); +gboolean lm_socket_set_keepalive (LmSocket *socket, int delay); +gchar * lm_socket_get_local_host (LmSocket *socket); + +#endif /* __LM_SOCKET_H__ */ + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-ssl-base.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-ssl-base.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,49 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SSL_BASE_H__ +#define __LM_SSL_BASE_H__ + +#include "lm-ssl.h" + +#define LM_SSL_BASE(x) ((LmSSLBase *) x) + +typedef struct _LmSSLBase LmSSLBase; +struct _LmSSLBase { + LmSSLFunction func; + gpointer func_data; + GDestroyNotify data_notify; + gchar *expected_fingerprint; + char fingerprint[20]; + gboolean use_starttls; + gboolean require_starttls; + + gint ref_count; +}; + +void _lm_ssl_base_init (LmSSLBase *base, + const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify); + +void _lm_ssl_base_free_fields (LmSSLBase *base); + +#endif /* __LM_SSL_BASE_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm-ssl-internals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm-ssl-internals.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,69 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SSL_INTERNALS_H__ +#define __LM_SSL_INTERNALS_H__ + +#include + +LmSSLResponse _lm_ssl_func_always_continue (LmSSL *ssl, + LmSSLStatus status, + gpointer user_data); +LmSSL * _lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify); + +void _lm_ssl_initialize (LmSSL *ssl); +gboolean _lm_ssl_begin (LmSSL *ssl, + gint fd, + const gchar *server, + GError **error); +GIOStatus _lm_ssl_read (LmSSL *ssl, + gchar *buf, + gint len, + gsize *bytes_read); +gint _lm_ssl_send (LmSSL *ssl, + const gchar *str, + gint len); +void _lm_ssl_close (LmSSL *ssl); +void _lm_ssl_free (LmSSL *ssl); + +LmSSL * _lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify); + +void _lm_ssl_initialize (LmSSL *ssl); +gboolean _lm_ssl_begin (LmSSL *ssl, + gint fd, + const gchar *server, + GError **error); +GIOStatus _lm_ssl_read (LmSSL *ssl, + gchar *buf, + gint len, + gsize *bytes_read); +gint _lm_ssl_send (LmSSL *ssl, + const gchar *str, + gint len); +void _lm_ssl_close (LmSSL *ssl); +void _lm_ssl_free (LmSSL *ssl); + +#endif /* __LM_SSL_INTERNALS_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/lm_enums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/lm_enums.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef enum_lm +#define enum_lm +#include +typedef enum +{ + LM_LOG_LEVEL_VERBOSE = 1 << (G_LOG_LEVEL_USER_SHIFT), + LM_LOG_LEVEL_NET = 1 << (G_LOG_LEVEL_USER_SHIFT+1), + LM_LOG_LEVEL_PARSER = 1 << (G_LOG_LEVEL_USER_SHIFT+2), + LM_LOG_LEVEL_SSL = 1 << (G_LOG_LEVEL_USER_SHIFT+3), + LM_LOG_LEVEL_SASL = 1 << (G_LOG_LEVEL_USER_SHIFT+4), + LM_LOG_LEVEL_ALL = ((1 << ((8) +1)) | + (1 << ((8))) | + (1 << ((8) +2)) | + (1 << ((8) +3)) | + (1 << ((8) +4))) +} LmLogLevelFlags; + +#endif diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-connection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-connection.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,175 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_CONNECTION_H__ +#define __LM_CONNECTION_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include "loudmouth/lm-message.h" +#include "loudmouth/lm-proxy.h" +#include "loudmouth/lm-ssl.h" + +G_BEGIN_DECLS + +#define LM_CONNECTION(o) (LmConnection *) o; + +#define LM_CONNECTION_DEFAULT_PORT 5222 +#define LM_CONNECTION_DEFAULT_PORT_SSL 5223 + +typedef struct _LmConnection LmConnection; + +typedef struct LmMessageHandler LmMessageHandler; + +typedef enum { + LM_HANDLER_RESULT_REMOVE_MESSAGE, + LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS +} LmHandlerResult; + +typedef enum { + LM_HANDLER_PRIORITY_LAST = 1, + LM_HANDLER_PRIORITY_NORMAL = 2, + LM_HANDLER_PRIORITY_FIRST = 3 +} LmHandlerPriority; + +typedef enum { + LM_DISCONNECT_REASON_OK, + LM_DISCONNECT_REASON_PING_TIME_OUT, + LM_DISCONNECT_REASON_HUP, + LM_DISCONNECT_REASON_ERROR, + LM_DISCONNECT_REASON_RESOURCE_CONFLICT, + LM_DISCONNECT_REASON_INVALID_XML, + LM_DISCONNECT_REASON_UNKNOWN +} LmDisconnectReason; + +typedef enum { + LM_CONNECTION_STATE_CLOSED, + LM_CONNECTION_STATE_OPENING, + LM_CONNECTION_STATE_OPEN, + LM_CONNECTION_STATE_AUTHENTICATING, + LM_CONNECTION_STATE_AUTHENTICATED +} LmConnectionState; + +typedef void (* LmResultFunction) (LmConnection *connection, + gboolean success, + gpointer user_data); + +typedef void (* LmDisconnectFunction) (LmConnection *connection, + LmDisconnectReason reason, + gpointer user_data); + +IMPORT_C LmConnection *lm_connection_new (const gchar *server); +IMPORT_C LmConnection *lm_connection_new_with_context (const gchar *server, + GMainContext *context); +IMPORT_C gboolean lm_connection_open (LmConnection *connection, + LmResultFunction function, + gpointer user_data, + GDestroyNotify notify, + GError **error); + +IMPORT_C gboolean lm_connection_open_and_block (LmConnection *connection, + GError **error); + +IMPORT_C void lm_connection_cancel_open (LmConnection *connection); +IMPORT_C gboolean lm_connection_close (LmConnection *connection, + GError **error); +IMPORT_C gboolean lm_connection_authenticate (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + LmResultFunction function, + gpointer user_data, + GDestroyNotify notify, + GError **error); +IMPORT_C gboolean +lm_connection_authenticate_and_block (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + GError **error); +IMPORT_C guint lm_connection_get_keep_alive_rate (LmConnection *connection); +IMPORT_C void lm_connection_set_keep_alive_rate (LmConnection *connection, + guint rate); + +IMPORT_C gboolean lm_connection_is_open (LmConnection *connection); +IMPORT_C gboolean lm_connection_is_authenticated (LmConnection *connection); + +IMPORT_C const gchar * lm_connection_get_server (LmConnection *connection); +IMPORT_C void lm_connection_set_server (LmConnection *connection, + const gchar *server); +IMPORT_C void lm_connection_set_jid (LmConnection *connection, + const gchar *jid); +IMPORT_C const gchar * lm_connection_get_jid (LmConnection *connection); +IMPORT_C gchar * lm_connection_get_full_jid (LmConnection *connection); + +IMPORT_C guint lm_connection_get_port (LmConnection *connection); +IMPORT_C void lm_connection_set_port (LmConnection *connection, + guint port); + +IMPORT_C LmSSL * lm_connection_get_ssl (LmConnection *connection); +IMPORT_C void lm_connection_set_ssl (LmConnection *connection, + LmSSL *ssl); +IMPORT_C LmProxy * lm_connection_get_proxy (LmConnection *connection); +IMPORT_C void lm_connection_set_proxy (LmConnection *connection, + LmProxy *proxy); +IMPORT_C gboolean lm_connection_send (LmConnection *connection, + LmMessage *message, + GError **error); +IMPORT_C gboolean lm_connection_send_with_reply (LmConnection *connection, + LmMessage *message, + LmMessageHandler *handler, + GError **error); +IMPORT_C LmMessage * +lm_connection_send_with_reply_and_block (LmConnection *connection, + LmMessage *message, + GError **error); +IMPORT_C void +lm_connection_register_message_handler (LmConnection *connection, + LmMessageHandler *handler, + LmMessageType type, + LmHandlerPriority priority); +IMPORT_C void +lm_connection_unregister_message_handler (LmConnection *connection, + LmMessageHandler *handler, + LmMessageType type); +IMPORT_C void +lm_connection_set_disconnect_function (LmConnection *connection, + LmDisconnectFunction function, + gpointer user_data, + GDestroyNotify notify); + +IMPORT_C gboolean lm_connection_send_raw (LmConnection *connection, + const gchar *str, + GError **error); +IMPORT_C LmConnectionState lm_connection_get_state (LmConnection *connection); +IMPORT_C gchar * lm_connection_get_local_host (LmConnection *connection); +IMPORT_C LmConnection* lm_connection_ref (LmConnection *connection); +IMPORT_C void lm_connection_unref (LmConnection *connection); + +gboolean +_lm_connection_old_auth (LmConnection *connection, const gchar *username, + const gchar *password, const gchar *resource, + GError **errror); + +G_END_DECLS + +#endif /* __LM_CONNECTION_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-error.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-error.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_ERROR_H__ +#define __LM_ERROR_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include + +G_BEGIN_DECLS + +#define LM_ERROR lm_error_quark () + +typedef enum { + LM_ERROR_CONNECTION_NOT_OPEN, + LM_ERROR_CONNECTION_OPEN, + LM_ERROR_AUTH_FAILED, + LM_ERROR_CONNECTION_FAILED +} LmError; + +IMPORT_C GQuark lm_error_quark (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __LM_ERROR_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-message-handler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-message-handler.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_MESSAGE_HANDLER_H__ +#define __LM_MESSAGE_HANDLER_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include "loudmouth/lm-connection.h" + +G_BEGIN_DECLS + +typedef LmHandlerResult (* LmHandleMessageFunction) (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + +IMPORT_C LmMessageHandler *lm_message_handler_new (LmHandleMessageFunction function, + gpointer user_data, + GDestroyNotify notify); +IMPORT_C void lm_message_handler_invalidate (LmMessageHandler *handler); +IMPORT_C gboolean lm_message_handler_is_valid (LmMessageHandler *handler); +IMPORT_C LmMessageHandler *lm_message_handler_ref (LmMessageHandler *handler); +IMPORT_C void lm_message_handler_unref (LmMessageHandler *handler); + +G_END_DECLS + +#endif /* __LM_MESSAGE_HANDLER_H__ */ + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-message-node.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-message-node.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_MESSAGE_NODE_H__ +#define __LM_MESSAGE_NODE_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _LmMessageNode LmMessageNode; + +struct _LmMessageNode { + gchar *name; + gchar *value; + gboolean raw_mode; + + LmMessageNode *next; + LmMessageNode *prev; + LmMessageNode *parent; + LmMessageNode *children; + + /* < private > */ + GSList *attributes; + gint ref_count; +}; + +IMPORT_C const gchar * lm_message_node_get_value (LmMessageNode *node); +IMPORT_C void lm_message_node_set_value (LmMessageNode *node, + const gchar *value); +IMPORT_C LmMessageNode *lm_message_node_add_child (LmMessageNode *node, + const gchar *name, + const gchar *value); +IMPORT_C void lm_message_node_set_attributes (LmMessageNode *node, + const gchar *name, + ...); +IMPORT_C void lm_message_node_set_attribute (LmMessageNode *node, + const gchar *name, + const gchar *value); +IMPORT_C const gchar * lm_message_node_get_attribute (LmMessageNode *node, + const gchar *name); +IMPORT_C LmMessageNode *lm_message_node_get_child (LmMessageNode *node, + const gchar *child_name); +IMPORT_C LmMessageNode *lm_message_node_find_child (LmMessageNode *node, + const gchar *child_name); +IMPORT_C gboolean lm_message_node_get_raw_mode (LmMessageNode *node); +IMPORT_C void lm_message_node_set_raw_mode (LmMessageNode *node, + gboolean raw_mode); +IMPORT_C LmMessageNode *lm_message_node_ref (LmMessageNode *node); +IMPORT_C void lm_message_node_unref (LmMessageNode *node); +IMPORT_C gchar * lm_message_node_to_string (LmMessageNode *node); + +G_END_DECLS + +#endif /* __LM_MESSAGE_NODE_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-message.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-message.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,89 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_MESSAGE_H__ +#define __LM_MESSAGE_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +#include "loudmouth/lm-message-node.h" + +G_BEGIN_DECLS + +typedef struct LmMessagePriv LmMessagePriv; + +typedef struct { + LmMessageNode *node; + + LmMessagePriv *priv; +} LmMessage; + +typedef enum { + LM_MESSAGE_TYPE_MESSAGE, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_TYPE_STREAM, + LM_MESSAGE_TYPE_STREAM_ERROR, + LM_MESSAGE_TYPE_STREAM_FEATURES, + LM_MESSAGE_TYPE_AUTH, + LM_MESSAGE_TYPE_CHALLENGE, + LM_MESSAGE_TYPE_RESPONSE, + LM_MESSAGE_TYPE_SUCCESS, + LM_MESSAGE_TYPE_FAILURE, + LM_MESSAGE_TYPE_PROCEED, + LM_MESSAGE_TYPE_STARTTLS, + LM_MESSAGE_TYPE_UNKNOWN +} LmMessageType; + +typedef enum { + LM_MESSAGE_SUB_TYPE_NOT_SET = -10, + LM_MESSAGE_SUB_TYPE_AVAILABLE = -1, + LM_MESSAGE_SUB_TYPE_NORMAL = 0, + LM_MESSAGE_SUB_TYPE_CHAT, + LM_MESSAGE_SUB_TYPE_GROUPCHAT, + LM_MESSAGE_SUB_TYPE_HEADLINE, + LM_MESSAGE_SUB_TYPE_UNAVAILABLE, + LM_MESSAGE_SUB_TYPE_PROBE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE, + LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBED, + LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED, + LM_MESSAGE_SUB_TYPE_GET, + LM_MESSAGE_SUB_TYPE_SET, + LM_MESSAGE_SUB_TYPE_RESULT, + LM_MESSAGE_SUB_TYPE_ERROR +} LmMessageSubType; + +IMPORT_C LmMessage * lm_message_new (const gchar *to, + LmMessageType type); +IMPORT_C LmMessage * lm_message_new_with_sub_type (const gchar *to, + LmMessageType type, + LmMessageSubType sub_type); +IMPORT_C LmMessageType lm_message_get_type (LmMessage *message); +IMPORT_C LmMessageSubType lm_message_get_sub_type (LmMessage *message); +IMPORT_C LmMessageNode * lm_message_get_node (LmMessage *message); +IMPORT_C LmMessage * lm_message_ref (LmMessage *message); +IMPORT_C void lm_message_unref (LmMessage *message); + +G_END_DECLS + +#endif /* __LM_MESSAGE_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-proxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-proxy.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2004 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ +#ifndef __LM_PROXY_H__ +#define __LM_PROXY_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +G_BEGIN_DECLS + +typedef struct _LmProxy LmProxy; + +typedef enum { + LM_PROXY_TYPE_NONE = 0, + LM_PROXY_TYPE_HTTP +} LmProxyType; + +IMPORT_C LmProxy * lm_proxy_new (LmProxyType type); +IMPORT_C LmProxy * lm_proxy_new_with_server (LmProxyType type, + const gchar *server, + guint port); + +IMPORT_C LmProxyType lm_proxy_get_type (LmProxy *proxy); +IMPORT_C void lm_proxy_set_type (LmProxy *proxy, + LmProxyType type); + +IMPORT_C const gchar * lm_proxy_get_server (LmProxy *proxy); +IMPORT_C void lm_proxy_set_server (LmProxy *proxy, + const gchar *server); + +IMPORT_C guint lm_proxy_get_port (LmProxy *proxy); +IMPORT_C void lm_proxy_set_port (LmProxy *proxy, + guint port); + +IMPORT_C const gchar * lm_proxy_get_username (LmProxy *proxy); +IMPORT_C void lm_proxy_set_username (LmProxy *proxy, + const gchar *username); + +IMPORT_C const gchar * lm_proxy_get_password (LmProxy *proxy); +IMPORT_C void lm_proxy_set_password (LmProxy *proxy, + const gchar *password); + +IMPORT_C LmProxy * lm_proxy_ref (LmProxy *proxy); +IMPORT_C void lm_proxy_unref (LmProxy *proxy); + +G_END_DECLS +#endif /* __LM_PROXY_H__ */ + diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-ssl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-ssl.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2004 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_SSL_H__ +#define __LM_SSL_H__ + +#include + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may disappear or change contents." +#endif + +G_BEGIN_DECLS + +typedef struct _LmSSL LmSSL; + +typedef enum { + LM_CERT_INVALID, + LM_CERT_ISSUER_NOT_FOUND, + LM_CERT_REVOKED +} LmCertificateStatus; + +typedef enum { + LM_SSL_STATUS_NO_CERT_FOUND, + LM_SSL_STATUS_UNTRUSTED_CERT, + LM_SSL_STATUS_CERT_EXPIRED, + LM_SSL_STATUS_CERT_NOT_ACTIVATED, + LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH, + LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH, + LM_SSL_STATUS_GENERIC_ERROR +} LmSSLStatus; + +typedef enum { + LM_SSL_RESPONSE_CONTINUE, + LM_SSL_RESPONSE_STOP +} LmSSLResponse; + +typedef LmSSLResponse (* LmSSLFunction) (LmSSL *ssl, + LmSSLStatus status, + gpointer user_data); + +IMPORT_C LmSSL * lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify); + +IMPORT_C gboolean lm_ssl_is_supported (void); + +IMPORT_C const gchar * lm_ssl_get_fingerprint (LmSSL *ssl); + +IMPORT_C void lm_ssl_use_starttls (LmSSL *ssl, + gboolean use_starttls, + gboolean require); + +gboolean lm_ssl_get_use_starttls (LmSSL *ssl); + +gboolean lm_ssl_get_require_starttls (LmSSL *ssl); + +IMPORT_C LmSSL * lm_ssl_ref (LmSSL *ssl); +IMPORT_C void lm_ssl_unref (LmSSL *ssl); + +G_END_DECLS + +#endif /* __LM_SSL_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/lm-utils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/lm-utils.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LM_UTILS_H__ +#define __LM_UTILS_H__ + +#if !defined (LM_INSIDE_LOUDMOUTH_H) && !defined (LM_COMPILATION) +#error "Only can be included directly, this file may di/sappear or change contents." +#endif + +#include + +G_BEGIN_DECLS + +IMPORT_C struct tm *lm_utils_get_localtime (const gchar *stamp); + +G_END_DECLS + +#endif /* __LM_UTILS_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/loudmouth/loudmouth.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/loudmouth/loudmouth.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,37 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#ifndef __LOUDMOUTH_H__ +#define __LOUDMOUTH_H__ + +#define LM_INSIDE_LOUDMOUTH_H 1 + +#include "loudmouth/lm-connection.h" +#include "loudmouth/lm-error.h" +#include "loudmouth/lm-message.h" +#include "loudmouth/lm-message-handler.h" +#include "loudmouth/lm-message-node.h" +#include "loudmouth/lm-proxy.h" +#include "loudmouth/lm-utils.h" +#include "loudmouth/lm-ssl.h" + +#undef LM_INSIDE_LOUDMOUTH_H + +#endif /* __LOUDMOUTH_H__ */ diff -r 000000000000 -r d0f3a028347a loudmouth/inc/md5.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/inc/md5.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,91 @@ +/* + Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Removed support for non-ANSI compilers; removed + references to Ghostscript; clarified derivation from RFC 1321; + now handles byte order either statically or dynamically. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + */ + +#ifndef md5_INCLUDED +# define md5_INCLUDED + +/* + * This package supports both compile-time and run-time determination of CPU + * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be + * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is + * defined as non-zero, the code will be compiled to run only on big-endian + * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to + * run on either big- or little-endian CPUs, but will run slightly less + * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. + */ + +typedef unsigned char md5_byte_t; /* 8-bit byte */ +typedef unsigned int md5_word_t; /* 32-bit word */ + +/* Define the state of the MD5 Algorithm. */ +typedef struct md5_state_s { + md5_word_t count[2]; /* message length in bits, lsw first */ + md5_word_t abcd[4]; /* digest buffer */ + md5_byte_t buf[64]; /* accumulate block */ +} md5_state_t; + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Initialize the algorithm. */ +void md5_init(md5_state_t *pms); + +/* Append a string to the message. */ +void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); + +/* Finish the message and return the digest. */ +void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* md5_INCLUDED */ diff -r 000000000000 -r d0f3a028347a loudmouth/install/loudmouth.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/install/loudmouth.bat Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,26 @@ +/* + * loudmouth.bat + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ + +@ECHO OFF +makesis loudmouth.pkg +signsis loudmouth.sis loudmouth.sisx rd.cer rd-key.pem diff -r 000000000000 -r d0f3a028347a loudmouth/install/loudmouth.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/install/loudmouth.pkg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,56 @@ +; ============================================================================ +; Name : loudmouth.pkg +; Part of : OpenC project +; Description : package file for all openc libraries +; +; +; +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; * Neither the name of the nor the names of its contributors +; may be used to endorse or promote products derived from this software +; without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES, LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; =========================================================================== +;Languages +&EN + +;Header +#{"loudmouth-pkg"},(0x19207369),1,0,0 + +;Localised Vendor name +%{"Nokia Testing EN"} + +;Unique Vendor name +:"Vendor" + +;INI FILE +; "\epoc32\winscw\c\testframework\testframework.ini" - "c:\testframework\testframework_tlm.ini" + +;CFG FILES + "\epoc32\winscw\c\testframework\tstlm_gtalk.cfg" - "c:\testframework\tstlm_gtalk.cfg" + "\epoc32\winscw\c\testframework\tstlm_gtalk1.cfg" - "c:\testframework\tstlm_gtalk1.cfg" + + +;TEST EXE +"\epoc32\release\ARMV5\urel\tstlm.dll" - "!:\Sys\Bin\tstlm.dll" + +;loudmouth +;"\epoc32\release\armv5\urel\loudmouth.dll" - "!:\sys\bin\loudmouth.dll" diff -r 000000000000 -r d0f3a028347a loudmouth/rom/loudmouth.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/rom/loudmouth.iby Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,34 @@ +/* + * loudmouth.iby + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +#ifndef __LOUDMOUTH_IBY__ +#define __LOUDMOUTH_IBY__ + +//Loudmouth DLLs +file=ABI_DIR\BUILD_DIR\loudmouth.dll SHARED_LIB_DIR\loudmouth.dll + +// mecostub SIS, provides support for SIS upgrading +//data=DATAZ_\system\install\meco_stub.sis system\install\meco_stub.sis + +#endif + + diff -r 000000000000 -r d0f3a028347a loudmouth/src/asyncns.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/asyncns.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1143 @@ +/* $Id: asyncns.c 27 2007-02-16 13:51:03Z lennart $ */ + +/*** + This file is part of libasyncns. + Copyright (C) 2006 Collabora Ltd. + + libasyncns is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + libasyncns 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 Lesser General Public + License along with libasyncns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +/*#undef HAVE_PTHREAD */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +#if HAVE_PTHREAD +#include +#endif + +#include "asyncns.h" + +#define MAX_WORKERS 16 +#define MAX_QUERIES 256 +#define BUFSIZE (10240) + +typedef enum { + REQUEST_ADDRINFO, + RESPONSE_ADDRINFO, + REQUEST_NAMEINFO, + RESPONSE_NAMEINFO, + REQUEST_RES_QUERY, + REQUEST_RES_SEARCH, + RESPONSE_RES, + REQUEST_TERMINATE +} query_type_t; + +enum { + REQUEST_RECV_FD = 0, + REQUEST_SEND_FD = 1, + RESPONSE_RECV_FD = 2, + RESPONSE_SEND_FD = 3 +}; + +struct asyncns { + int fds[4]; + +#ifndef HAVE_PTHREAD + pid_t workers[MAX_WORKERS]; +#else + pthread_t workers[MAX_WORKERS]; +#endif + unsigned valid_workers; + + unsigned current_id, current_index; + asyncns_query_t* queries[MAX_QUERIES]; + + asyncns_query_t *done_head, *done_tail; + + int n_queries; +}; + +struct asyncns_query { + asyncns_t *asyncns; + int done; + unsigned id; + query_type_t type; + asyncns_query_t *done_next, *done_prev; + int ret; + struct addrinfo *addrinfo; + char *serv, *host; + void *userdata; +}; + +typedef struct rheader { + query_type_t type; + unsigned id; + size_t length; +} rheader_t; + +typedef struct addrinfo_request { + struct rheader header; + int hints_is_null; + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t node_len, service_len; +} addrinfo_request_t; + +typedef struct addrinfo_response { + struct rheader header; + int ret; +} addrinfo_response_t; + +typedef struct addrinfo_serialization { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + size_t canonname_len; +} addrinfo_serialization_t; + +typedef struct nameinfo_request { + struct rheader header; + int flags; + socklen_t sockaddr_len; + int gethost, getserv; +} nameinfo_request_t; + +typedef struct nameinfo_response { + struct rheader header; + size_t hostlen, servlen; + int ret; +} nameinfo_response_t; + +typedef struct res_query_request { + struct rheader header; + int class; + int type; + size_t dlen; +} res_request_t; + +typedef struct res_query_response { + struct rheader header; + int ret; +} res_response_t; + +#ifndef HAVE_STRNDUP + +static char *strndup(const char *s, size_t l) { + size_t a; + char *n; + + a = strlen(s); + if (a > l) + a = l; + + if (!(n = malloc(a+1))) + return NULL; + + strncpy(n, s, a); + n[a] = 0; + + return n; +} + +#endif + +static int fd_nonblock(int fd) { + int i; + assert(fd >= 0); + + if ((i = fcntl(fd, F_GETFL, 0)) < 0) + return -1; + + if (i & O_NONBLOCK) + return 0; + + return fcntl(fd, F_SETFL, i | O_NONBLOCK); +} + +static int fd_cloexec(int fd) { + int v; + assert(fd >= 0); + + if ((v = fcntl(fd, F_GETFD, 0)) < 0) + return -1; + + if (v & FD_CLOEXEC) + return 0; + + return fcntl(fd, F_SETFD, v | FD_CLOEXEC); +} + + +static void *serialize_addrinfo(void *p, const struct addrinfo *ai, size_t *length, size_t maxlength) { + addrinfo_serialization_t *s = p; + size_t cnl, l; + assert(p); + assert(ai); + assert(length); + assert(*length <= maxlength); + + cnl = (ai->ai_canonname ? strlen(ai->ai_canonname)+1 : 0); + l = sizeof(addrinfo_serialization_t) + ai->ai_addrlen + cnl; + + if (*length + l > maxlength) + return NULL; + + s->ai_flags = ai->ai_flags; + s->ai_family = ai->ai_family; + s->ai_socktype = ai->ai_socktype; + s->ai_protocol = ai->ai_protocol; + s->ai_addrlen = ai->ai_addrlen; + s->canonname_len = cnl; + + memcpy((uint8_t*) p + sizeof(addrinfo_serialization_t), ai->ai_addr, ai->ai_addrlen); + + if (ai->ai_canonname) + strcpy((char*) p + sizeof(addrinfo_serialization_t) + ai->ai_addrlen, ai->ai_canonname); + + *length += l; + return (uint8_t*) p + l; +} + +static int send_addrinfo_reply(int out_fd, unsigned id, int ret, struct addrinfo *ai) { + uint8_t data[BUFSIZE]; + addrinfo_response_t *resp = (addrinfo_response_t*) data; + assert(out_fd >= 0); + + resp->header.type = RESPONSE_ADDRINFO; + resp->header.id = id; + resp->header.length = sizeof(addrinfo_response_t); + resp->ret = ret; + + if (ret == 0 && ai) { + void *p = data + sizeof(addrinfo_response_t); + + while (ai && p) { + p = serialize_addrinfo(p, ai, &resp->header.length, BUFSIZE); + ai = ai->ai_next; + } + } + + if (ai) + freeaddrinfo(ai); + + return send(out_fd, resp, resp->header.length, 0); +} + +static int send_nameinfo_reply(int out_fd, unsigned id, int ret, const char *host, const char *serv) { + uint8_t data[BUFSIZE]; + size_t hl, sl; + nameinfo_response_t *resp = (nameinfo_response_t*) data; + + assert(out_fd >= 0); + + sl = serv ? strlen(serv)+1 : 0; + hl = host ? strlen(host)+1 : 0; + + resp->header.type = RESPONSE_NAMEINFO; + resp->header.id = id; + resp->header.length = sizeof(nameinfo_response_t) + hl + sl; + resp->ret = ret; + resp->hostlen = hl; + resp->servlen = sl; + + assert(sizeof(data) >= resp->header.length); + + if (host) + memcpy(data + sizeof(nameinfo_response_t), host, hl); + + if (serv) + memcpy(data + sizeof(nameinfo_response_t) + hl, serv, sl); + + return send(out_fd, resp, resp->header.length, 0); +} + +static int send_res_reply(int out_fd, unsigned id, const unsigned char *answer, int ret) { + uint8_t data[BUFSIZE]; + res_response_t *resp = (res_response_t *) data; + + assert(out_fd >= 0); + + resp->header.type = RESPONSE_RES; + resp->header.id = id; + resp->header.length = sizeof(res_response_t) + (ret < 0 ? 0 : ret); + resp->ret = (ret < 0) ? -errno : ret; + + assert(sizeof(data) >= resp->header.length); + + if (ret > 0) + memcpy(data + sizeof(res_response_t), answer, ret); + + return send(out_fd, resp, resp->header.length, 0); +} + +static int handle_request(int out_fd, const rheader_t *req, size_t length) { + assert(out_fd >= 0); + assert(req); + assert(length >= sizeof(rheader_t)); + assert(length == req->length); + + switch (req->type) { + case REQUEST_ADDRINFO: { + struct addrinfo ai, *result = NULL; + const addrinfo_request_t *ai_req = (const addrinfo_request_t*) req; + const char *node, *service; + int ret; + + assert(length >= sizeof(addrinfo_request_t)); + assert(length == sizeof(addrinfo_request_t) + ai_req->node_len + ai_req->service_len); + + memset(&ai, 0, sizeof(ai)); + ai.ai_flags = ai_req->ai_flags; + ai.ai_family = ai_req->ai_family; + ai.ai_socktype = ai_req->ai_socktype; + ai.ai_protocol = ai_req->ai_protocol; + + node = ai_req->node_len ? (const char*) req + sizeof(addrinfo_request_t) : NULL; + service = ai_req->service_len ? (const char*) req + sizeof(addrinfo_request_t) + ai_req->node_len : NULL; + + /*printf("[getaddrinfo for '%s']\n", node);*/ + ret = getaddrinfo(node, service, + ai_req->hints_is_null ? NULL : &ai, + &result); + /*printf("[return value: %d: '%s']\n", ret, gai_strerror(ret));*/ + + /* send_addrinfo_reply() frees result */ + return send_addrinfo_reply(out_fd, req->id, ret, result); + } + + case REQUEST_NAMEINFO: { + int ret; + const nameinfo_request_t *ni_req = (const nameinfo_request_t*) req; + char hostbuf[NI_MAXHOST], servbuf[NI_MAXSERV]; + const struct sockaddr *sa; + + assert(length >= sizeof(nameinfo_request_t)); + assert(length == sizeof(nameinfo_request_t) + ni_req->sockaddr_len); + + sa = (const struct sockaddr*) ((const char*) req + sizeof(nameinfo_request_t)); + + ret = getnameinfo(sa, ni_req->sockaddr_len, + ni_req->gethost ? hostbuf : NULL, ni_req->gethost ? sizeof(hostbuf) : 0, + ni_req->getserv ? servbuf : NULL, ni_req->getserv ? sizeof(servbuf) : 0, + ni_req->flags); + + return send_nameinfo_reply(out_fd, req->id, ret, + ret == 0 && ni_req->gethost ? hostbuf : NULL, + ret == 0 && ni_req->getserv ? servbuf : NULL); + } + + case REQUEST_RES_QUERY: + case REQUEST_RES_SEARCH: { + int ret; + unsigned char answer[BUFSIZE]; + const res_request_t *res_req = (const res_request_t *)req; + const char *dname; + + assert(length >= sizeof(res_request_t)); + assert(length == sizeof(res_request_t) + res_req->dlen + 1); + + dname = (const char *) req + sizeof(res_request_t); + + if (req->type == REQUEST_RES_QUERY) { + /*printf("[res query for '%s']\n", dname);*/ + ret = res_query(dname, res_req->class, res_req->type, + answer, BUFSIZE); + /*printf("[return value: %d]\n", ret);*/ + } else { + ret = res_search(dname, res_req->class, res_req->type, + answer, BUFSIZE); + } + return send_res_reply(out_fd, req->id, answer, ret); + } + + case REQUEST_TERMINATE: { + /* Quit */ + return -1; + } + + default: + ; + } + + return 0; +} + +#ifndef HAVE_PTHREAD + +static int process_worker(int in_fd, int out_fd) { + int have_death_sig = 0; + assert(in_fd > 2); + assert(out_fd > 2); + + close(0); + close(1); + close(2); + + open("/dev/null", O_RDONLY); + open("/dev/null", O_WRONLY); + open("/dev/null", O_WRONLY); + + chdir("/"); + + if (geteuid() == 0) { + struct passwd *pw; + + if ((pw = getpwnam("nobody"))) { +#ifdef HAVE_SETRESUID + setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); +#elif HAVE_SETREUID + setreuid(pw->pw_uid, pw->pw_uid); +#else + setuid(pw->pw_uid); + seteuid(pw->pw_uid); +#endif + } + } + + signal(SIGTERM, SIG_DFL); + + signal(SIGINT, SIG_IGN); + signal(SIGHUP, SIG_IGN); + signal(SIGPIPE, SIG_IGN); + signal(SIGUSR1, SIG_IGN); + signal(SIGUSR2, SIG_IGN); + +#ifdef PR_SET_PDEATHSIG + if (prctl(PR_SET_PDEATHSIG, SIGTERM) >= 0) + have_death_sig = 1; +#endif + + if (!have_death_sig) + fd_nonblock(in_fd); + + while (getppid() > 1) { /* if the parent PID is 1 our parent process died. */ + char buf[BUFSIZE]; + ssize_t length; + + if (!have_death_sig) { + fd_set fds; + struct timeval tv = { 0, 500000 } ; + + FD_ZERO(&fds); + FD_SET(in_fd, &fds); + + if (select(in_fd+1, &fds, NULL, NULL, &tv) < 0) + break; + + if (getppid() == 1) + break; + } + + if ((length = recv(in_fd, buf, sizeof(buf), 0)) <= 0) { + + if (length < 0 && errno == EAGAIN) + continue; + + break; + } + + if (handle_request(out_fd, (rheader_t*) buf, (size_t) length) < 0) + break; + } + + close(in_fd); + close(out_fd); + + return 0; +} + +#else + +static void* thread_worker(void *p) { + sigset_t fullset; + int *fds = p; + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); + + /* No signals in this thread please */ + sigfillset(&fullset); + pthread_sigmask(SIG_BLOCK, &fullset, NULL); + + for (;;) { + char buf[BUFSIZE]; + ssize_t length; + + if ((length = recv(fds[REQUEST_RECV_FD], buf, sizeof(buf), 0)) <= 0) + break; + + if (handle_request(fds[RESPONSE_SEND_FD], (rheader_t*) buf, (size_t) length) < 0) + break; + + } + + return NULL; +} + +#endif + +asyncns_t* asyncns_new(unsigned n_proc) { + asyncns_t *asyncns = NULL; + int i; + unsigned p; + assert(n_proc >= 1); + + if (n_proc > MAX_WORKERS) + n_proc = MAX_WORKERS; + + if (!(asyncns = malloc(sizeof(asyncns_t)))) + goto fail; + + asyncns->valid_workers = 0; + + for (i = 0; i < 4; i++) + asyncns->fds[i] = -1; + + for (p = 0; p < MAX_QUERIES; p++) + asyncns->queries[p] = NULL; + + if (socketpair(PF_UNIX, SOCK_DGRAM, 0, asyncns->fds) < 0 || + socketpair(PF_UNIX, SOCK_DGRAM, 0, asyncns->fds+2) < 0) + goto fail; + + for (i = 0; i < 4; i++) + fd_cloexec(asyncns->fds[i]); + + for (asyncns->valid_workers = 0; asyncns->valid_workers < n_proc; asyncns->valid_workers++) { + +#ifndef HAVE_PTHREAD + if ((asyncns->workers[asyncns->valid_workers] = fork()) < 0) + goto fail; + else if (asyncns->workers[asyncns->valid_workers] == 0) { + close(asyncns->fds[REQUEST_SEND_FD]); + close(asyncns->fds[RESPONSE_RECV_FD]); + _exit(process_worker(asyncns->fds[REQUEST_RECV_FD], asyncns->fds[RESPONSE_SEND_FD])); + } +#else + if (pthread_create(&asyncns->workers[asyncns->valid_workers], NULL, thread_worker, asyncns->fds) != 0) + goto fail; +#endif + } + +#ifndef HAVE_PTHREAD + close(asyncns->fds[REQUEST_RECV_FD]); + close(asyncns->fds[RESPONSE_SEND_FD]); + asyncns->fds[REQUEST_RECV_FD] = asyncns->fds[RESPONSE_SEND_FD] = -1; +#endif + + asyncns->current_index = asyncns->current_id = 0; + asyncns->done_head = asyncns->done_tail = NULL; + asyncns->n_queries = 0; + + fd_nonblock(asyncns->fds[RESPONSE_RECV_FD]); + + return asyncns; + +fail: + if (asyncns) + asyncns_free(asyncns); + + return NULL; +} + +void asyncns_free(asyncns_t *asyncns) { + unsigned p; + int i; + rheader_t req; + assert(asyncns); + + req.type = REQUEST_TERMINATE; + req.length = sizeof(req); + req.id = 0; + + /* Send one termiantion packet for each worker */ + for (p = 0; p < asyncns->valid_workers; p++) + send(asyncns->fds[REQUEST_SEND_FD], &req, req.length, 0); + + /* No terminate them forcibly*/ + for (p = 0; p < asyncns->valid_workers; p++) { +#ifndef HAVE_PTHREAD + kill(asyncns->workers[p], SIGTERM); + waitpid(asyncns->workers[p], NULL, 0); +#else + pthread_cancel(asyncns->workers[p]); + pthread_join(asyncns->workers[p], NULL); +#endif + } + + /* Due to Solaris' broken thread cancelation we first send an + * termination request and then cancel th thread. */ + + + for (i = 0; i < 4; i++) + if (asyncns->fds[i] >= 0) + close(asyncns->fds[i]); + + for (p = 0; p < MAX_QUERIES; p++) + if (asyncns->queries[p]) + asyncns_cancel(asyncns, asyncns->queries[p]); + + free(asyncns); +} + +int asyncns_fd(asyncns_t *asyncns) { + assert(asyncns); + + return asyncns->fds[RESPONSE_RECV_FD]; +} + +static asyncns_query_t *lookup_query(asyncns_t *asyncns, unsigned id) { + asyncns_query_t *q; + assert(asyncns); + + if ((q = asyncns->queries[id % MAX_QUERIES])) + if (q->id == id) + return q; + + return NULL; +} + +static void complete_query(asyncns_t *asyncns, asyncns_query_t *q) { + assert(asyncns); + assert(q); + assert(!q->done); + + q->done = 1; + + if ((q->done_prev = asyncns->done_tail)) + asyncns->done_tail->done_next = q; + else + asyncns->done_head = q; + + asyncns->done_tail = q; + q->done_next = NULL; +} + +static void *unserialize_addrinfo(void *p, struct addrinfo **ret_ai, size_t *length) { + addrinfo_serialization_t *s = p; + size_t l; + struct addrinfo *ai; + assert(p); + assert(ret_ai); + assert(length); + + if (*length < sizeof(addrinfo_serialization_t)) + return NULL; + + l = sizeof(addrinfo_serialization_t) + s->ai_addrlen + s->canonname_len; + if (*length < l) + return NULL; + + if (!(ai = malloc(sizeof(struct addrinfo)))) + goto fail; + + ai->ai_addr = NULL; + ai->ai_canonname = NULL; + ai->ai_next = NULL; + + if (s->ai_addrlen && !(ai->ai_addr = malloc(s->ai_addrlen))) + goto fail; + + if (s->canonname_len && !(ai->ai_canonname = malloc(s->canonname_len))) + goto fail; + + ai->ai_flags = s->ai_flags; + ai->ai_family = s->ai_family; + ai->ai_socktype = s->ai_socktype; + ai->ai_protocol = s->ai_protocol; + ai->ai_addrlen = s->ai_addrlen; + + if (ai->ai_addr) + memcpy(ai->ai_addr, (uint8_t*) p + sizeof(addrinfo_serialization_t), s->ai_addrlen); + + if (ai->ai_canonname) + memcpy(ai->ai_canonname, (uint8_t*) p + sizeof(addrinfo_serialization_t) + s->ai_addrlen, s->canonname_len); + + *length -= l; + *ret_ai = ai; + + return (uint8_t*) p + l; + + +fail: + if (ai) + asyncns_freeaddrinfo(ai); + + return NULL; +} + +static int handle_response(asyncns_t *asyncns, rheader_t *resp, size_t length) { + asyncns_query_t *q; + assert(asyncns); + assert(resp); + assert(length >= sizeof(rheader_t)); + assert(length == resp->length); + + if (!(q = lookup_query(asyncns, resp->id))) + return 0; + + switch (resp->type) { + case RESPONSE_ADDRINFO: { + const addrinfo_response_t *ai_resp = (addrinfo_response_t*) resp; + void *p; + size_t l; + struct addrinfo *prev = NULL; + + assert(length >= sizeof(addrinfo_response_t)); + assert(q->type == REQUEST_ADDRINFO); + + q->ret = ai_resp->ret; + l = length - sizeof(addrinfo_response_t); + p = (uint8_t*) resp + sizeof(addrinfo_response_t); + + while (l > 0 && p) { + struct addrinfo *ai = NULL; + p = unserialize_addrinfo(p, &ai, &l); + + if (!ai) + break; + + if (prev) + prev->ai_next = ai; + else + q->addrinfo = ai; + + prev = ai; + } + + complete_query(asyncns, q); + break; + } + + case RESPONSE_NAMEINFO: { + const nameinfo_response_t *ni_resp = (nameinfo_response_t*) resp; + + assert(length >= sizeof(nameinfo_response_t)); + assert(q->type == REQUEST_NAMEINFO); + + q->ret = ni_resp->ret; + + if (ni_resp->hostlen) + q->host = strndup((const char*) ni_resp + sizeof(nameinfo_response_t), ni_resp->hostlen-1); + + if (ni_resp->servlen) + q->serv = strndup((const char*) ni_resp + sizeof(nameinfo_response_t) + ni_resp->hostlen, ni_resp->servlen-1); + + + complete_query(asyncns, q); + break; + } + + case RESPONSE_RES: { + const res_response_t *res_resp = (res_response_t *)resp; + + assert(length >= sizeof(res_response_t)); + assert(q->type == REQUEST_RES_QUERY || q->type == REQUEST_RES_SEARCH); + + q->ret = res_resp->ret; + + if (res_resp->ret >= 0) { + q->serv = malloc(res_resp->ret); + memcpy(q->serv, (char *)resp + sizeof(res_response_t), res_resp->ret); + } + + complete_query(asyncns, q); + break; + } + + default: + ; + } + + return 0; +} + +int asyncns_wait(asyncns_t *asyncns, int block) { + int handled = 0; + assert(asyncns); + + for (;;) { + char buf[BUFSIZE]; + ssize_t l; + + if (((l = recv(asyncns->fds[RESPONSE_RECV_FD], buf, sizeof(buf), 0)) < 0)) { + fd_set fds; + + if (errno != EAGAIN) + return -1; + + if (!block || handled) + return 0; + + FD_ZERO(&fds); + FD_SET(asyncns->fds[RESPONSE_RECV_FD], &fds); + + if (select(asyncns->fds[RESPONSE_RECV_FD]+1, &fds, NULL, NULL, NULL) < 0) + return -1; + + continue; + } + + + if (handle_response(asyncns, (rheader_t*) buf, (size_t) l) < 0) + return -1; + + handled = 1; + } +} + +static asyncns_query_t *alloc_query(asyncns_t *asyncns) { + asyncns_query_t *q; + assert(asyncns); + + if (asyncns->n_queries >= MAX_QUERIES) + return NULL; + + while (asyncns->queries[asyncns->current_index]) { + + asyncns->current_index++; + asyncns->current_id++; + + while (asyncns->current_index >= MAX_QUERIES) + asyncns->current_index -= MAX_QUERIES; + } + + if (!(q = asyncns->queries[asyncns->current_index] = malloc(sizeof(asyncns_query_t)))) + return NULL; + + asyncns->n_queries++; + + q->asyncns = asyncns; + q->done = 0; + q->id = asyncns->current_id; + q->done_next = q->done_prev = NULL; + q->ret = 0; + q->addrinfo = NULL; + q->userdata = NULL; + q->host = q->serv = NULL; + + return q; +} + +asyncns_query_t* asyncns_getaddrinfo(asyncns_t *asyncns, const char *node, const char *service, const struct addrinfo *hints) { + uint8_t data[BUFSIZE]; + addrinfo_request_t *req = (addrinfo_request_t*) data; + asyncns_query_t *q; + assert(asyncns); + assert(node || service); + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(addrinfo_request_t)); + + req->node_len = node ? strlen(node)+1 : 0; + req->service_len = service ? strlen(service)+1 : 0; + + req->header.id = q->id; + req->header.type = q->type = REQUEST_ADDRINFO; + req->header.length = sizeof(addrinfo_request_t) + req->node_len + req->service_len; + + if (req->header.length > BUFSIZE) + goto fail; + + if (!(req->hints_is_null = !hints)) { + req->ai_flags = hints->ai_flags; + req->ai_family = hints->ai_family; + req->ai_socktype = hints->ai_socktype; + req->ai_protocol = hints->ai_protocol; + } + + if (node) + strcpy((char*) req + sizeof(addrinfo_request_t), node); + + if (service) + strcpy((char*) req + sizeof(addrinfo_request_t) + req->node_len, service); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, 0) < 0) + goto fail; + + return q; + +fail: + if (q) + asyncns_cancel(asyncns, q); + + return NULL; +} + +int asyncns_getaddrinfo_done(asyncns_t *asyncns, asyncns_query_t* q, struct addrinfo **ret_res) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_ADDRINFO); + + if (!q->done) + return EAI_AGAIN; + + *ret_res = q->addrinfo; + q->addrinfo = NULL; + ret = q->ret; + asyncns_cancel(asyncns, q); + + return ret; +} + +asyncns_query_t* asyncns_getnameinfo(asyncns_t *asyncns, const struct sockaddr *sa, socklen_t salen, int flags, int gethost, int getserv) { + uint8_t data[BUFSIZE]; + nameinfo_request_t *req = (nameinfo_request_t*) data; + asyncns_query_t *q; + + assert(asyncns); + assert(sa); + assert(salen > 0); + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(nameinfo_request_t)); + + req->header.id = q->id; + req->header.type = q->type = REQUEST_NAMEINFO; + req->header.length = sizeof(nameinfo_request_t) + salen; + + if (req->header.length > BUFSIZE) + goto fail; + + req->flags = flags; + req->sockaddr_len = salen; + req->gethost = gethost; + req->getserv = getserv; + + memcpy((uint8_t*) req + sizeof(nameinfo_request_t), sa, salen); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, 0) < 0) + goto fail; + + return q; + +fail: + if (q) + asyncns_cancel(asyncns, q); + + return NULL; +} + +int asyncns_getnameinfo_done(asyncns_t *asyncns, asyncns_query_t* q, char *ret_host, size_t hostlen, char *ret_serv, size_t servlen) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_NAMEINFO); + assert(!ret_host || hostlen); + assert(!ret_serv || servlen); + + if (!q->done) + return EAI_AGAIN; + + if (ret_host && q->host) { + strncpy(ret_host, q->host, hostlen); + ret_host[hostlen-1] = 0; + } + + if (ret_serv && q->serv) { + strncpy(ret_serv, q->serv, servlen); + ret_serv[servlen-1] = 0; + } + + ret = q->ret; + asyncns_cancel(asyncns, q); + + return ret; +} + +static asyncns_query_t * +asyncns_res(asyncns_t *asyncns, query_type_t qtype, + const char *dname, int class, int type) { + uint8_t data[BUFSIZE]; + res_request_t *req = (res_request_t*) data; + asyncns_query_t *q; + size_t dlen; + + assert(asyncns); + assert(dname); + + dlen = strlen(dname); + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(res_request_t)); + + req->header.id = q->id; + req->header.type = q->type = qtype; + req->header.length = sizeof(res_request_t) + dlen + 1; + + if (req->header.length > BUFSIZE) + goto fail; + + req->class = class; + req->type = type; + req->dlen = dlen; + + memcpy((uint8_t*) req + sizeof(res_request_t), dname, dlen + 1); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, 0) < 0) + goto fail; + + return q; + +fail: + if (q) + asyncns_cancel(asyncns, q); + + return NULL; +} + +asyncns_query_t* asyncns_res_query(asyncns_t *asyncns, const char *dname, int class, int type) { + return asyncns_res(asyncns, REQUEST_RES_QUERY, dname, class, type); +} + +asyncns_query_t* asyncns_res_search(asyncns_t *asyncns, const char *dname, int class, int type) { + return asyncns_res(asyncns, REQUEST_RES_SEARCH, dname, class, type); +} + +int asyncns_res_done(asyncns_t *asyncns, asyncns_query_t* q, unsigned char **answer) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_RES_QUERY || q->type == REQUEST_RES_SEARCH); + assert(answer); + + if (!q->done) + return -EAGAIN; + + *answer = (unsigned char *)q->serv; + q->serv = NULL; + + ret = q->ret; + + asyncns_cancel(asyncns, q); + + return ret; +} + +asyncns_query_t* asyncns_getnext(asyncns_t *asyncns) { + assert(asyncns); + return asyncns->done_head; +} + +int asyncns_getnqueries(asyncns_t *asyncns) { + assert(asyncns); + return asyncns->n_queries; +} + +void asyncns_cancel(asyncns_t *asyncns, asyncns_query_t* q) { + int i; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(asyncns->n_queries > 0); + + if (q->done) { + + if (q->done_prev) + q->done_prev->done_next = q->done_next; + else + asyncns->done_head = q->done_next; + + if (q->done_next) + q->done_next->done_prev = q->done_prev; + else + asyncns->done_tail = q->done_prev; + } + + + i = q->id % MAX_QUERIES; + assert(asyncns->queries[i] == q); + asyncns->queries[i] = NULL; + + asyncns_freeaddrinfo(q->addrinfo); + free(q->addrinfo); + free(q->host); + free(q->serv); + + asyncns->n_queries--; + free(q); +} + +void asyncns_freeaddrinfo(struct addrinfo *ai) { + if (!ai) + return; + + while (ai) { + struct addrinfo *next = ai->ai_next; + + free(ai->ai_addr); + free(ai->ai_canonname); + free(ai); + + ai = next; + } +} + +int asyncns_isdone(asyncns_t *asyncns, asyncns_query_t*q) { + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + + return q->done; +} + +void asyncns_setuserdata(asyncns_t *asyncns, asyncns_query_t *q, void *userdata) { + assert(q); + assert(asyncns); + assert(q->asyncns = asyncns); + + q->userdata = userdata; +} + +void* asyncns_getuserdata(asyncns_t *asyncns, asyncns_query_t *q) { + assert(q); + assert(asyncns); + assert(q->asyncns = asyncns); + + return q->userdata; +} + + diff -r 000000000000 -r d0f3a028347a loudmouth/src/base64.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/base64.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,207 @@ +/* + * base64.c - Base 64 encoding/decoding implementation + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include + +#include "base64.h" + +/* +|AAAA AABB|BBBB CCCC|CCDD DDDD| + +0xFC = 1111 1100 +0x03 = 0000 0011 +0xF0 = 1111 0000 +0x0F = 0000 1111 +0xC0 = 1100 0000 +0x3F = 0011 1111 + +3 input bytes = 4 output bytes; +2 input bytes = 2 output bytes; +1 input byte = 1 output byte. +*/ + + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" + +GET_STATIC_ARRAY_FROM_TLS(encoding, lm_base64, gchar) + #define encoding (GET_WSD_VAR_NAME(encoding, lm_base64, s)()) + +#else + +static const gchar *encoding = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +#endif + + + +static const guint decoding[256] = +{ + /* ... */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + /* + */ + 62, + /* ... */ + 0, 0, 0, + /* / , 0-9 */ + 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + /* ... */ + 0, 0, 0, 0, 0, 0, 0, + /* A */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + /* ... */ + 0, 0, 0, 0, 0, 0, + /* a */ + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 +}; + +#define GET_6_BITS_0(s) (((s)[0] & 0xFC) >> 2) +#define GET_6_BITS_1(s) (((s)[0] & 0x03) << 4) | \ + (((s)[1] & 0xF0) >> 4) +#define GET_6_BITS_2(s) (((s)[1] & 0x0F) << 2) | \ + (((s)[2] & 0xC0) >> 6) +#define GET_6_BITS_3(s) (((s)[2] & 0x3F) << 0) + +#define GET_BYTE_0(s) (((decoding[(guchar)(s)[0]] & 0x3F) << 2) | \ + ((decoding[(guchar)(s)[1]] & 0x30) >> 4)) +#define GET_BYTE_1(s) (((decoding[(guchar)(s)[1]] & 0x0F) << 4) | \ + ((decoding[(guchar)(s)[2]] & 0x3C) >> 2)) +#define GET_BYTE_2(s) (((decoding[(guchar)(s)[2]] & 0x03) << 6) | \ + ((decoding[(guchar)(s)[3]] & 0xFF) << 0)) + +gchar *_lm_base64_encode (const gchar *txt, gsize n) +{ + guint i; + guint len; + GString *tmp; + GString *str = g_string_new_len (txt, n); + + len = str->len; + /* TODO: calculate requisite output string length and allocate that big a + * GString */ + tmp = g_string_new (""); + + for (i = 0; i < len; i += 3) + { + guint c1, c2, c3, c4; + + switch (i + 3 - len) + { + case 1: + c1 = encoding[GET_6_BITS_0 (str->str + i)]; + c2 = encoding[GET_6_BITS_1 (str->str + i)]; + c3 = encoding[GET_6_BITS_2 (str->str + i)]; + c4 = '='; + break; + case 2: + c1 = encoding[GET_6_BITS_0 (str->str + i)]; + c2 = encoding[GET_6_BITS_1 (str->str + i)]; + c3 = '='; + c4 = '='; + break; + default: + c1 = encoding[GET_6_BITS_0 (str->str + i)]; + c2 = encoding[GET_6_BITS_1 (str->str + i)]; + c3 = encoding[GET_6_BITS_2 (str->str + i)]; + c4 = encoding[GET_6_BITS_3 (str->str + i)]; + } + + g_string_append_printf (tmp, "%c%c%c%c", c1, c2, c3, c4); + } + + return g_string_free (tmp, FALSE); +} + +gchar *_lm_base64_decode (const gchar *str, gsize *len) +{ + guint i; + GString *tmp; + char group[4]; + guint filled = 0; + + *len = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] != 'A' && + str[i] != '=' && + !isspace(str[i]) && + decoding[(guchar) str[i]] == 0) + { + g_debug ("bad character %x at byte %u", (guchar)str[i], i); + return NULL; + } + } + + tmp = g_string_new (""); + + for (i = 0; str[i]; i++) + { + if (isspace(str[i])) + continue; + + group[filled++] = str[i]; + + if (filled == 4) + { + if (group[3] == '=') + { + if (group[2] == '=') + { + g_string_append_c (tmp, GET_BYTE_0(group)); + } + else + { + g_string_append_c (tmp, GET_BYTE_0(group)); + g_string_append_c (tmp, GET_BYTE_1(group)); + } + } + else + { + g_string_append_c (tmp, GET_BYTE_0(group)); + g_string_append_c (tmp, GET_BYTE_1(group)); + g_string_append_c (tmp, GET_BYTE_2(group)); + } + filled = 0; + } + } + + if (filled) + { + g_debug ("insufficient padding at end of base64 string:\n%s", str); + g_string_free (tmp, TRUE); + return NULL; + } + + *len = tmp->len; + return g_string_free (tmp, FALSE); +} + + diff -r 000000000000 -r d0f3a028347a loudmouth/src/libloudmouth_wsd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/libloudmouth_wsd.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2003-2007 Imendio AB + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary/subsidiaries. + * Copyright (C) 2007 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include "libloudmouth_wsd_solution.h" +#include + + +#include // For emulator WSD API + +const TUid KLibLoudmouthUid3 = {0x10281F99}; // This is the UID of the library +struct libloudmouth_global_struct *libloudmouth_ImpurePtr() +{ + #if defined(__WINSCW__) || defined(__WINS__) + + // Access the PLS of this process + struct libloudmouth_global_struct *g = Pls(KLibLoudmouthUid3, &libloudmouth_Init); + return g; + + #else + + return NULL; + + #endif +}; + +int libloudmouth_Init(libloudmouth_global_struct *g) +{ + +TypeNames type_names[14] = { + { LM_MESSAGE_TYPE_MESSAGE, "message" }, + { LM_MESSAGE_TYPE_PRESENCE, "presence" }, + { LM_MESSAGE_TYPE_IQ, "iq" }, + { LM_MESSAGE_TYPE_STREAM, "stream:stream" }, + { LM_MESSAGE_TYPE_STREAM_FEATURES, "stream:features" }, + { LM_MESSAGE_TYPE_STREAM_ERROR, "stream:error" }, + { LM_MESSAGE_TYPE_AUTH, "auth" }, + { LM_MESSAGE_TYPE_CHALLENGE, "challenge" }, + { LM_MESSAGE_TYPE_RESPONSE, "response" }, + { LM_MESSAGE_TYPE_SUCCESS, "success" }, + { LM_MESSAGE_TYPE_FAILURE, "failure" }, + { LM_MESSAGE_TYPE_PROCEED, "proceed" }, + { LM_MESSAGE_TYPE_STARTTLS, "starttls" }, + { LM_MESSAGE_TYPE_UNKNOWN, NULL } + +}; + +SubTypeNames sub_type_names[14] = { + { LM_MESSAGE_SUB_TYPE_NORMAL, "normal" }, + { LM_MESSAGE_SUB_TYPE_CHAT, "chat" }, + { LM_MESSAGE_SUB_TYPE_GROUPCHAT, "groupchat" }, + { LM_MESSAGE_SUB_TYPE_HEADLINE, "headline" }, + { LM_MESSAGE_SUB_TYPE_UNAVAILABLE, "unavailable" }, + { LM_MESSAGE_SUB_TYPE_PROBE, "probe" }, + { LM_MESSAGE_SUB_TYPE_SUBSCRIBE, "subscribe" }, + { LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE, "unsubscribe" }, + { LM_MESSAGE_SUB_TYPE_SUBSCRIBED, "subscribed" }, + { LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED, "unsubscribed" }, + { LM_MESSAGE_SUB_TYPE_GET, "get" }, + { LM_MESSAGE_SUB_TYPE_SET, "set" }, + { LM_MESSAGE_SUB_TYPE_RESULT, "result" }, + { LM_MESSAGE_SUB_TYPE_ERROR, "error" } +}; +gchar base_64_chars[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +gchar encoding1[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +gchar retval[41] = ""; + +char buffer[256] = ""; + + if(g) + { + //g->GET_WSD_VAR_NAME(debug_flags,lm_debug,g) = Flags; + + g->GET_WSD_VAR_NAME(initialized,lm_debug,g) = EFalse; + g->GET_WSD_VAR_NAME(log_handler_id,lm_debug,g) = 0; + memcpy (&(g->GET_WSD_VAR_NAME(type_names,lm_message,s)), type_names, 13*sizeof(TypeNames)); + memcpy (&(g->GET_WSD_VAR_NAME(sub_type_names,lm_message,s)), sub_type_names, 14*sizeof(SubTypeNames)); + g->GET_WSD_VAR_NAME(initialized,lm_ssl_openssl,s) = EFalse; + g->GET_WSD_VAR_NAME(last_id,lm_utils, s) = 0; + + strcpy((g->GET_WSD_VAR_NAME(base64chars,lm_utils,s)), base_64_chars); + + strcpy((g->GET_WSD_VAR_NAME(ret_val,lm_sha,s)), retval); + + strcpy((g->GET_WSD_VAR_NAME(encoding,lm_base64,s)), encoding1); + + strcpy((g->GET_WSD_VAR_NAME(buf,lm_misc,s)), buffer); + + g->GET_WSD_VAR_NAME(initialised,lm_sock,g) = EFalse; + return 0; + } + return 1; +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-connection.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-connection.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,2248 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2007 Imendio AB + * and/or its subsidiary/subsidiaries. All rights reserved. + * Copyright (C) 2007 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include +#include +#include +#include + +/* Needed on Mac OS X */ +#if HAVE_NETINET_IN_H +#include +#endif + +#include +//#include + +#include +#include + +#include "lm-sock.h" +#include "lm-debug.h" +#include "lm-error.h" +#include "lm-internals.h" +#include "lm-message-queue.h" +#include "lm-misc.h" +#include "lm-ssl-internals.h" +#include "lm-parser.h" +#include "lm-sha.h" +#include "lm-connection.h" +#include "lm-utils.h" +#include "lm-socket.h" +#include "lm-sasl.h" + +#define IN_BUFFER_SIZE 1024 +//#define SRV_LEN 8192 +#define SRV_LEN 2048 // check the actual value needed here! - MeCo + +typedef struct { + LmHandlerPriority priority; + LmMessageHandler *handler; +} HandlerData; + +struct _LmConnection { + /* Parameters */ + GMainContext *context; + gchar *server; + gchar *jid; + gchar *effective_jid; + guint port; + gboolean use_srv; + + LmSocket *socket; + LmSSL *ssl; + LmProxy *proxy; + LmParser *parser; + + gchar *stream_id; + + GHashTable *id_handlers; + GSList *handlers[LM_MESSAGE_TYPE_UNKNOWN]; + + /* XMPP1.0 stuff (SASL, resource binding, StartTLS) */ + gboolean use_sasl; + LmSASL *sasl; + gchar *resource; + LmMessageHandler *features_cb; + LmMessageHandler *starttls_cb; + gboolean tls_started; + + /* Communication */ + guint open_id; + LmCallback *open_cb; + + gboolean async_connect_waiting; + gboolean blocking; + + gboolean cancel_open; + LmCallback *auth_cb; + + LmCallback *disconnect_cb; + + LmMessageQueue *queue; + + LmConnectionState state; + + guint keep_alive_rate; + GSource *keep_alive_source; + + gint ref_count; +}; + +typedef enum { + AUTH_TYPE_PLAIN = 1, + AUTH_TYPE_DIGEST = 2, + AUTH_TYPE_0K = 4 +} AuthType; + +#define XMPP_NS_BIND "urn:ietf:params:xml:ns:xmpp-bind" +#define XMPP_NS_SESSION "urn:ietf:params:xml:ns:xmpp-session" +#define XMPP_NS_STARTTLS "urn:ietf:params:xml:ns:xmpp-tls" + +static void connection_free (LmConnection *connection); + + +static void connection_handle_message (LmConnection *connection, + LmMessage *message); + +static void connection_new_message_cb (LmParser *parser, + LmMessage *message, + LmConnection *connection); +static gboolean connection_do_open (LmConnection *connection, + GError **error); +void connection_do_close (LmConnection *connection); + + +static LmMessage * connection_create_auth_req_msg (const gchar *username); +static LmMessage * connection_create_auth_msg (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + gint auth_type); +static LmHandlerResult connection_auth_req_reply (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *m, + gpointer user_data); +static int connection_check_auth_type (LmMessage *auth_req_rpl); + +static LmHandlerResult +connection_auth_reply (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *m, + gpointer user_data); + +static void connection_stream_received (LmConnection *connection, + LmMessage *m); +static void connection_stream_error (LmConnection *connection, + LmMessage *m); + +static gint connection_handler_compare_func (HandlerData *a, + HandlerData *b); +static gboolean connection_send_keep_alive (LmConnection *connection); +static void connection_start_keep_alive (LmConnection *connection); +static void connection_stop_keep_alive (LmConnection *connection); +static gboolean connection_send (LmConnection *connection, + const gchar *str, + gint len, + GError **error); +static void connection_message_queue_cb (LmMessageQueue *queue, + LmConnection *connection); +static void connection_signal_disconnect (LmConnection *connection, + LmDisconnectReason reason); +static void connection_incoming_data (LmSocket *socket, + const gchar *buf, + LmConnection *connection); +static void connection_socket_closed_cb (LmSocket *socket, + LmDisconnectReason reason, + LmConnection *connection); +static void connection_socket_connect_cb (LmSocket *socket, + gboolean result, + LmConnection *connection); + +static gboolean connection_get_server_from_jid (const gchar *jid, + gchar **server); +static void connection_send_stream_header (LmConnection *connection); +static LmHandlerResult connection_features_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + +static void +connection_free (LmConnection *connection) +{ + int i; + + g_free (connection->server); + g_free (connection->jid); + g_free (connection->effective_jid); + g_free (connection->stream_id); + g_free (connection->resource); + + if (connection->sasl) { + lm_sasl_free (connection->sasl); + } + + if (connection->parser) { + lm_parser_free (connection->parser); + } + + /* Unref handlers */ + for (i = 0; i < LM_MESSAGE_TYPE_UNKNOWN; ++i) { + GSList *l; + + for (l = connection->handlers[i]; l; l = l->next) { + HandlerData *hd = (HandlerData *) l->data; + + lm_message_handler_unref (hd->handler); + g_free (hd); + } + + g_slist_free (connection->handlers[i]); + } + + g_hash_table_destroy (connection->id_handlers); + if (connection->state >= LM_CONNECTION_STATE_OPENING) { + connection_do_close (connection); + } + + if (connection->open_cb) { + _lm_utils_free_callback (connection->open_cb); + } + + if (connection->auth_cb) { + _lm_utils_free_callback (connection->auth_cb); + } + + lm_connection_set_disconnect_function (connection, NULL, NULL, NULL); + + if (connection->proxy) { + lm_proxy_unref (connection->proxy); + } + + lm_message_queue_unref (connection->queue); + + if (connection->context) { + g_main_context_unref (connection->context); + } + + if (connection->socket) { + lm_socket_unref (connection->socket); + } + + g_free (connection); +} + +static void +connection_handle_message (LmConnection *connection, LmMessage *m) +{ + LmMessageHandler *handler; + GSList *l; + const gchar *id; + LmHandlerResult result = LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + lm_connection_ref (connection); + lm_verbose("[connection_handle_message]: Inside\n"); + lm_verbose("msg type:[%d]\n", lm_message_get_type (m)); + id = lm_message_node_get_attribute (m->node, "id"); + if(id) + { + lm_verbose("handlemsg node id: %s\n", id); + } + if (lm_message_get_type (m) == LM_MESSAGE_TYPE_STREAM) { + lm_verbose("[connection_handle_message]: Stream received\n"); + lm_verbose("[connection_handle_message]: calling connection_stream_received \n"); + connection_stream_received (connection, m); + lm_verbose("[connection_handle_message]: CALLED connection_stream_received \n"); + goto out; + } + + if ((lm_message_get_sub_type (m) == LM_MESSAGE_SUB_TYPE_ERROR) || + (lm_message_get_sub_type (m) == LM_MESSAGE_SUB_TYPE_RESULT)) { + id = lm_message_node_get_attribute (m->node, "id"); + + lm_verbose("[connection_handle_message]: type is error or result \n"); + if (id) { + handler = g_hash_table_lookup (connection->id_handlers, id); + if (handler) { + lm_verbose("[connection_handle_message]: calling the right handler for error/result \n"); + result = _lm_message_handler_handle_message (handler, + connection, + m); + lm_verbose("[connection_handle_message]: Called right handler for error/result \n"); + g_hash_table_remove (connection->id_handlers, + id); + } + } + + if (result == LM_HANDLER_RESULT_REMOVE_MESSAGE) { + lm_verbose("return from connection_handle_message\n"); + goto out; + } + } + lm_verbose("[connection_handle_message]:starting for loop for more handlers\n"); + for (l = connection->handlers[lm_message_get_type (m)]; + l && result == LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + l = l->next) { + HandlerData *hd = (HandlerData *) l->data; + lm_verbose("[connection_handle_message]:inside for loop for more handlers with msg type: %d\n", lm_message_get_type (m)); + lm_verbose("[connection_handle_message]:inside for loop with node name: %s\n",lm_message_get_node(m)->name); + result = _lm_message_handler_handle_message (hd->handler, + connection, + m); + lm_verbose("[connection_handle_message]:got result from _lm_message_handler_handle_message as :%d\n",result); + } + lm_verbose("[connection_handle_message]:Ended for loop for more handlers\n"); + if (lm_message_get_type (m) == LM_MESSAGE_TYPE_STREAM_ERROR) { + lm_verbose("[connection_handle_message]:stream error\n"); + connection_stream_error (connection, m); + goto out; + } + +out: + lm_verbose("[connection_handle_message]:exiting connection_handle_message\n"); + lm_connection_unref (connection); + lm_verbose("[connection_handle_message]:after unref of connection\n"); + return; +} + +static void +connection_new_message_cb (LmParser *parser, + LmMessage *m, + LmConnection *connection) +{ + const gchar *from; + + lm_message_ref (m); + + from = lm_message_node_get_attribute (m->node, "from"); + if (!from) { + from = "unknown"; + } + + lm_verbose ("New message with type=\"%s\" from: %s\n", + _lm_message_type_to_string (lm_message_get_type (m)), + from); + + lm_message_queue_push_tail (connection->queue, m); + UNUSED_FORMAL_PARAM(parser); +} + +static gboolean +connection_send_keep_alive (LmConnection *connection) +{ + lm_verbose ("[connection_send_keep_alive]\n"); + if (!connection_send (connection, " ", -1, NULL)) { + lm_verbose ("Error while sending keep alive package!\n"); + } + return TRUE; +} + +static void +connection_start_keep_alive (LmConnection *connection) +{ + lm_verbose("[connection_start_keep_alive]:Inside ...."); + /* try using TCP keepalives if possible */ + if ((connection->keep_alive_rate > 0) && + lm_socket_set_keepalive (connection->socket, + connection->keep_alive_rate)) { + lm_verbose("[connection_start_keep_alive]: timer already active\n"); + connection->keep_alive_source = + lm_misc_add_timeout (connection->context, + connection->keep_alive_rate * 1000, + (GSourceFunc) connection_send_keep_alive, + connection); + return; + } + + if (connection->keep_alive_source) { + lm_verbose("[connection_start_keep_alive]:stopping keep alive timer"); + connection_stop_keep_alive (connection); + } + + if (connection->keep_alive_rate > 0) { + connection->keep_alive_source = + lm_misc_add_timeout (connection->context, + connection->keep_alive_rate * 1000, + (GSourceFunc) connection_send_keep_alive, + connection); + lm_verbose("[connection_start_keep_alive]: added timer to gsource\n"); + } +lm_verbose("[connection_start_keep_alive]: ...Exiting connection_start_keep_alive...."); +} + +static void +connection_stop_keep_alive (LmConnection *connection) +{ + lm_verbose("[connection_start_keep_alive]:Stopping Keep Alive\n"); + if (connection->keep_alive_source) { + g_source_destroy (connection->keep_alive_source); + } + + connection->keep_alive_source = NULL; +} + +static gboolean +connection_send (LmConnection *connection, + const gchar *str, + gint len, + GError **error) +{ + gint b_written; + + if (connection->state < LM_CONNECTION_STATE_OPENING) { + /* g_log (LM_LOG_DOMAIN,LM_LOG_LEVEL_NET, + "Connection is not open.\n"); + + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_NOT_OPEN, + "Connection is not open, call lm_connection_open() first");*/ + lm_verbose("[connection_send]: Connection is not open call lm_connection_open() first"); + return FALSE; + } + + if (len == -1) { + len = strlen (str); + } + + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "\nSEND:\n"); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + // "-----------------------------------\n"); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "%s\n", str); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + // "-----------------------------------\n"); + lm_verbose ( "\n[connection_send]: SEND:\n"); + lm_verbose ( "-----------------------------------\n"); + lm_verbose ( "%s\n", str); + lm_verbose ( "-----------------------------------\n"); + + /* Check to see if there already is an output buffer, if so, add to the + buffer and return */ + + if (lm_socket_output_is_buffered (connection->socket, str, len)) { + return TRUE; + } + + b_written = lm_socket_do_write (connection->socket, str, len); + + lm_verbose("[connection_send]: number of bytes written using lm_socket_do_write is : %d\n",b_written); + if (b_written < 0) { + lm_verbose("[connection_send]: Since b_written<0 closing the connection\n"); + connection_do_close (connection); + connection_signal_disconnect (connection, + LM_DISCONNECT_REASON_ERROR); + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_FAILED, + "Server closed the connection"); + return FALSE; + } + + if (b_written < len) { + lm_socket_setup_output_buffer (connection->socket, + str + b_written, + len - b_written); + } + + return TRUE; +} + +static void +connection_message_queue_cb (LmMessageQueue *queue, LmConnection *connection) +{ + LmMessage *m; + + m = lm_message_queue_pop_nth (connection->queue, 0); + + if (m) { + lm_verbose("In connection_message_queue_cb\n"); + connection_handle_message (connection, m); + lm_message_unref (m); + lm_verbose("After un refing the message\n"); + } + UNUSED_FORMAL_PARAM(queue); +} + +/* Returns directly */ +/* Setups all data needed to start the connection attempts */ +static gboolean +connection_do_open (LmConnection *connection, GError **error) +{ + gchar *domain = NULL; + + if (lm_connection_is_open (connection)) { + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_NOT_OPEN, + "Connection is already open, call lm_connection_close() first"); + return FALSE; + } + + if (!connection_get_server_from_jid (connection->jid, &domain)) { + domain = g_strdup (connection->server); + } + + lm_verbose ("[connection_do_open]: Connecting to: %s:%d\n", connection->server, connection->port); + + connection->socket = lm_socket_create (connection->context, + (IncomingDataFunc) connection_incoming_data, + (SocketClosedFunc) connection_socket_closed_cb, + (ConnectResultFunc) connection_socket_connect_cb, + connection, + connection, + connection->blocking, + connection->server, + domain, + connection->port, + connection->ssl, + connection->proxy, + error); + + g_free (domain); + lm_verbose ("[connection_do_open]: after lm_socket_create call in connection_do_open"); + + if (!connection->socket) { + return FALSE; + } + + lm_message_queue_attach (connection->queue, connection->context); + + connection->state = LM_CONNECTION_STATE_OPENING; + connection->async_connect_waiting = FALSE; + + return TRUE; +} + +void +connection_do_close (LmConnection *connection) +{ + connection_stop_keep_alive (connection); + + if (connection->socket) { + lm_socket_close (connection->socket); + } + + lm_message_queue_detach (connection->queue); + + if (!lm_connection_is_open (connection)) { + /* lm_connection_is_open is FALSE for state OPENING as well */ + connection->state = LM_CONNECTION_STATE_CLOSED; + connection->async_connect_waiting = FALSE; + return; + } + + connection->state = LM_CONNECTION_STATE_CLOSED; + connection->async_connect_waiting = FALSE; + if (connection->ssl) { + _lm_ssl_close (connection->ssl); + } + + if (connection->sasl) { + lm_sasl_free (connection->sasl); + connection->sasl = NULL; + } +} + +typedef struct { + gchar *username; + gchar *password; + gchar *resource; +} AuthReqData; + +static void +auth_req_data_free (AuthReqData *data) +{ + g_free (data->username); + g_free (data->password); + g_free (data->resource); + g_free (data); +} + +static LmMessage * +connection_create_auth_req_msg (const gchar *username) +{ + LmMessage *m; + LmMessageNode *q_node; + + m = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (m->node, "query", NULL); + lm_message_node_set_attributes (q_node, + "xmlns", "jabber:iq:auth", + NULL); + lm_message_node_add_child (q_node, "username", username); + + return m; +} + +static LmMessage * +connection_create_auth_msg (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + gint auth_type) +{ + LmMessage *auth_msg; + LmMessageNode *q_node; + + auth_msg = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + q_node = lm_message_node_add_child (auth_msg->node, "query", NULL); + + lm_message_node_set_attributes (q_node, + "xmlns", "jabber:iq:auth", + NULL); + + lm_message_node_add_child (q_node, "username", username); + + if (auth_type & AUTH_TYPE_0K) { + lm_verbose ("Using 0k auth (not implemented yet)\n"); + /* TODO: Should probably use this? */ + } + + if (auth_type & AUTH_TYPE_DIGEST) { + gchar *str; + const gchar *digest; + + lm_verbose ("Using digest\n"); + str = g_strconcat (connection->stream_id, password, NULL); + digest = lm_sha_hash (str); + g_free (str); + lm_message_node_add_child (q_node, "digest", digest); + } + else if (auth_type & AUTH_TYPE_PLAIN) { + lm_verbose ("Using plaintext auth\n"); + lm_message_node_add_child (q_node, "password", password); + } else { + /* TODO: Report error somehow */ + } + + lm_message_node_add_child (q_node, "resource", resource); + + return auth_msg; +} + +static LmHandlerResult +connection_auth_req_reply (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *m, + gpointer user_data) +{ + int auth_type; + LmMessage *auth_msg; + LmMessageHandler *auth_handler; + AuthReqData *data = (AuthReqData *) user_data; + gboolean result; + + auth_type = connection_check_auth_type (m); + + auth_msg = connection_create_auth_msg (connection, + data->username, + data->password, + data->resource, + auth_type); + + auth_handler = lm_message_handler_new (connection_auth_reply, + NULL, NULL); + result = lm_connection_send_with_reply (connection, auth_msg, + auth_handler, NULL); + lm_message_handler_unref (auth_handler); + lm_message_unref (auth_msg); + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(user_data); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static int +connection_check_auth_type (LmMessage *auth_req_rpl) +{ + LmMessageNode *q_node; + gint ret_val = 0; + + q_node = lm_message_node_get_child (auth_req_rpl->node, "query"); + + if (!q_node) { + return AUTH_TYPE_PLAIN; + } + + if (lm_message_node_get_child (q_node, "password")) { + ret_val |= AUTH_TYPE_PLAIN; + } + + if (lm_message_node_get_child (q_node, "digest")) { + ret_val |= AUTH_TYPE_DIGEST; + } + + if (lm_message_node_get_child (q_node, "sequence") && + lm_message_node_get_child (q_node, "token")) { + ret_val |= AUTH_TYPE_0K; + } + + return ret_val; +} + +static LmHandlerResult +connection_auth_reply (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *m, + gpointer user_data) +{ + const gchar *type; + gboolean result = TRUE; + + g_return_val_if_fail (connection != NULL, + LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS); + + + type = lm_message_node_get_attribute (m->node, "type"); + if (strcmp (type, "result") == 0) { + result = TRUE; + connection->state = LM_CONNECTION_STATE_AUTHENTICATED; + } + else if (strcmp (type, "error") == 0) { + result = FALSE; + connection->state = LM_CONNECTION_STATE_OPEN; + } + + lm_verbose ("AUTH reply: %d\n", result); + + if (connection->auth_cb) { + LmCallback *cb = connection->auth_cb; + + connection->auth_cb = NULL; + + if (cb->func) { + (* ((LmResultFunction) cb->func)) (connection, + result, cb->user_data); + } + + _lm_utils_free_callback (cb); + } + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(user_data); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + + +static LmHandlerResult +_lm_connection_starttls_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + if (lm_socket_starttls (connection->socket)) { + connection->tls_started = TRUE; + connection_send_stream_header (connection); + } else { + connection_do_close (connection); + connection_signal_disconnect (connection, + LM_DISCONNECT_REASON_ERROR); + } + UNUSED_FORMAL_PARAM(message); + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(user_data); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +connection_stream_received (LmConnection *connection, LmMessage *m) +{ + gboolean result; + const char *xmpp_version; + + g_return_if_fail (connection != NULL); + g_return_if_fail (m != NULL); + + connection->stream_id = g_strdup (lm_message_node_get_attribute (m->node, + "id"));; + + xmpp_version = lm_message_node_get_attribute (m->node, "version"); + if (xmpp_version && strcmp (xmpp_version, "1.0") == 0) { + lm_verbose ("[connection_stream_received]: XMPP 1.0 stream received: %s\n", + connection->stream_id); + + connection->use_sasl = TRUE; + + /* stream is started multiple times, but we only want + * one sasl mechanism */ + if (!connection->sasl) + connection->sasl = lm_sasl_new(connection); + + /* if we'd like to use tls and we didn't already start + * it, prepare for it now */ + if (connection->ssl && + lm_ssl_get_use_starttls (connection->ssl) && + !connection->starttls_cb) { + lm_verbose("[connction_stream_received]: Starttls called"); + connection->starttls_cb = + lm_message_handler_new (_lm_connection_starttls_cb, + NULL, NULL); + lm_connection_register_message_handler (connection, + connection->starttls_cb, + LM_MESSAGE_TYPE_PROCEED, + LM_HANDLER_PRIORITY_FIRST); + } + } else { + lm_verbose ("Old Jabber stream received: %s\n", + connection->stream_id); + } + + if (connection->state < LM_CONNECTION_STATE_OPEN) { + connection->state = LM_CONNECTION_STATE_OPEN; + } + + /* Check to see if the stream is correctly set up */ + result = TRUE; + +// connection_start_keep_alive (connection); //prima + + if (connection->open_cb) { + LmCallback *cb = connection->open_cb; + + connection->open_cb = NULL; + + if (cb->func) { + (* ((LmResultFunction) cb->func)) (connection, result, + cb->user_data); + } + _lm_utils_free_callback (cb); + } +} + +static void +connection_stream_error (LmConnection *connection, LmMessage *m) +{ + LmMessageNode *node, *reason_node; + LmDisconnectReason reason; + + g_return_if_fail (connection != NULL); + g_return_if_fail (m != NULL); + + node = m->node; + + /* Resource conflict */ + reason_node = lm_message_node_get_child (node, "conflict"); + if (reason_node) { + lm_verbose ("Stream error: Conflict (resource connected elsewhere)\n"); + reason = LM_DISCONNECT_REASON_RESOURCE_CONFLICT; + return; + } + + /* XML is crack */ + reason_node = lm_message_node_get_child (node, "xml-not-well-formed"); + if (reason_node) { + lm_verbose ("Stream error: XML not well formed\n"); + reason = LM_DISCONNECT_REASON_INVALID_XML; + return; + } + + lm_verbose ("Stream error: Unrecognised error\n"); + reason = LM_DISCONNECT_REASON_ERROR; + connection->stream_id = g_strdup (lm_message_node_get_attribute (m->node, + "id"));; + connection_do_close (connection); + connection_signal_disconnect (connection, reason); +} + +static gint +connection_handler_compare_func (HandlerData *a, HandlerData *b) +{ + return b->priority - a->priority; +} + +static void +connection_signal_disconnect (LmConnection *connection, + LmDisconnectReason reason) +{ + lm_verbose ("[connection_signal_disconnect]\n"); + if (connection->disconnect_cb && connection->disconnect_cb->func) { + + LmCallback *cb = connection->disconnect_cb; + lm_verbose("[connection_signal_disconnect]: ...disconnecting\n"); + lm_connection_ref (connection); + (* ((LmDisconnectFunction) cb->func)) (connection, + reason, + cb->user_data); + lm_connection_unref (connection); + lm_verbose("[connection_signal_disconnect]: ...after unref\n"); + } +} + +static void +connection_incoming_data (LmSocket *socket, + const gchar *buf, + LmConnection *connection) +{ + lm_parser_parse (connection->parser, buf); + UNUSED_FORMAL_PARAM(socket); +} + +static void +connection_socket_closed_cb (LmSocket *socket, + LmDisconnectReason reason, + LmConnection *connection) +{ + lm_verbose("[connection_socket_closed_cb]: inside..\n"); + connection_do_close (connection); + connection_signal_disconnect (connection, reason); + lm_verbose("[connection_socket_closed_cb]: exiting..\n"); + UNUSED_FORMAL_PARAM(socket); +} + +static void +connection_socket_connect_cb (LmSocket *socket, + gboolean result, + LmConnection *connection) +{ + if (!result) { + connection_do_close (connection); + lm_verbose ("[connection_socket_connect_cb]: result false "); + if (connection->open_cb) { + LmCallback *cb = connection->open_cb; + lm_verbose ("[connection_socket_connect_cb]: connection->open_cb is defined "); + + connection->open_cb = NULL; + + (* ((LmResultFunction) cb->func)) (connection, FALSE, + cb->user_data); + _lm_utils_free_callback (cb); + } + + UNUSED_FORMAL_PARAM(socket); + return; + } + + /* FIXME: Set up according to XMPP 1.0 specification */ + /* StartTLS and the like */ + if (!connection_send (connection, + "", -1, + NULL)) { + lm_verbose ("Failed to send xml version and encoding\n"); + connection_do_close (connection); + + return; + } + + connection_send_stream_header (connection); + lm_verbose("\n[connection_socket_connect_cb]: exiting "); +} + +static gboolean +connection_get_server_from_jid (const gchar *jid, + gchar **server) +{ + gchar *ch; + gchar *ch_end; + + if (jid != NULL && (ch = strchr (jid, '@')) != NULL) { + ch_end = strchr(ch + 1, '/'); + if (ch_end != NULL) { + *server = g_strndup (ch + 1, ch_end - ch - 1); + } else { + *server = g_strdup (ch + 1); + } + + return TRUE; + } + + return FALSE; +} + +static void +connection_send_stream_header (LmConnection *connection) +{ + LmMessage *m; + gchar *server_from_jid; + + lm_verbose ("Sending stream header\n"); + + if (!connection_get_server_from_jid (connection->jid, &server_from_jid)) { + server_from_jid = g_strdup (connection->server); + } + + m = lm_message_new (server_from_jid, LM_MESSAGE_TYPE_STREAM); + lm_message_node_set_attributes (m->node, + "xmlns:stream", + "http://etherx.jabber.org/streams", + "xmlns", "jabber:client", + "version", "1.0", + NULL); + + g_free (server_from_jid); + + if (!lm_connection_send (connection, m, NULL)) { + lm_verbose ("Failed to send stream information\n"); + connection_do_close (connection); + } + connection_start_keep_alive (connection); //prima + lm_message_unref (m); + lm_verbose("\n[connection_send_stream_header]: Exiting send stream header method"); +} + +gboolean +_lm_connection_async_connect_waiting (LmConnection *connection) +{ + return connection->async_connect_waiting; +} + +void +_lm_connection_set_async_connect_waiting (LmConnection *connection, + gboolean waiting) +{ + connection->async_connect_waiting = waiting; +} + +static void +connection_call_auth_cb (LmConnection *connection, gboolean success) +{ + if (success) { + lm_verbose("connection_call_auth_cb: authenticated\n"); + connection->state = LM_CONNECTION_STATE_AUTHENTICATED; + } else { + lm_verbose("connection_call_auth_cb: conn still open\n"); + connection->state = LM_CONNECTION_STATE_OPEN; + } + + if (connection->auth_cb) { + LmCallback *cb = connection->auth_cb; + + connection->auth_cb = NULL; + + if (cb->func) { + lm_verbose("connection_call_auth_cb: calling the test code's registered cb method\n"); + (* ((LmResultFunction) cb->func)) (connection, + success, + cb->user_data); + } + + _lm_utils_free_callback (cb); + } +} + +static LmHandlerResult +connection_bind_reply (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmMessage *m; + LmMessageNode *session_node; + LmMessageNode *jid_node; + int result; + LmMessageSubType type; + lm_verbose("[connection_bind_reply]: inside connection_bind_reply\n"); + type = lm_message_get_sub_type (message); + if (type == LM_MESSAGE_SUB_TYPE_ERROR) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: error while binding to resource\n", G_STRFUNC);*/ + lm_verbose("[connection_bind_reply]: calling connection_call_auth_cb\n"); + connection_call_auth_cb (connection, FALSE); + lm_verbose("[connection_bind_reply]: called connection_call_auth_cb\n"); + UNUSED_FORMAL_PARAM(user_data); + UNUSED_FORMAL_PARAM(handler); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + /* use whatever server returns as our effective jid */ + jid_node = lm_message_node_find_child (message->node, "jid"); + if (jid_node) { + g_free (connection->effective_jid); + connection->effective_jid = g_strdup + (lm_message_node_get_value (jid_node)); + } + + + m = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + lm_verbose("[connection_bind_reply]: Creation session child node\n"); + session_node = lm_message_node_add_child (m->node, "session", NULL); + lm_message_node_set_attributes (session_node, + "xmlns", XMPP_NS_SESSION, + NULL); + lm_verbose("[connection_bind_reply]: Sending session child node\n"); + result = lm_connection_send (connection, m, NULL); + lm_message_unref (m); + if (result < 0) { + connection_do_close (connection); + } + + /* We may finally tell the client they're authorized */ + connection_call_auth_cb (connection, TRUE); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmHandlerResult +connection_features_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmMessageNode *bind_node; + LmMessageNode *starttls_node; + LmMessageNode *old_auth; + lm_verbose("[connection_features_cb] inside..\n"); + + starttls_node = lm_message_node_find_child (message->node, "starttls"); + if (connection->ssl && lm_ssl_get_use_starttls (connection->ssl)) { + if (starttls_node) { + LmMessage *msg; + + msg = lm_message_new (NULL, LM_MESSAGE_TYPE_STARTTLS); + + lm_message_node_set_attributes ( + msg->node, + "xmlns", XMPP_NS_STARTTLS, + NULL); + + lm_connection_send (connection, msg, NULL); + lm_message_unref (msg); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } else if (!connection->tls_started && + lm_ssl_get_require_starttls (connection->ssl)) { + /* If there were no starttls features present and we require it, this is + * the place to scream. */ + lm_verbose("connection_features_cb: Required StartTLS feature not supported by server\n"); + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: required StartTLS feature not supported by server\n", G_STRFUNC);*/ + connection_do_close (connection); + connection_signal_disconnect (connection, + LM_DISCONNECT_REASON_ERROR); + UNUSED_FORMAL_PARAM(user_data); + UNUSED_FORMAL_PARAM(handler); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + } + + bind_node = lm_message_node_find_child (message->node, "bind"); + if (bind_node) { + LmMessageHandler *bind_handler; + LmMessage *bind_msg; + const gchar *ns; + int result; + + lm_verbose("connection_features_cb: found bind node\n"); + ns = lm_message_node_get_attribute (bind_node, "xmlns"); + if (!ns || strcmp (ns, XMPP_NS_BIND) != 0) { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + bind_msg = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + bind_node = lm_message_node_add_child (bind_msg->node, + "bind", NULL); + lm_message_node_set_attributes (bind_node, + "xmlns", XMPP_NS_BIND, + NULL); + + lm_message_node_add_child (bind_node, "resource", + connection->resource); + + lm_verbose("[connection_features_cb]:setting callback method for bind response\n"); + bind_handler = lm_message_handler_new (connection_bind_reply, + NULL, NULL); + lm_verbose("[connection_features_cb]: calling lm_connection_send_with_reply for bind response\n"); + result = lm_connection_send_with_reply (connection, bind_msg, + bind_handler, NULL); + lm_verbose("[connection_features_cb]:called lm_connection_send_with_reply for bind response with result: %d\n", result); + lm_message_handler_unref (bind_handler); + lm_message_unref (bind_msg); + + if (result < 0) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: can't send resource binding request\n", G_STRFUNC);*/ + connection_do_close (connection); + } + } + + old_auth = lm_message_node_find_child (message->node, "auth"); + if (connection->use_sasl && old_auth) { + g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "Server uses XEP-0078 (jabber iq auth) instead of SASL\n"); + /* So the server is XMPP1.0, but doesn't support SASL and uses + * obsolete XEP-0078 instead. Let's cope. */ + + connection->use_sasl = FALSE; + + if (connection->sasl) { + const gchar *user, *pass; + + lm_sasl_get_auth_params (connection->sasl, &user, &pass); + if (user && pass) { + GError *error = NULL; + lm_verbose("[connection_features_cb]:calling _lm_connection_old_auth\n"); + _lm_connection_old_auth (connection, user, pass, + connection->resource, &error); + + if (error) { + g_error_free (error); + } + } + + lm_sasl_free (connection->sasl); + connection->sasl = NULL; + } + } + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + +/** + * lm_connection_new: + * @server: The hostname to the server for the connection. + * + * Creates a new closed connection. To open the connection call + * lm_connection_open(). @server can be #NULL but must be set before calling lm_connection_open(). + * + * Return value: A newly created LmConnection, should be unreffed with lm_connection_unref(). + **/ +EXPORT_C LmConnection * +lm_connection_new (const gchar *server) +{ + LmConnection *connection = NULL; + gint i; + + lm_debug_init (); + _lm_sock_library_init (); + + connection = g_new0 (LmConnection, 1); + + if (server) { + connection->server = _lm_utils_hostname_to_punycode (server); + connection->use_srv = FALSE; + } else { + connection->server = NULL; + connection->use_srv = TRUE; + } + + connection->context = NULL; + connection->port = LM_CONNECTION_DEFAULT_PORT; + connection->jid = NULL; + connection->effective_jid = NULL; + connection->ssl = NULL; + connection->proxy = NULL; + connection->disconnect_cb = NULL; + connection->queue = lm_message_queue_new ((LmMessageQueueCallback) connection_message_queue_cb, + connection); + connection->cancel_open = FALSE; + connection->state = LM_CONNECTION_STATE_CLOSED; + connection->keep_alive_source = NULL; + connection->keep_alive_rate = 0; + connection->socket = NULL; + connection->use_sasl = FALSE; + connection->tls_started = FALSE; + + connection->id_handlers = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) lm_message_handler_unref); + connection->ref_count = 1; + + for (i = 0; i < LM_MESSAGE_TYPE_UNKNOWN; ++i) { + connection->handlers[i] = NULL; + } + + connection->parser = lm_parser_new + ((LmParserMessageFunction) connection_new_message_cb, + connection, NULL); + + return connection; +} + +/** + * lm_connection_new_with_context: + * @server: The hostname to the server for the connection. + * @context: The context this connection should be running in. + * + * Creates a new closed connection running in a certain context. To open the + * connection call #lm_connection_open. @server can be #NULL but must be set + * before calling #lm_connection_open. + * + * Return value: A newly created LmConnection, should be unreffed with lm_connection_unref(). + **/ +EXPORT_C LmConnection * +lm_connection_new_with_context (const gchar *server, GMainContext *context) +{ + LmConnection *connection; + + connection = lm_connection_new (server); + connection->context = context; + + if (context) { + g_main_context_ref (connection->context); + } + + return connection; +} + +/** + * lm_connection_open: + * @connection: #LmConnection to open + * @function: Callback function that will be called when the connection is open. + * @user_data: User data that will be passed to @function. + * @notify: Function for freeing that user_data, can be NULL. + * @error: location to store error, or %NULL + * + * An async call to open @connection. When the connection is open @function will be called. + * + * Return value: #TRUE if everything went fine, otherwise #FALSE. + **/ +EXPORT_C gboolean +lm_connection_open (LmConnection *connection, + LmResultFunction function, + gpointer user_data, + GDestroyNotify notify, + GError **error) +{ + lm_verbose("[lm_connection_open]: open..."); + g_return_val_if_fail (connection != NULL, FALSE); + + connection->open_cb = _lm_utils_new_callback ((gpointer)function, + user_data, notify); + connection->blocking = FALSE; + lm_verbose("[lm_connection_open]: calling connection_do_open..."); + return connection_do_open (connection, error); +} + +/** + * lm_connection_open_and_block: + * @connection: an #LmConnection to open + * @error: location to store error, or %NULL + * + * Opens @connection and waits until the stream is setup. + * + * Return value: #TRUE if no errors where encountered during opening and stream setup successfully, #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_open_and_block (LmConnection *connection, GError **error) +{ + gboolean result; + LmConnectionState state; + + g_return_val_if_fail (connection != NULL, FALSE); + + connection->open_cb = NULL; + connection->blocking = TRUE; + + result = connection_do_open (connection, error); + + if (result == FALSE) { + return FALSE; + } + + while ((state = lm_connection_get_state (connection)) == LM_CONNECTION_STATE_OPENING) { + if (g_main_context_pending (connection->context)) { + g_main_context_iteration (connection->context, TRUE); + } else { + /* Sleep for 1 millisecond */ + g_usleep (1000); + } + } + + if (lm_connection_is_open (connection)) { + connection_start_keep_alive (connection); + return TRUE; + } + + /* Need to set the error here: LM-15 */ + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_FAILED, + "Opening the connection failed"); + + return FALSE; +} + +/** + * lm_connection_cancel_open: + * @connection: an #LmConnection to cancel opening on + * + * Cancels the open operation of a connection. The connection should be in the state #LM_CONNECTION_STATE_OPENING. + **/ +EXPORT_C void +lm_connection_cancel_open (LmConnection *connection) +{ + g_return_if_fail (connection != NULL); + + lm_verbose("[lm_connection_cancel_open]: inside.."); + if (connection->open_cb) { + _lm_utils_free_callback (connection->open_cb); + connection->open_cb = NULL; + } + + connection->cancel_open = TRUE; + +#ifdef HAVE_ASYNCNS + lm_verbose("[lm_connection_cancel_open] called in HAVE_ASYNCNS"); + _asyncns_cancel(connection->socket); +#endif +} + +/** + * lm_connection_close: + * @connection: #LmConnection to close + * @error: location to store error, or %NULL + * + * A synchronous call to close the connection. When returning the connection is considered to be closed and can be opened again with lm_connection_open(). + * + * Return value: Returns #TRUE if no errors where detected, otherwise #FALSE. + **/ +EXPORT_C gboolean +lm_connection_close (LmConnection *connection, + GError **error) +{ + gboolean no_errors = TRUE; + + g_return_val_if_fail (connection != NULL, FALSE); + +#ifdef HAVE_ASYNCNS + _asyncns_cancel (connection->socket); +#endif + + if (connection->state == LM_CONNECTION_STATE_CLOSED) { + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_NOT_OPEN, + "Connection is not open, call lm_connection_open() first"); + return FALSE; + } + + lm_verbose ("Disconnecting from: %s:%d\n", + connection->server, connection->port); + + if (lm_connection_is_open (connection)) { + if (!connection_send (connection, "", -1, error)) { + no_errors = FALSE; + } + + lm_socket_flush (connection->socket); + } + + connection_do_close (connection); + connection_signal_disconnect (connection, LM_DISCONNECT_REASON_OK); + + return no_errors; +} + +static void +connection_sasl_auth_finished (LmSASL *sasl, + LmConnection *connection, + gboolean success, + const gchar *reason) +{ + if (!success) { + lm_verbose ("SASL authentication failed, closing connection\n"); + connection_call_auth_cb (connection, FALSE); + return; + } + + connection_send_stream_header (connection); + UNUSED_FORMAL_PARAM(sasl); + UNUSED_FORMAL_PARAM(reason); + lm_verbose("\n exiting SASL auth finished method"); +} + +/** + * lm_connection_authenticate: + * @connection: #LmConnection to authenticate. + * @username: Username used to authenticate. + * @password: Password corresponding to @username. + * @resource: Resource used for this connection. + * @function: Callback called when authentication is finished. + * @user_data: Userdata passed to @function when called. + * @notify: Destroy function to free the memory used by @user_data, can be NULL. + * @error: location to store error, or %NULL + * + * Tries to authenticate a user against the server. The #LmResult in the result callback @function will say whether it succeeded or not. + * + * Return value: #TRUE if no errors where detected while sending the authentication message, #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_authenticate (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + LmResultFunction function, + gpointer user_data, + GDestroyNotify notify, + GError **error) +{ + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (username != NULL, FALSE); + g_return_val_if_fail (password != NULL, FALSE); + g_return_val_if_fail (resource != NULL, FALSE); + + if (!lm_connection_is_open (connection)) { + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_NOT_OPEN, + "Connection is not open, call lm_connection_open() first"); + return FALSE; + } + lm_verbose("\n[lm_connection_authenticate] inside...\n"); + connection->state = LM_CONNECTION_STATE_AUTHENTICATING; + + connection->auth_cb = _lm_utils_new_callback ((gpointer)function, + user_data, + notify); + + connection->resource = g_strdup (resource); + connection->effective_jid = g_strdup_printf ("%s/%s", + connection->jid, connection->resource); + + if (connection->use_sasl) { + lm_verbose("[lm_connection_authenticate]: conn->use_sasl is true. calling lm_sasl_authenticate\n"); + lm_sasl_authenticate (connection->sasl, + username, password, + connection->server, + connection_sasl_auth_finished); + + connection->features_cb = + lm_message_handler_new (connection_features_cb, + NULL, NULL); + lm_connection_register_message_handler (connection, + connection->features_cb, + LM_MESSAGE_TYPE_STREAM_FEATURES, + LM_HANDLER_PRIORITY_FIRST); + + lm_verbose("[lm_connection_authenticate]: connection->use_sasl is true. So NOT calling create_auth_req_msg\n"); + return TRUE; + } + + return _lm_connection_old_auth (connection, username, password, + resource, error); +} + +gboolean +_lm_connection_old_auth (LmConnection *connection, const gchar *username, + const gchar *password, const gchar *resource, GError **error) +{ + LmMessage *m; + AuthReqData *data; + LmMessageHandler *handler; + gboolean result; + + + m = connection_create_auth_req_msg (username); + + data = g_new0 (AuthReqData, 1); + data->username = g_strdup (username); + data->password = g_strdup (password); + data->resource = g_strdup (resource); + + handler = lm_message_handler_new (connection_auth_req_reply, + data, + (GDestroyNotify) auth_req_data_free); + result = lm_connection_send_with_reply (connection, m, handler, error); + + lm_message_handler_unref (handler); + lm_message_unref (m); + + return result; +} + +/** + * lm_connection_authenticate_and_block: + * @connection: an #LmConnection + * @username: Username used to authenticate. + * @password: Password corresponding to @username. + * @resource: Resource used for this connection. + * @error: location to store error, or %NULL + * + * Tries to authenticate a user against the server. This function blocks until a reply to the authentication attempt is returned and returns whether it was successful or not. + * + * Return value: #TRUE if no errors where detected and authentication was successful. #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_authenticate_and_block (LmConnection *connection, + const gchar *username, + const gchar *password, + const gchar *resource, + GError **error) +{ + gboolean result; + + result = lm_connection_authenticate (connection, username, password, + resource, NULL, NULL, NULL, error); + + if (!result) + return result; + + while (lm_connection_get_state (connection) == LM_CONNECTION_STATE_AUTHENTICATING) { + if (g_main_context_pending (connection->context)) { + g_main_context_iteration (connection->context, TRUE); + } else { + /* Sleep for 1 millisecond */ + g_usleep (1000); + } + } + + switch (lm_connection_get_state (connection)) { + case LM_CONNECTION_STATE_AUTHENTICATED: + return TRUE; + //removing compilation error : not reachable statement + //break; + case LM_CONNECTION_STATE_OPEN: + g_set_error (error, + LM_ERROR, + LM_ERROR_AUTH_FAILED, + "Authentication failed"); + return FALSE; + //removing compilation error : not reachable statement + //break; + default: + g_assert_not_reached (); + break; + } + + return FALSE; +} + +/** + * lm_connection_get_keep_alive_rate: + * @connection: an #LmConnection + * + * Get the keep alive rate, in seconds. Zero is returned if no keep alive rate has been set. + * + * Since 1.3.5 + **/ +guint +lm_connection_get_keep_alive_rate (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, 0); + + return connection->keep_alive_rate; +} + +/** + * lm_connection_set_keep_alive_rate: + * @connection: an #LmConnection + * @rate: Number of seconds between keep alive packages are sent. + * + * Set the keep alive rate, in seconds. Set to 0 to prevent keep alive messages to be sent. + * A keep alive message is a single space character. + **/ +EXPORT_C void +lm_connection_set_keep_alive_rate (LmConnection *connection, guint rate) +{ + g_return_if_fail (connection != NULL); + lm_verbose("Setting Keep Alive Rate"); + connection_stop_keep_alive (connection); + + if (rate == 0) { + connection->keep_alive_source = NULL; + return; + } + + connection->keep_alive_rate = rate; + + if (lm_connection_is_open (connection)) { + connection_start_keep_alive (connection); + } +} + +/** + * lm_connection_is_open: + * @connection: #LmConnection to check if it is open. + * + * Check if the @connection is currently open. + * + * Return value: #TRUE if connection is open and #FALSE if it is closed. + **/ +EXPORT_C gboolean +lm_connection_is_open (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, FALSE); + + return connection->state >= LM_CONNECTION_STATE_OPEN; +} + +/** + * lm_connection_is_authenticated: + * @connection: #LmConnection to check if it is authenticated + * + * Check if @connection is authenticated. + * + * Return value: #TRUE if connection is authenticated, #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_is_authenticated (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, FALSE); + + return connection->state >= LM_CONNECTION_STATE_AUTHENTICATED; +} + +/** + * lm_connection_get_server: + * @connection: an #LmConnection + * + * Fetches the server address that @connection is using. + * + * Return value: the server address + **/ +EXPORT_C const gchar * +lm_connection_get_server (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return connection->server; +} + +/** + * lm_connection_set_server: + * @connection: an #LmConnection + * @server: Address of the server + * + * Sets the server address for @connection to @server. Notice that @connection + * can't be open while doing this. + **/ +EXPORT_C void +lm_connection_set_server (LmConnection *connection, const gchar *server) +{ + g_return_if_fail (connection != NULL); + g_return_if_fail (server != NULL); + + if (lm_connection_is_open (connection)) { + g_warning ("Can't change server address while connected"); + return; + } + + g_free (connection->server); + connection->server = _lm_utils_hostname_to_punycode (server); + connection->use_srv = FALSE; +} + +/** + * lm_connection_get_jid: + * @connection: an #LmConnection + * + * Fetches the jid set for @connection is using. + * + * Return value: the jid + **/ +EXPORT_C const gchar * +lm_connection_get_jid (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return connection->jid; +} + +/** + * lm_connection_get_full_jid: + * @connection: an #LmConnection + * + * Returns the full jid that server set for us after + * resource binding, complete with the resource. + * + * Return value: the jid + **/ +gchar * +lm_connection_get_full_jid (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return connection->effective_jid; +} + +/** + * lm_connection_set_jid: + * @connection: an #LmConnection + * @jid: JID to be used for @connection + * + * Sets the JID to be used for @connection. + **/ +EXPORT_C void +lm_connection_set_jid (LmConnection *connection, const gchar *jid) +{ + g_return_if_fail (connection != NULL); + + if (lm_connection_is_open (connection)) { + g_warning ("Can't change JID while connected"); + return; + } + + g_free (connection->jid); + connection->jid = g_strdup (jid); +} + +/** + * lm_connection_get_port: + * @connection: an #LmConnection + * + * Fetches the port that @connection is using. + * + * Return value: + **/ +EXPORT_C guint +lm_connection_get_port (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, 0); + + return connection->port; +} + +/** + * lm_connection_set_port: + * @connection: an #LmConnection + * @port: server port + * + * Sets the server port that @connection will be using. + **/ +EXPORT_C void +lm_connection_set_port (LmConnection *connection, guint port) +{ + g_return_if_fail (connection != NULL); + + if (lm_connection_is_open (connection)) { + g_warning ("Can't change server port while connected"); + return; + } + + connection->port = port; +} + +/** + * lm_connection_get_ssl: + * @connection: an #LmConnection + * + * Returns the SSL struct if the connection is using one. + * + * Return value: The ssl struct or %NULL if no proxy is used. + **/ +EXPORT_C LmSSL * +lm_connection_get_ssl (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return connection->ssl; +} + +/** + * lm_connection_set_ssl: + * @connection: An #LmConnection + * @ssl: An #LmSSL + * + * Sets SSL struct or unset if @ssl is %NULL. If set @connection will use SSL to for the connection. + */ +EXPORT_C void +lm_connection_set_ssl (LmConnection *connection, LmSSL *ssl) +{ + lm_verbose("[lm_connection_set_ssl]: inside..."); + g_return_if_fail (connection != NULL); + g_return_if_fail (lm_ssl_is_supported () == TRUE); + + if (connection->ssl) { + lm_ssl_unref (connection->ssl); + } + + if (ssl) { + lm_verbose("[lm_connection_set_ssl]: setting of ssl success"); + connection->ssl = lm_ssl_ref (ssl); + } else { + lm_verbose("[lm_connection_set_ssl]: setting of ssl failed"); + connection->ssl = NULL; + } +} + +/** + * lm_connection_get_proxy: + * @connection: an #LmConnection + * + * Returns the proxy if the connection is using one. + * + * Return value: The proxy or %NULL if no proxy is used. + **/ +EXPORT_C LmProxy * +lm_connection_get_proxy (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + return connection->proxy; +} + +/** + * lm_connection_set_proxy: + * @connection: an #LmConnection + * @proxy: an #LmProxy + * + * Sets the proxy to use for this connection. To unset pass #NULL. + * + **/ +EXPORT_C void +lm_connection_set_proxy (LmConnection *connection, LmProxy *proxy) +{ + g_return_if_fail (connection != NULL); + + if (lm_connection_is_open (connection)) { + g_warning ("Can't change server proxy while connected"); + return; + } + + if (connection->proxy) { + lm_proxy_unref (connection->proxy); + connection->proxy = NULL; + } + + if (proxy && lm_proxy_get_type (proxy) != LM_PROXY_TYPE_NONE) { + connection->proxy = lm_proxy_ref (proxy); + } +} + +/** + * lm_connection_send: + * @connection: #LmConnection to send message over. + * @message: #LmMessage to send. + * @error: location to store error, or %NULL + * + * Asynchronous call to send a message. + * + * Return value: Returns #TRUE if no errors where detected while sending, #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_send (LmConnection *connection, + LmMessage *message, + GError **error) +{ + gchar *xml_str; + gchar *ch; + gboolean result; + + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (message != NULL, FALSE); + + xml_str = lm_message_node_to_string (message->node); + ch = strstr (xml_str, ""); + if (ch) { + *ch = '\0'; + } + + result = connection_send (connection, xml_str, -1, error); + g_free (xml_str); + + return result; +} + +/** + * lm_connection_send_with_reply: + * @connection: #LmConnection used to send message. + * @message: #LmMessage to send. + * @handler: #LmMessageHandler that will be used when a reply to @message arrives + * @error: location to store error, or %NULL + * + * Send a #LmMessage which will result in a reply. + * + * Return value: Returns #TRUE if no errors where detected while sending, #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_send_with_reply (LmConnection *connection, + LmMessage *message, + LmMessageHandler *handler, + GError **error) +{ + gchar *id; + + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (message != NULL, FALSE); + g_return_val_if_fail (handler != NULL, FALSE); + + if (lm_message_node_get_attribute (message->node, "id")) { + id = g_strdup (lm_message_node_get_attribute (message->node, + "id")); + } else { + id = _lm_utils_generate_id (); + lm_message_node_set_attributes (message->node, "id", id, NULL); + } + + g_hash_table_insert (connection->id_handlers, + id, lm_message_handler_ref (handler)); + lm_verbose("[lm_connection_send_with_reply]: inside..calling lm_connection_send\n"); + return lm_connection_send (connection, message, error); +} + +/** + * lm_connection_send_with_reply_and_block: + * @connection: an #LmConnection + * @message: an #LmMessage + * @error: Set if error was detected during sending. + * + * Send @message and wait for return. + * + * Return value: The reply + **/ +EXPORT_C LmMessage * +lm_connection_send_with_reply_and_block (LmConnection *connection, + LmMessage *message, + GError **error) +{ + gchar *id; + LmMessage *reply = NULL; + + g_return_val_if_fail (connection != NULL, NULL); + g_return_val_if_fail (message != NULL, NULL); + + if (connection->state < LM_CONNECTION_STATE_OPENING) { + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_NOT_OPEN, + "Connection is not open, call lm_connection_open() first"); + return FALSE; + } + + + if (lm_message_node_get_attribute (message->node, "id")) { + id = g_strdup (lm_message_node_get_attribute (message->node, + "id")); + } else { + id = _lm_utils_generate_id (); + lm_message_node_set_attributes (message->node, "id", id, NULL); + } + + lm_message_queue_detach (connection->queue); + + lm_connection_send (connection, message, error); + + while (!reply) { + const gchar *m_id; + guint n; + + g_main_context_iteration (connection->context, TRUE); + + if (lm_message_queue_is_empty (connection->queue)) { + continue; + } + + for (n = 0; n < lm_message_queue_get_length (connection->queue); n++) { + LmMessage *m; + + m = (LmMessage *) lm_message_queue_peek_nth (connection->queue, n); + + m_id = lm_message_node_get_attribute (m->node, "id"); + + if (m_id && strcmp (m_id, id) == 0) { + reply = m; + lm_message_queue_pop_nth (connection->queue, n); + break; + } + } + } + + g_free (id); + lm_message_queue_attach (connection->queue, connection->context); + + return reply; +} + +/** + * lm_connection_register_message_handler: + * @connection: Connection to register a handler for. + * @handler: Message handler to register. + * @type: Message type that @handler will handle. + * @priority: The priority in which to call @handler. + * + * Registers a #LmMessageHandler to handle incoming messages of a certain type. + * To unregister the handler call lm_connection_unregister_message_handler(). + **/ +EXPORT_C void +lm_connection_register_message_handler (LmConnection *connection, + LmMessageHandler *handler, + LmMessageType type, + LmHandlerPriority priority) +{ + HandlerData *hd; + + g_return_if_fail (connection != NULL); + g_return_if_fail (handler != NULL); + g_return_if_fail (type != LM_MESSAGE_TYPE_UNKNOWN); + + hd = g_new0 (HandlerData, 1); + hd->priority = priority; + hd->handler = lm_message_handler_ref (handler); + + connection->handlers[type] = g_slist_insert_sorted (connection->handlers[type], + hd, + (GCompareFunc) connection_handler_compare_func); +} + +/** + * lm_connection_unregister_message_handler: + * @connection: Connection to unregister a handler for. + * @handler: The handler to unregister. + * @type: What type of messages to unregister this handler for. + * + * Unregisters a handler for @connection. @handler will no longer be called + * when incoming messages of @type arrive. + **/ +EXPORT_C void +lm_connection_unregister_message_handler (LmConnection *connection, + LmMessageHandler *handler, + LmMessageType type) +{ + GSList *l; + + g_return_if_fail (connection != NULL); + g_return_if_fail (handler != NULL); + g_return_if_fail (type != LM_MESSAGE_TYPE_UNKNOWN); + + for (l = connection->handlers[type]; l; l = l->next) { + HandlerData *hd = (HandlerData *) l->data; + + if (handler == hd->handler) { + connection->handlers[type] = g_slist_remove_link (connection->handlers[type], l); + g_slist_free (l); + lm_message_handler_unref (hd->handler); + g_free (hd); + break; + } + } +} + +/** + * lm_connection_set_disconnect_function: + * @connection: Connection to register disconnect callback for. + * @function: Function to be called when @connection is closed. + * @user_data: User data passed to @function. + * @notify: Function that will be called with @user_data when @user_data needs to be freed. Pass #NULL if it shouldn't be freed. + * + * Set the callback that will be called when a connection is closed. + **/ +EXPORT_C void +lm_connection_set_disconnect_function (LmConnection *connection, + LmDisconnectFunction function, + gpointer user_data, + GDestroyNotify notify) +{ + g_return_if_fail (connection != NULL); + + if (connection->disconnect_cb) { + _lm_utils_free_callback (connection->disconnect_cb); + } + + if (function) { + connection->disconnect_cb = _lm_utils_new_callback ((gpointer)function, + user_data, + notify); + } else { + connection->disconnect_cb = NULL; + } +} + +/** + * lm_connection_send_raw: + * @connection: Connection used to send + * @str: The string to send, the entire string will be sent. + * @error: Set if error was detected during sending. + * + * Asynchronous call to send a raw string. Useful for debugging and testing. + * + * Return value: Returns #TRUE if no errors was detected during sending, + * #FALSE otherwise. + **/ +EXPORT_C gboolean +lm_connection_send_raw (LmConnection *connection, + const gchar *str, + GError **error) +{ + g_return_val_if_fail (connection != NULL, FALSE); + g_return_val_if_fail (str != NULL, FALSE); + + return connection_send (connection, str, -1, error); +} +/** + * lm_connection_get_state: + * @connection: Connection to get state on + * + * Returns the state of the connection. + * + * Return value: The state of the connection. + **/ +EXPORT_C LmConnectionState +lm_connection_get_state (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, + LM_CONNECTION_STATE_CLOSED); + + return connection->state; +} + +/** + * lm_connection_get_client_host: + * @connection: An #LmConnection + * + * Returns the local host name of the connection. + * + * Return value: A newly allocated string representing the local host name. + **/ +gchar * +lm_connection_get_local_host (LmConnection *connection) +{ + return lm_socket_get_local_host (connection->socket); +} + +/** + * lm_connection_ref: + * @connection: Connection to add a reference to. + * + * Add a reference on @connection. To remove a reference call + * lm_connection_unref(). + * + * Return value: Returns the same connection. + **/ +EXPORT_C LmConnection* +lm_connection_ref (LmConnection *connection) +{ + g_return_val_if_fail (connection != NULL, NULL); + + connection->ref_count++; + + return connection; +} + +/** + * lm_connection_unref: + * @connection: Connection to remove reference from. + * + * Removes a reference on @connection. If there are no references to + * @connection it will be freed and shouldn't be used again. + **/ +EXPORT_C void +lm_connection_unref (LmConnection *connection) +{ + //g_return_if_fail (connection != NULL); + if(!connection) + return; + connection->ref_count--; + + if (connection->ref_count == 0) { + connection_free (connection); + } +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-debug.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-debug.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,125 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 "lm-debug.h" + + +//#ifdef EMULATOR +#ifndef LM_NO_DEBUG + + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" + +GET_GLOBAL_VAR_FROM_TLS(debug_flags,lm_debug,LmLogLevelFlags) + #define debug_flags (*GET_WSD_VAR_NAME(debug_flags,lm_debug,g)()) + +GET_GLOBAL_VAR_FROM_TLS(initialized,lm_debug,gboolean) + #define initialized (*GET_WSD_VAR_NAME(initialized,lm_debug,g)()) + +GET_GLOBAL_VAR_FROM_TLS(log_handler_id,lm_debug,guint) + #define log_handler_id (*GET_WSD_VAR_NAME(log_handler_id,lm_debug,g)()) + +#else //EMULATOR + + +static LmLogLevelFlags debug_flags = 0; +static gboolean initialized = FALSE; +static guint log_handler_id = 0; +#endif//EMULATOR + + +static const GDebugKey debug_keys[] = { + {"VERBOSE", LM_LOG_LEVEL_VERBOSE}, + {"NET", LM_LOG_LEVEL_NET}, + {"PARSER", LM_LOG_LEVEL_PARSER}, + {"SSL", LM_LOG_LEVEL_SSL}, + {"SASL", LM_LOG_LEVEL_SASL}, + {"ALL", LM_LOG_LEVEL_ALL} +}; + +#define NUM_DEBUG_KEYS (sizeof (debug_keys) / sizeof (GDebugKey)) + +static void +debug_log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + + + /*if (debug_flags & log_level) { + if (log_level & LM_LOG_LEVEL_VERBOSE) { + g_print ("*** "); + } + else if (log_level & LM_LOG_LEVEL_PARSER) { + g_print ("LM-PARSER: "); + } + else if (log_level & LM_LOG_LEVEL_SASL) { + g_print ("LM-SASL: "); + } + else if (log_level & LM_LOG_LEVEL_SSL) { + g_print ("LM-SSL: "); + } + + g_print ("%s", message);*/ + UNUSED_FORMAL_PARAM(log_domain); + UNUSED_FORMAL_PARAM(log_level); + UNUSED_FORMAL_PARAM(user_data); + lm_verbose (message); + //} +} + +/** + * lm_debug_init + * + * Initialized the debug system. + **/ +void +lm_debug_init (void) +{ + /*const gchar *env_lm_debug; + + if (initialized) { + return; + } + + env_lm_debug = g_getenv ("LM_DEBUG"); + if (env_lm_debug) { + debug_flags = g_parse_debug_string (env_lm_debug, debug_keys, + NUM_DEBUG_KEYS); + } + + log_handler_id = g_log_set_handler (LM_LOG_DOMAIN, LM_LOG_LEVEL_ALL, + debug_log_handler, NULL); + + initialized = TRUE;*/ + +} + +#else /* LM_NO_DEBUG */ + +void +lm_debug_init (void) +{ +} + +#endif /* LM_NO_DEBUG */ + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-error.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-error.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include +#include "lm-error.h" + +EXPORT_C GQuark +lm_error_quark (void) +{ + static GQuark q = 0; + + if (q == 0) { + q = g_quark_from_static_string ("lm-error-quark"); + } + + return q; +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-message-handler.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-message-handler.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,160 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include "lm-internals.h" +#include "lm-message-handler.h" +#include "lm-debug.h" +struct LmMessageHandler { + gboolean valid; + gint ref_count; + LmHandleMessageFunction function; + gpointer user_data; + GDestroyNotify notify; +}; + +LmHandlerResult +_lm_message_handler_handle_message (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message) +{ + g_return_val_if_fail (handler != NULL, + LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS); + lm_verbose("\nCalling handler in handler_handle_message\n"); + if (!handler->valid) { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (handler->function) { + lm_verbose("In handler msg Node name: %s", message->node->name); + return (* handler->function) (handler, connection, + message, handler->user_data); + } + lm_verbose("could not call handler: go for more handlers\n"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + +/** + * lm_message_handler_new: + * @function: a callback + * @user_data: user data passed to function + * @notify: function called when the message handler is freed + * + * Creates a new message handler. This can be set to handle incoming messages + * and when a message of the type the handler is registered to handle is + * received @function will be called and @user_data will be passed to it. + * @notify is called when the message handler is freed, that way any memory + * allocated by @user_data can be freed. + * + * Return value: a newly created message handler + **/ +EXPORT_C LmMessageHandler * +lm_message_handler_new (LmHandleMessageFunction function, + gpointer user_data, + GDestroyNotify notify) +{ + LmMessageHandler *handler; + + g_return_val_if_fail (function != NULL, NULL); + + handler = g_new0 (LmMessageHandler, 1); + + if (handler == NULL) { + return NULL; + } + + handler->valid = TRUE; + handler->ref_count = 1; + handler->function = function; + handler->user_data = user_data; + handler->notify = notify; + + return handler; +} + +/** + * lm_message_handler_invalidate + * @handler: an #LmMessageHandler + * + * Invalidates the handler. Useful if you need to cancel a reply + **/ +EXPORT_C void +lm_message_handler_invalidate (LmMessageHandler *handler) +{ + handler->valid = FALSE; +} + +/** + * lm_message_handler_is_valid + * @handler: an #LmMessageHandler + * + * Fetches whether the handler is valid or not. + * + * Return value: #TRUE if @handler is valid, otherwise #FALSE + **/ +EXPORT_C gboolean +lm_message_handler_is_valid (LmMessageHandler *handler) +{ + g_return_val_if_fail (handler != NULL, FALSE); + + return handler->valid; +} + +/** + * lm_message_handler_ref: + * @handler: an #LmMessageHandler + * + * Adds a reference to @handler. + * + * Return value: the message handler + **/ +EXPORT_C LmMessageHandler * +lm_message_handler_ref (LmMessageHandler *handler) +{ + g_return_val_if_fail (handler != NULL, NULL); + + handler->ref_count++; + + return handler; +} + +/** + * lm_message_handler_unref: + * @handler: an #LmMessagHandler + * + * Removes a reference from @handler. When no more references are present the + * handler is freed. + **/ +EXPORT_C void +lm_message_handler_unref (LmMessageHandler *handler) +{ + g_return_if_fail (handler != NULL); + + handler->ref_count --; + + if (handler->ref_count == 0) { + if (handler->notify) { + (* handler->notify) (handler->user_data); + } + g_free (handler); + } +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-message-node.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-message-node.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,506 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include + +#include "lm-internals.h" +#include "lm-message-node.h" + +typedef struct { + gchar *key; + gchar *value; +} KeyValuePair; + +static void message_node_free (LmMessageNode *node); +static LmMessageNode * message_node_last_child (LmMessageNode *node); + +static void +message_node_free (LmMessageNode *node) +{ + LmMessageNode *l; + GSList *list; + + g_return_if_fail (node != NULL); + + for (l = node->children; l;) { + LmMessageNode *next = l->next; + + lm_message_node_unref (l); + l = next; + } + + g_free (node->name); + g_free (node->value); + + for (list = node->attributes; list; list = list->next) { + KeyValuePair *kvp = (KeyValuePair *) list->data; + + g_free (kvp->key); + g_free (kvp->value); + g_free (kvp); + } + + g_slist_free (node->attributes); + g_free (node); +} + +static LmMessageNode * +message_node_last_child (LmMessageNode *node) +{ + LmMessageNode *l; + + g_return_val_if_fail (node != NULL, NULL); + + if (!node->children) { + return NULL; + } + + l = node->children; + + while (l->next) { + l = l->next; + } + + return l; +} + +LmMessageNode * +_lm_message_node_new (const gchar *name) +{ + LmMessageNode *node; + + node = g_new0 (LmMessageNode, 1); + + node->name = g_strdup (name); + node->value = NULL; + node->raw_mode = FALSE; + node->attributes = NULL; + node->next = NULL; + node->prev = NULL; + node->parent = NULL; + node->children = NULL; + + node->ref_count = 1; + + return node; +} +void +_lm_message_node_add_child_node (LmMessageNode *node, LmMessageNode *child) +{ + LmMessageNode *prev; + + g_return_if_fail (node != NULL); + + prev = message_node_last_child (node); + lm_message_node_ref (child); + + if (prev) { + prev->next = child; + child->prev = prev; + } else { + node->children = child; + } + + child->parent = node; +} + +/** + * lm_message_node_get_value: + * @node: an #LmMessageNode + * + * Retrieves the value of @node. + * + * Return value: + **/ +EXPORT_C const gchar * +lm_message_node_get_value (LmMessageNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + return node->value; +} + +/** + * lm_message_node_set_value: + * @node: an #LmMessageNode + * @value: the new value. + * + * Sets the value of @node. If a previous value is set it will be freed. + **/ +EXPORT_C void +lm_message_node_set_value (LmMessageNode *node, const gchar *value) +{ + g_return_if_fail (node != NULL); + + g_free (node->value); + + if (!value) { + node->value = NULL; + return; + } + + node->value = g_strdup (value); +} + +/** + * lm_message_node_add_child: + * @node: an #LmMessageNode + * @name: the name of the new child + * @value: value of the new child + * + * Add a child node with @name and value set to @value. + * + * Return value: the newly created child + **/ +EXPORT_C LmMessageNode * +lm_message_node_add_child (LmMessageNode *node, + const gchar *name, + const gchar *value) +{ + LmMessageNode *child; + + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + child = _lm_message_node_new (name); + + lm_message_node_set_value (child, value); + _lm_message_node_add_child_node (node, child); + lm_message_node_unref (child); + + return child; +} + +/** + * lm_message_node_set_attributes: + * @node: an #LmMessageNode + * @name: the first attribute, should be followed by a string with the value + * @Varargs: The rest of the name/value pairs + * + * Sets a list of attributes. The arguments should be names and corresponding + * value and needs to be ended with %NULL. + **/ +EXPORT_C void +lm_message_node_set_attributes (LmMessageNode *node, + const gchar *name, + ...) +{ + va_list args; + + g_return_if_fail (node != NULL); + + for (va_start (args, name); + name; + name = (const gchar *) va_arg (args, gpointer)) { + const gchar *value; + + value = (const gchar *) va_arg (args, gpointer); + + lm_message_node_set_attribute (node, name, value); + + } + + va_end (args); +} + +/** + * lm_message_node_set_attribute: + * @node: an #LmMessageNode + * @name: name of attribute + * @value: value of attribute. + * + * Sets the attribute @name to @value. + **/ +EXPORT_C void +lm_message_node_set_attribute (LmMessageNode *node, + const gchar *name, + const gchar *value) +{ + gboolean found = FALSE; + GSList *l; + + g_return_if_fail (node != NULL); + g_return_if_fail (name != NULL); + g_return_if_fail (value != NULL); + + for (l = node->attributes; l; l = l->next) { + KeyValuePair *kvp = (KeyValuePair *) l->data; + + if (strcmp (kvp->key, name) == 0) { + g_free (kvp->value); + kvp->value = g_strdup (value); + found = TRUE; + break; + } + } + + if (!found) { + KeyValuePair *kvp; + + kvp = g_new0 (KeyValuePair, 1); + kvp->key = g_strdup (name); + kvp->value = g_strdup (value); + + node->attributes = g_slist_prepend (node->attributes, kvp); + } +} + +/** + * lm_message_node_get_attribute: + * @node: an #LmMessageNode + * @name: the attribute name + * + * Fetches the attribute @name from @node. + * + * Return value: the attribute value or %NULL if not set + **/ +EXPORT_C const gchar * +lm_message_node_get_attribute (LmMessageNode *node, const gchar *name) +{ + GSList *l; + const gchar *ret_val = NULL; + + //g_return_val_if_fail (node != NULL, NULL); + //g_return_val_if_fail (name != NULL, NULL); + + if(!node || !name) + return NULL; + + for (l = node->attributes; l; l = l->next) { + KeyValuePair *kvp = (KeyValuePair *) l->data; + + if (strcmp (kvp->key, name) == 0) { + ret_val = kvp->value; + } + } + + return ret_val; +} + +/** + * lm_message_node_get_child: + * @node: an #LmMessageNode + * @child_name: the childs name + * + * Fetches the child @child_name from @node. If child is not found as an + * immediate child of @node %NULL is returned. + * + * Return value: the child node or %NULL if not found + **/ +EXPORT_C LmMessageNode * +lm_message_node_get_child (LmMessageNode *node, const gchar *child_name) +{ + LmMessageNode *l; + + // g_return_val_if_fail (node != NULL, NULL); + // g_return_val_if_fail (child_name != NULL, NULL); + + if(!node || !child_name) + return NULL; + for (l = node->children; l; l = l->next) { + if (strcmp (l->name, child_name) == 0) { + return l; + } + } + + return NULL; +} + +/** + * lm_message_node_find_child: + * @node: A #LmMessageNode + * @child_name: The name of the child to find + * + * Locates a child among all children of @node. The entire tree will be search + * until a child with name @child_name is located. + * + * Return value: the located child or %NULL if not found + **/ +EXPORT_C LmMessageNode * +lm_message_node_find_child (LmMessageNode *node, + const gchar *child_name) +{ + LmMessageNode *l; + LmMessageNode *ret_val = NULL; + + //g_return_val_if_fail (node != NULL, NULL); + //g_return_val_if_fail (child_name != NULL, NULL); + if(!node || !child_name) + return NULL; + for (l = node->children; l; l = l->next) { + if (strcmp (l->name, child_name) == 0) { + return l; + } + if (l->children) { + ret_val = lm_message_node_find_child (l, child_name); + if (ret_val) { + return ret_val; + } + } + } + + return NULL; +} + +/** + * lm_message_node_get_raw_mode: + * @node: an #LmMessageNode + * + * Checks if the nodes value should be sent as raw mode. + * + * Return value: %TRUE if nodes value should be sent as is and %FALSE if the value will be escaped before sending. + **/ +EXPORT_C gboolean +lm_message_node_get_raw_mode (LmMessageNode *node) +{ + //g_return_val_if_fail (node != NULL, FALSE); + + return node? node->raw_mode : 0 ; + //return node->raw_mode; +} + +/** + * lm_message_node_set_raw_mode: + * @node: an #LmMessageNode + * @raw_mode: boolean specifying if node value should be escaped or not. + * + * Set @raw_mode to %TRUE if you don't want to escape the value. You need to make sure the value is valid XML yourself. + **/ +EXPORT_C void +lm_message_node_set_raw_mode (LmMessageNode *node, gboolean raw_mode) +{ + //g_return_if_fail (node != NULL); + if(!node) + return; + + node->raw_mode = raw_mode; +} + +/** + * lm_message_node_ref: + * @node: an #LmMessageNode + * + * Adds a reference to @node. + * + * Return value: the node + **/ +EXPORT_C LmMessageNode * +lm_message_node_ref (LmMessageNode *node) +{ + //g_return_val_if_fail (node != NULL, NULL); + if(!node) + return NULL; + node->ref_count++; + + return node; +} + +/** + * lm_message_node_unref: + * @node: an #LmMessageNode + * + * Removes a reference from @node. When no more references are present the + * node is freed. When freed lm_message_node_unref() will be called on all + * children. If caller needs to keep references to the children a call to + * lm_message_node_ref() needs to be done before the call to + *lm_message_unref(). + **/ +EXPORT_C void +lm_message_node_unref (LmMessageNode *node) +{ + //g_return_if_fail (node != NULL); + if(!node) + return; + node->ref_count--; + + if (node->ref_count == 0) { + message_node_free (node); + } +} + +/** + * lm_message_node_to_string: + * @node: an #LmMessageNode + * + * Returns an XML string representing the node. This is what is sent over the + * wire. This is used internally Loudmouth and is external for debugging + * purposes. + * + * Return value: an XML string representation of @node + **/ +EXPORT_C gchar * +lm_message_node_to_string (LmMessageNode *node) +{ + GString *ret; + GSList *l; + LmMessageNode *child; + + g_return_val_if_fail (node != NULL, NULL); + + if (node->name == NULL) { + return g_strdup (""); + } + + ret = g_string_new ("<"); + g_string_append (ret, node->name); + + for (l = node->attributes; l; l = l->next) { + KeyValuePair *kvp = (KeyValuePair *) l->data; + + if (node->raw_mode == FALSE) { + gchar *escaped; + + escaped = g_markup_escape_text (kvp->value, -1); + g_string_append_printf (ret, " %s=\"%s\"", + kvp->key, escaped); + g_free (escaped); + } else { + g_string_append_printf (ret, " %s=\"%s\"", + kvp->key, kvp->value); + } + + } + + g_string_append_c (ret, '>'); + + if (node->value) { + gchar *tmp; + + if (node->raw_mode == FALSE) { + tmp = g_markup_escape_text (node->value, -1); + g_string_append (ret, tmp); + g_free (tmp); + } else { + g_string_append (ret, node->value); + } + } + + for (child = node->children; child; child = child->next) { + gchar *child_str = lm_message_node_to_string (child); + g_string_append_c (ret, ' '); + g_string_append (ret, child_str); + g_free (child_str); + } + + g_string_append_printf (ret, "\n", node->name); + + return g_string_free (ret, FALSE); +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-message-queue.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-message-queue.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,234 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include "lm-message-queue.h" +#include "lm-debug.h" + +struct _LmMessageQueue { + GQueue *messages; + + GMainContext *context; + GSource *source; + + LmMessageQueueCallback callback; + gpointer user_data; + + gint ref_count; +}; + +typedef struct { + GSource source; + LmMessageQueue *queue; +} MessageQueueSource; + +static void message_queue_free (LmMessageQueue *queue); +static gboolean message_queue_prepare_func (GSource *source, + gint *timeout); +static gboolean message_queue_check_func (GSource *source); +static gboolean message_queue_dispatch_func (GSource *source, + GSourceFunc callback, + gpointer user_data); + +static GSourceFuncs source_funcs = { + message_queue_prepare_func, + message_queue_check_func, + message_queue_dispatch_func, + NULL +}; + +static void +foreach_free_message (LmMessage *m, gpointer user_data) +{ + lm_message_unref (m); + UNUSED_FORMAL_PARAM(user_data); +} + +static void +message_queue_free (LmMessageQueue *queue) +{ + lm_message_queue_detach (queue); + + g_queue_foreach (queue->messages, (GFunc) foreach_free_message, NULL); + g_queue_free (queue->messages); + + g_free (queue); +} + +//Prepare has to return true for check method to be called. +static gboolean +message_queue_prepare_func (GSource *source, gint *timeout) +{ + LmMessageQueue *queue; + + queue = ((MessageQueueSource *)source)->queue; + UNUSED_FORMAL_PARAM(timeout); + return !g_queue_is_empty (queue->messages); +} + +//check has to return true for Dispatch method to be called. +static gboolean +message_queue_check_func (GSource *source) +{ +// return FALSE; +UNUSED_FORMAL_PARAM(source); +return TRUE; +} + +static gboolean +message_queue_dispatch_func (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + LmMessageQueue *queue; + + queue = ((MessageQueueSource *)source)->queue; + + if (queue->callback) { + (queue->callback) (queue, queue->user_data); + } + UNUSED_FORMAL_PARAM(source); + UNUSED_FORMAL_PARAM(callback); + return TRUE; +} + +LmMessageQueue * +lm_message_queue_new (LmMessageQueueCallback callback, + gpointer user_data) +{ + LmMessageQueue *queue; + + queue = g_new0 (LmMessageQueue, 1); + + queue->messages = g_queue_new (); + queue->context = NULL; + queue->source = NULL; + queue->ref_count = 1; + + queue->callback = callback; + queue->user_data = user_data; + + return queue; +} + +void +lm_message_queue_attach (LmMessageQueue *queue, GMainContext *context) +{ + GSource *source; + + if (queue->source) { + if (queue->context == context) { + /* Already attached */ + return; + } + lm_message_queue_detach (queue); + } + + if (context) { + queue->context = g_main_context_ref (context); + } + + source = g_source_new (&source_funcs, sizeof (MessageQueueSource)); + ((MessageQueueSource *)source)->queue = queue; + queue->source = source; + + g_source_attach (source, queue->context); +} + +void +lm_message_queue_detach (LmMessageQueue *queue) +{ + if (queue->source) { + g_source_destroy (queue->source); + g_source_unref (queue->source); + } + + if (queue->context) { + g_main_context_unref (queue->context); + } + + queue->source = NULL; + queue->context = NULL; +} + +void +lm_message_queue_push_tail (LmMessageQueue *queue, LmMessage *m) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (m != NULL); + + g_queue_push_tail (queue->messages, m); +} + +LmMessage * +lm_message_queue_peek_nth (LmMessageQueue *queue, guint n) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return (LmMessage *) g_queue_peek_nth (queue->messages, n); +} + +LmMessage * +lm_message_queue_pop_nth (LmMessageQueue *queue, guint n) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return (LmMessage *) g_queue_pop_nth (queue->messages, n); +} + +guint +lm_message_queue_get_length (LmMessageQueue *queue) +{ + g_return_val_if_fail (queue != NULL, 0); + + return g_queue_get_length (queue->messages); +} + +gboolean +lm_message_queue_is_empty (LmMessageQueue *queue) +{ + g_return_val_if_fail (queue != NULL, TRUE); + + return g_queue_is_empty (queue->messages); +} + +LmMessageQueue * +lm_message_queue_ref (LmMessageQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + queue->ref_count++; + + return queue; +} + +void +lm_message_queue_unref (LmMessageQueue *queue) +{ + g_return_if_fail (queue != NULL); + + queue->ref_count--; + + if (queue->ref_count <= 0) { + message_queue_free (queue); + } +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-message.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-message.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,373 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include + +#include "lm-internals.h" +#include "lm-message.h" + +#define PRIV(o) ((LmMessage *)o)->priv + + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" + +GET_STATIC_ARRAY_FROM_TLS(type_names, lm_message, TypeNames) + #define type_names (GET_WSD_VAR_NAME(type_names, lm_message, s)()) + +GET_STATIC_ARRAY_FROM_TLS(sub_type_names,lm_message,SubTypeNames) + #define sub_type_names (GET_WSD_VAR_NAME(sub_type_names,lm_message,s)()) + + +#else +static struct TypeNames +{ + LmMessageType type; + const gchar *name; +} type_names[] = { + { LM_MESSAGE_TYPE_MESSAGE, "message" }, + { LM_MESSAGE_TYPE_PRESENCE, "presence" }, + { LM_MESSAGE_TYPE_IQ, "iq" }, + { LM_MESSAGE_TYPE_STREAM, "stream:stream" }, + { LM_MESSAGE_TYPE_STREAM_FEATURES, "stream:features" }, + { LM_MESSAGE_TYPE_STREAM_ERROR, "stream:error" }, + { LM_MESSAGE_TYPE_AUTH, "auth" }, + { LM_MESSAGE_TYPE_CHALLENGE, "challenge" }, + { LM_MESSAGE_TYPE_RESPONSE, "response" }, + { LM_MESSAGE_TYPE_SUCCESS, "success" }, + { LM_MESSAGE_TYPE_FAILURE, "failure" }, + { LM_MESSAGE_TYPE_PROCEED, "proceed" }, + { LM_MESSAGE_TYPE_STARTTLS, "starttls" }, + { LM_MESSAGE_TYPE_UNKNOWN, NULL } +}; + +static struct SubTypeNames +{ + LmMessageSubType type; + const gchar *name; +} sub_type_names[] = { + { LM_MESSAGE_SUB_TYPE_NORMAL, "normal" }, + { LM_MESSAGE_SUB_TYPE_CHAT, "chat" }, + { LM_MESSAGE_SUB_TYPE_GROUPCHAT, "groupchat" }, + { LM_MESSAGE_SUB_TYPE_HEADLINE, "headline" }, + { LM_MESSAGE_SUB_TYPE_UNAVAILABLE, "unavailable" }, + { LM_MESSAGE_SUB_TYPE_PROBE, "probe" }, + { LM_MESSAGE_SUB_TYPE_SUBSCRIBE, "subscribe" }, + { LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE, "unsubscribe" }, + { LM_MESSAGE_SUB_TYPE_SUBSCRIBED, "subscribed" }, + { LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED, "unsubscribed" }, + { LM_MESSAGE_SUB_TYPE_GET, "get" }, + { LM_MESSAGE_SUB_TYPE_SET, "set" }, + { LM_MESSAGE_SUB_TYPE_RESULT, "result" }, + { LM_MESSAGE_SUB_TYPE_ERROR, "error" } +}; +#endif + +struct LmMessagePriv { + LmMessageType type; + LmMessageSubType sub_type; + gint ref_count; +}; + +static LmMessageType +message_type_from_string (const gchar *type_str) +{ + gint i; + + if (!type_str) { + return LM_MESSAGE_TYPE_UNKNOWN; + } + + for (i = LM_MESSAGE_TYPE_MESSAGE; + i < LM_MESSAGE_TYPE_UNKNOWN; + ++i) { + if (strcmp (type_str, type_names[i].name) == 0) { + return type_names[i].type; + } + } + + return LM_MESSAGE_TYPE_UNKNOWN; +} + + +const gchar * +_lm_message_type_to_string (LmMessageType type) +{ + if (type < LM_MESSAGE_TYPE_MESSAGE || + type > LM_MESSAGE_TYPE_STARTTLS) { + type = LM_MESSAGE_TYPE_UNKNOWN; + } + + return type_names[type].name; +} + +static LmMessageSubType +message_sub_type_from_string (const gchar *type_str) +{ + gint i; + + if (!type_str) { + return LM_MESSAGE_SUB_TYPE_NOT_SET; + } + + for (i = LM_MESSAGE_SUB_TYPE_NORMAL; + i <= LM_MESSAGE_SUB_TYPE_ERROR; + ++i) { + if (g_ascii_strcasecmp (type_str, + sub_type_names[i].name) == 0) { + return i; + } + } + + return LM_MESSAGE_SUB_TYPE_NOT_SET; +} + +const gchar * +_lm_message_sub_type_to_string (LmMessageSubType type) +{ + if (type < LM_MESSAGE_SUB_TYPE_NORMAL || + type > LM_MESSAGE_SUB_TYPE_ERROR) { + return NULL; + } + + return sub_type_names[type].name; +} + +static LmMessageSubType +message_sub_type_when_unset (LmMessageType type) { + LmMessageSubType sub_type = LM_MESSAGE_SUB_TYPE_NORMAL; + + switch (type) { + case LM_MESSAGE_TYPE_MESSAGE: + /* A message without type should be handled like a message with + * type=normal, but we won't set it to that since then the user + * will not know if it's set or not. + */ + sub_type = LM_MESSAGE_SUB_TYPE_NOT_SET; + break; + case LM_MESSAGE_TYPE_PRESENCE: + sub_type = LM_MESSAGE_SUB_TYPE_AVAILABLE; + break; + case LM_MESSAGE_TYPE_IQ: + sub_type = LM_MESSAGE_SUB_TYPE_GET; + break; + default: + break; + } + + return sub_type; +} + +LmMessage * +_lm_message_new_from_node (LmMessageNode *node) +{ + LmMessage *m; + LmMessageType type; + LmMessageSubType sub_type; + const gchar *sub_type_str; + + type = message_type_from_string (node->name); + + if (type == LM_MESSAGE_TYPE_UNKNOWN) { + return NULL; + } + + sub_type_str = lm_message_node_get_attribute (node, "type"); + if (sub_type_str) { + sub_type = message_sub_type_from_string (sub_type_str); + } else { + sub_type = message_sub_type_when_unset (type); + } + + m = g_new0 (LmMessage, 1); + m->priv = g_new0 (LmMessagePriv, 1); + + PRIV(m)->ref_count = 1; + PRIV(m)->type = type; + PRIV(m)->sub_type = sub_type; + + m->node = lm_message_node_ref (node); + + return m; +} + +/** + * lm_message_new: + * @to: receipient jid + * @type: message type + * + * Creates a new #LmMessage which can be sent with lm_connection_send() or + * lm_connection_send_with_reply(). If @to is %NULL the message is sent to the + * server. The returned message should be unreferenced with lm_message_unref() + * when caller is finished with it. + * + * Return value: a newly created #LmMessage + **/ +EXPORT_C LmMessage * +lm_message_new (const gchar *to, LmMessageType type) +{ + LmMessage *m; + gchar *id; + + m = g_new0 (LmMessage, 1); + m->priv = g_new0 (LmMessagePriv, 1); + + PRIV(m)->ref_count = 1; + PRIV(m)->type = type; + PRIV(m)->sub_type = message_sub_type_when_unset (type); + + m->node = _lm_message_node_new (_lm_message_type_to_string (type)); + + id = _lm_utils_generate_id (); + lm_message_node_set_attribute (m->node, "id", id); + g_free (id); + + if (to) { + lm_message_node_set_attribute (m->node, "to", to); + } + + if (type == LM_MESSAGE_TYPE_IQ) { + lm_message_node_set_attribute (m->node, "type", "get"); + } + + return m; +} + +/** + * lm_message_new_with_sub_type: + * @to: receipient jid + * @type: message type + * @sub_type: message sub type + * + * Creates a new #LmMessage with sub type set. See lm_message_new() for more + * information. + * + * Return value: a newly created #LmMessage + **/ +EXPORT_C LmMessage * +lm_message_new_with_sub_type (const gchar *to, + LmMessageType type, + LmMessageSubType sub_type) +{ + LmMessage *m; + const gchar *type_str; + + m = lm_message_new (to, type); + + type_str = _lm_message_sub_type_to_string (sub_type); + + if (type_str) { + lm_message_node_set_attributes (m->node, + "type", type_str, NULL); + PRIV(m)->sub_type = sub_type; + } + + return m; +} + +/** + * lm_message_get_type: + * @message: an #LmMessage + * + * Fetches the type of @message. + * + * Return value: the message type + **/ +EXPORT_C LmMessageType +lm_message_get_type (LmMessage *message) +{ + g_return_val_if_fail (message != NULL, LM_MESSAGE_TYPE_UNKNOWN); + + return PRIV(message)->type; +} + +/** + * lm_message_get_sub_type: + * @message: + * + * Fetches the sub type of @message. + * + * Return value: the message sub type + **/ +EXPORT_C LmMessageSubType +lm_message_get_sub_type (LmMessage *message) +{ + g_return_val_if_fail (message != NULL, LM_MESSAGE_TYPE_UNKNOWN); + + return PRIV(message)->sub_type; +} + +/** + * lm_message_get_node: + * @message: an #LmMessage + * + * Retrieves the root node from @message. + * + * Return value: an #LmMessageNode + **/ +EXPORT_C LmMessageNode * +lm_message_get_node (LmMessage *message) +{ + g_return_val_if_fail (message != NULL, NULL); + + return message->node; +} + +/** + * lm_message_ref: + * @message: an #LmMessage + * + * Adds a reference to @message. + * + * Return value: the message + **/ +EXPORT_C LmMessage * +lm_message_ref (LmMessage *message) +{ + g_return_val_if_fail (message != NULL, NULL); + + PRIV(message)->ref_count++; + + return message; +} + +/** + * lm_message_unref: + * @message: an #LmMessage + * + * Removes a reference from @message. When no more references are present the + * message is freed. + **/ +EXPORT_C void +lm_message_unref (LmMessage *message) +{ + //g_return_if_fail (message != NULL); + if(message==NULL) + return; + + PRIV(message)->ref_count--; + + if (PRIV(message)->ref_count == 0) { + lm_message_node_unref (message->node); + g_free (message->priv); + g_free (message); + } +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-misc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-misc.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,116 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include + +#include "lm-misc.h" + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" +GET_STATIC_ARRAY_FROM_TLS(buf, lm_misc, gchar) + #define buf (GET_WSD_VAR_NAME(buf, lm_misc, s)()) + + +#endif + +static void +misc_setup_source (GMainContext *context, + GSource *source, + GSourceFunc function, + gpointer data) +{ + g_source_set_callback (source, (GSourceFunc)function, data, NULL); + g_source_attach (source, context); + g_source_unref (source); +} + +GSource * +lm_misc_add_io_watch (GMainContext *context, + GIOChannel *channel, + GIOCondition condition, + GIOFunc function, + gpointer data) +{ + GSource *source; + + g_return_val_if_fail (channel != NULL, 0); + + source = g_io_create_watch (channel, condition); + misc_setup_source (context, source, (GSourceFunc) function, data); + + return source; +} + +GSource * +lm_misc_add_idle (GMainContext *context, + GSourceFunc function, + gpointer data) +{ + GSource *source; + + g_return_val_if_fail (function != NULL, 0); + + source = g_idle_source_new (); + misc_setup_source (context, source, function, data); + + return source; +} + +GSource * +lm_misc_add_timeout (GMainContext *context, + guint interval, + GSourceFunc function, + gpointer data) +{ + GSource *source; + + g_return_val_if_fail (function != NULL, 0); + + source = g_timeout_source_new (interval); + misc_setup_source (context, source, function, data); + + return source; +} + +const char * +lm_misc_io_condition_to_str (GIOCondition condition) +{ +#ifndef EMULATOR + static char buf[256]; +#endif + + buf[0] = '\0'; + + if(condition & G_IO_ERR) + strcat(buf, "G_IO_ERR "); + if(condition & G_IO_HUP) + strcat(buf, "G_IO_HUP "); + if(condition & G_IO_NVAL) + strcat(buf, "G_IO_NVAL "); + if(condition & G_IO_IN) + strcat(buf, "G_IO_IN "); + if(condition & G_IO_OUT) + strcat(buf, "G_IO_OUT "); + + return buf; +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-parser.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-parser.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,284 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include + +#include + +#include "lm-debug.h" +#include "lm-internals.h" +#include "lm-message-node.h" +#include "lm-parser.h" + +#define SHORT_END_TAG "/>" +#define XML_MAX_DEPTH 5 + +#define LM_PARSER(o) ((LmParser *) o) + +struct LmParser { + LmParserMessageFunction function; + gpointer user_data; + GDestroyNotify notify; + + LmMessageNode *cur_root; + LmMessageNode *cur_node; + + GMarkupParser *m_parser; + GMarkupParseContext *context; +}; + + +/* Used while parsing */ +static void parser_start_node_cb (GMarkupParseContext *context, + const gchar *node_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error); +static void parser_end_node_cb (GMarkupParseContext *context, + const gchar *node_name, + gpointer user_data, + GError **error); +static void parser_text_cb (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error); +static void parser_error_cb (GMarkupParseContext *context, + GError *error, + gpointer user_data); + +static void +parser_start_node_cb (GMarkupParseContext *context, + const gchar *node_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + LmParser *parser; + gint i; + + parser = LM_PARSER (user_data);; + + +/* parser->cur_depth++; */ + + if (!parser->cur_root) { + /* New toplevel element */ + parser->cur_root = _lm_message_node_new (node_name); + parser->cur_node = parser->cur_root; + } else { + LmMessageNode *parent_node; + + parent_node = parser->cur_node; + + parser->cur_node = _lm_message_node_new (node_name); + _lm_message_node_add_child_node (parent_node, + parser->cur_node); + } + + for (i = 0; attribute_names[i]; ++i) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER, + "ATTRIBUTE: %s = %s\n", + attribute_names[i], + attribute_values[i]);*/ + + lm_verbose ("[parser_start_node_cb]: ATTRIBUTE: %s = %s\n", + attribute_names[i], + attribute_values[i]); + + lm_message_node_set_attributes (parser->cur_node, + attribute_names[i], + attribute_values[i], + NULL); + } + + if (strcmp ("stream:stream", node_name) == 0) { + parser_end_node_cb (context, + "stream:stream", + user_data, + error); + } +} + +static void +parser_end_node_cb (GMarkupParseContext *context, + const gchar *node_name, + gpointer user_data, + GError **error) +{ + LmParser *parser; + + parser = LM_PARSER (user_data); + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER, + "Trying to close node: %s\n", node_name);*/ + lm_verbose ("[parser_end_node_cb]:Trying to close node: %s\n", node_name); + if (!parser->cur_node) { + /* FIXME: LM-1 should look at this */ + return; + } + + if (strcmp (parser->cur_node->name, node_name) != 0) { + if (strcmp (node_name, "stream:stream")) { + g_print ("Got an stream:stream end\n"); + } + g_warning ("Trying to close node that isn't open: %s", + node_name); + return; + } + + if (parser->cur_node == parser->cur_root) { + LmMessage *m; + + m = _lm_message_new_from_node (parser->cur_root); + + if (!m) { + g_warning ("Couldn't create message: %s\n", + parser->cur_root->name); + return; + } + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER, + "Have a new message\n");*/ + lm_verbose("[parser_end_node_cb]: Have a new message\n"); + if (parser->function) { + (* parser->function) (parser, m, parser->user_data); + } + + lm_message_unref (m); + lm_message_node_unref (parser->cur_root); + + + parser->cur_node = parser->cur_root = NULL; + } else { + LmMessageNode *tmp_node; + tmp_node = parser->cur_node; + parser->cur_node = parser->cur_node->parent; + + lm_message_node_unref (tmp_node); + } + UNUSED_FORMAL_PARAM(context); + UNUSED_FORMAL_PARAM(error); +} + +static void +parser_text_cb (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + LmParser *parser; + + g_return_if_fail (user_data != NULL); + + parser = LM_PARSER (user_data); + + if (parser->cur_node && strcmp (text, "") != 0) { + lm_message_node_set_value (parser->cur_node, text); + } + UNUSED_FORMAL_PARAM(context); + UNUSED_FORMAL_PARAM(error); + UNUSED_FORMAL_PARAM(text_len); +} + +static void +parser_error_cb (GMarkupParseContext *context, + GError *error, + gpointer user_data) +{ + g_return_if_fail (user_data != NULL); + g_return_if_fail (error != NULL); + + g_warning ("Parsing failed: %s\n", error->message); + UNUSED_FORMAL_PARAM(context); +} + +EXPORT_C LmParser * +lm_parser_new (LmParserMessageFunction function, + gpointer user_data, + GDestroyNotify notify) +{ + LmParser *parser; + + parser = g_new0 (LmParser, 1); + if (!parser) { + return NULL; + } + + parser->m_parser = g_new0 (GMarkupParser, 1); + if (!parser->m_parser) { + g_free (parser); + return NULL; + } + + parser->function = function; + parser->user_data = user_data; + parser->notify = notify; + + parser->m_parser->start_element = parser_start_node_cb; + parser->m_parser->end_element = parser_end_node_cb; + parser->m_parser->text = parser_text_cb; + parser->m_parser->error = parser_error_cb; + + parser->context = g_markup_parse_context_new (parser->m_parser, 0, + parser, NULL); + + parser->cur_root = NULL; + parser->cur_node = NULL; + + return parser; +} + +EXPORT_C void +lm_parser_parse (LmParser *parser, const gchar *string) +{ + g_return_if_fail (parser != NULL); + + if (!parser->context) { + parser->context = g_markup_parse_context_new (parser->m_parser, 0, + parser, NULL); + } + + if (g_markup_parse_context_parse (parser->context, string, + (gssize)strlen (string), NULL)) { + } else { + g_markup_parse_context_free (parser->context); + parser->context = NULL; + } +} + +EXPORT_C void +lm_parser_free (LmParser *parser) +{ + if (parser->notify) { + (* parser->notify) (parser->user_data); + } + + if (parser->context) { + g_markup_parse_context_free (parser->context); + } + g_free (parser->m_parser); + g_free (parser); +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-proxy.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-proxy.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,490 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2004 Imendio AB + * Copyright (C) 2004 Josh Beam + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include +#include + +#ifndef G_OS_WIN32 + +#include +#include + +#else /* G_OS_WIN32 */ + +#include + +#endif /* G_OS_WIN32 */ + +#include "lm-internals.h" +#include "lm-proxy.h" +#include "lm-debug.h" +#include "lm-utils.h" + +struct _LmProxy { + LmProxyType type; + gchar *server; + guint port; + gchar *username; + gchar *password; + guint io_watch; + + gint ref_count; +}; + +static void proxy_free (LmProxy *proxy); +static gboolean proxy_http_negotiate (LmProxy *proxy, + gint fd, + const gchar *server, + guint port); +static gboolean proxy_negotiate (LmProxy *proxy, + gint fd, + const gchar *server, + guint port); +static gboolean proxy_http_read_cb (GIOChannel *source, + GIOCondition condition, + gpointer data); +static gboolean proxy_read_cb (GIOChannel *source, + GIOCondition condition, + gpointer data); + +static void +proxy_free (LmProxy *proxy) +{ + g_free (proxy->server); + g_free (proxy->username); + g_free (proxy->password); + + g_free (proxy); +} + +static gboolean +proxy_http_negotiate (LmProxy *proxy, gint fd, const gchar *server, guint port) +{ + gchar *str; + + if (proxy->username && proxy->password) { + gchar *tmp1; + gchar *tmp2; + + tmp1 = g_strdup_printf ("%s:%s", + proxy->username, + proxy->password); + tmp2 = _lm_utils_base64_encode (tmp1); + g_free (tmp1); + + str = g_strdup_printf ("CONNECT %s:%u HTTP/1.1\r\nHost: %s:%u\r\nProxy-Authorization: Basic %s\r\n\r\n", + server, port, + server, port, + tmp2); + g_free (tmp2); + } else { + str = g_strdup_printf ("CONNECT %s:%u HTTP/1.1\r\nHost: %s:%u\r\n\r\n", + server, port, + server, port); + } + + send (fd, str, strlen (str), 0); + g_free (str); + return TRUE; +} + +/* returns TRUE when connected through proxy */ +static gboolean +proxy_http_read_cb (GIOChannel *source, GIOCondition condition, gpointer data) +{ + gchar buf[512]; + gsize bytes_read; + GError *error = NULL; + + g_io_channel_read_chars (source, buf, 512, &bytes_read, &error); + + if (bytes_read < 16) { + return FALSE; + } + + if (strncmp (buf, "HTTP/1.1 200", 12) != 0 && + strncmp (buf, "HTTP/1.0 200", 12) != 0) { + return FALSE; + } + + if (strncmp (buf + (bytes_read - 4), "\r\n\r\n", 4) != 0) { + return FALSE; + } + UNUSED_FORMAL_PARAM(condition); + UNUSED_FORMAL_PARAM(data); + return TRUE; +} + +static gboolean +proxy_read_cb (GIOChannel *source, GIOCondition condition, gpointer data) +{ + LmConnectData *connect_data; + LmConnection *connection; + LmProxy *proxy; + gboolean retval = FALSE; + + connect_data = (LmConnectData *) data; + connection = connect_data->connection; + proxy = lm_connection_get_proxy (connection); + + g_return_val_if_fail (proxy != NULL, FALSE); + + if (lm_connection_is_open (connection)) { + return FALSE; + } + + switch (lm_proxy_get_type (proxy)) { + default: + case LM_PROXY_TYPE_NONE: + g_assert_not_reached (); + break; + case LM_PROXY_TYPE_HTTP: + retval = proxy_http_read_cb (source, condition, data); + break; + } + + if (retval == TRUE) { + g_source_remove (proxy->io_watch); + _lm_socket_succeeded ((LmConnectData *) data); + } + //retval is false + //route call to connect_cb + else + { + _lm_socket_failed_with_error(connect_data, _LM_SOCK_EINVAL); + } + return FALSE; +} + +gboolean +proxy_negotiate (LmProxy *proxy, gint fd, const gchar *server, guint port) +{ + g_return_val_if_fail (proxy != NULL, FALSE); + + switch (proxy->type) { + case LM_PROXY_TYPE_NONE: + return TRUE; + case LM_PROXY_TYPE_HTTP: + return proxy_http_negotiate (proxy, fd, server, port); + default: + g_assert_not_reached (); + } + + return FALSE; +} + +gboolean +_lm_proxy_connect_cb (GIOChannel *source, GIOCondition condition, gpointer data) +{ + LmConnection *connection; + LmConnectData *connect_data; + LmProxy *proxy; + int error; + socklen_t len; + + connect_data = (LmConnectData *) data; + connection = connect_data->connection; + proxy = lm_connection_get_proxy (connection); + + g_return_val_if_fail (proxy != NULL, FALSE); + + if (condition == G_IO_ERR) { + len = sizeof (error); + _lm_sock_get_error (connect_data->fd, &error, &len); + _lm_socket_failed_with_error (connect_data, error); + return FALSE; + } else if (condition == G_IO_OUT) { + if (!proxy_negotiate (lm_connection_get_proxy (connection), connect_data->fd, lm_connection_get_server (connection), lm_connection_get_port (connection))) { + _lm_socket_failed (connect_data); + return FALSE; + } + + proxy->io_watch = g_io_add_watch (connect_data->io_channel, + G_IO_IN|G_IO_ERR, + (GIOFunc) proxy_read_cb, + connect_data); + } else { + g_assert_not_reached (); + } + UNUSED_FORMAL_PARAM(source); + return FALSE; +} + +/** + * lm_proxy_new + * @type: the type of the new proxy + * + * Creates a new Proxy. Used #lm_connection_set_proxy to make a connection + * user this proxy. + * + * Return value: a newly create proxy + **/ +EXPORT_C LmProxy * +lm_proxy_new (LmProxyType type) +{ + LmProxy *proxy; + + proxy = g_new0 (LmProxy, 1); + + proxy->ref_count = 1; + proxy->type = type; + + switch (proxy->type) { + case LM_PROXY_TYPE_HTTP: + proxy->port = 8000; + break; + default: + proxy->port = 0; + } + + return proxy; +} + +/** + * lm_proxy_new_with_server + * @type: the type of the new proxy + * @server: the proxy server + * @port: the proxy server port + * + * Creates a new Proxy. Use #lm_connection_set_proxy to make a connection + * user this proxy. + * + * Return value: a newly create proxy + **/ +EXPORT_C LmProxy * +lm_proxy_new_with_server (LmProxyType type, + const gchar *server, + guint port) +{ + LmProxy *proxy; + + proxy = lm_proxy_new (type); + lm_proxy_set_server (proxy, server); + lm_proxy_set_port (proxy, port); + + return proxy; +} + +/** + * lm_proxy_get_type + * @proxy: an #LmProxy + * + * Fetches the proxy type + * + * Return value: the type + **/ +EXPORT_C LmProxyType +lm_proxy_get_type (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, LM_PROXY_TYPE_NONE); + + return proxy->type; +} + +/** + * lm_proxy_set_type + * @proxy: an #LmProxy + * @type: an LmProxyType + * + * Sets the proxy type for @proxy to @type. + **/ +EXPORT_C void +lm_proxy_set_type (LmProxy *proxy, LmProxyType type) +{ + g_return_if_fail (proxy != NULL); + + proxy->type = type; +} + +/** + * lm_proxy_get_server: + * @proxy: an #LmProxy + * + * Fetches the server address that @proxy is using. + * + * Return value: the proxy server address + **/ +EXPORT_C const gchar * +lm_proxy_get_server (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, NULL); + + return proxy->server; +} + +/** + * lm_proxy_set_server: + * @proxy: an #LmProxy + * @server: Address of the proxy server + * + * Sets the server address for @proxy to @server. + **/ +EXPORT_C void +lm_proxy_set_server (LmProxy *proxy, const gchar *server) +{ + g_return_if_fail (proxy != NULL); + g_return_if_fail (server != NULL); + + g_free (proxy->server); + proxy->server = _lm_utils_hostname_to_punycode (server); +} + +/** + * lm_proxy_get_port: + * @proxy: an #LmProxy + * + * Fetches the port that @proxy is using. + * + * Return value: The port + **/ +EXPORT_C guint +lm_proxy_get_port (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, 0); + + return proxy->port; +} + +/** + * lm_proxy_set_port: + * @proxy: an #LmProxy + * @port: proxy server port + * + * Sets the server port that @proxy will be using. + **/ +EXPORT_C void +lm_proxy_set_port (LmProxy *proxy, guint port) +{ + g_return_if_fail (proxy != NULL); + + proxy->port = port; +} + +/** + * lm_proxy_get_username: + * @proxy: an #LmProxy + * + * Fetches the username that @proxy is using. + * + * Return value: the username + **/ +EXPORT_C const gchar * +lm_proxy_get_username (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, NULL); + + return proxy->username; +} + +/** + * lm_proxy_set_username: + * @proxy: an #LmProxy + * @username: Username + * + * Sets the username for @proxy to @username or %NULL to unset. + **/ +EXPORT_C void +lm_proxy_set_username (LmProxy *proxy, const gchar *username) +{ + g_return_if_fail (proxy != NULL); + + g_free (proxy->username); + + if (username) { + proxy->username = g_strdup (username); + } else { + proxy->username = NULL; + } +} +/** + * lm_proxy_get_password: + * @proxy: an #LmProxy + * + * Fetches the password that @proxy is using. + * + * Return value: the proxy password + **/ +EXPORT_C const gchar * +lm_proxy_get_password (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, NULL); + + return proxy->password; +} + +/** + * lm_proxy_set_password: + * @proxy: an #LmProxy + * @password: Password + * + * Sets the password for @proxy to @password or %NULL to unset. + **/ +EXPORT_C void +lm_proxy_set_password (LmProxy *proxy, const gchar *password) +{ + g_return_if_fail (proxy != NULL); + + g_free (proxy->password); + + if (password) { + proxy->password = g_strdup (password); + } else { + proxy->password = NULL; + } +} + +/** + * lm_proxy_ref: + * @proxy: an #LmProxy + * + * Adds a reference to @proxy. + * + * Return value: the proxy + **/ +EXPORT_C LmProxy * +lm_proxy_ref (LmProxy *proxy) +{ + g_return_val_if_fail (proxy != NULL, NULL); + + proxy->ref_count++; + return proxy; +} + +/** + * lm_proxy_unref + * @proxy: an #LmProxy + * + * Removes a reference from @proxy. When no more references are present + * @proxy is freed. + **/ +EXPORT_C void +lm_proxy_unref (LmProxy *proxy) +{ + g_return_if_fail (proxy != NULL); + + proxy->ref_count--; + + if (proxy->ref_count == 0) { + proxy_free (proxy); + } +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-sasl.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-sasl.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,876 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2007 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include +#include + +//hack - to get over compilation error +#include +#include "lm-sock.h" +#include "lm-debug.h" +#include "lm-error.h" +#include "lm-internals.h" +#include "lm-message-queue.h" +#include "lm-misc.h" +#include "lm-ssl-internals.h" +#include "lm-parser.h" +#include "lm-sha.h" +#include "lm-connection.h" +#include "lm-utils.h" +#include "lm-socket.h" +#include "lm-sasl.h" + +#include "md5.h" +#include "base64.h" + +typedef enum { + AUTH_TYPE_PLAIN = 1, + AUTH_TYPE_DIGEST = 2 +} AuthType; + +typedef enum { + SASL_AUTH_STATE_NO_MECH, + SASL_AUTH_STATE_PLAIN_STARTED, + SASL_AUTH_STATE_DIGEST_MD5_STARTED, + SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE, + SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE, +} SaslAuthState; + +struct _LmSASL { + LmConnection *connection; + AuthType auth_type; + SaslAuthState state; + gchar *username; + gchar *password; + gchar *server; + gchar *digest_md5_rspauth; + LmMessageHandler *features_cb; + LmMessageHandler *challenge_cb; + LmMessageHandler *success_cb; + LmMessageHandler *failure_cb; + + gboolean features_received; + gboolean start_auth; + + LmSASLResultHandler handler; +}; + +#define XMPP_NS_SASL_AUTH "urn:ietf:params:xml:ns:xmpp-sasl" + +static LmHandlerResult sasl_features_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + +static LmHandlerResult sasl_challenge_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + +static LmHandlerResult sasl_success_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + +static LmHandlerResult sasl_failure_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data); + + +/* DIGEST-MD5 mechanism code from libgibber */ + +static gchar * +sasl_strndup_unescaped (const gchar *str, gsize len) +{ + const gchar *s; + gchar *d; + gchar *ret; + + ret = g_malloc0 (len + 1); + for (s = str, d = ret ; s < (str + len) ; s++, d++) { + if (*s == '\\') s++; + *d = *s; + } + + return ret; +} + +static GHashTable * +sasl_digest_md5_challenge_to_hash (const gchar * challenge) +{ + const gchar *keystart, *keyend, *valstart; + const gchar *c = challenge; + gchar *key, *val; + GHashTable *result; + + result = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + do { + while (g_ascii_isspace(*c)) c++; + + keystart = c; + for (; *c != '\0' && *c != '='; c++); + + if (*c == '\0' || c == keystart) goto error; + + keyend = c; + c++; + + if (*c == '"') { + c++; + valstart = c; + for (; *c != '\0' && *c != '"'; c++); + if (*c == '\0' || c == valstart) goto error; + val = sasl_strndup_unescaped (valstart, c - valstart); + c++; + } else { + valstart = c; + for (; *c != '\0' && *c != ','; c++); + if (c == valstart) goto error; + val = g_strndup (valstart, c - valstart); + } + + key = g_strndup (keystart, keyend - keystart); + + g_hash_table_insert (result, key, val); + + if (*c == ',') c++; + } while (*c != '\0'); + + return result; +error: + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "Failed to parse challenge: %s", challenge);*/ + lm_verbose("[sasl_digest_md5_challenge_to_hash]:Failed to parse challenge: %s", challenge); + g_hash_table_destroy (result); + return NULL; +} + +static gchar * +sasl_md5_hex_hash (gchar *value, gsize len) +{ + md5_byte_t digest_md5[16]; + md5_state_t md5_calc; + GString *str; + int i; + + str = g_string_sized_new (32); + + md5_init (&md5_calc); + md5_append (&md5_calc, (const md5_byte_t *)value, len); + md5_finish (&md5_calc, digest_md5); + + for (i = 0 ; i < 16 ; i++) { + g_string_append_printf (str, "%02x", digest_md5[i]); + } + + return g_string_free (str, FALSE); +} + +static gchar * +sasl_digest_md5_generate_cnonce(void) +{ + /* RFC 2831 recommends the the nonce to be either hexadecimal or base64 with + * at least 64 bits of entropy */ +#define NR 8 + guint32 n[NR]; + int i; + + for (i = 0; i < NR; i++) { + n[i] = g_random_int(); + } + + return base64_encode ((gchar *)n, sizeof(n)); +} + +static gchar * +sasl_md5_prepare_response (LmSASL *sasl, GHashTable *challenge) +{ + GString *response; + const gchar *realm, *nonce; + gchar *a1, *a1h, *a2, *a2h, *kd, *kdh; + gchar *cnonce = NULL; + gchar *tmp; + md5_byte_t digest_md5[16]; + md5_state_t md5_calc; + gsize len; + + response = g_string_new (""); + + if (sasl->username == NULL || sasl->password == NULL) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: no username or password provided", G_STRFUNC);*/ + lm_verbose("[sasl_md5_prepare_response]: %s: no username or password provided", G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "no username/password provided"); + } + goto error; + } + + nonce = g_hash_table_lookup (challenge, "nonce"); + if (nonce == NULL || nonce == '\0') { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: server didn't provide a nonce in the challenge", + G_STRFUNC);*/ + lm_verbose("[sasl_md5_prepare_response]: %s: server didn't provide a nonce in the challenge", G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + goto error; + } + + cnonce = sasl_digest_md5_generate_cnonce (); + + /* FIXME challenge can contain multiple realms */ + realm = g_hash_table_lookup (challenge, "realm"); + if (realm == NULL) { + realm = sasl->server; + } + + /* FIXME properly escape values */ + g_string_append_printf (response, "username=\"%s\"", sasl->username); + g_string_append_printf (response, ",realm=\"%s\"", realm); + g_string_append_printf (response, ",digest-uri=\"xmpp/%s\"", realm); + g_string_append_printf (response, ",nonce=\"%s\",nc=00000001", nonce); + g_string_append_printf (response, ",cnonce=\"%s\"", cnonce); + /* FIXME should check if auth is in the cop challenge val */ + g_string_append_printf (response, ",qop=auth,charset=utf-8"); + + tmp = g_strdup_printf ("%s:%s:%s", + sasl->username, realm, sasl->password); + md5_init (&md5_calc); + md5_append (&md5_calc, (const md5_byte_t *)tmp, strlen(tmp)); + md5_finish (&md5_calc, digest_md5); + g_free (tmp); + + a1 = g_strdup_printf ("0123456789012345:%s:%s", nonce, cnonce); + len = strlen (a1); + memcpy (a1, digest_md5, 16); + a1h = sasl_md5_hex_hash (a1, len); + + a2 = g_strdup_printf ("AUTHENTICATE:xmpp/%s", realm); + a2h = sasl_md5_hex_hash (a2, strlen(a2)); + + kd = g_strdup_printf ("%s:%s:00000001:%s:auth:%s", + a1h, nonce, cnonce, a2h); + kdh = sasl_md5_hex_hash (kd, strlen(kd)); + g_string_append_printf (response, ",response=%s", kdh); + + g_free (kd); + g_free (kdh); + g_free (a2); + g_free (a2h); + + /* Calculate the response we expect from the server */ + a2 = g_strdup_printf (":xmpp/%s", realm); + a2h = sasl_md5_hex_hash (a2, strlen(a2)); + + kd = g_strdup_printf ("%s:%s:00000001:%s:auth:%s", a1h, nonce, cnonce, a2h); + g_free (sasl->digest_md5_rspauth); + sasl->digest_md5_rspauth = sasl_md5_hex_hash (kd, strlen(kd)); + + g_free (a1); + g_free (a1h); + g_free (a2); + g_free (a2h); + g_free (kd); + +out: + g_free (cnonce); + if (response) { + return g_string_free (response, FALSE); + } else { + return NULL; + } + +error: + g_string_free (response, TRUE); + response = NULL; + goto out; +} + +static gboolean +sasl_digest_md5_send_initial_response (LmSASL *sasl, GHashTable *challenge) +{ + LmMessage *msg; + gchar *response; + gchar *response64; + int result; + + response = sasl_md5_prepare_response(sasl, challenge); + if (response == NULL) { + return FALSE; + } + + response64 = base64_encode ((gchar *)response, strlen(response)); + + msg = lm_message_new (NULL, LM_MESSAGE_TYPE_RESPONSE); + lm_message_node_set_attributes (msg->node, + "xmlns", XMPP_NS_SASL_AUTH, + NULL); + lm_message_node_set_value (msg->node, response64); + + result = lm_connection_send (sasl->connection, msg, NULL); + + g_free (response); + g_free (response64); + lm_message_unref (msg); + + if (!result) { + return FALSE; + } + + sasl->state = SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE; + + return TRUE; +} + +static gboolean +sasl_digest_md5_check_server_response(LmSASL *sasl, GHashTable *challenge) +{ + LmMessage *msg; + const gchar *rspauth; + int result; + + rspauth = g_hash_table_lookup (challenge, "rspauth"); + if (rspauth == NULL) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + "%s: server sent an invalid reply (no rspauth)\n", + G_STRFUNC);*/ + lm_verbose("%s: server sent an invalid reply (no rspauth)\n",G_STRFUNC); + + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + TRUE, "server error"); + } + return FALSE; + } + + if (strcmp (sasl->digest_md5_rspauth, rspauth) != 0) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + "%s: server sent an invalid reply (rspauth not matching)\n", + G_STRFUNC);*/ + lm_verbose("%s: server sent an invalid reply (rspauth not matching)\n", + G_STRFUNC); + + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + TRUE, "server error"); + } + return FALSE; + } + + msg = lm_message_new (NULL, LM_MESSAGE_TYPE_RESPONSE); + lm_message_node_set_attributes (msg->node, + "xmlns", XMPP_NS_SASL_AUTH, + NULL); + + result = lm_connection_send (sasl->connection, msg, NULL); + lm_message_unref (msg); + + if (!result) { + g_warning ("Failed to send SASL response\n"); + return FALSE; + } + + sasl->state = SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE; + + return TRUE; +} + +static gboolean +sasl_digest_md5_handle_challenge (LmSASL *sasl, LmMessageNode *node) +{ + const gchar *encoded; + gchar *challenge; + gsize len; + GHashTable *h; + + encoded = lm_message_node_get_value (node); + if (!encoded) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: got empty challenge!", G_STRFUNC);*/ + lm_verbose("[sasl_digest_md5_handle_challenge]: %s: got empty challenge!", G_STRFUNC); + return FALSE; + } + + challenge = (gchar *) base64_decode (encoded, &len); + h = sasl_digest_md5_challenge_to_hash (challenge); + g_free(challenge); + + if (!h) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: server sent an invalid challenge", G_STRFUNC);*/ + lm_verbose("[sasl_digest_md5_handle_challenge]: %s: server sent an invalid challenge", G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + return FALSE; + } + + switch (sasl->state) { + case SASL_AUTH_STATE_DIGEST_MD5_STARTED: + sasl_digest_md5_send_initial_response (sasl, h); + break; + case SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE: + sasl_digest_md5_check_server_response (sasl, h); + break; + default: + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: server sent a challenge at the wrong time", + G_STRFUNC);*/ + lm_verbose( "[sasl_digst_md5_handle_challenge]: %s: server sent a challenge at the wrong time", + G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + + return FALSE; + } + + g_hash_table_destroy(h); + + return TRUE; +} + +static LmHandlerResult +sasl_challenge_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmSASL *sasl; + const gchar *ns; + + ns = lm_message_node_get_attribute (message->node, "xmlns"); + if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + sasl = (LmSASL *) user_data; + + switch (sasl->auth_type) { + case AUTH_TYPE_PLAIN: + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + "%s: server sent challenge for PLAIN mechanism", + G_STRFUNC);*/ + lm_verbose("[sasl_challenge_cb]: %s: server sent challenge for PLAIN mechanism",G_STRFUNC); + + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + break; + case AUTH_TYPE_DIGEST: + sasl_digest_md5_handle_challenge (sasl, message->node); + break; + default: + g_warning ("Wrong auth type"); + break; + } + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(connection); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmHandlerResult +sasl_success_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmSASL *sasl; + const gchar *ns; + + ns = lm_message_node_get_attribute (message->node, "xmlns"); + if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + sasl = (LmSASL *) user_data; + + switch (sasl->auth_type) { + case AUTH_TYPE_PLAIN: + if (sasl->state != SASL_AUTH_STATE_PLAIN_STARTED) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: server sent success before finishing auth", + G_STRFUNC);*/ + lm_verbose("[sasl_success_cb]: %s: server sent success before finishing auth", G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + } + break; + case AUTH_TYPE_DIGEST: + if (sasl->state != SASL_AUTH_STATE_DIGEST_MD5_SENT_AUTH_RESPONSE && + sasl->state != SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: server sent success before finishing auth", + G_STRFUNC);*/ + lm_verbose("[sasl_success_cb]: %s: server sent success before finishing auth", G_STRFUNC); + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, + FALSE, "server error"); + } + } + break; + default: + g_warning ("Wrong auth type"); + break; + } + +/* g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: SASL authentication successful", G_STRFUNC);*/ + lm_verbose("[sasl_success_cb]: %s: SASL authentication successful", G_STRFUNC); + + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, TRUE, NULL); + } + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(connection); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + +} + +static LmHandlerResult +sasl_failure_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmSASL *sasl; + const gchar *ns; + const gchar *reason = "unknown reason"; + lm_verbose("[sasl_failure_cb]: inside sasl_failure_cb\n"); + ns = lm_message_node_get_attribute (message->node, "xmlns"); + if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + sasl = (LmSASL *) user_data; + + if (message->node->children) { + const gchar *r; + + r = lm_message_node_get_value (message->node->children); + if (r) { + reason = r; + } + } + lm_verbose("[sasl_failure_cb]: %s: SASL authentication failed: %s\n", G_STRFUNC, reason); + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: SASL authentication failed: %s", G_STRFUNC, reason);*/ + + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, FALSE, reason); + } + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(connection); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + + +static gboolean +sasl_start (LmSASL *sasl) +{ + LmMessage *auth_msg; + gboolean result; + const char *mech = NULL; + + auth_msg = lm_message_new (NULL, LM_MESSAGE_TYPE_AUTH); + lm_verbose("[sasl_start]: inside sasl_start\n"); + if (sasl->auth_type == AUTH_TYPE_PLAIN) { + GString *str; + gchar *cstr; + + str = g_string_new (""); + + mech = "PLAIN"; + sasl->state = SASL_AUTH_STATE_PLAIN_STARTED; + lm_verbose("[sasl_start]: inside sasl_start: auth type is PLAIN\n"); + if (sasl->username == NULL || sasl->password == NULL) { + lm_verbose("[sasl_start]: no username or password provided\n"); + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: no username or password provided", + G_STRFUNC);*/ + if (sasl->handler) { + sasl->handler (sasl, sasl->connection, FALSE, "no username/password provided"); + } + + return FALSE; + } + + g_string_append_c (str, '\0'); + g_string_append (str, sasl->username); + g_string_append_c (str, '\0'); + g_string_append (str, sasl->password); + cstr = base64_encode ((gchar *)str->str, str->len); + + lm_message_node_set_value (auth_msg->node, cstr); + + g_string_free (str, TRUE); + g_free (cstr); + + /* Here we say the Google magic word. Bad Google. */ + lm_message_node_set_attributes (auth_msg->node, + "xmlns:ga", "http://www.google.com/talk/protocol/auth", + "ga:client-uses-full-bind-result", "true", + NULL); + + } + else if (sasl->auth_type == AUTH_TYPE_DIGEST) { + mech = "DIGEST-MD5"; + sasl->state = SASL_AUTH_STATE_DIGEST_MD5_STARTED; + } + + lm_message_node_set_attributes (auth_msg->node, + "xmlns", XMPP_NS_SASL_AUTH, + "mechanism", mech, + NULL); + + result = lm_connection_send (sasl->connection, auth_msg, NULL); + lm_message_unref (auth_msg); + + if (!result) { + return FALSE; + } + + return TRUE; +} + +static gboolean +sasl_set_auth_type (LmSASL *sasl, LmMessageNode *mechanisms) +{ + LmMessageNode *m; + const gchar *ns; + + sasl->auth_type = 0; + lm_verbose("[sasl_set_auth_type]: inside sasl_set_auth_type\n"); + ns = lm_message_node_get_attribute (mechanisms, "xmlns"); + if (!ns || strcmp (ns, XMPP_NS_SASL_AUTH) != 0) { + return FALSE; + } + + for (m = mechanisms->children; m; m = m->next) { + const gchar *name; + + name = lm_message_node_get_value (m); + + if (!name) { + continue; + } + if (strcmp (name, "PLAIN") == 0) { + sasl->auth_type |= AUTH_TYPE_PLAIN; + continue; + } + if (strcmp (name, "DIGEST-MD5") == 0) { + sasl->auth_type |= AUTH_TYPE_DIGEST; + continue; + } + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: unknown SASL auth mechanism: %s", G_STRFUNC, name);*/ + lm_verbose ("[sasl_set_auth_type]: %s: unknown SASL auth mechanism: %s", G_STRFUNC, name); + } + + return TRUE; +} + +static gboolean +sasl_authenticate (LmSASL *sasl) +{ + lm_verbose ("[sasl_authenticate]: inside sasl_authenticate\n"); + if (sasl->auth_type == 0) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, + "%s: no supported SASL auth mechanisms found", + G_STRFUNC);*/ + lm_verbose ("[sasl_authenticate]: %s: no supported SASL auth mechanisms found",G_STRFUNC); + + return FALSE; + } + + /* Prefer DIGEST */ + if (sasl->auth_type & AUTH_TYPE_DIGEST) { + sasl->auth_type = AUTH_TYPE_DIGEST; + return sasl_start (sasl); + } + else if (sasl->auth_type & AUTH_TYPE_PLAIN) { + sasl->auth_type = AUTH_TYPE_PLAIN; + return sasl_start (sasl); + } + + return FALSE; +} + +static LmHandlerResult +sasl_features_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + LmMessageNode *mechanisms; + LmSASL *sasl; + + lm_verbose ("\n[sasl_feature_cb]: Stream features received\n\n"); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SASL, "Stream features received\n"); + mechanisms = lm_message_node_find_child (message->node, "mechanisms"); + if (!mechanisms) { + gchar* childname = NULL; + lm_message_node_get_child(message->node,childname); + lm_verbose("[sasl_feature_cb]: Child name of stream:features %s\n", message->node->children->name); + lm_verbose("[sasl_feature_cb]: Child pointer of stream:features %u\n", message->node->children); + lm_verbose ("[sasl_feature_cb]: mechanisms empty:LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS \n"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + lm_verbose("[sasl_features_cb]: Mechanisms not null\n"); + + sasl = (LmSASL *) user_data; + sasl->features_received = TRUE; + + sasl_set_auth_type (sasl, mechanisms); + + if (sasl->start_auth) { + lm_verbose ("[sasl_feature_cb]: Going to call sasl_authenticate\n"); + sasl_authenticate (sasl); + } + UNUSED_FORMAL_PARAM(handler); + UNUSED_FORMAL_PARAM(connection); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + +LmSASL * +lm_sasl_new (LmConnection *connection) +{ + LmSASL *sasl; + + sasl = g_new0 (LmSASL, 1); + + sasl->connection = connection; + sasl->features_received = FALSE; + sasl->start_auth = FALSE; + + sasl->features_cb = lm_message_handler_new (sasl_features_cb, + sasl, + NULL); + lm_verbose ("[lm_sasl_new]: inside \n"); + lm_connection_register_message_handler (connection, + sasl->features_cb, + LM_MESSAGE_TYPE_STREAM_FEATURES, + LM_HANDLER_PRIORITY_LAST); + return sasl; +} + +void +lm_sasl_authenticate (LmSASL *sasl, + const gchar *username, + const gchar *password, + const gchar *server, + LmSASLResultHandler handler) +{ + sasl->username = g_strdup (username); + sasl->password = g_strdup (password); + sasl->server = g_strdup (server); + sasl->handler = handler; + + sasl->challenge_cb = lm_message_handler_new (sasl_challenge_cb, + sasl, + NULL); + lm_connection_register_message_handler (sasl->connection, + sasl->challenge_cb, + LM_MESSAGE_TYPE_CHALLENGE, + LM_HANDLER_PRIORITY_FIRST); + + sasl->success_cb = lm_message_handler_new (sasl_success_cb, + sasl, + NULL); + lm_connection_register_message_handler (sasl->connection, + sasl->success_cb, + LM_MESSAGE_TYPE_SUCCESS, + LM_HANDLER_PRIORITY_FIRST); + + sasl->failure_cb = lm_message_handler_new (sasl_failure_cb, + sasl, + NULL); + lm_connection_register_message_handler (sasl->connection, + sasl->failure_cb, + LM_MESSAGE_TYPE_FAILURE, + LM_HANDLER_PRIORITY_FIRST); + + if (sasl->features_received) { + lm_verbose("[lm_sasl_authenticate]: calling sasl_authenticate\n"); + sasl_authenticate (sasl); + } else { + sasl->start_auth = TRUE; + } +} + +void +lm_sasl_free (LmSASL *sasl) +{ + g_return_if_fail (sasl != NULL); + + g_free (sasl->username); + g_free (sasl->password); + g_free (sasl->server); + + if (sasl->features_cb) { + lm_connection_unregister_message_handler (sasl->connection, + sasl->features_cb, + LM_MESSAGE_TYPE_STREAM_FEATURES); + } + + if (sasl->challenge_cb) { + lm_connection_unregister_message_handler (sasl->connection, + sasl->challenge_cb, + LM_MESSAGE_TYPE_CHALLENGE); + } + + if (sasl->success_cb) { + lm_connection_unregister_message_handler (sasl->connection, + sasl->success_cb, + LM_MESSAGE_TYPE_SUCCESS); + } + + if (sasl->failure_cb) { + lm_connection_unregister_message_handler (sasl->connection, + sasl->failure_cb, + LM_MESSAGE_TYPE_FAILURE); + } + + g_free (sasl); +} + + +void +lm_sasl_get_auth_params (LmSASL *sasl, const gchar **username, + const gchar **password) +{ + *username = sasl->username; + *password = sasl->password; +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-sha.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-sha.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,635 @@ +/*- + * Copyright (c) 2001, 2002 Allan Saddi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * Define WORDS_BIGENDIAN if compiling on a big-endian architecture. + * + * Define SHA1_TEST to test the implementation using the NIST's + * sample messages. The output should be: + * + * a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d + * 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1 + * 34aa973c d4c4daa4 f61eeb2b dbad2731 6534016f + */ + +#ifdef HAVE_CONFIG_H +#include +#endif /* HAVE_CONFIG_H */ + +#include +#include +#include + +#include "lm-sha.h" + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" +GET_STATIC_ARRAY_FROM_TLS(ret_val, lm_sha, gchar) + #define ret_val (GET_WSD_VAR_NAME(ret_val, lm_sha, s)()) +#endif + + + +#define SHA1_HASH_SIZE 20 + +/* Hash size in 32-bit words */ +#define SHA1_HASH_WORDS 5 + +struct _SHA1Context { + guint64 totalLength; + guint32 hash[SHA1_HASH_WORDS]; + guint32 bufferLength; + union { + guint32 words[16]; + guint8 bytes[64]; + } buffer; +}; + +typedef struct _SHA1Context SHA1Context; + +#ifdef __cplusplus +extern "C" { +#endif + +static void SHA1Init (SHA1Context *sc); +static void SHA1Update (SHA1Context *sc, const void *udata, guint32 len); +static void SHA1Final (SHA1Context *sc, guint8 hash[SHA1_HASH_SIZE]); + +#ifdef __cplusplus +} +#endif + +#ifndef lint +static const char rcsid[] = + "$Id$"; +#endif /* !lint */ + +#define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) +#define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) + +#define F_0_19(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define F_20_39(x, y, z) ((x) ^ (y) ^ (z)) +#define F_40_59(x, y, z) (((x) & ((y) | (z))) | ((y) & (z))) +#define F_60_79(x, y, z) ((x) ^ (y) ^ (z)) + +#define DO_ROUND(F, K) { \ + temp = ROTL(a, 5) + F(b, c, d) + e + *(W++) + K; \ + e = d; \ + d = c; \ + c = ROTL(b, 30); \ + b = a; \ + a = temp; \ +} + +#define K_0_19 0x5a827999L +#define K_20_39 0x6ed9eba1L +#define K_40_59 0x8f1bbcdcL +#define K_60_79 0xca62c1d6L + +#ifndef RUNTIME_ENDIAN + +#ifdef WORDS_BIGENDIAN + +#define BYTESWAP(x) (x) +#define BYTESWAP64(x) (x) + +#else /* WORDS_BIGENDIAN */ + +#define BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \ + (ROTL((x), 8) & 0x00ff00ffL)) +#define BYTESWAP64(x) _byteswap64(x) + +static inline guint64 _byteswap64(guint64 x) +{ + guint32 a = x >> 32; + guint32 b = (guint32) x; + return ((guint64) BYTESWAP(b) << 32) | (guint64) BYTESWAP(a); +} + +#endif /* WORDS_BIGENDIAN */ + +#else /* !RUNTIME_ENDIAN */ + +static int littleEndian; + +#define BYTESWAP(x) _byteswap(x) +#define BYTESWAP64(x) _byteswap64(x) + +#define _BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \ + (ROTL((x), 8) & 0x00ff00ffL)) +#define _BYTESWAP64(x) __byteswap64(x) + +static inline guint64 __byteswap64(guint64 x) +{ + guint32 a = x >> 32; + guint32 b = (guint32) x; + return ((guint64) _BYTESWAP(b) << 32) | (guint64) _BYTESWAP(a); +} + +static inline guint32 _byteswap(guint32 x) +{ + if (!littleEndian) + return x; + else + return _BYTESWAP(x); +} + +static inline guint64 _byteswap64(guint64 x) +{ + if (!littleEndian) + return x; + else + return _BYTESWAP64(x); +} + +static inline void setEndian(void) +{ + union { + guint32 w; + guint8 b[4]; + } endian; + + endian.w = 1L; + littleEndian = endian.b[0] != 0; +} + +#endif /* !RUNTIME_ENDIAN */ + +static const guint8 padding[64] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static void +SHA1Init (SHA1Context *sc) +{ +#ifdef RUNTIME_ENDIAN + setEndian (); +#endif /* RUNTIME_ENDIAN */ + +#ifdef G_OS_WIN32 + sc->totalLength = 0L; +#else + sc->totalLength = 0LL; +#endif + sc->hash[0] = 0x67452301L; + sc->hash[1] = 0xefcdab89L; + sc->hash[2] = 0x98badcfeL; + sc->hash[3] = 0x10325476L; + sc->hash[4] = 0xc3d2e1f0L; + sc->bufferLength = 0L; +} + +static void +burnStack (int size) +{ + char buf[128]; + + memset (buf, 0, sizeof (buf)); + size -= sizeof (buf); + if (size > 0) + burnStack (size); +} + +static void +SHA1Guts (SHA1Context *sc, const guint32 *cbuf) +{ + guint32 buf[80]; + guint32 *W, *W3, *W8, *W14, *W16; + guint32 a, b, c, d, e, temp; + int i; + + W = buf; + + for (i = 15; i >= 0; i--) { + *(W++) = BYTESWAP(*cbuf); + cbuf++; + } + + W16 = &buf[0]; + W14 = &buf[2]; + W8 = &buf[8]; + W3 = &buf[13]; + + for (i = 63; i >= 0; i--) { + *W = *(W3++) ^ *(W8++) ^ *(W14++) ^ *(W16++); + *W = ROTL(*W, 1); + W++; + } + + a = sc->hash[0]; + b = sc->hash[1]; + c = sc->hash[2]; + d = sc->hash[3]; + e = sc->hash[4]; + + W = buf; + +#ifndef SHA1_UNROLL +#define SHA1_UNROLL 20 +#endif /* !SHA1_UNROLL */ + +#if SHA1_UNROLL == 1 + for (i = 19; i >= 0; i--) + DO_ROUND(F_0_19, K_0_19); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_20_39, K_20_39); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_40_59, K_40_59); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_60_79, K_60_79); +#elif SHA1_UNROLL == 2 + for (i = 9; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 4 + for (i = 4; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 5 + for (i = 3; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 10 + for (i = 1; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 20 + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); +#else /* SHA1_UNROLL */ +#error SHA1_UNROLL must be 1, 2, 4, 5, 10 or 20! +#endif + + sc->hash[0] += a; + sc->hash[1] += b; + sc->hash[2] += c; + sc->hash[3] += d; + sc->hash[4] += e; +} + +static void +SHA1Update (SHA1Context *sc, const void *udata, guint32 len) +{ + guint32 bufferBytesLeft; + guint32 bytesToCopy; + int needBurn = 0; + guint8 *data = (guint8 *)udata; + +#ifdef SHA1_FAST_COPY + if (sc->bufferLength) { + bufferBytesLeft = 64L - sc->bufferLength; + + bytesToCopy = bufferBytesLeft; + if (bytesToCopy > len) + bytesToCopy = len; + + memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); + + sc->totalLength += bytesToCopy * 8L; + + sc->bufferLength += bytesToCopy; + data += bytesToCopy; + len -= bytesToCopy; + + if (sc->bufferLength == 64L) { + SHA1Guts (sc, sc->buffer.words); + needBurn = 1; + sc->bufferLength = 0L; + } + } + + while (len > 63) { + sc->totalLength += 512L; + + SHA1Guts (sc, data); + needBurn = 1; + + data += 64L; + len -= 64L; + } + + if (len) { + memcpy (&sc->buffer.bytes[sc->bufferLength], data, len); + + sc->totalLength += len * 8L; + + sc->bufferLength += len; + } +#else /* SHA1_FAST_COPY */ + while (len) { + bufferBytesLeft = 64L - sc->bufferLength; + + bytesToCopy = bufferBytesLeft; + if (bytesToCopy > len) + bytesToCopy = len; + + memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); + + sc->totalLength += bytesToCopy * 8L; + + sc->bufferLength += bytesToCopy; + data += bytesToCopy; + len -= bytesToCopy; + + if (sc->bufferLength == 64L) { + SHA1Guts (sc, sc->buffer.words); + needBurn = 1; + sc->bufferLength = 0L; + } + } +#endif /* SHA1_FAST_COPY */ + + if (needBurn) + burnStack (sizeof (guint32[86]) + sizeof (guint32 *[5]) + sizeof (int)); +} + +static void +SHA1Final (SHA1Context *sc, guint8 hash[SHA1_HASH_SIZE]) +{ + guint32 bytesToPad; + guint64 lengthPad; + int i; + + bytesToPad = 120L - sc->bufferLength; + if (bytesToPad > 64L) + bytesToPad -= 64L; + + lengthPad = BYTESWAP64(sc->totalLength); + + SHA1Update (sc, padding, bytesToPad); + SHA1Update (sc, &lengthPad, 8L); + + if (hash) { + for (i = 0; i < SHA1_HASH_WORDS; i++) { +#ifdef SHA1_FAST_COPY + *((guint32 *) hash) = BYTESWAP(sc->hash[i]); +#else /* SHA1_FAST_COPY */ + hash[0] = (guint8) (sc->hash[i] >> 24); + hash[1] = (guint8) (sc->hash[i] >> 16); + hash[2] = (guint8) (sc->hash[i] >> 8); + hash[3] = (guint8) sc->hash[i]; +#endif /* SHA1_FAST_COPY */ + hash += 4; + } + } +} + +#ifdef G_OS_WIN32 +#define snprintf _snprintf +#endif + +const gchar * +lm_sha_hash (const gchar *str) +{ +#ifndef EMULATOR + static gchar ret_val[41]; +#endif + SHA1Context ctx; + guint8 hash[SHA1_HASH_SIZE]; + gchar *ch; + guint i; + + SHA1Init (&ctx); + SHA1Update (&ctx, str, strlen (str)); + SHA1Final (&ctx, hash); + + ch = ret_val; + + for (i = 0; i < SHA1_HASH_SIZE; ++i) { + snprintf (ch, 3, "%02x", hash[i]); + ch += 2; + } + + return (const gchar *) ret_val; +} diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-sock.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-sock.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,392 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +//#include +//#include + +#ifndef G_OS_WIN32 +//#include + +#include +#include +#include +#include +#include +#include +//#include +//#include +#include +#include +// hack - to compile without the error of n_long not defined +#define LM_SHUTDOWN SHUT_RDWR + +#else /* G_OS_WIN32 */ + +#include +#define LM_SHUTDOWN SD_BOTH + +#endif /* G_OS_WIN32 */ + +#include "lm-internals.h" +#include "lm-connection.h" +#include "lm-sock.h" +#include "lm-debug.h" + +#define IPV6_MAX_ADDRESS_LEN 46 /* 45 + '\0' */ + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" + +GET_GLOBAL_VAR_FROM_TLS(initialised,lm_sock,gboolean) + #define initialised (*GET_WSD_VAR_NAME(initialised,lm_sock,g)()) + +#else +static gboolean initialised = FALSE; +#endif +gboolean +_lm_sock_library_init (void) +{ +#ifdef G_OS_WIN32 + WORD version; + WSADATA data; + int error; +#endif /* G_OS_WIN32 */ + + if (initialised) { + return TRUE; + } + + lm_verbose ("Socket library initialising...\n"); + +#ifdef G_OS_WIN32 + lm_verbose ("Checking for winsock 2.0 or above...\n"); + + version = MAKEWORD (2, 0); + + error = WSAStartup (version, &data); + if (error != 0) { + g_printerr ("WSAStartup() failed, error:%d\n", error); + return FALSE; + } + + /* Confirm that the WinSock DLL supports 2.0. + * Note that if the DLL supports versions greater + * than 2.0 in addition to 2.0, it will still return + * 2.0 in wVersion since that is the version we + * requested. + */ + if (LOBYTE (data.wVersion) != 2 || + HIBYTE (data.wVersion) != 0) { + /* Tell the user that we could not find a usable + * WinSock DLL. + */ + g_printerr ("Socket library version is not sufficient!\n"); + WSACleanup (); + return FALSE; + } +#endif /* G_OS_WIN32 */ + + initialised = TRUE; + + return TRUE; +} + +void +_lm_sock_library_shutdown (void) +{ + if (!initialised) { + return; + } + + lm_verbose ("Socket library shutting down...\n"); + +#ifdef G_OS_WIN32 + WSACleanup (); +#endif /* G_OS_WIN32 */ + + initialised = FALSE; +} + +void +_lm_sock_set_blocking (LmSocketT sock, + gboolean block) +{ + int res; + +#ifndef G_OS_WIN32 + res = fcntl (sock, F_SETFL, block ? 0 : O_NONBLOCK); +#else /* G_OS_WIN32 */ + u_long mode = (block ? 0 : 1); + res = ioctlsocket (sock, FIONBIO, &mode); +#endif /* G_OS_WIN32 */ + + if (res != 0) { + // g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + // "Could not set connection to be %s\n", + // block ? "blocking" : "non-blocking"); + lm_verbose ("[_lm_sock_set_blocking]: Could not set connection to be %s\n", + block ? "blocking" : "non-blocking"); + } +} + +void +_lm_sock_shutdown (LmSocketT sock) +{ + shutdown (sock, LM_SHUTDOWN); +} + +void +_lm_sock_close (LmSocketT sock) +{ +#ifndef G_OS_WIN32 + close (sock); +#else /* G_OS_WIN32 */ + closesocket (sock); +#endif /* G_OS_WIN32 */ +} + +LmSocketT +_lm_sock_makesocket (int af, + int type, + int protocol) +{ + int optval = 1; + int sock_fd = -1; + unsigned int optlen = sizeof(optval); + sock_fd = socket (af, type, protocol); + setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR|SO_REUSEPORT,&optval,optlen); + + return (LmSocketT)sock_fd; +} + +int +_lm_sock_connect (LmSocketT sock, + const struct sockaddr *name, + int namelen) +{ + return connect (sock, name, namelen); +} + +gboolean +_lm_sock_is_blocking_error (int err) +{ +#ifndef G_OS_WIN32 + return (err == _LM_SOCK_EINPROGRESS); +#else /* G_OS_WIN32 */ + return (err == _LM_SOCK_EINPROGRESS || + err == _LM_SOCK_EWOULDBLOCK || + err == _LM_SOCK_EINVAL); +#endif /* G_OS_WIN32 */ +} + +gboolean +_lm_sock_is_blocking_success (int err) +{ + //Bug fixed by MRT from week 50 devlong onwards + return (err == _LM_SOCK_EEXISTS); + //Error EEXIST = 17 is not expected here. But It should be mrt error 107 + //fix take later + //Before week 50 SDK + //return (err == _LM_SOCK_EALREADY || err == _LM_SOCK_EISCONN); +} + +int +_lm_sock_get_last_error (void) +{ +#ifndef G_OS_WIN32 + return errno; +#else /* G_OS_WIN32 */ + return WSAGetLastError (); +#endif /* G_OS_WIN32 */ +} + +void +_lm_sock_get_error (LmSocketT sock, + void *error, + socklen_t *len) +{ + getsockopt (sock, SOL_SOCKET, SO_ERROR, (void*) error, len); +} + +const gchar * +_lm_sock_get_error_str (int err) +{ +#ifndef G_OS_WIN32 + return strerror (err); +#else /* G_OS_WIN32 */ + switch (err) { + case WSAEINTR: return _("Connect interrupted and canceled"); + case WSAEACCES: return _("Permission denied"); + case WSAEFAULT: return _("Bad address"); + case WSAEINVAL: return _("Invalid argument"); + case WSAEMFILE: return _("Too many open sockets"); + case WSAEWOULDBLOCK: return _("Resource temporarily unavailable"); + case WSAEINPROGRESS: return _("Operation now in progress"); + case WSAEALREADY: return _("Operation already in progress"); + case WSAENOTSOCK: return _("Socket operation on nonsocket"); + case WSAEDESTADDRREQ: return _("Destination address required"); + case WSAEMSGSIZE: return _("Message too long"); + case WSAEPROTOTYPE: return _("Protocol wrong type for socket"); + case WSAENOPROTOOPT: return _("Bad protocol option"); + case WSAEPROTONOSUPPORT: return _("Protocol not supported"); + case WSAESOCKTNOSUPPORT: return _("Socket type not supported"); + case WSAEOPNOTSUPP: return _("Operation not supported"); + case WSAEPFNOSUPPORT: return _("Protocol family not supported"); + case WSAEAFNOSUPPORT: return _("Address family not supported by protocol family"); + case WSAEADDRINUSE: return _("Address already in use"); + case WSAEADDRNOTAVAIL: return _("Can not assign requested address"); + case WSAENETDOWN: return _("Network is down"); + case WSAENETUNREACH: return _("Network is unreachable"); + case WSAENETRESET: return _("Network dropped connection on reset"); + case WSAECONNABORTED: return _("Software caused connection abort"); + case WSAECONNRESET: return _("Connection reset by peer"); + case WSAENOBUFS: return _("No buffer space available"); + case WSAEISCONN: return _("Socket is already connected"); + case WSAENOTCONN: return _("Socket is not connected"); + case WSAESHUTDOWN: return _("Can not send after socket shutdown"); + case WSAETIMEDOUT: return _("Connection timed out"); + case WSAECONNREFUSED: return _("Connection refused"); + case WSAEHOSTDOWN: return _("Host is down"); + case WSAEHOSTUNREACH: return _("No route to host"); + case WSAEPROCLIM: return _("Too many processes"); + case WSASYSNOTREADY: return _("Network subsystem is unavailable"); + case WSAVERNOTSUPPORTED: return _("Winsock library version is out of range "); + case WSANOTINITIALISED: return _("Successful WSAStartup not yet performed"); + case WSAEDISCON: return _("Graceful shutdown in progress"); + case WSATYPE_NOT_FOUND: return _("Class type not found"); + case WSAHOST_NOT_FOUND: return _("Host not found"); + case WSATRY_AGAIN: return _("Nonauthoritative host not found"); + case WSANO_RECOVERY: return _("This is a nonrecoverable error"); + case WSANO_DATA: return _("Valid name, no data record of requested type"); + case WSA_INVALID_HANDLE: return _("Specified event object handle is invalid"); + case WSA_INVALID_PARAMETER: return _("One or more parameters are invalid"); + case WSA_IO_INCOMPLETE: return _("Overlapped I/O event object no in signaled state"); + case WSA_IO_PENDING: return _("Overlapped operations will complete later"); + case WSA_NOT_ENOUGH_MEMORY: return _("Insufficient memory available"); + case WSA_OPERATION_ABORTED: return _("Overlapped operation aborted"); + /* os dependent */ + case WSASYSCALLFAILURE: return _("System call failure"); + } + + return _("Unknown"); +#endif /* G_OS_WIN32 */ +} + +const gchar * +_lm_sock_addrinfo_get_error_str (int err) +{ + switch (err) { + case EAI_AGAIN: + return ("The nameserver failed to return an " + "address, try again later"); + case EAI_BADFLAGS: + return ("Internal error trying to obtain remote address"); + case EAI_FAIL: + return ("The nameserver encountered errors " + "looking up this address"); + /* EAI_NODATA is apparently missing on FreeBSD. On recent GNU libc, + * it requires _GNU_SOURCE to be defined; in the unlikely case that + * that GNU libc returns this value we'll return the default message */ +#ifdef EAI_NODATA + case EAI_NODATA: + return _("The remote host exists but no address " + "is available"); +#endif + case EAI_NONAME: + return ("The remote address is unknown"); + case EAI_FAMILY: + case EAI_SERVICE: + case EAI_SOCKTYPE: + return ("The remote address is not obtainable " + "for that socket type."); + default: + break; + } + + return ("The remote address could not be obtained "); +} + +#ifdef USE_TCP_KEEPALIVES +gboolean +_lm_sock_set_keepalive (LmSocketT sock, int delay) +{ + int opt; + + lm_verbose ("[_lm_sock_set_keepalive]: USE_TCP_KEEPALIVES Enabled\n"); + + opt = 1; + if (setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof (opt)) < 0) { + return FALSE; + } + + //opt = 3; /* 3 keepalives before considering connection dead */ + /*if (setsockopt (sock, IPPROTO_TCP, TCP_KEEPCNT, &opt, sizeof (opt)) < 0) { + return FALSE; + } + + opt = delay; + if (setsockopt (sock, IPPROTO_TCP, TCP_KEEPIDLE, &opt, sizeof (opt)) < 0) { + return FALSE; + } + + opt = delay; + if (setsockopt (sock, IPPROTO_TCP, TCP_KEEPINTVL, &opt, sizeof (opt)) < 0) { + return FALSE; + }*/ + UNUSED_FORMAL_PARAM(delay); + return TRUE; +} +#endif /* USE_TCP_KEEPALIVES */ + +gchar * +_lm_sock_get_local_host (LmSocketT sock) +{ + struct sockaddr addr_info; + void *sock_addr; + socklen_t namelen; + char addrbuf[IPV6_MAX_ADDRESS_LEN]; + const char *host; + + namelen = sizeof (struct sockaddr); + if (getsockname (sock, &addr_info, &namelen)) { + return NULL; + } + + switch (addr_info.sa_family) { + case AF_INET: + + sock_addr = & (((struct sockaddr_in *) &addr_info)->sin_addr); + break; + case AF_INET6: + sock_addr = & (((struct sockaddr_in6 *) &addr_info)->sin6_addr); + break; + default: + return NULL; + } + /* inet_ntoa has been obsoleted in favour of inet_ntop */ + host = inet_ntop (addr_info.sa_family, + sock_addr, + addrbuf, + IPV6_MAX_ADDRESS_LEN); + + return g_strdup (host); +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-socket.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-socket.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1251 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * and/or its subsidiary/subsidiaries. All rights reserved. + * Copyright (C) 2007 Collabora Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include +#include + +/* Needed on Mac OS X */ +#if HAVE_NETINET_IN_H +#include +#endif + +/* Needed on Mac OS X */ +#if HAVE_ARPA_NAMESER_COMPAT_H +#include +#endif + +#include +#include + +#include "lm-debug.h" +#include "lm-internals.h" +#include "lm-misc.h" +#include "lm-ssl.h" +#include "lm-ssl-internals.h" +#include "lm-proxy.h" +#include "lm-socket.h" +#include "lm-sock.h" +#include "lm-error.h" + +#ifdef HAVE_ASYNCNS +#include +#define freeaddrinfo(x) asyncns_freeaddrinfo(x) +#endif + +#define IN_BUFFER_SIZE 1024 +#define MIN_PORT 1 +#define MAX_PORT 65536 +//#define SRV_LEN 8192 +#define SRV_LEN 512 // check the actual value needed here! - meco + +struct _LmSocket { + LmConnection *connection; + GMainContext *context; + + gchar *domain; + gchar *server; + guint port; + + gboolean blocking; + + LmSSL *ssl; + gboolean ssl_started; + LmProxy *proxy; + + GIOChannel *io_channel; + GSource *watch_in; + GSource *watch_err; + GSource *watch_hup; + + LmSocketT fd; + + GSource *watch_connect; + + gboolean cancel_open; + + GSource *watch_out; + GString *out_buf; + + LmConnectData *connect_data; + + IncomingDataFunc data_func; + SocketClosedFunc closed_func; + ConnectResultFunc connect_func; + gpointer user_data; + + guint ref_count; + +#ifdef HAVE_ASYNCNS + GSource *watch_resolv; + asyncns_query_t *resolv_query; + asyncns_t *asyncns_ctx; + GIOChannel *resolv_channel; +#endif +}; + +static void socket_free (LmSocket *socket); +static gboolean socket_do_connect (LmConnectData *connect_data); +static gboolean socket_connect_cb (GIOChannel *source, + GIOCondition condition, + LmConnectData *connect_data); +static gboolean socket_in_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket); +static gboolean socket_hup_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket); +static gboolean socket_error_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket); +static gboolean socket_buffered_write_cb (GIOChannel *source, + GIOCondition condition, + LmSocket *socket); +static gboolean socket_parse_srv_response (unsigned char *srv, + int srv_len, + gchar **out_server, + guint *out_port); +static void socket_close_io_channel (GIOChannel *io_channel); + +static void +socket_free (LmSocket *socket) +{ + g_free (socket->server); + g_free (socket->domain); + + if (socket->ssl) { + lm_ssl_unref (socket->ssl); + } + + if (socket->proxy) { + lm_proxy_unref (socket->proxy); + } + + if (socket->out_buf) { + g_string_free (socket->out_buf, TRUE); + } + + g_free (socket); +} + +gint +lm_socket_do_write (LmSocket *socket, const gchar *buf, gint len) +{ + gint b_written; + gint err; + if (socket->ssl_started) { + b_written = _lm_ssl_send (socket->ssl, buf, len); + } else { + GIOStatus io_status = G_IO_STATUS_AGAIN; + gsize bytes_written; + + while (io_status == G_IO_STATUS_AGAIN) { + io_status = g_io_channel_write_chars (socket->io_channel, + buf, len, + &bytes_written, + NULL); + } + + b_written = bytes_written; + + if (io_status != G_IO_STATUS_NORMAL) { + b_written = -1; + } + } + + err = _lm_sock_get_last_error (); + lm_verbose("[lm_socket_do_write]: socket write last error: %d\n\n",err); + return b_written; +} + +static gboolean +socket_read_incoming (LmSocket *socket, + gchar *buf, + gsize buf_size, + gsize *bytes_read, + gboolean *hangup, + gint *reason) +{ + GIOStatus status; + + *hangup = FALSE; + + if (socket->ssl_started) { + status = _lm_ssl_read (socket->ssl, + buf, buf_size - 1, bytes_read); + } else { + status = g_io_channel_read_chars (socket->io_channel, + buf, buf_size - 1, + bytes_read, + NULL); + } + +//added by prima + if (status != G_IO_STATUS_NORMAL ) { + switch (status) { + case G_IO_STATUS_EOF: + *reason = LM_DISCONNECT_REASON_HUP; + break; + case G_IO_STATUS_AGAIN: + /* No data readable but we didn't hangup */ + return FALSE; + // break; + case G_IO_STATUS_ERROR: + *reason = LM_DISCONNECT_REASON_ERROR; + break; + default: + *reason = LM_DISCONNECT_REASON_UNKNOWN; + } + + /* Notify connection_in_event that we hangup the connection */ + *hangup = TRUE; + + return FALSE; + } + + if(*bytes_read>0) + { + buf[*bytes_read] = '\0'; + return TRUE; + } + + /* There is more data to be read */ + return FALSE; + //return TRUE; +} + +static gboolean +socket_in_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket) +{ + gchar buf[IN_BUFFER_SIZE]; + gsize bytes_read = 0; + gboolean read_anything = FALSE; + gboolean hangup = 0; + gint reason = 0; + + if (!socket->io_channel) { + lm_verbose ( "[socket_in_event]:Error in io_channel\n"); + return FALSE; + } + + while (/*(condition & G_IO_IN) && */socket_read_incoming (socket, buf, IN_BUFFER_SIZE, + &bytes_read, &hangup, &reason)) { + + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "\nRECV [%d]:\n", + // (int)bytes_read); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + // "-----------------------------------\n"); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "'%s'\n", buf); + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + // "-----------------------------------\n"); + + lm_verbose ("\n[socket_in_event]: RECV [%d]:\n", (int)bytes_read); + lm_verbose ("-----------------------------------\n"); + lm_verbose ("'%s'\n", buf); + lm_verbose ( "-----------------------------------\n"); + lm_verbose ("Read: %d chars\n", (int)bytes_read); + + (socket->data_func) (socket, buf, socket->user_data); + + read_anything = TRUE; + + //condition = g_io_channel_get_buffer_condition (socket->io_channel); + } + + /* If we have read something, delay the hangup so that the data can be + * processed. */ + if (hangup && !read_anything) { + (socket->closed_func) (socket, reason, socket->user_data); + lm_verbose ( "[socket_in_event]:Error in hangup && !read_anything\n"); + return FALSE; + } +lm_verbose ( "[socket_in_event]:Returning TRUE\n"); + return TRUE; +} + +static gboolean +socket_hup_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket) +{ + lm_verbose ("HUP event: %d->'%s'\n", + condition, lm_misc_io_condition_to_str (condition)); + + if (!socket->io_channel) { + return FALSE; + } + + (socket->closed_func) (socket, LM_DISCONNECT_REASON_HUP, + socket->user_data); + + return TRUE; +} + +static gboolean +socket_error_event (GIOChannel *source, + GIOCondition condition, + LmSocket *socket) +{ + gint err =0; + lm_verbose ("[socket_error_event]: ERROR event: %d->'%s'\n", + condition, lm_misc_io_condition_to_str (condition)); + + err = _lm_sock_get_last_error (); + lm_verbose("[socket_error_event]: socket write last error: %d\n\n",err); + if (!socket->io_channel) { + return FALSE; + } + + (socket->closed_func) (socket, LM_DISCONNECT_REASON_ERROR, + socket->user_data); + + return TRUE; +} + +static gboolean +_lm_socket_ssl_init (LmSocket *socket, gboolean delayed) +{ + GError *error = NULL; + const gchar *ssl_verify_domain = NULL; + + lm_verbose ("[_lm_socket_ssl_init] Setting up SSL...\n"); + + _lm_ssl_initialize (socket->ssl); + +#ifdef HAVE_GNUTLS + /* GNU TLS requires the socket to be blocking */ + _lm_sock_set_blocking (socket->fd, TRUE); +#endif + + /* If we're using StartTLS, the correct thing is to verify against + * the domain. If we're using old SSL, we should verify against the + * hostname. */ + if (delayed) + ssl_verify_domain = socket->domain; + else + ssl_verify_domain = socket->server; + + if (!_lm_ssl_begin (socket->ssl, socket->fd, ssl_verify_domain, &error)) { + lm_verbose ("Could not begin SSL\n"); + + if (error) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "%s\n", error->message); + */ + lm_verbose("[_lm_socket_ssl_init]: %s\n", error->message); + g_error_free (error); + } + lm_verbose("\n[_lm_socket_ssl_init]: shutting down the socket"); + _lm_sock_shutdown (socket->fd); + _lm_sock_close (socket->fd); + + if (!delayed && socket->connect_func) { + lm_verbose("\n[_lm_socket_ssl_init]: calling the socket connect callback if ssl begin failed"); + (socket->connect_func) (socket, FALSE, socket->user_data); + } + + return FALSE; + } + +#ifdef HAVE_GNUTLS + _lm_sock_set_blocking (socket->fd, FALSE); +#endif + + socket->ssl_started = TRUE; + + return TRUE; +} + +gboolean +lm_socket_starttls (LmSocket *socket) +{ + g_return_val_if_fail (lm_ssl_get_use_starttls (socket->ssl) == TRUE, FALSE); + + return _lm_socket_ssl_init (socket, TRUE); +} + + + +void +_lm_socket_succeeded (LmConnectData *connect_data) +{ + LmSocket *socket; + + socket = connect_data->socket; + + lm_verbose ("\n[_lm_socket_succeeded]:inside.. \n"); + if (socket->watch_connect) { + g_source_destroy (socket->watch_connect); + socket->watch_connect = NULL; + } + + /* Need some way to report error/success */ + if (socket->cancel_open) { + lm_verbose ("Cancelling connection...\n"); + if (socket->connect_func) { + (socket->connect_func) (socket, FALSE, socket->user_data); + } + return; + } + + socket->fd = connect_data->fd; + socket->io_channel = connect_data->io_channel; + + freeaddrinfo (connect_data->resolved_addrs); + socket->connect_data = NULL; + g_free (connect_data); + + /* old-style ssl should be started immediately */ + if (socket->ssl && (lm_ssl_get_use_starttls (socket->ssl) == FALSE)) { + if (!_lm_socket_ssl_init (socket, FALSE)) { + return; + } + } + + socket->watch_in = + lm_misc_add_io_watch (socket->context, + socket->io_channel, + G_IO_IN, + (GIOFunc) socket_in_event, + socket); + + /* FIXME: if we add these, we don't get ANY + * response from the server, this is to do with the way that + * windows handles watches, see bug #331214. + */ +#ifndef G_OS_WIN32 + socket->watch_err = + lm_misc_add_io_watch (socket->context, + socket->io_channel, + G_IO_ERR, + (GIOFunc) socket_error_event, + socket); + + socket->watch_hup = + lm_misc_add_io_watch (socket->context, + socket->io_channel, + G_IO_HUP, + (GIOFunc) socket_hup_event, + socket); +#endif + + if (socket->connect_func) { + (socket->connect_func) (socket, TRUE, socket->user_data); + } +} + +gboolean +_lm_socket_failed_with_error (LmConnectData *connect_data, int error) +{ + LmSocket *socket; + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Connection failed: %s (error %d)\n", + _lm_sock_get_error_str (error), error);*/ + lm_verbose( "[_lm_socket_failed_with_error]: Connection failed: %s (error %d)\n",_lm_sock_get_error_str (error), error); + + socket = lm_socket_ref (connect_data->socket); + + connect_data->current_addr = connect_data->current_addr->ai_next; + + if (socket->watch_connect) { + g_source_destroy (socket->watch_connect); + socket->watch_connect = NULL; + } + + if (connect_data->io_channel != NULL) { + socket_close_io_channel (connect_data->io_channel); + } + + if (connect_data->current_addr == NULL) { + if (socket->connect_func) { + (socket->connect_func) (socket, FALSE, socket->user_data); + } + lm_verbose("\n\n[_lm_socket_failed_with_error]: connect_data->current_addr ==NULL"); + /* if the user callback called connection_close(), this is already freed */ + if (socket->connect_data != NULL) { + freeaddrinfo (connect_data->resolved_addrs); + socket->connect_data = NULL; + g_free (connect_data); + } + } else { + /* try to connect to the next host */ + lm_verbose("\n\n[_lm_socket_failed_with_error]: !!!!Trying to connect to the next host after socket connect failed with error\n"); + return socket_do_connect (connect_data); + } + + lm_socket_unref(socket); + + return FALSE; +} + +gboolean +_lm_socket_failed (LmConnectData *connect_data) +{ + return _lm_socket_failed_with_error (connect_data, + _lm_sock_get_last_error()); +} + +static gboolean +socket_connect_cb (GIOChannel *source, + GIOCondition condition, + LmConnectData *connect_data) +{ + LmSocket *socket; + struct addrinfo *addr; + int err; + socklen_t len; + LmSocketT fd; + gboolean result = FALSE; + + socket = lm_socket_ref (connect_data->socket); + addr = connect_data->current_addr; + fd = g_io_channel_unix_get_fd (source); + lm_verbose("\n[socket_connect_cb]: Inside socket_connect_cb\n"); + if (condition == G_IO_ERR) { + len = sizeof (err); + _lm_sock_get_error (fd, &err, &len); + if (!_lm_sock_is_blocking_error (err)) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Connection failed.\n");*/ + lm_verbose( "[socket_conect_cb]: Connection failed.\n"); + + /* error condition, but might be possible to recover + * from it (by connecting to the next host) */ + if (!_lm_socket_failed_with_error (connect_data, err)) { + socket->watch_connect = NULL; + goto out; + } + } + } + + if (_lm_connection_async_connect_waiting (socket->connection)) { + gint res; + + fd = g_io_channel_unix_get_fd (source); + lm_verbose("\n[socket_conect_cb]: Async waiting calling _lm_sock_connect again\n"); + res = _lm_sock_connect (fd, addr->ai_addr, (int)addr->ai_addrlen); + if (res < 0) { + err = _lm_sock_get_last_error (); + if (_lm_sock_is_blocking_success (err)) { + _lm_connection_set_async_connect_waiting (socket->connection, FALSE); + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Connection success (1).\n");*/ + lm_verbose("[socket_connect_cb]: connection success"); + _lm_socket_succeeded (connect_data); + } + + if (_lm_connection_async_connect_waiting (socket->connection) && + !_lm_sock_is_blocking_error (err)) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Connection failed.\n");*/ + lm_verbose("[socket_conect_cb]: connection failed"); + _lm_sock_close (connect_data->fd); + _lm_socket_failed_with_error (connect_data, err); + + socket->watch_connect = NULL; + goto out; + } + } + } else { + /* for blocking sockets, G_IO_OUT means we are connected */ + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Connection success (2).\n");*/ + lm_verbose("[socket_conect_cb]: Connection success (2).\n"); + _lm_socket_succeeded (connect_data); + } + + result = TRUE; + + out: + lm_socket_unref(socket); + + return result; +} + +static gboolean +socket_do_connect (LmConnectData *connect_data) +{ + LmSocket *socket; + LmSocketT fd; + int res, err; + int port; + char name[NI_MAXHOST]; + char portname[NI_MAXSERV]; + struct addrinfo *addr; + + socket = connect_data->socket; + addr = connect_data->current_addr; + + if (socket->proxy) { + port = htons (lm_proxy_get_port (socket->proxy)); + } else { + port = htons (socket->port); + } + + ((struct sockaddr_in *) addr->ai_addr)->sin_port = port; + + res = getnameinfo (addr->ai_addr, + (socklen_t)addr->ai_addrlen, + name, sizeof (name), + portname, sizeof (portname), + NI_NUMERICHOST | NI_NUMERICSERV); + + if (res < 0) { + return _lm_socket_failed (connect_data); + } + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Trying %s port %s...\n", name, portname);*/ + lm_verbose("[socket_do_connect]: Trying %s port %s...\n", name, portname); + lm_verbose("[socket_do_connect]: calling make socket\n"); + fd = _lm_sock_makesocket (addr->ai_family, + addr->ai_socktype, + addr->ai_protocol); + lm_verbose("[socket_do_connet]: called make socket and fd"); + lm_verbose("[socket_do_connect]: The value of FD is :%d",fd); + if (!_LM_SOCK_VALID (fd)) { + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Failed making socket, error:%d...\n", + _lm_sock_get_last_error ());*/ + lm_verbose( "[socket_do_connect]: Failed making socket, error:[%d]...\n", _lm_sock_get_last_error ()); + + return _lm_socket_failed (connect_data); + } + + /* Even though it says _unix_new(), it is supported by glib on + * win32 because glib does some cool stuff to find out if it + * can treat it as a FD or a windows SOCKET. + */ + connect_data->fd = fd; + connect_data->io_channel = g_io_channel_unix_new (fd); + + g_io_channel_set_encoding (connect_data->io_channel, NULL, NULL); + g_io_channel_set_buffered (connect_data->io_channel, FALSE); + + //_lm_sock_set_blocking (connect_data->fd, socket->blocking); + + if (socket->proxy) { + socket->watch_connect = + lm_misc_add_io_watch (socket->context, + connect_data->io_channel, + G_IO_OUT|G_IO_ERR, + (GIOFunc) _lm_proxy_connect_cb, + connect_data); + } else { + socket->watch_connect = + lm_misc_add_io_watch (socket->context, + connect_data->io_channel, + G_IO_OUT|G_IO_ERR, + (GIOFunc) socket_connect_cb, + connect_data); + } + + _lm_connection_set_async_connect_waiting (socket->connection, !socket->blocking); + lm_verbose("\n[socket_do_connect]: calling _lm_sock_connect\n"); + _lm_sock_set_blocking (connect_data->fd, TRUE); //prima + errno =0; + res = _lm_sock_connect (connect_data->fd, + addr->ai_addr, (int)addr->ai_addrlen); + err = _lm_sock_get_last_error (); + lm_verbose("[socket_do_connect]: socket connect last error: [%d]\n",err); + if (res < 0) { + //err = _lm_sock_get_last_error (); + lm_verbose("[socket_do_connect]: socket connect last error: %d\n",err); + if (!_lm_sock_is_blocking_error (err)) { + _lm_sock_close (connect_data->fd); + return _lm_socket_failed_with_error (connect_data, err); + } + } + _lm_sock_set_blocking (connect_data->fd, FALSE);//prima + return TRUE; +} + +gboolean +lm_socket_output_is_buffered (LmSocket *socket, + const gchar *buffer, + gint len) +{ + if (socket->out_buf) { + lm_verbose ("Appending %d bytes to output buffer\n", len); + g_string_append_len (socket->out_buf, buffer, len); + return TRUE; + } + + return FALSE; +} + +void +lm_socket_setup_output_buffer (LmSocket *socket, const gchar *buffer, gint len) +{ + lm_verbose ("OUTPUT BUFFER ENABLED\n"); + + socket->out_buf = g_string_new_len (buffer, len); + + socket->watch_out = + lm_misc_add_io_watch (socket->context, + socket->io_channel, + G_IO_OUT, + (GIOFunc) socket_buffered_write_cb, + socket); +} + +static gboolean +socket_buffered_write_cb (GIOChannel *source, + GIOCondition condition, + LmSocket *socket) +{ + gint b_written; + GString *out_buf; + /* FIXME: Do the writing */ + + out_buf = socket->out_buf; + if (!out_buf) { + /* Should not be possible */ + return FALSE; + } + + b_written = lm_socket_do_write (socket, out_buf->str, out_buf->len); + + if (b_written < 0) { + (socket->closed_func) (socket, LM_DISCONNECT_REASON_ERROR, + socket->user_data); + return FALSE; + } + + g_string_erase (out_buf, 0, (gsize) b_written); + if (out_buf->len == 0) { + lm_verbose ("Output buffer is empty, going back to normal output\n"); + + if (socket->watch_out) { + g_source_destroy (socket->watch_out); + socket->watch_out = NULL; + } + + g_string_free (out_buf, TRUE); + socket->out_buf = NULL; + return FALSE; + } + + return TRUE; +} + +static gboolean +socket_parse_srv_response (unsigned char *srv, + int srv_len, + gchar **out_server, + guint *out_port) +{ +/* int qdcount; + int ancount; + int len; + const unsigned char *pos; + unsigned char *end; + HEADER *head; + char name[256]; + char pref_name[256]; + guint pref_port = 0; + guint pref_prio = 9999; + + pref_name[0] = 0; + + pos = srv + sizeof (HEADER); + end = srv + srv_len; + head = (HEADER *) srv; + + qdcount = ntohs (head->qdcount); + ancount = ntohs (head->ancount); + + // Ignore the questions + while (qdcount-- > 0 && (len = dn_expand (srv, end, pos, name, 255)) >= 0) { + g_assert (len >= 0); + pos += len + QFIXEDSZ; + } + + // Parse the answers + while (ancount-- > 0 && (len = dn_expand (srv, end, pos, name, 255)) >= 0) { + // Ignore the initial string + uint16_t pref, weight, port; + + g_assert (len >= 0); + pos += len; + // Ignore type, ttl, class and dlen + pos += 10; + GETSHORT (pref, pos); + GETSHORT (weight, pos); + GETSHORT (port, pos); + + len = dn_expand (srv, end, pos, name, 255); + if (pref < pref_prio) { + pref_prio = pref; + strcpy (pref_name, name); + pref_port = port; + } + pos += len; + } + + if (pref_name[0]) { + *out_server = g_strdup (pref_name); + *out_port = pref_port; + return TRUE; + } */ + return FALSE; +} + +static void +socket_close_io_channel (GIOChannel *io_channel) +{ + gint fd; + + g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Freeing up IOChannel and file descriptor\n"); + + fd = g_io_channel_unix_get_fd (io_channel); + + g_io_channel_unref (io_channel); + + _lm_sock_close (fd); +} + +static void +_lm_socket_create_phase1 (LmSocket *socket, unsigned char *srv_ans, int len); +static void +_lm_socket_create_phase2 (LmSocket *socket, struct addrinfo *ans); + +#ifdef HAVE_ASYNCNS +#define PHASE_1 0 +#define PHASE_2 1 + +static gboolean +_lm_socket_resolver_done (GSource *source, + GIOCondition condition, + gpointer data); + + +static void +_asyncns_done (LmSocket *socket) +{ + if (socket->resolv_channel != NULL) { + g_io_channel_unref (socket->resolv_channel); + socket->resolv_channel = NULL; + } + + if (socket->watch_resolv) { + g_source_destroy(socket->watch_resolv); + socket->watch_resolv = NULL; + } + + if (socket->asyncns_ctx) { + asyncns_free (socket->asyncns_ctx); + socket->asyncns_ctx = NULL; + } + + socket->resolv_query = NULL; +} + +void _asyncns_cancel (LmSocket *socket) +{ + if (socket == NULL) + return; + + if (socket->asyncns_ctx) { + if (socket->resolv_query) + asyncns_cancel (socket->asyncns_ctx, socket->resolv_query); + + _asyncns_done (socket); + } +} + +static gboolean +_asyncns_prep (LmSocket *socket, GError **error) +{ + if (socket->asyncns_ctx) { + return TRUE; + } + + socket->asyncns_ctx = asyncns_new (1); + if (socket->asyncns_ctx == NULL) { + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_FAILED, + "can't initialise libasyncns"); + return FALSE; + } + + socket->resolv_channel = + g_io_channel_unix_new (asyncns_fd (socket->asyncns_ctx)); + + socket->watch_resolv = + lm_misc_add_io_watch (socket->context, + socket->resolv_channel, + G_IO_IN, + (GIOFunc) _lm_socket_resolver_done, + socket); + + return TRUE; +} + +static gboolean +_lm_socket_resolver_done (GSource *source, + GIOCondition condition, + gpointer data) +{ + LmSocket *socket = lm_socket_ref ((LmSocket *) data); + struct addrinfo *ans; + unsigned char *srv_ans; + int err; + gboolean result = FALSE; + + /* process pending data */ + asyncns_wait (socket->asyncns_ctx, FALSE); + + if (!asyncns_isdone (socket->asyncns_ctx, socket->resolv_query)) { + result = TRUE; + } else { + switch ((guint) asyncns_getuserdata (socket->asyncns_ctx, socket->resolv_query)) { + case PHASE_1: + err = asyncns_res_done (socket->asyncns_ctx, socket->resolv_query, &srv_ans); + socket->resolv_query = NULL; + _lm_socket_create_phase1 (socket, (err <= 0) ? NULL : srv_ans, err); + result = TRUE; + break; + case PHASE_2: + err = asyncns_getaddrinfo_done (socket->asyncns_ctx, socket->resolv_query, &ans); + socket->resolv_query = NULL; + _lm_socket_create_phase2 (socket, (err) ? NULL : ans); + _asyncns_done (socket); + break; + default: + g_assert_not_reached(); + break; + } + } + + lm_socket_unref(socket); + + return result; +} + +#endif + +static void +_lm_socket_create_phase1 (LmSocket *socket, + unsigned char *srv_ans, + int len) +{ + const char *remote_addr; + LmConnectData *data; + struct addrinfo req; +#ifndef HAVE_ASYNCNS + struct addrinfo *ans; + int err; +#endif + + if (srv_ans != NULL) { + gchar *new_server; + guint new_port; + gboolean result; + result = socket_parse_srv_response (srv_ans, len, + &new_server, + &new_port); + if (result == TRUE) { + g_free (socket->server); + socket->server = new_server; + socket->port = new_port; + } + } + + /* If server wasn't specified and SRV failed, use domain */ + if (!socket->server) { + lm_verbose ("SRV lookup failed, trying jid domain\n"); + socket->server = g_strdup (socket->domain); + } + + if (socket->proxy) { + remote_addr = lm_proxy_get_server (socket->proxy); + } else { + remote_addr = socket->server; + } + + /*g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, + "Going to connect to %s%s:%u\n", (socket->proxy) ? "proxy " : "", + remote_addr, socket->port);*/ + lm_verbose( "[_lm_socket_create_phase1]: Going to connect to %s%s:%u\n", (socket->proxy) ? "proxy " : "", + remote_addr, socket->port); + + data = g_new0 (LmConnectData, 1); + + data->socket = socket; + data->connection = socket->connection; + data->fd = -1; + socket->connect_data = data; + + memset (&req, 0, sizeof(req)); + req.ai_family = AF_UNSPEC; + req.ai_socktype = SOCK_STREAM; + req.ai_protocol = IPPROTO_TCP; + +#ifdef HAVE_ASYNCNS + if (!_asyncns_prep (socket, NULL)) + return; + + socket->resolv_query = + asyncns_getaddrinfo (socket->asyncns_ctx, + remote_addr, + NULL, + &req); + + asyncns_setuserdata (socket->asyncns_ctx, + socket->resolv_query, + (gpointer) PHASE_2); +#else + err = getaddrinfo (remote_addr, NULL, &req, &ans); + lm_verbose( "[_lm_socket_create_phase1]: after getaddrinfo : %u\n", err); + _lm_socket_create_phase2 (socket, (err) ? NULL : ans); + if (err != 0) { + return; + } +#endif +} + +static void +_lm_socket_create_phase2 (LmSocket *socket, struct addrinfo *ans) +{ + if (ans == NULL) { + lm_verbose ("error while resolving, bailing out\n"); + if (socket->connect_func) { + (socket->connect_func) (socket, FALSE, socket->user_data); + } + g_free (socket->connect_data); + socket->connect_data = NULL; + return; + } + + socket->connect_data->resolved_addrs = ans; + socket->connect_data->current_addr = ans; + + socket_do_connect (socket->connect_data); +} + +LmSocket * +lm_socket_create (GMainContext *context, + IncomingDataFunc data_func, + SocketClosedFunc closed_func, + ConnectResultFunc connect_func, + gpointer user_data, + LmConnection *connection, + gboolean blocking, + const gchar *server, + const gchar *domain, + guint port, + LmSSL *ssl, + LmProxy *proxy, + GError **error) +{ + LmSocket *socket; + +#ifndef HAVE_ASYNCNS + unsigned char srv_ans[SRV_LEN]; + int len; +#endif + lm_verbose ("[lm_socket_create]: inside.."); + + g_return_val_if_fail (domain != NULL, NULL); + g_return_val_if_fail ((port >= MIN_PORT && port <= MAX_PORT), NULL); + g_return_val_if_fail (data_func != NULL, NULL); + g_return_val_if_fail (closed_func != NULL, NULL); + g_return_val_if_fail (connect_func != NULL, NULL); + + + socket = g_new0 (LmSocket, 1); + lm_verbose ("[lm_socket_create]: after g_new0 "); + + socket->ref_count = 1; + + socket->connection = connection; + socket->domain = g_strdup (domain); + socket->server = g_strdup (server); + socket->port = port; + socket->cancel_open = FALSE; + socket->ssl = ssl; + socket->ssl_started = FALSE; + socket->proxy = NULL; + socket->blocking = blocking; + + if (context) { + socket->context = g_main_context_ref (context); + } + + if (proxy) { + socket->proxy = lm_proxy_ref (proxy); + } + + if (!server) { + /*char *srv; + srv = g_strdup_printf ("_xmpp-client._tcp.%s", socket->domain); + lm_verbose ("Performing a SRV lookup for %s\n", srv); + +#ifdef HAVE_ASYNCNS + if (!_asyncns_prep (socket, error)) + return NULL; + + socket->resolv_query = + asyncns_res_query (socket->asyncns_ctx, srv, C_IN, T_SRV); + asyncns_setuserdata (socket->asyncns_ctx, socket->resolv_query, (gpointer) PHASE_1); +#else + res_init (); + + len = res_query (srv, C_IN, T_SRV, srv_ans, SRV_LEN); + _lm_socket_create_phase1 (socket, (len < 1) ? NULL : srv_ans, len); + g_free (srv); +#endif*/ + } else { + lm_verbose ("SRV lookup disabled for %s\n", socket->server); + _lm_socket_create_phase1 (socket, NULL, 0); + } + + if (socket->connect_data == NULL) { + /* Open failed synchronously, probably a DNS lookup problem */ + lm_socket_unref(socket); + + g_set_error (error, + LM_ERROR, + LM_ERROR_CONNECTION_FAILED, + "Failed to resolve server"); + + return NULL; + } + + + /* If the connection fails synchronously, we don't want to call the + * connect_func to indicate an error, we return an error indication + * instead. So, we delay saving the functions until after we know + * we are going to return success. + */ + socket->data_func = data_func; + socket->closed_func = closed_func; + socket->connect_func = connect_func; + socket->user_data = user_data; + + return socket; +} + +void +lm_socket_flush (LmSocket *socket) +{ + g_return_if_fail (socket != NULL); + g_return_if_fail (socket->io_channel != NULL); + + g_io_channel_flush (socket->io_channel, NULL); +} + +void +lm_socket_close (LmSocket *socket) +{ + LmConnectData *data; + int ret = 0; + g_return_if_fail (socket != NULL); + + if (socket->watch_connect) { + g_source_destroy (socket->watch_connect); + socket->watch_connect = NULL; + } + + _lm_sock_close(socket->fd); + data = socket->connect_data; + ret = errno; lm_verbose("\n\n[lm_socket_close]: The errno after close fd is: %d",ret); + if (data) { + freeaddrinfo (data->resolved_addrs); + socket->connect_data = NULL; + g_free (data); + } + + if (socket->io_channel) { + if (socket->watch_in) { + g_source_destroy (socket->watch_in); + socket->watch_in = NULL; + } + + if (socket->watch_err) { + g_source_destroy (socket->watch_err); + socket->watch_err = NULL; + } + + if (socket->watch_hup) { + g_source_destroy (socket->watch_hup); + socket->watch_hup = NULL; + } + + if (socket->watch_out) { + g_source_destroy (socket->watch_out); + socket->watch_out = NULL; + } + + socket_close_io_channel (socket->io_channel); + + socket->io_channel = NULL; + socket->fd = -1; + } +} + +gchar * +lm_socket_get_local_host (LmSocket *socket) +{ + return _lm_sock_get_local_host (socket->fd); +} + +LmSocket * +lm_socket_ref (LmSocket *socket) +{ + g_return_val_if_fail (socket != NULL, NULL); + + socket->ref_count++; + + return socket; +} + +void +lm_socket_unref (LmSocket *socket) +{ + g_return_if_fail (socket != NULL); + + socket->ref_count--; + + if (socket->ref_count <= 0) { + socket_free (socket); + } +} + +gboolean +lm_socket_set_keepalive (LmSocket *socket, int delay) +{ +#ifdef USE_TCP_KEEPALIVES + return _lm_sock_set_keepalive (socket->fd, delay); +#else + return FALSE; +#endif /* USE_TCP_KEEPALIVES */ +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-ssl-base.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-ssl-base.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,56 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 "lm-ssl-base.h" +#include "lm-ssl-internals.h" + +void +_lm_ssl_base_init (LmSSLBase *base, + const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify) +{ + base->ref_count = 1; + base->func = ssl_function; + base->func_data = user_data; + base->data_notify = notify; + base->fingerprint[0] = '\0'; + + if (expected_fingerprint) { + base->expected_fingerprint = g_strdup (expected_fingerprint); + } else { + base->expected_fingerprint = NULL; + } + + if (!base->func) { + /* If user didn't provide an SSL func the default will be used + * this function will always tell the connection to continue. + */ + base->func = _lm_ssl_func_always_continue; + } +} + +void +_lm_ssl_base_free_fields (LmSSLBase *base) +{ + g_free (base->expected_fingerprint); +} + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-ssl-generic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-ssl-generic.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,249 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include "lm-debug.h" +#include "lm-ssl.h" +#include "lm-ssl-base.h" +#include "lm-ssl-internals.h" + +LmSSLResponse +_lm_ssl_func_always_continue (LmSSL *ssl, + LmSSLStatus status, + gpointer user_data) +{ + UNUSED_FORMAL_PARAM(ssl); + UNUSED_FORMAL_PARAM(status); + UNUSED_FORMAL_PARAM(user_data); + return LM_SSL_RESPONSE_CONTINUE;; +} + +/* Define the SSL functions as noops if we compile without support */ +#ifndef HAVE_SSL + +LmSSL * +_lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify) +{ + return NULL; +} + +void +_lm_ssl_initialize (LmSSL *ssl) +{ + /* NOOP */ +} + +gboolean +_lm_ssl_begin (LmSSL *ssl, + gint fd, + const gchar *server, + GError **error) +{ + return TRUE; +} + +GIOStatus +_lm_ssl_read (LmSSL *ssl, + gchar *buf, + gint len, + gsize *bytes_read) +{ + /* NOOP */ + *bytes_read = 0; + + return G_IO_STATUS_EOF; +} + +gboolean +_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len) +{ + /* NOOP */ + return TRUE; +} +void +_lm_ssl_close (LmSSL *ssl) +{ + /* NOOP */ +} + +void +_lm_ssl_free (LmSSL *ssl) +{ + /* NOOP */ +} + +#endif /* HAVE_SSL */ + + + +/** + * lm_ssl_new: + * @expected_fingerprint: The expected fingerprint. @ssl_function will be called if there is a mismatch. %NULL if you are not interested in this check. + * @ssl_function: Callback called to inform the user of a problem during setting up the SSL connection and how to proceed. If %NULL is passed the default function that always continues will be used. + * @user_data: Data sent with the callback. + * @notify: Function to free @user_dataa when the connection is finished. %NULL if @user_data should not be freed. + * + * Creates a new SSL struct, call #lm_connection_set_ssl to use it. + * + * Return value: A new #LmSSL struct. + **/ +EXPORT_C LmSSL * +lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify) +{ + /* The implementation of this function will be different depending + * on which implementation is used + */ + return _lm_ssl_new (expected_fingerprint, + ssl_function, user_data, notify); +} + +/** + * lm_ssl_is_supported: + * + * Checks whether Loudmouth supports SSL or not. + * + * Return value: #TRUE if this installation of Loudmouth supports SSL, otherwise returns #FALSE. + **/ +EXPORT_C gboolean +lm_ssl_is_supported (void) +{ +#ifdef HAVE_SSL + return TRUE; +#else + return FALSE; +#endif +} + + +/** + * lm_ssl_get_fingerprint: + * @ssl: an #LmSSL + * + * Returns the MD5 fingerprint of the remote server's certificate. + * + * Return value: A 16-byte array representing the fingerprint or %NULL if unknown. + **/ +EXPORT_C const gchar * +lm_ssl_get_fingerprint (LmSSL *ssl) +{ + g_return_val_if_fail (ssl != NULL, NULL); + + return LM_SSL_BASE(ssl)->fingerprint; +} + +/** + * lm_ssl_ref: + * @ssl: an #LmSSL + * + * Adds a reference to @ssl. + * + * Return value: the ssl + **/ +EXPORT_C LmSSL * +lm_ssl_ref (LmSSL *ssl) +{ + g_return_val_if_fail (ssl != NULL, NULL); + + LM_SSL_BASE(ssl)->ref_count++; + + return ssl; +} + +/** + * lm_ssl_use_starttls: + * @ssl: an #LmSSL + * + * Set whether STARTTLS should be used. + **/ +EXPORT_C void +lm_ssl_use_starttls (LmSSL *ssl, + gboolean use_starttls, + gboolean require_starttls) +{ + LmSSLBase *base; + + base = LM_SSL_BASE (ssl); + base->use_starttls = use_starttls; + base->require_starttls = require_starttls; +} + +/** + * lm_ssl_get_use_starttls: + * + * Return value: TRUE is @ssl is configured to use STARTTLS. + **/ +gboolean +lm_ssl_get_use_starttls (LmSSL *ssl) +{ + LmSSLBase *base; + + base = LM_SSL_BASE (ssl); + lm_verbose ("lm_ssl_get_use_starttls use_starttls[%d]\n", base->use_starttls); + return base->use_starttls; +} + +/** + * lm_ssl_get_require_starttls: + * + * Return value: TRUE if @ssl requires that STARTTLS succeed. + **/ +gboolean +lm_ssl_get_require_starttls (LmSSL *ssl) +{ + LmSSLBase *base; + + base = LM_SSL_BASE (ssl); + return base->require_starttls; +} + +/** + * lm_ssl_unref + * @ssl: an #LmSSL + * + * Removes a reference from @ssl. When no more references are present + * @ssl is freed. + **/ +EXPORT_C void +lm_ssl_unref (LmSSL *ssl) +{ + LmSSLBase *base; + + g_return_if_fail (ssl != NULL); + + base = LM_SSL_BASE (ssl); + + base->ref_count --; + + if (base->ref_count == 0) { + if (base->data_notify) { + (* base->data_notify) (base->func_data); + } + + _lm_ssl_free (ssl); + } +} + + diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-ssl-gnutls.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-ssl-gnutls.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,312 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003-2006 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include +#include + +#include "lm-debug.h" +#include "lm-error.h" +#include "lm-ssl-base.h" +#include "lm-ssl-internals.h" + +#ifdef HAVE_GNUTLS + +#include + +#define CA_PEM_FILE "/etc/ssl/certs/ca-certificates.crt" + +struct _LmSSL { + LmSSLBase base; + + gnutls_session gnutls_session; + gnutls_certificate_credentials gnutls_xcred; + gboolean started; +}; + +static gboolean ssl_verify_certificate (LmSSL *ssl, + const gchar *server); + +static gboolean +ssl_verify_certificate (LmSSL *ssl, const gchar *server) +{ + LmSSLBase *base; + unsigned int status; + int rc; + + base = LM_SSL_BASE (ssl); + + /* This verification function uses the trusted CAs in the credentials + * structure. So you must have installed one or more CA certificates. + */ + rc = gnutls_certificate_verify_peers2 (ssl->gnutls_session, &status); + + if (rc == GNUTLS_E_NO_CERTIFICATE_FOUND) { + if (base->func (ssl, + LM_SSL_STATUS_NO_CERT_FOUND, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (rc != 0) { + if (base->func (ssl, + LM_SSL_STATUS_GENERIC_ERROR, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (rc == GNUTLS_E_NO_CERTIFICATE_FOUND) { + if (base->func (ssl, + LM_SSL_STATUS_NO_CERT_FOUND, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (status & GNUTLS_CERT_INVALID + || status & GNUTLS_CERT_REVOKED) { + if (base->func (ssl, LM_SSL_STATUS_UNTRUSTED_CERT, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (gnutls_certificate_expiration_time_peers (ssl->gnutls_session) < time (0)) { + if (base->func (ssl, LM_SSL_STATUS_CERT_EXPIRED, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (gnutls_certificate_activation_time_peers (ssl->gnutls_session) > time (0)) { + if (base->func (ssl, LM_SSL_STATUS_CERT_NOT_ACTIVATED, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (gnutls_certificate_type_get (ssl->gnutls_session) == GNUTLS_CRT_X509) { + const gnutls_datum* cert_list; + guint cert_list_size; + size_t digest_size; + gnutls_x509_crt cert; + + cert_list = gnutls_certificate_get_peers (ssl->gnutls_session, &cert_list_size); + if (cert_list == NULL) { + if (base->func (ssl, LM_SSL_STATUS_NO_CERT_FOUND, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + gnutls_x509_crt_init (&cert); + + if (gnutls_x509_crt_import (cert, &cert_list[0], + GNUTLS_X509_FMT_DER) != 0) { + if (base->func (ssl, LM_SSL_STATUS_NO_CERT_FOUND, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + if (!gnutls_x509_crt_check_hostname (cert, server)) { + if (base->func (ssl, LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + gnutls_x509_crt_deinit (cert); + + digest_size = sizeof (base->fingerprint); + + if (gnutls_fingerprint (GNUTLS_DIG_MD5, &cert_list[0], + base->fingerprint, + &digest_size) >= 0) { + if (base->expected_fingerprint && + memcmp (base->expected_fingerprint, + base->fingerprint, + digest_size) && + base->func (ssl, + LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + else if (base->func (ssl, LM_SSL_STATUS_GENERIC_ERROR, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + + return TRUE; +} + +/* From lm-ssl-protected.h */ + +LmSSL * +_lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify) +{ + LmSSL *ssl; + + ssl = g_new0 (LmSSL, 1); + + _lm_ssl_base_init ((LmSSLBase *) ssl, + expected_fingerprint, + ssl_function, user_data, notify); + + return ssl; +} + +void +_lm_ssl_initialize (LmSSL *ssl) +{ + gnutls_global_init (); + gnutls_certificate_allocate_credentials (&ssl->gnutls_xcred); + gnutls_certificate_set_x509_trust_file(ssl->gnutls_xcred, + CA_PEM_FILE, + GNUTLS_X509_FMT_PEM); +} + +gboolean +_lm_ssl_begin (LmSSL *ssl, gint fd, const gchar *server, GError **error) +{ + int ret; + gboolean auth_ok = TRUE; + const int cert_type_priority[] = + { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 }; + const int compression_priority[] = + { GNUTLS_COMP_DEFLATE, GNUTLS_COMP_NULL, 0 }; + + gnutls_init (&ssl->gnutls_session, GNUTLS_CLIENT); + gnutls_set_default_priority (ssl->gnutls_session); + gnutls_certificate_type_set_priority (ssl->gnutls_session, + cert_type_priority); + gnutls_compression_set_priority (ssl->gnutls_session, + compression_priority); + gnutls_credentials_set (ssl->gnutls_session, + GNUTLS_CRD_CERTIFICATE, + ssl->gnutls_xcred); + + gnutls_transport_set_ptr (ssl->gnutls_session, + (gnutls_transport_ptr_t) fd); + + ret = gnutls_handshake (ssl->gnutls_session); + + if (ret >= 0) { + auth_ok = ssl_verify_certificate (ssl, server); + } + + if (ret < 0 || !auth_ok) { + char *errmsg; + + gnutls_perror (ret); + + if (!auth_ok) { + errmsg = "*** GNUTLS authentication error"; + } else { + errmsg = "*** GNUTLS handshake failed"; + } + + g_set_error (error, + LM_ERROR, LM_ERROR_CONNECTION_OPEN, + errmsg); + + return FALSE; + } + lm_verbose ("GNUTLS negotiated compression: %s", + gnutls_compression_get_name (gnutls_compression_get + (ssl->gnutls_session))); + + ssl->started = TRUE; + + return TRUE; +} + +GIOStatus +_lm_ssl_read (LmSSL *ssl, gchar *buf, gint len, gsize *bytes_read) +{ + GIOStatus status; + gint b_read; + + *bytes_read = 0; + b_read = gnutls_record_recv (ssl->gnutls_session, buf, len); + + if (b_read == GNUTLS_E_AGAIN) { + status = G_IO_STATUS_AGAIN; + } + else if (b_read == 0) { + status = G_IO_STATUS_EOF; + } + else if (b_read < 0) { + status = G_IO_STATUS_ERROR; + } else { + *bytes_read = (guint) b_read; + status = G_IO_STATUS_NORMAL; + } + + return status; +} + +gint +_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len) +{ + gint bytes_written; + + bytes_written = gnutls_record_send (ssl->gnutls_session, str, len); + + while (bytes_written < 0) { + if (bytes_written != GNUTLS_E_INTERRUPTED && + bytes_written != GNUTLS_E_AGAIN) { + return -1; + } + + bytes_written = gnutls_record_send (ssl->gnutls_session, + str, len); + } + + return bytes_written; +} + +void +_lm_ssl_close (LmSSL *ssl) +{ + if (!ssl->started) + return; + + gnutls_deinit (ssl->gnutls_session); + gnutls_certificate_free_credentials (ssl->gnutls_xcred); + gnutls_global_deinit (); +} + +void +_lm_ssl_free (LmSSL *ssl) +{ + _lm_ssl_base_free_fields (LM_SSL_BASE (ssl)); + g_free (ssl); +} + +#endif /* HAVE_GNUTLS */ diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-ssl-openssl.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-ssl-openssl.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,469 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2006 Imendio AB + * and/or its subsidiary/subsidiaries. All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + +#include +#include +#include +#include + +#include "lm-debug.h" +#include "lm-error.h" +#include "lm-ssl-base.h" +#include "lm-ssl-internals.h" + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" +GET_STATIC_VAR_FROM_TLS(initialized, lm_ssl_openssl, gboolean) + #define initialized (*GET_WSD_VAR_NAME(initialized, lm_ssl_openssl, s) () ) +#endif +#ifdef HAVE_OPENSSL + +#include +#include + +#define LM_SSL_CN_MAX 63 + +struct _LmSSL { + LmSSLBase base; + + SSL_METHOD *ssl_method; + SSL_CTX *ssl_ctx; + SSL *ssl; + /*BIO *bio;*/ +}; + +int ssl_verify_cb (int preverify_ok, X509_STORE_CTX *x509_ctx); + +static gboolean ssl_verify_certificate (LmSSL *ssl, const gchar *server); +static GIOStatus ssl_io_status_from_return (LmSSL *ssl, gint error); + +/*static char _ssl_error_code[11];*/ + +static void +ssl_print_state (LmSSL *ssl, const char *func, int val) +{ + unsigned long errid; + const char *errmsg; + + switch (SSL_get_error(ssl->ssl, val)) { + case SSL_ERROR_NONE: + g_warning ("%s(): %i / SSL_ERROR_NONE", + func, val); + break; + case SSL_ERROR_ZERO_RETURN: + g_warning ("%s(): %i / SSL_ERROR_ZERO_RETURN", + func, val); + break; + case SSL_ERROR_WANT_READ: + g_warning ("%s(): %i / SSL_ERROR_WANT_READ", + func, val); + break; + case SSL_ERROR_WANT_WRITE: + g_warning ("%s(): %i / SSL_ERROR_WANT_WRITE", + func, val); + break; + case SSL_ERROR_WANT_X509_LOOKUP: + g_warning ("%s(): %i / SSL_ERROR_WANT_X509_LOOKUP", + func, val); + break; + case SSL_ERROR_SYSCALL: + g_warning ("%s(): %i / SSL_ERROR_SYSCALL", + func, val); + break; + case SSL_ERROR_SSL: + g_warning ("%s(): %i / SSL_ERROR_SSL", + func, val); + break; + } + do { + errid = ERR_get_error(); + if (errid) { + errmsg = ERR_error_string(errid, NULL); + g_warning ("\t%s", errmsg); + } + } while (errid != 0); +} + +/*static const char * +ssl_get_x509_err (long verify_res) +{ + sprintf(_ssl_error_code, "%ld", verify_res); + return _ssl_error_code; +}*/ + + +int +ssl_verify_cb (int preverify_ok, X509_STORE_CTX *x509_ctx) +{ + /* As this callback doesn't get auxiliary pointer parameter we + * cannot really use this. However, we can retrieve results later. */ + UNUSED_FORMAL_PARAM(preverify_ok); + UNUSED_FORMAL_PARAM(x509_ctx); + return 1; +} + +static gboolean +ssl_verify_certificate (LmSSL *ssl, const gchar *server) +{ + gboolean retval = TRUE; + LmSSLBase *base; + long verify_res; + unsigned int digest_len; + X509 *srv_crt; + gchar *cn; + X509_NAME *crt_subj; + + return TRUE ; // hack - to bypass certificate verification error- Pankaj +/* + base = LM_SSL_BASE(ssl); + + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + // "%s: Cipher: %s/%s/%i\n", + // __FILE__, + // SSL_get_cipher_version(ssl->ssl), + // SSL_get_cipher_name(ssl->ssl), + // SSL_get_cipher_bits(ssl->ssl, NULL)); + + lm_verbose("\n[ssl_verify_certificate]:Cipher: %s/%s/%i\n", + SSL_get_cipher_version(ssl->ssl), + SSL_get_cipher_name(ssl->ssl), + SSL_get_cipher_bits(ssl->ssl, NULL)); + + verify_res = SSL_get_verify_result(ssl->ssl); + srv_crt = SSL_get_peer_certificate(ssl->ssl); + if (base->expected_fingerprint != NULL) { + X509_digest(srv_crt, EVP_md5(), (guchar *) base->fingerprint, + &digest_len); + if (memcmp(base->expected_fingerprint, base->fingerprint, + digest_len) != 0) { + if (base->func(ssl, + LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + return FALSE; + } + } + } + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + // "%s: SSL_get_verify_result() = %ld\n", + // __FILE__, + // verify_res); + lm_verbose("[ssl_verify_certificate]: SSL_get_verify_result() = %ld\n", verify_res); + switch (verify_res) { + case X509_V_OK: + break; + case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: + // special case for self signed certificates? + case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: + case X509_V_ERR_UNABLE_TO_GET_CRL: + case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: + if (base->func(ssl, + LM_SSL_STATUS_NO_CERT_FOUND, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + break; + case X509_V_ERR_INVALID_CA: + case X509_V_ERR_CERT_UNTRUSTED: + case X509_V_ERR_CERT_REVOKED: + if (base->func(ssl, + LM_SSL_STATUS_UNTRUSTED_CERT, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + break; + case X509_V_ERR_CERT_NOT_YET_VALID: + case X509_V_ERR_CRL_NOT_YET_VALID: + if (base->func(ssl, + LM_SSL_STATUS_CERT_NOT_ACTIVATED, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + break; + case X509_V_ERR_CERT_HAS_EXPIRED: + case X509_V_ERR_CRL_HAS_EXPIRED: + if (base->func(ssl, + LM_SSL_STATUS_CERT_EXPIRED, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + break; + default: + if (base->func(ssl, LM_SSL_STATUS_GENERIC_ERROR, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + } + //if (retval == FALSE) { + // g_set_error (error, LM_ERROR, LM_ERROR_CONNECTION_OPEN, + // ssl_get_x509_err(verify_res), NULL); + //} + crt_subj = X509_get_subject_name(srv_crt); + cn = (gchar *) g_malloc0(LM_SSL_CN_MAX + 1); + + if (X509_NAME_get_text_by_NID(crt_subj, NID_commonName, cn, LM_SSL_CN_MAX) > 0) { + gchar *domain = cn; + + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + // "%s: server = '%s', cn = '%s'\n", + // __FILE__, server, cn); + lm_verbose("%s: server = '%s', cn = '%s'\n", + __FILE__, server, cn); + + if ((cn[0] == '*') && (cn[1] == '.')) { + domain = strstr (cn, server); + } + + if ((domain == NULL) || (strncmp (server, domain, LM_SSL_CN_MAX) != 0)) { + if (base->func (ssl, + LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH, + base->func_data) != LM_SSL_RESPONSE_CONTINUE) { + retval = FALSE; + } + } + } else { + g_warning ("X509_NAME_get_text_by_NID() failed"); + } + + //g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL, + // "%s:\n\tIssuer: %s\n\tSubject: %s\n\tFor: %s\n", + // __FILE__, + // X509_NAME_oneline(X509_get_issuer_name(srv_crt), NULL, 0), + // X509_NAME_oneline(X509_get_subject_name(srv_crt), NULL, 0), + // cn); + + lm_verbose("%s:\n\tIssuer: %s\n\tSubject: %s\n\tFor: %s\n", + __FILE__, + X509_NAME_oneline(X509_get_issuer_name(srv_crt), NULL, 0), + X509_NAME_oneline(X509_get_subject_name(srv_crt), NULL, 0), + cn); + + g_free(cn); + + //return TRUE ; // hack - to bypass certificate verification error- Pankaj + return retval; + */ +} + +static GIOStatus +ssl_io_status_from_return (LmSSL *ssl, gint ret) +{ + gint error; + GIOStatus status; + + if (ret > 0) return G_IO_STATUS_NORMAL; + + error = SSL_get_error(ssl->ssl, ret); + switch (error) { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + status = G_IO_STATUS_AGAIN; + break; + case SSL_ERROR_ZERO_RETURN: + status = G_IO_STATUS_EOF; + break; + default: + status = G_IO_STATUS_ERROR; + } + + return status; +} + +/* From lm-ssl-protected.h */ + +LmSSL * +_lm_ssl_new (const gchar *expected_fingerprint, + LmSSLFunction ssl_function, + gpointer user_data, + GDestroyNotify notify) +{ + LmSSL *ssl; + + ssl = g_new0 (LmSSL, 1); + + _lm_ssl_base_init ((LmSSLBase *) ssl, + expected_fingerprint, + ssl_function, user_data, notify); + + return ssl; +} + +void +_lm_ssl_initialize (LmSSL *ssl) +{ +#ifndef EMULATOR + static gboolean initialized = FALSE; +#endif + /*const char *cert_file = NULL;*/ + + if (!initialized) { + SSL_library_init(); + /* FIXME: Is this needed when we are not in debug? */ + SSL_load_error_strings(); + initialized = TRUE; + } + + ssl->ssl_method = TLSv1_client_method(); + if (ssl->ssl_method == NULL) { + g_warning ("TLSv1_client_method() == NULL"); + abort(); + } + ssl->ssl_ctx = SSL_CTX_new(ssl->ssl_method); + if (ssl->ssl_ctx == NULL) { + g_warning ("SSL_CTX_new() == NULL"); + abort(); + } + /*if (access("/etc/ssl/cert.pem", R_OK) == 0) + cert_file = "/etc/ssl/cert.pem"; + if (!SSL_CTX_load_verify_locations(ssl->ssl_ctx, + cert_file, "/etc/ssl/certs")) { + g_warning("SSL_CTX_load_verify_locations() failed"); + }*/ + SSL_CTX_set_default_verify_paths (ssl->ssl_ctx); + SSL_CTX_set_verify (ssl->ssl_ctx, SSL_VERIFY_PEER, ssl_verify_cb); +} + +gboolean +_lm_ssl_begin (LmSSL *ssl, gint fd, const gchar *server, GError **error) +{ + gint ssl_ret; + GIOStatus status; + + if (!ssl->ssl_ctx) { + g_set_error (error, + LM_ERROR, LM_ERROR_CONNECTION_OPEN, + "No SSL Context for OpenSSL"); + return FALSE; + } + + ssl->ssl = SSL_new(ssl->ssl_ctx); + if (ssl->ssl == NULL) { + g_warning ("SSL_new() == NULL"); + g_set_error(error, LM_ERROR, LM_ERROR_CONNECTION_OPEN, + "SSL_new()"); + return FALSE; + } + + if (!SSL_set_fd (ssl->ssl, fd)) { + g_warning ("SSL_set_fd() failed"); + g_set_error(error, LM_ERROR, LM_ERROR_CONNECTION_OPEN, + "SSL_set_fd()"); + return FALSE; + } + /*ssl->bio = BIO_new_socket (fd, BIO_NOCLOSE); + if (ssl->bio == NULL) { + g_warning("BIO_new_socket() failed"); + g_set_error(error, LM_ERROR, LM_ERROR_CONNECTION_OPEN, + "BIO_new_socket()"); + return FALSE; + } + SSL_set_bio(ssl->ssl, ssl->bio, ssl->bio);*/ + + do { + ssl_ret = SSL_connect(ssl->ssl); + if (ssl_ret <= 0) { + status = ssl_io_status_from_return(ssl, ssl_ret); + if (status != G_IO_STATUS_AGAIN) { + lm_verbose("[_lm_ssl_begin] errno for ssl connect:[%d], ssl_ret[%d]\n", errno, ssl_ret); + lm_verbose("\n[_lm_ssl_begin] ssl_io_status_from_return return status failed..:[%d]\n", status); + ssl_print_state(ssl, "SSL_connect", + ssl_ret); + g_set_error(error, LM_ERROR, + LM_ERROR_CONNECTION_OPEN, + "SSL_connect()"); + return FALSE; + } + } + } while (ssl_ret <= 0); + + lm_verbose("\n[_lm_ssl_begin] errno for ssl connect:[%d], ssl_ret[%d]\n", errno, ssl_ret); + // log + { + long verify_res; + verify_res = SSL_get_verify_result(ssl->ssl); + lm_verbose("[_lm_ssl_begin]: After SSL Connect : SSL_get_verify_result() = %ld\n", verify_res); + } + + if (!ssl_verify_certificate (ssl, server)) { + g_set_error (error, LM_ERROR, LM_ERROR_CONNECTION_OPEN, + "*** SSL certificate verification failed"); + return FALSE; + } + + return TRUE; +} + +GIOStatus +_lm_ssl_read (LmSSL *ssl, gchar *buf, gint len, gsize *bytes_read) +{ + GIOStatus status; + gint ssl_ret; + + *bytes_read = 0; + ssl_ret = SSL_read(ssl->ssl, buf, len); + status = ssl_io_status_from_return(ssl, ssl_ret); + if (status == G_IO_STATUS_NORMAL) { + *bytes_read = ssl_ret; + } + + return status; +} + +gint +_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len) +{ + GIOStatus status; + gint ssl_ret; + + do { + ssl_ret = SSL_write(ssl->ssl, str, len); + if (ssl_ret <= 0) { + status = ssl_io_status_from_return(ssl, ssl_ret); + if (status != G_IO_STATUS_AGAIN) + return -1; + } + } while (ssl_ret <= 0); + + return ssl_ret; +} + +void +_lm_ssl_close (LmSSL *ssl) +{ + if (ssl->ssl != NULL) { + SSL_shutdown(ssl->ssl); + SSL_free(ssl->ssl); + ssl->ssl = NULL; + } +} + +void +_lm_ssl_free (LmSSL *ssl) +{ + SSL_CTX_free(ssl->ssl_ctx); + ssl->ssl_ctx = NULL; + + _lm_ssl_base_free_fields (LM_SSL_BASE(ssl)); + g_free (ssl); +} + +#endif /* HAVE_GNUTLS */ diff -r 000000000000 -r d0f3a028347a loudmouth/src/lm-utils.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/lm-utils.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,231 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2003 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 +#include +#include +#include +#include + +#include + +#ifndef G_OS_WIN32 +#include +#endif + +#ifdef HAVE_IDN +#include +#include +#include +#endif + +#include "lm-internals.h" +#include "lm-utils.h" + +#ifdef EMULATOR +#include "libloudmouth_wsd_solution.h" +GET_STATIC_VAR_FROM_TLS(last_id, lm_utils, guint) + #define last_id (*GET_WSD_VAR_NAME(last_id, lm_utils, s)()) + +GET_STATIC_ARRAY_FROM_TLS(base64chars, lm_utils, gchar) + #define base64chars (GET_WSD_VAR_NAME(base64chars, lm_utils, s)()) +#endif + + +LmCallback * +_lm_utils_new_callback (gpointer func, + gpointer user_data, + GDestroyNotify notify) +{ + LmCallback *cb; + + cb = g_new0 (LmCallback, 1); + cb->func = func; + cb->user_data = user_data; + cb->notify = notify; + + return cb; +} + +void +_lm_utils_free_callback (LmCallback *cb) +{ + if (!cb) { + return; + } + + if (cb->notify) { + (* cb->notify) (cb->user_data); + } + g_free (cb); +} + +gchar * +_lm_utils_generate_id (void) +{ +#ifndef EMULATOR + static guint last_id = 0; +#endif + GTimeVal tv; + glong val; + + g_get_current_time (&tv); + val = (tv.tv_sec & tv.tv_usec) + last_id++; + + return g_strdup_printf ("%ld%ld", val, tv.tv_usec); +} + +gchar * +_lm_utils_base64_encode (const gchar *s) +{ +#ifndef EMULATOR + + static const gchar *base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +#endif + guint i, j; + guint32 bits = 0; + guint maxlen = (strlen(s) * 2) + 3; + gchar *str; + + str = g_malloc(maxlen); + + j = 0; + for (i = 0; i < strlen(s); i++) { + bits <<= 8; + bits |= s[i] & 0xff; + + if (!((i+1) % 3)) { + guint indices[4]; + + indices[0] = (bits >> 18) & 0x3f; + indices[1] = (bits >> 12) & 0x3f; + indices[2] = (bits >> 6) & 0x3f; + indices[3] = bits & 0x3f; + bits = 0; + + str[j++] = base64chars[(indices[0])]; + str[j++] = base64chars[(indices[1])]; + str[j++] = base64chars[(indices[2])]; + str[j++] = base64chars[(indices[3])]; + } + } + + if (j + 4 < maxlen) { + if ((i % 3) == 1) { + guint indices[2]; + + indices[0] = (bits >> 2) & 0x3f; + indices[1] = (bits << 4) & 0x3f; + + str[j++] = base64chars[(indices[0])]; + str[j++] = base64chars[(indices[1])]; + str[j++] = '='; + str[j++] = '='; + } else if ((i % 3) == 2) { + guint indices[3]; + + indices[0] = (bits >> 10) & 0x3f; + indices[1] = (bits >> 4) & 0x3f; + indices[2] = (bits << 2) & 0x3f; + + str[j++] = base64chars[(indices[0])]; + str[j++] = base64chars[(indices[1])]; + str[j++] = base64chars[(indices[2])]; + str[j++] = '='; + } + } + + str[j] = '\0'; + + return str; +} + +gchar* +_lm_utils_hostname_to_punycode (const gchar *hostname) +{ +#ifdef HAVE_IDN + char *s; + uint32_t *q; + int rc; + gchar *result; + + q = stringprep_utf8_to_ucs4 (hostname, -1, NULL); + if (q == NULL) { + return g_strdup (hostname); + } + + rc = idna_to_ascii_4z (q, &s, IDNA_ALLOW_UNASSIGNED); + free(q); + if (rc != IDNA_SUCCESS) { + return g_strdup (hostname); + } + + /* insures result is allocated through glib */ + result = g_strdup(s); + free(s); + + return result; +#else + return g_strdup(hostname); +#endif +} + +/** + * lm_utils_get_localtime: + * @stamp: An XMPP timestamp + * + * Converts an XMPP timestamp to a struct tm showing local time. + * + * Return value: The local time struct. + **/ +EXPORT_C struct tm * +lm_utils_get_localtime (const gchar *stamp) +{ + struct tm tm; + time_t t; + gint year, month; + + g_return_val_if_fail (stamp != NULL, NULL); + + /* 20021209T23:51:30 */ + + sscanf (stamp, "%4d%2d%2dT%2d:%2d:%2d", + &year, &month, &tm.tm_mday, &tm.tm_hour, + &tm.tm_min, &tm.tm_sec); + + tm.tm_year = year - 1900; + tm.tm_mon = month - 1; + tm.tm_isdst = -1; + + t = mktime (&tm); + +#if defined(HAVE_TM_GMTOFF) + t += tm.tm_gmtoff; +#elif defined(HAVE_TIMEZONE) + t -= timezone; + if (tm.tm_isdst > 0) { + t += 3600; + } +#endif + + return localtime (&t); +} + + diff -r 000000000000 -r d0f3a028347a loudmouth/src/md5.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/src/md5.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,381 @@ +/* + Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.c is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order + either statically or dynamically; added missing #include + in library. + 2002-03-11 lpd Corrected argument list for main(), and added int return + type, in test program and T value program. + 2002-02-21 lpd Added missing #include in test program. + 2000-07-03 lpd Patched to eliminate warnings about "constant is + unsigned in ANSI C, signed in traditional"; made test program + self-checking. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). + 1999-05-03 lpd Original version. + */ + +#include "md5.h" +#include + +#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ +#ifdef ARCH_IS_BIG_ENDIAN +# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) +#else +# define BYTE_ORDER 0 +#endif + +#define T_MASK ((md5_word_t)~0) +#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) +#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) +#define T3 0x242070db +#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) +#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) +#define T6 0x4787c62a +#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) +#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) +#define T9 0x698098d8 +#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) +#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) +#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) +#define T13 0x6b901122 +#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) +#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) +#define T16 0x49b40821 +#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) +#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) +#define T19 0x265e5a51 +#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) +#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) +#define T22 0x02441453 +#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) +#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) +#define T25 0x21e1cde6 +#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) +#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) +#define T28 0x455a14ed +#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) +#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) +#define T31 0x676f02d9 +#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) +#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) +#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) +#define T35 0x6d9d6122 +#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) +#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) +#define T38 0x4bdecfa9 +#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) +#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) +#define T41 0x289b7ec6 +#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) +#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) +#define T44 0x04881d05 +#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) +#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) +#define T47 0x1fa27cf8 +#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) +#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) +#define T50 0x432aff97 +#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) +#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) +#define T53 0x655b59c3 +#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) +#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) +#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) +#define T57 0x6fa87e4f +#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) +#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) +#define T60 0x4e0811a1 +#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) +#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) +#define T63 0x2ad7d2bb +#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) + + +static void +md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) +{ + md5_word_t + a = pms->abcd[0], b = pms->abcd[1], + c = pms->abcd[2], d = pms->abcd[3]; + md5_word_t t; +#if BYTE_ORDER > 0 + /* Define storage only for big-endian CPUs. */ + md5_word_t X[16]; +#else + /* Define storage for little-endian or both types of CPUs. */ + md5_word_t xbuf[16]; + const md5_word_t *X; +#endif + + { +#if BYTE_ORDER == 0 + /* + * Determine dynamically whether this is a big-endian or + * little-endian machine, since we can use a more efficient + * algorithm on the latter. + */ + static const int w = 1; + + if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ +#endif +#if BYTE_ORDER <= 0 /* little-endian */ + { + /* + * On little-endian machines, we can process properly aligned + * data without copying it. + */ + if (!((data - (const md5_byte_t *)0) & 3)) { + /* data are properly aligned */ + X = (const md5_word_t *)data; + } else { + /* not aligned */ + memcpy(xbuf, data, 64); + X = xbuf; + } + } +#endif +#if BYTE_ORDER == 0 + else /* dynamic big-endian */ +#endif +#if BYTE_ORDER >= 0 /* big-endian */ + { + /* + * On big-endian machines, we must arrange the bytes in the + * right order. + */ + const md5_byte_t *xp = data; + int i; + +# if BYTE_ORDER == 0 + X = xbuf; /* (dynamic only) */ +# else +# define xbuf X /* (static only) */ +# endif + for (i = 0; i < 16; ++i, xp += 4) + xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); + } +#endif + } + +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ +#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 7, T1); + SET(d, a, b, c, 1, 12, T2); + SET(c, d, a, b, 2, 17, T3); + SET(b, c, d, a, 3, 22, T4); + SET(a, b, c, d, 4, 7, T5); + SET(d, a, b, c, 5, 12, T6); + SET(c, d, a, b, 6, 17, T7); + SET(b, c, d, a, 7, 22, T8); + SET(a, b, c, d, 8, 7, T9); + SET(d, a, b, c, 9, 12, T10); + SET(c, d, a, b, 10, 17, T11); + SET(b, c, d, a, 11, 22, T12); + SET(a, b, c, d, 12, 7, T13); + SET(d, a, b, c, 13, 12, T14); + SET(c, d, a, b, 14, 17, T15); + SET(b, c, d, a, 15, 22, T16); +#undef SET + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ +#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 1, 5, T17); + SET(d, a, b, c, 6, 9, T18); + SET(c, d, a, b, 11, 14, T19); + SET(b, c, d, a, 0, 20, T20); + SET(a, b, c, d, 5, 5, T21); + SET(d, a, b, c, 10, 9, T22); + SET(c, d, a, b, 15, 14, T23); + SET(b, c, d, a, 4, 20, T24); + SET(a, b, c, d, 9, 5, T25); + SET(d, a, b, c, 14, 9, T26); + SET(c, d, a, b, 3, 14, T27); + SET(b, c, d, a, 8, 20, T28); + SET(a, b, c, d, 13, 5, T29); + SET(d, a, b, c, 2, 9, T30); + SET(c, d, a, b, 7, 14, T31); + SET(b, c, d, a, 12, 20, T32); +#undef SET + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + H(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 5, 4, T33); + SET(d, a, b, c, 8, 11, T34); + SET(c, d, a, b, 11, 16, T35); + SET(b, c, d, a, 14, 23, T36); + SET(a, b, c, d, 1, 4, T37); + SET(d, a, b, c, 4, 11, T38); + SET(c, d, a, b, 7, 16, T39); + SET(b, c, d, a, 10, 23, T40); + SET(a, b, c, d, 13, 4, T41); + SET(d, a, b, c, 0, 11, T42); + SET(c, d, a, b, 3, 16, T43); + SET(b, c, d, a, 6, 23, T44); + SET(a, b, c, d, 9, 4, T45); + SET(d, a, b, c, 12, 11, T46); + SET(c, d, a, b, 15, 16, T47); + SET(b, c, d, a, 2, 23, T48); +#undef SET + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ +#define I(x, y, z) ((y) ^ ((x) | ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 6, T49); + SET(d, a, b, c, 7, 10, T50); + SET(c, d, a, b, 14, 15, T51); + SET(b, c, d, a, 5, 21, T52); + SET(a, b, c, d, 12, 6, T53); + SET(d, a, b, c, 3, 10, T54); + SET(c, d, a, b, 10, 15, T55); + SET(b, c, d, a, 1, 21, T56); + SET(a, b, c, d, 8, 6, T57); + SET(d, a, b, c, 15, 10, T58); + SET(c, d, a, b, 6, 15, T59); + SET(b, c, d, a, 13, 21, T60); + SET(a, b, c, d, 4, 6, T61); + SET(d, a, b, c, 11, 10, T62); + SET(c, d, a, b, 2, 15, T63); + SET(b, c, d, a, 9, 21, T64); +#undef SET + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + pms->abcd[0] += a; + pms->abcd[1] += b; + pms->abcd[2] += c; + pms->abcd[3] += d; +} + +void +md5_init(md5_state_t *pms) +{ + pms->count[0] = pms->count[1] = 0; + pms->abcd[0] = 0x67452301; + pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; + pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; + pms->abcd[3] = 0x10325476; +} + +void +md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) +{ + const md5_byte_t *p = data; + int left = nbytes; + int offset = (pms->count[0] >> 3) & 63; + md5_word_t nbits = (md5_word_t)(nbytes << 3); + + if (nbytes <= 0) + return; + + /* Update the message length. */ + pms->count[1] += nbytes >> 29; + pms->count[0] += nbits; + if (pms->count[0] < nbits) + pms->count[1]++; + + /* Process an initial partial block. */ + if (offset) { + int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); + + memcpy(pms->buf + offset, p, copy); + if (offset + copy < 64) + return; + p += copy; + left -= copy; + md5_process(pms, pms->buf); + } + + /* Process full blocks. */ + for (; left >= 64; p += 64, left -= 64) + md5_process(pms, p); + + /* Process a final partial block. */ + if (left) + memcpy(pms->buf, p, left); +} + +void +md5_finish(md5_state_t *pms, md5_byte_t digest[16]) +{ + static const md5_byte_t pad[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + md5_byte_t data[8]; + int i; + + /* Save the length before padding. */ + for (i = 0; i < 8; ++i) + data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); + /* Pad to 56 bytes mod 64. */ + md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + /* Append the length. */ + md5_append(pms, data, 8); + for (i = 0; i < 16; ++i) + digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); +} diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/bmarm/tstlmu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/bmarm/tstlmu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + LibEntryL__FR13CTestModuleIf @ 1 NONAME R3UNUSED ; LibEntryL(CTestModuleIf &) + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/bwins/tstlmu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/bwins/tstlmu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &) + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,575 @@ +[Define] +SERVER chat.gizmoproject.com +USERNAME prima@chat.gizmoproject.com +PASSWORD donna +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +OnlyDomainofJID @chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +BadGizmoDomain prima@chat.gizmoooproject.com +BadGtalkDomain nokiaprima@gmaiiil.com +badpassword 12345 +badserver chat.gizmoprojeeeect.com +UsernameWithBadServer testlmnokia@chat.gizmoprojeeeeect.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGPASSWORD thisisawrongpasswordandthetestcaseshouldnotfail +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com + +EMPTYCONTACT Emptycontact@chat.gizmoproject.com +EMPTYPASSWORD test + +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 + +PROXY_SERVER 172.16.9.181 +PROXY_PORT 8080 +[Enddefine] + +[Test] +title 1. lm_connection_new +create tstlm LmObj +LmObj lm_connection_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 2. lm_connection_send +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 3. lm_fetching_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 4. lm_fetching_presence +create tstlm LmObj +LmObj lm_fetching_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 5. lm_connection_new_with_context +create tstlm LmObj +LmObj lm_new_with_context +delete LmObj +[Endtest] + +[Test] +title 6. lm_connection_open +create tstlm LmObj +LmObj lm_connection_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 7. lm_connection_closeWhenNotOpen +create tstlm LmObj +LmObj lm_connection_closeWhenNotOpen SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 8. lm_connection_authenticate +create tstlm LmObj +LmObj lm_authenticate SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 9. lm_connection_is_open +create tstlm LmObj +LmObj lm_connection_is_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 10. lm_connection_authenticate_withbadpassword +create tstlm LmObj +LmObj lm_authenticate_badpassword SERVER USERNAME badpassword RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 11. lm_connection_authenticate when connection is closed +create tstlm LmObj +LmObj lm_authenticate_connectionisnotcreated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 12. lm_connection_is_open_WhenConnectionIsClosed +create tstlm LmObj +LmObj lm_connection_is_open_WhenConnectionIsClosed SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 13. lm_connection_close +create tstlm LmObj +LmObj lm_connection_close SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 14. lm_connection_is_authenticated +create tstlm LmObj +LmObj lm_is_authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 15. lm_connection_is_authenticated_WhenNot_Authenticated +create tstlm LmObj +LmObj lm_connection_is_authenticated_WhenNot_Authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 16. lm_connection_set_get_server +create tstlm LmObj +LmObj lm_connection_set_get_server SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 17. lm_connection_set_get_port +create tstlm LmObj +LmObj lm_connection_set_get_port +delete LmObj +[Endtest] + +[Test] +title 18. lm_connection_set_get_ssl +create tstlm LmObj +LmObj lm_connection_set_get_ssl +delete LmObj +[Endtest] + + +[Test] +title 19. lm_connection_set_get_proxy +create tstlm LmObj +LmObj lm_connection_set_get_proxy +delete LmObj +[Endtest] + +[Test] +title 20. lm_connection_set_get_jid +create tstlm LmObj +LmObj lm_connection_set_get_jid SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 21. lm_connection_set_jid_WithNull +create tstlm LmObj +LmObj lm_connection_set_jid_WithNull SERVER \0 PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 22. lm_connection_set_port_WithNULL +create tstlm LmObj +LmObj lm_connection_set_port_WithNULL +delete LmObj +[Endtest] + +[Test] +title 23. lm_connection_set_server_withNULL +create tstlm LmObj +LmObj lm_connection_set_server_withNULL \0 USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 24. lm_connection_set_disconnect_function +create tstlm LmObj +LmObj set_disconnect_function SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 25. lm_connection_send_with_reply +create tstlm LmObj +LmObj lm_send_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 26. lm_proxy_set_get_port +create tstlm LmObj +LmObj lm_proxy_set_get_port +delete LmObj +[Endtest] + +[Test] +title 27. lm_proxy_set_get_type +create tstlm LmObj +LmObj lm_proxy_set_get_type +delete LmObj +[Endtest] + +[Test] +title 28. lm_proxy_set_get_server +create tstlm LmObj +LmObj lm_proxy_set_get_server +delete LmObj +[Endtest] + + +[Test] +title 29. lm_proxy_set_get_username +create tstlm LmObj +LmObj lm_proxy_set_get_username +delete LmObj +[Endtest] + + + +[Test] +title 30. lm_proxy_set_get_password +create tstlm LmObj +LmObj lm_proxy_set_get_password +delete LmObj +[Endtest] + +[Test] +title 31. lm_proxy_new +create tstlm LmObj +LmObj lm_proxy_new +delete LmObj +[Endtest] + +[Test] +title 32. lm_proxy_new_with_server +create tstlm LmObj +LmObj lm_proxy_new_with_server +delete LmObj +[Endtest] + + +[Test] +title 33. lm_proxy_ref +create tstlm LmObj +LmObj lm_proxy_ref +delete LmObj +[Endtest] + +[Test] +title 34. lm_proxy_unref +create tstlm LmObj +LmObj lm_proxy_unref +delete LmObj +[Endtest] + +[Test] +title 35. lm_ssl_new +create tstlm LmObj +LmObj lm_ssl_new +delete LmObj +[Endtest] + +[Test] +title 36. lm_ssl_is_supported +create tstlm LmObj +LmObj lm_ssl_is_supported +delete LmObj +[Endtest] + +[Test] +title 37. lm_ssl_get_fingerprint +create tstlm LmObj +LmObj lm_ssl_get_fingerprint +delete LmObj +[Endtest] + +[Test] +title 38. lm_ssl_ref +create tstlm LmObj +LmObj lm_ssl_ref +delete LmObj +[Endtest] + +[Test] +title 39. lm_ssl_unref +create tstlm LmObj +LmObj lm_ssl_unref +delete LmObj +[Endtest] + + +[Test] +title 40. lm_message_node_ref +create tstlm LmObj +LmObj lm_message_node_ref +delete LmObj +[Endtest] + +[Test] +title 41. lm_message_node_unref +create tstlm LmObj +LmObj lm_message_node_unref +delete LmObj +[Endtest] + +[Test] +title 42. lm_message_node_to_string +create tstlm LmObj +LmObj lm_message_node_to_string +delete LmObj +[Endtest] + + +\\failed when run together. passed independantly +[Test] +title 43. lm_message_node_set_get_attributes +create tstlm LmObj +LmObj lm_message_node_set_get_attributes +delete LmObj +[Endtest] + + +[Test] +title 44. lm_message_node_set_get_raw_mode +create tstlm LmObj +LmObj lm_message_node_set_get_raw_mode +delete LmObj +[Endtest] + +\\failed when run together. passed independantly +[Test] +title 45. lm_message_node_add_child +create tstlm LmObj +LmObj lm_message_node_add_child +delete LmObj +[Endtest] + +[Test] +title 46. lm_message_node_get_child +create tstlm LmObj +LmObj lm_message_node_get_child +delete LmObj +[Endtest] + +[Test] +title 47. lm_message_node_find_child +create tstlm LmObj +LmObj lm_message_node_find_child +delete LmObj +[Endtest] + + +[Test] +title 48. lm_message_node_set_get_value +create tstlm LmObj +LmObj lm_message_node_set_get_value +delete LmObj +[Endtest] + +[Test] +title 49. lm_message_handler_new +create tstlm LmObj +LmObj lm_message_handler_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 50. lm_message_handler_invalidate +create tstlm LmObj +LmObj lm_message_handler_invalidate +delete LmObj +[Endtest] + +[Test] +title 51. lm_message_handler_is_valid +create tstlm LmObj +LmObj lm_message_handler_is_valid +delete LmObj +[Endtest] + +[Test] +title 52. lm_message_handler_ref +create tstlm LmObj +LmObj lm_message_handler_ref +delete LmObj +[Endtest] + +[Test] +title 53. lm_message_handler_unref +create tstlm LmObj +LmObj lm_message_handler_unref +delete LmObj +[Endtest] + +[Test] +title 54. lm_message_new +create tstlm LmObj +LmObj lm_message_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 55. lm_message_new_with_sub_type +create tstlm LmObj +LmObj lm_message_new_with_sub_type SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 56. lm_message_get_type +create tstlm LmObj +LmObj lm_message_get_type +delete LmObj +[Endtest] + +[Test] +title 57. lm_message_get_sub_type +create tstlm LmObj +LmObj lm_message_get_sub_type +delete LmObj +[Endtest] + +[Test] +title 58. lm_message_get_node +create tstlm LmObj +LmObj lm_message_get_node +delete LmObj +[Endtest] + +[Test] +title 59. lm_message_ref +create tstlm LmObj +LmObj lm_message_ref +delete LmObj +[Endtest] + +[Test] +title 60. lm_message_unref +create tstlm LmObj +LmObj lm_message_unref +delete LmObj +[Endtest] + + +[Test] +title 61. lm_connection_get_state +create tstlm LmObj +LmObj lm_connection_get_state SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 62. lm_connection_ref +create tstlm LmObj +LmObj lm_connection_ref +delete LmObj +[Endtest] + +[Test] +title 63. lm_connection_unref +create tstlm LmObj +LmObj lm_connection_unref +delete LmObj +[Endtest] + + +[Test] +title 64. lm_connection_send_raw +create tstlm LmObj +LmObj lm_connection_send_raw SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 65. lm_register_message_handler +create tstlm LmObj +LmObj register_message_handler SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 66. lm_set_ssl_WithNULL +create tstlm LmObj +LmObj lm_connection_set_ssl_WithNULL +delete LmObj +[Endtest] + +[Test] +title 67. lm_connection_authenticate_withUnexistJID +create tstlm LmObj +LmObj lm_authenticate_unexistjid SERVER UnexistGizmoJID PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 68. lm_login_test_with_SpecialChar_JID +create tstlm LmObj +LmObj lm_login_test SERVER SpecialUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 69. lm_login_test_with_Long_JID +create tstlm LmObj +LmObj lm_login_test SERVER LONGUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 70. lm_login_test_with_Long_PASSWORD +create tstlm LmObj +LmObj lm_login_test SERVER USERNAME LONGPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 71. lm_send_long_message +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT LONGMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 72. lm_send_400chars +create tstlm LmObj +LmObj lm_connection_send400char SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 73. lm_send_repeated +create tstlm LmObj +LmObj lm_connection_send_repeated SERVER USERNAME PASSWORD RECIPIENT REPEATEDMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 74. lm_send_smiley +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm1.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,304 @@ +[Define] +SERVER chat.gizmoproject.com +USERNAME prima@chat.gizmoproject.com +PASSWORD donna +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +OnlyDomainofJID @chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +BadGizmoDomain prima@chat.gizmoooproject.com +badpassword 12345 +badserver chat.gizmoprojeeeect.com +UsernameWithBadServer testlmnokia@chat.gizmoprojeeeeect.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGPASSWORD loudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouth +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com + +EMPTYCONTACT Emptycontact@chat.gizmoproject.com +EMPTYPASSWORD test + +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 + +PROXY_SERVER 172.16.9.181 +PROXY_PORT 8080 +[Enddefine] + +[Test] +title 75. lm_add_contact +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 76. lm_remove_contact +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 77. lm_subscribe_contact +create tstlm LmObj +LmObj lm_subscribe_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 78. lm_send_receive +create tstlm LmObj +LmObj lm_connection_send_receive SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 80. lm_send_to_LongGmailUserid +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD LONGGMAILUSERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 81. lm_connection_cancel_open +create tstlm LmObj +LmObj lm_connection_cancel_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 82. lm_send_image_bytestream_msg +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_msg SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 83. lm_send_image_bytestream_iq +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_iq SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 84. lm_get_privacy_lists +create tstlm LmObj +LmObj lm_connection_get_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 85. lm_set_privacy_lists +create tstlm LmObj +LmObj lm_connection_set_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 86. lm_get_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 87. lm_set_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 88. lm_create_one_privacy_list +create tstlm LmObj +LmObj lm_connection_create_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 89. lm_get_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 90. lm_set_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_set_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 91. lm_get_many_privacy_list_from_listname +create tstlm LmObj +LmObj lm_connection_get_many_privacy_list_from_listname SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 92. lm_set_active_list +create tstlm LmObj +LmObj lm_connection_set_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 93. lm_set_unexist_active_list +create tstlm LmObj +LmObj lm_connection_set_unexist_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 94. lm_set_decline_active_list +create tstlm LmObj +LmObj lm_connection_set_decline_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 95. lm_block_contact +create tstlm LmObj +LmObj lm_connection_block_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 96. lm_unblock_contact +create tstlm LmObj +LmObj lm_connection_unblock_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 97. lm_send_multiple_conn +create tstlm LmObj +LmObj lm_connection_send_multiple_conn SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 98. lm_service_discovery +create tstlm LmObj +LmObj lm_service_discovery SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 99. lm_simple_communications_blocking +create tstlm LmObj +LmObj lm_simple_communications_blocking SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 100. lm_service_discovery_connected_resource +create tstlm LmObj +LmObj lm_service_discovery_connected_resource SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 101. lm_send_im_with_reply_unexistjid_gizmo +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGizmoJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 102. lm_add_contact_unexistjid_gizmo +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 103. lm_remove_contact_unexisting_gizmo +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 104. lm_add_contact_unexistjid_gtalk +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 105. lm_remove_contact_unexisting_gtalk +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 106. lm_add_contact_long_gtalkid +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 107. lm_remove_contact_long_gtalkid +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 108. lm_send_im_with_reply +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 109. lm_fetching_empty_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER EMPTYCONTACT EMPTYPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 110. lm_change_own_presence +create tstlm LmObj +LmObj lm_change_own_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE + PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 111. lm_send_im_with_reply_invalid_gizmo +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGizmoJID MESSAGE RES +OURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 112. lm_send_im_with_reply_invalid_gizmodomain_only +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD OnlyDomainofJID MESSAGE RES +OURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm_NFT.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm_NFT.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,82 @@ +[Define] +SERVER talk.google.com +USERNAME nokiaprima@gmail.com +PASSWORD nokianokia +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 +USERNAME1 rakesh.harsh@gmail.com +PASSWORD1 majisay82 +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +OnlyDomainofJID @gmail.com +BadGizmoDomain prima@chat.gizmoooproject.com +BadGtalkDomain nokiaprima@gmaiiil.com +badpassword 12345 +badserver talk.goo456gly.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com +LONGPASSWORD thisisawrongpasswordandthetestcaseshouldnotfail +SPECIALMESSAGE hello&*&*^#^*)%)@$)*@)(*%%(*!^%@^#% +EMPTYCONTACT Emptycontact@gmail.com +EMPTYPASSWORD testtesttest +EMPTYDOMAIN nokiaprima +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 +UsernameWithBadServer prima@talk.goo456gly.com + + +PROXY_SERVER 172.16.42.135 +PROXY_PORT 8080 + +[Enddefine] + +[Test] +title 1. lm_nft_updating_presence +create tstlm LmObj +LmObj lm_nft_updating_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 2. lm_nft_presence_notification +create tstlm LmObj +LmObj lm_nft_presence_notification SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 3. lm_nft_send_text_message +create tstlm LmObj +LmObj lm_nft_send_text_message SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 4. lm_nft_open_conversation_with_multiple +create tstlm LmObj +LmObj lm_nft_open_conversation_with_multiple SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 5. lm_nft_fetch300_contact +create tstlm LmObj +LmObj lm_nft_fetch300_contact SERVER USERNAME1 PASSWORD1 RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 6. lm_nft_loginlogoutmultipletime +create tstlm LmObj +LmObj lm_nft_loginlogoutmultipletime SERVER USERNAME1 PASSWORD1 RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm_gizmo.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm_gizmo.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,592 @@ +[Define] +SERVER chat.gizmoproject.com +USERNAME prima@chat.gizmoproject.com +PASSWORD donna +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +OnlyDomainofJID @chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +BadGizmoDomain prima@chat.gizmooo123project.com +BadGtalkDomain nokiaprima@gmaiiil.com +badpassword 12345 +badserver chat.gizmoprojeeeect.com +UsernameWithBadServer testlmnokia@chat.gizmoproj123eeeeect.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGPASSWORD thisisawrongpasswordandthetestcaseshouldnotfail +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +SPECIALMESSAGE hello&*&*^#^*)%)@$)*@)(*%%(*!^%@^#% +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com + +EMPTYCONTACT Emptycontact@chat.gizmoproject.com +EMPTYPASSWORD test +EMPTYDOMAIN prima +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 + + +PROXY_SERVER 172.16.9.181 +PROXY_PORT 8080 + +[Enddefine] + +[Test] +title 1. lm_connection_new +create tstlm LmObj +LmObj lm_connection_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 2. lm_connection_send +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 3. lm_fetching_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 4. lm_fetching_presence +create tstlm LmObj +LmObj lm_fetching_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 5. lm_connection_new_with_context +create tstlm LmObj +LmObj lm_new_with_context +delete LmObj +[Endtest] + +[Test] +title 6. lm_connection_open +create tstlm LmObj +LmObj lm_connection_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 7. lm_connection_closeWhenNotOpen +create tstlm LmObj +LmObj lm_connection_closeWhenNotOpen SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 8. lm_connection_authenticate +create tstlm LmObj +LmObj lm_authenticate SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 9. lm_connection_is_open +create tstlm LmObj +LmObj lm_connection_is_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 10. lm_connection_authenticate_withbadpassword +create tstlm LmObj +LmObj lm_authenticate_badpassword SERVER USERNAME badpassword RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 11. lm_connection_authenticate when connection is closed +create tstlm LmObj +LmObj lm_authenticate_connectionisnotcreated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 12. lm_connection_is_open_WhenConnectionIsClosed +create tstlm LmObj +LmObj lm_connection_is_open_WhenConnectionIsClosed SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 13. lm_connection_close +create tstlm LmObj +LmObj lm_connection_close SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 14. lm_connection_is_authenticated +create tstlm LmObj +LmObj lm_is_authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 15. lm_connection_is_authenticated_WhenNot_Authenticated +create tstlm LmObj +LmObj lm_connection_is_authenticated_WhenNot_Authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 16. lm_connection_set_get_server +create tstlm LmObj +LmObj lm_connection_set_get_server SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 17. lm_connection_set_get_port +create tstlm LmObj +LmObj lm_connection_set_get_port +delete LmObj +[Endtest] + +[Test] +title 18. lm_connection_set_get_ssl +create tstlm LmObj +LmObj lm_connection_set_get_ssl +delete LmObj +[Endtest] + + +[Test] +title 19. lm_connection_set_get_proxy +create tstlm LmObj +LmObj lm_connection_set_get_proxy +delete LmObj +[Endtest] + +[Test] +title 20. lm_connection_set_get_jid +create tstlm LmObj +LmObj lm_connection_set_get_jid SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 21. lm_connection_set_jid_WithNull +create tstlm LmObj +LmObj lm_connection_set_jid_WithNull SERVER \0 PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 22. lm_connection_set_port_WithNULL +create tstlm LmObj +LmObj lm_connection_set_port_WithNULL +delete LmObj +[Endtest] + + +[Test] +title 23. lm_connection_set_server_withNULL +create tstlm LmObj +LmObj lm_connection_set_server_withNULL \0 USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 24. lm_connection_set_disconnect_function +create tstlm LmObj +LmObj set_disconnect_function SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 25. lm_connection_send_with_reply +create tstlm LmObj +LmObj lm_send_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 26. lm_proxy_set_get_port +create tstlm LmObj +LmObj lm_proxy_set_get_port +delete LmObj +[Endtest] + +[Test] +title 27. lm_proxy_set_get_type +create tstlm LmObj +LmObj lm_proxy_set_get_type +delete LmObj +[Endtest] + + +[Test] +title 28. lm_proxy_set_get_server +create tstlm LmObj +LmObj lm_proxy_set_get_server +delete LmObj +[Endtest] + + +[Test] +title 29. lm_proxy_set_get_username +create tstlm LmObj +LmObj lm_proxy_set_get_username +delete LmObj +[Endtest] + + + +[Test] +title 30. lm_proxy_set_get_password +create tstlm LmObj +LmObj lm_proxy_set_get_password +delete LmObj +[Endtest] + +[Test] +title 31. lm_proxy_new +create tstlm LmObj +LmObj lm_proxy_new +delete LmObj +[Endtest] + +[Test] +title 32. lm_proxy_new_with_server +create tstlm LmObj +LmObj lm_proxy_new_with_server +delete LmObj +[Endtest] + + +[Test] +title 33. lm_proxy_ref +create tstlm LmObj +LmObj lm_proxy_ref +delete LmObj +[Endtest] + +[Test] +title 34. lm_proxy_unref +create tstlm LmObj +LmObj lm_proxy_unref +delete LmObj +[Endtest] + + +[Test] +title 35. lm_ssl_new +create tstlm LmObj +LmObj lm_ssl_new +delete LmObj +[Endtest] + +[Test] +title 36. lm_ssl_is_supported +create tstlm LmObj +LmObj lm_ssl_is_supported +delete LmObj +[Endtest] + + +[Test] +title 37. lm_ssl_get_fingerprint +create tstlm LmObj +LmObj lm_ssl_get_fingerprint +delete LmObj +[Endtest] + +[Test] +title 38. lm_ssl_ref +create tstlm LmObj +LmObj lm_ssl_ref +delete LmObj +[Endtest] + +[Test] +title 39. lm_ssl_unref +create tstlm LmObj +LmObj lm_ssl_unref +delete LmObj +[Endtest] + + +[Test] +title 40. lm_message_node_ref +create tstlm LmObj +LmObj lm_message_node_ref +delete LmObj +[Endtest] + +[Test] +title 41. lm_message_node_unref +create tstlm LmObj +LmObj lm_message_node_unref +delete LmObj +[Endtest] + +[Test] +title 42. lm_message_node_to_string +create tstlm LmObj +LmObj lm_message_node_to_string +delete LmObj +[Endtest] + + +\\failed when run together. passed independantly +[Test] +title 43. lm_message_node_set_get_attributes +create tstlm LmObj +LmObj lm_message_node_set_get_attributes +delete LmObj +[Endtest] + + +[Test] +title 44. lm_message_node_set_get_raw_mode +create tstlm LmObj +LmObj lm_message_node_set_get_raw_mode +delete LmObj +[Endtest] + +\\failed when run together. passed independantly +[Test] +title 45. lm_message_node_add_child +create tstlm LmObj +LmObj lm_message_node_add_child +delete LmObj +[Endtest] + +[Test] +title 46. lm_message_node_get_child +create tstlm LmObj +LmObj lm_message_node_get_child +delete LmObj +[Endtest] + +[Test] +title 47. lm_message_node_find_child +create tstlm LmObj +LmObj lm_message_node_find_child +delete LmObj +[Endtest] + + +[Test] +title 48. lm_message_node_set_get_value +create tstlm LmObj +LmObj lm_message_node_set_get_value +delete LmObj +[Endtest] + + +[Test] +title 49. lm_message_handler_new +create tstlm LmObj +LmObj lm_message_handler_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 50. lm_message_handler_invalidate +create tstlm LmObj +LmObj lm_message_handler_invalidate +delete LmObj +[Endtest] + +[Test] +title 51. lm_message_handler_is_valid +create tstlm LmObj +LmObj lm_message_handler_is_valid +delete LmObj +[Endtest] + +[Test] +title 52. lm_message_handler_ref +create tstlm LmObj +LmObj lm_message_handler_ref +delete LmObj +[Endtest] + +[Test] +title 53. lm_message_handler_unref +create tstlm LmObj +LmObj lm_message_handler_unref +delete LmObj +[Endtest] + + +[Test] +title 54. lm_message_new +create tstlm LmObj +LmObj lm_message_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 55. lm_message_new_with_sub_type +create tstlm LmObj +LmObj lm_message_new_with_sub_type SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 56. lm_message_get_type +create tstlm LmObj +LmObj lm_message_get_type +delete LmObj +[Endtest] + +[Test] +title 57. lm_message_get_sub_type +create tstlm LmObj +LmObj lm_message_get_sub_type +delete LmObj +[Endtest] + +[Test] +title 58. lm_message_get_node +create tstlm LmObj +LmObj lm_message_get_node +delete LmObj +[Endtest] + +[Test] +title 59. lm_message_ref +create tstlm LmObj +LmObj lm_message_ref +delete LmObj +[Endtest] + +[Test] +title 60. lm_message_unref +create tstlm LmObj +LmObj lm_message_unref +delete LmObj +[Endtest] + + +[Test] +title 61. lm_connection_get_state +create tstlm LmObj +LmObj lm_connection_get_state SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 62. lm_connection_ref +create tstlm LmObj +LmObj lm_connection_ref +delete LmObj +[Endtest] + +[Test] +title 63. lm_connection_unref +create tstlm LmObj +LmObj lm_connection_unref +delete LmObj +[Endtest] + + +[Test] +title 64. lm_connection_send_raw +create tstlm LmObj +LmObj lm_connection_send_raw SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 65. lm_register_message_handler +create tstlm LmObj +LmObj register_message_handler SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 66. lm_set_ssl_WithNULL +create tstlm LmObj +LmObj lm_connection_set_ssl_WithNULL +delete LmObj +[Endtest] + + +[Test] +title 67. lm_connection_authenticate_withUnexistJID +create tstlm LmObj +LmObj lm_authenticate_unexistjid SERVER UnexistGizmoJID PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 68. lm_login_test_with_SpecialChar_JID +create tstlm LmObj +LmObj lm_login_test SERVER SpecialUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 69. lm_login_test_with_Long_JID +create tstlm LmObj +LmObj lm_login_test SERVER LONGUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 70. lm_login_test_with_Long_PASSWORD +create tstlm LmObj +LmObj lm_login_test SERVER USERNAME LONGPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 71. lm_send_long_message +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT LONGMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 72. lm_send_400chars +create tstlm LmObj +LmObj lm_connection_send400char SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 73. lm_send_repeated +create tstlm LmObj +LmObj lm_connection_send_repeated SERVER USERNAME PASSWORD RECIPIENT REPEATEDMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 74. lm_send_smiley +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm_gizmo1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm_gizmo1.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,356 @@ +[Define] +SERVER chat.gizmoproject.com +USERNAME prima@chat.gizmoproject.com +PASSWORD donna +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +OnlyDomainofJID @chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +BadGizmoDomain prima@chat.gizmo123ooproject.com +badpassword 12345 +badserver chat.gizmop123rojeeeect.com +UsernameWithBadServer testlmnokia@chat.gizmoprojeeeeect.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@chat.gizmoproject.com +LONGPASSWORD loudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouthloudmouth +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com +SPECIALMESSAGE hello&*&*^#^*)%)@$)*@)(*%%(*!^%@^#% +EMPTYCONTACT Emptycontact@chat.gizmoproject.com +EMPTYPASSWORD test + +EMPTYDOMAIN prima +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 + +PROXY_SERVER 172.16.9.181 +PROXY_PORT 8080 +[Enddefine] + +[Test] +title 75. lm_add_contact +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 76. lm_remove_contact +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 77. lm_subscribe_contact +create tstlm LmObj +LmObj lm_subscribe_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 78. lm_send_receive +create tstlm LmObj +LmObj lm_connection_send_receive SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 80. lm_send_to_LongGmailUserid +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD LONGGMAILUSERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 81. lm_connection_cancel_open +create tstlm LmObj +LmObj lm_connection_cancel_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 82. lm_send_image_bytestream_msg +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_msg SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 83. lm_send_image_bytestream_iq +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_iq SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 84. lm_get_privacy_lists +create tstlm LmObj +LmObj lm_connection_get_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 85. lm_set_privacy_lists +create tstlm LmObj +LmObj lm_connection_set_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 86. lm_get_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 87. lm_set_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 88. lm_create_one_privacy_list +create tstlm LmObj +LmObj lm_connection_create_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 89. lm_get_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 90. lm_set_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_set_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 91. lm_get_many_privacy_list_from_listname +create tstlm LmObj +LmObj lm_connection_get_many_privacy_list_from_listname SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 92. lm_set_active_list +create tstlm LmObj +LmObj lm_connection_set_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 93. lm_set_unexist_active_list +create tstlm LmObj +LmObj lm_connection_set_unexist_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 94. lm_set_decline_active_list +create tstlm LmObj +LmObj lm_connection_set_decline_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 95. lm_block_contact +create tstlm LmObj +LmObj lm_connection_block_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 96. lm_unblock_contact +create tstlm LmObj +LmObj lm_connection_unblock_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 97. lm_send_multiple_conn +create tstlm LmObj +LmObj lm_connection_send_multiple_conn SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 98. lm_service_discovery +create tstlm LmObj +LmObj lm_service_discovery SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 99. lm_simple_communications_blocking +create tstlm LmObj +LmObj lm_simple_communications_blocking SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 100. lm_service_discovery_connected_resource +create tstlm LmObj +LmObj lm_service_discovery_connected_resource SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 101. lm_send_im_with_reply_unexistjid_gizmo +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGizmoJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 102. lm_add_contact_unexistjid_gizmo +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 103. lm_remove_contact_unexisting_gizmo +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 104. lm_add_contact_unexistjid_gtalk +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 105. lm_remove_contact_unexisting_gtalk +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 106. lm_add_contact_long_gtalkid +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 107. lm_remove_contact_long_gtalkid +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 108. lm_send_im_with_reply +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 109. lm_fetching_empty_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER EMPTYCONTACT EMPTYPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 110. lm_change_own_presence +create tstlm LmObj +LmObj lm_change_own_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 111. lm_send_im_with_reply_invalid_gizmo +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGizmoJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 112. lm_send_im_with_reply_invalid_gizmodomain_only +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD OnlyDomainofJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 113. lm_send_message_with_special_char +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT SPECIALMESSAGE RESOU +RCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 114. lm_login_test_with_blank_username +create tstlm LmObj +LmObj lm_login_test SERVER \0 PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER P +ROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 115. lm_login_test_with_blank_password +create tstlm LmObj +LmObj lm_login_test SERVER USERNAME \0 RECIPIENT MESSAGE RESOURCE PROXY_SERVER P +ROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 116. lm_login_test_empty_domain +create tstlm LmObj +LmObj lm_login_test SERVER EMPTYDOMAIN PASSWORD RECIPIENT MESSAGE RESOURCE PROXY +_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 117. lm_login_test_invalid_port +create tstlm LmObj +LmObj lm_login_test_invalid_port SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 118. lm_login_test_invalid_server +create tstlm LmObj +LmObj lm_login_test_invalid_server badserver USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 79. lm_login_test_invalid_domain +create tstlm LmObj +LmObj lm_login_test_invalid_server SERVER BadGtalkDomain PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm_gtalk.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm_gtalk.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,591 @@ +[Define] +SERVER talk.google.com +USERNAME nokiaprima@gmail.com +PASSWORD nokianokia +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGizmoJID testlmnokia1111@chat.gizmoproject.com +UnexistGTalkJID abcd123_mk@gmail.com +OnlyDomainofJID @gmail.com +BadGizmoDomain prima@chat.gizmoooproject.com +BadGtalkDomain nokiaprima@gmaiiil.com +badpassword 12345 +badserver talk.goo456gly.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com +LONGPASSWORD thisisawrongpasswordandthetestcaseshouldnotfail +SPECIALMESSAGE hello&*&*^#^*)%)@$)*@)(*%%(*!^%@^#% +EMPTYCONTACT Emptycontact@gmail.com +EMPTYPASSWORD testtesttest +EMPTYDOMAIN nokiaprima +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 +UsernameWithBadServer prima@talk.goo456gly.com + + +PROXY_SERVER 172.16.42.135 +PROXY_PORT 8080 + +[Enddefine] + +[Test] +title 1. lm_connection_new +create tstlm LmObj +LmObj lm_connection_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 2. lm_connection_send +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 3. lm_fetching_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 4. lm_fetching_presence +create tstlm LmObj +LmObj lm_fetching_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 5. lm_connection_new_with_context +create tstlm LmObj +LmObj lm_new_with_context +delete LmObj +[Endtest] + +[Test] +title 6. lm_connection_open +create tstlm LmObj +LmObj lm_connection_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 7. lm_connection_closeWhenNotOpen +create tstlm LmObj +LmObj lm_connection_closeWhenNotOpen SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 8. lm_connection_authenticate +create tstlm LmObj +LmObj lm_authenticate SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 9. lm_connection_is_open +create tstlm LmObj +LmObj lm_connection_is_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 10. lm_connection_authenticate_withbadpassword +create tstlm LmObj +LmObj lm_authenticate_badpassword SERVER USERNAME badpassword RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 11. lm_connection_authenticate when connection is closed +create tstlm LmObj +LmObj lm_authenticate_connectionisnotcreated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 12. lm_connection_is_open_WhenConnectionIsClosed +create tstlm LmObj +LmObj lm_connection_is_open_WhenConnectionIsClosed SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 13. lm_connection_close +create tstlm LmObj +LmObj lm_connection_close SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 14. lm_connection_is_authenticated +create tstlm LmObj +LmObj lm_is_authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 15. lm_connection_is_authenticated_WhenNot_Authenticated +create tstlm LmObj +LmObj lm_connection_is_authenticated_WhenNot_Authenticated SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 16. lm_connection_set_get_server +create tstlm LmObj +LmObj lm_connection_set_get_server SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 17. lm_connection_set_get_port +create tstlm LmObj +LmObj lm_connection_set_get_port +delete LmObj +[Endtest] + +[Test] +title 18. lm_connection_set_get_ssl +create tstlm LmObj +LmObj lm_connection_set_get_ssl +delete LmObj +[Endtest] + + +[Test] +title 19. lm_connection_set_get_proxy +create tstlm LmObj +LmObj lm_connection_set_get_proxy +delete LmObj +[Endtest] + +[Test] +title 20. lm_connection_set_get_jid +create tstlm LmObj +LmObj lm_connection_set_get_jid SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 21. lm_connection_set_jid_WithNull +create tstlm LmObj +LmObj lm_connection_set_jid_WithNull SERVER \0 PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 22. lm_connection_set_port_WithNULL +create tstlm LmObj +LmObj lm_connection_set_port_WithNULL +delete LmObj +[Endtest] + + +[Test] +title 23. lm_connection_set_server_withNULL +create tstlm LmObj +LmObj lm_connection_set_server_withNULL \0 USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 24. lm_connection_set_disconnect_function +create tstlm LmObj +LmObj set_disconnect_function SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 25. lm_connection_send_with_reply +create tstlm LmObj +LmObj lm_send_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 26. lm_proxy_set_get_port +create tstlm LmObj +LmObj lm_proxy_set_get_port +delete LmObj +[Endtest] + +[Test] +title 27. lm_proxy_set_get_type +create tstlm LmObj +LmObj lm_proxy_set_get_type +delete LmObj +[Endtest] + + +[Test] +title 28. lm_proxy_set_get_server +create tstlm LmObj +LmObj lm_proxy_set_get_server +delete LmObj +[Endtest] + + +[Test] +title 29. lm_proxy_set_get_username +create tstlm LmObj +LmObj lm_proxy_set_get_username +delete LmObj +[Endtest] + + + +[Test] +title 30. lm_proxy_set_get_password +create tstlm LmObj +LmObj lm_proxy_set_get_password +delete LmObj +[Endtest] + +[Test] +title 31. lm_proxy_new +create tstlm LmObj +LmObj lm_proxy_new +delete LmObj +[Endtest] + +[Test] +title 32. lm_proxy_new_with_server +create tstlm LmObj +LmObj lm_proxy_new_with_server +delete LmObj +[Endtest] + + +[Test] +title 33. lm_proxy_ref +create tstlm LmObj +LmObj lm_proxy_ref +delete LmObj +[Endtest] + +[Test] +title 34. lm_proxy_unref +create tstlm LmObj +LmObj lm_proxy_unref +delete LmObj +[Endtest] + + +[Test] +title 35. lm_ssl_new +create tstlm LmObj +LmObj lm_ssl_new +delete LmObj +[Endtest] + +[Test] +title 36. lm_ssl_is_supported +create tstlm LmObj +LmObj lm_ssl_is_supported +delete LmObj +[Endtest] + + +[Test] +title 37. lm_ssl_get_fingerprint +create tstlm LmObj +LmObj lm_ssl_get_fingerprint +delete LmObj +[Endtest] + +[Test] +title 38. lm_ssl_ref +create tstlm LmObj +LmObj lm_ssl_ref +delete LmObj +[Endtest] + +[Test] +title 39. lm_ssl_unref +create tstlm LmObj +LmObj lm_ssl_unref +delete LmObj +[Endtest] + + +[Test] +title 40. lm_message_node_ref +create tstlm LmObj +LmObj lm_message_node_ref +delete LmObj +[Endtest] + +[Test] +title 41. lm_message_node_unref +create tstlm LmObj +LmObj lm_message_node_unref +delete LmObj +[Endtest] + +[Test] +title 42. lm_message_node_to_string +create tstlm LmObj +LmObj lm_message_node_to_string +delete LmObj +[Endtest] + + +\\failed when run together. passed independantly +[Test] +title 43. lm_message_node_set_get_attributes +create tstlm LmObj +LmObj lm_message_node_set_get_attributes +delete LmObj +[Endtest] + + +[Test] +title 44. lm_message_node_set_get_raw_mode +create tstlm LmObj +LmObj lm_message_node_set_get_raw_mode +delete LmObj +[Endtest] + +\\failed when run together. passed independantly +[Test] +title 45. lm_message_node_add_child +create tstlm LmObj +LmObj lm_message_node_add_child +delete LmObj +[Endtest] + +[Test] +title 46. lm_message_node_get_child +create tstlm LmObj +LmObj lm_message_node_get_child +delete LmObj +[Endtest] + +[Test] +title 47. lm_message_node_find_child +create tstlm LmObj +LmObj lm_message_node_find_child +delete LmObj +[Endtest] + + +[Test] +title 48. lm_message_node_set_get_value +create tstlm LmObj +LmObj lm_message_node_set_get_value +delete LmObj +[Endtest] + + +[Test] +title 49. lm_message_handler_new +create tstlm LmObj +LmObj lm_message_handler_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 50. lm_message_handler_invalidate +create tstlm LmObj +LmObj lm_message_handler_invalidate +delete LmObj +[Endtest] + +[Test] +title 51. lm_message_handler_is_valid +create tstlm LmObj +LmObj lm_message_handler_is_valid +delete LmObj +[Endtest] + +[Test] +title 52. lm_message_handler_ref +create tstlm LmObj +LmObj lm_message_handler_ref +delete LmObj +[Endtest] + +[Test] +title 53. lm_message_handler_unref +create tstlm LmObj +LmObj lm_message_handler_unref +delete LmObj +[Endtest] + + +[Test] +title 54. lm_message_new +create tstlm LmObj +LmObj lm_message_new SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 55. lm_message_new_with_sub_type +create tstlm LmObj +LmObj lm_message_new_with_sub_type SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 56. lm_message_get_type +create tstlm LmObj +LmObj lm_message_get_type +delete LmObj +[Endtest] + +[Test] +title 57. lm_message_get_sub_type +create tstlm LmObj +LmObj lm_message_get_sub_type +delete LmObj +[Endtest] + +[Test] +title 58. lm_message_get_node +create tstlm LmObj +LmObj lm_message_get_node +delete LmObj +[Endtest] + +[Test] +title 59. lm_message_ref +create tstlm LmObj +LmObj lm_message_ref +delete LmObj +[Endtest] + +[Test] +title 60. lm_message_unref +create tstlm LmObj +LmObj lm_message_unref +delete LmObj +[Endtest] + + +[Test] +title 61. lm_connection_get_state +create tstlm LmObj +LmObj lm_connection_get_state SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 62. lm_connection_ref +create tstlm LmObj +LmObj lm_connection_ref +delete LmObj +[Endtest] + +[Test] +title 63. lm_connection_unref +create tstlm LmObj +LmObj lm_connection_unref +delete LmObj +[Endtest] + + +[Test] +title 64. lm_connection_send_raw +create tstlm LmObj +LmObj lm_connection_send_raw SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 65. lm_register_message_handler +create tstlm LmObj +LmObj register_message_handler SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + +[Test] +title 66. lm_set_ssl_WithNULL +create tstlm LmObj +LmObj lm_connection_set_ssl_WithNULL +delete LmObj +[Endtest] + + +[Test] +title 67. lm_connection_authenticate_withUnexistJID +create tstlm LmObj +LmObj lm_authenticate_unexistjid SERVER UnexistGtalkJID PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 68. lm_login_test_with_SpecialChar_JID +create tstlm LmObj +LmObj lm_login_test SERVER SpecialUSERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 69. lm_login_test_with_Long_JID +create tstlm LmObj +LmObj lm_login_test SERVER LONGGMAILUSERID GMAILPWD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 70. lm_login_test_with_Long_PASSWORD +create tstlm LmObj +LmObj lm_login_test SERVER USERNAME LONGPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 71. lm_send_long_message +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT LONGMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 72. lm_send_400chars +create tstlm LmObj +LmObj lm_connection_send400char SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 73. lm_send_repeated +create tstlm LmObj +LmObj lm_connection_send_repeated SERVER USERNAME PASSWORD RECIPIENT REPEATEDMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 74. lm_send_smiley +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME PASSWORD RECIPIENT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/conf/tstlm_gtalk1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/conf/tstlm_gtalk1.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,313 @@ +[Define] +SERVER talk.google.com +USERNAME nokiaprima@gmail.com +PASSWORD nokianokia +RECIPIENT donna.prima@gmail.com +MESSAGE Hello +RESOURCE mytesds5rt123 + +UnexistGTalkJID abcd123_mk@gmail.com +OnlyDomainofJID @gmail.com +UnexistGizmoJID primaunexist@chat.gizmoproject.com +BadGizmoDomain prima@chat.gizmoooproject.com +BadGtalkDomain nokiaprima@gmaiiil.com +badpassword 12345 +badserver talk.goo456gly.com +SpecialUSERNAME im:here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGUSERNAME im:here%27s_a_wild_%26_%2Fr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address_here%27s_a_wild_%26_%2Fcr%zy%2F_address@gmail.com +LONGMESSAGE HelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworldHelloworlsfsdfdgdfgdfgdfgdfgdf +REPEATEDMESSAGE RepeatingHello +SMILEYMESSAGE :):-);-):-D:D:-(:( +GIZMOCONTACT harsh_rakesh@chat.gizmoproject.com +LONGPASSWORD thisisawrongpasswordandthetestcaseshouldnotfail +SPECIALMESSAGE hello&*&*^#^*)%)@$)*@)(*%%(*!^%@^#% +EMPTYCONTACT Emptycontact@gmail.com +EMPTYPASSWORD testtesttest +EMPTYDOMAIN nokiaprima +LONGGMAILUSERID abcd123456abcd123456abcd123456@gmail.com +GMAILPWD nokia123 +UsernameWithBadServer prima@talk.goo456gly.com + +PROXY_SERVER 172.16.42.135 +PROXY_PORT 8080 +[Enddefine] + +[Test] +title 75. lm_add_contact +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 76. lm_remove_contact +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD GIZMOCONTACT SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 77. lm_subscribe_contact +create tstlm LmObj +LmObj lm_subscribe_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 78. lm_send_receive +create tstlm LmObj +LmObj lm_connection_send_receive SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 79. lm_login_test_invalid_domain +create tstlm LmObj +LmObj lm_login_test_invalid_server SERVER BadGtalkDomain PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 80. lm_send_to_LongGmailUserid +create tstlm LmObj +LmObj lm_connection_send SERVER USERNAME GMAILPWD LONGGMAILUSERID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 81. lm_connection_cancel_open +create tstlm LmObj +LmObj lm_connection_cancel_open SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 82. lm_send_image_bytestream_msg +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_msg SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 83. lm_send_image_bytestream_iq +create tstlm LmObj +LmObj lm_connection_send_image_bytestream_iq SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 84. lm_get_privacy_lists +create tstlm LmObj +LmObj lm_connection_get_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 85. lm_set_privacy_lists +create tstlm LmObj +LmObj lm_connection_set_privacy_lists SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 86. lm_get_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 87. lm_set_one_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 88. lm_create_one_privacy_list +create tstlm LmObj +LmObj lm_connection_create_one_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 89. lm_get_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_get_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 90. lm_set_one_unexist_privacy_list +create tstlm LmObj +LmObj lm_connection_set_one_unexist_privacy_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 91. lm_get_many_privacy_list_from_listname +create tstlm LmObj +LmObj lm_connection_get_many_privacy_list_from_listname SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 92. lm_set_active_list +create tstlm LmObj +LmObj lm_connection_set_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 93. lm_set_unexist_active_list +create tstlm LmObj +LmObj lm_connection_set_unexist_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 94. lm_set_decline_active_list +create tstlm LmObj +LmObj lm_connection_set_decline_active_list SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 95. lm_block_contact +create tstlm LmObj +LmObj lm_connection_block_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 96. lm_unblock_contact +create tstlm LmObj +LmObj lm_connection_unblock_contact SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 97. lm_send_multiple_conn +create tstlm LmObj +LmObj lm_connection_send_multiple_conn SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 98. lm_service_discovery +create tstlm LmObj +LmObj lm_service_discovery SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 99. lm_simple_communications_blocking +create tstlm LmObj +LmObj lm_simple_communications_blocking SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 100. lm_service_discovery_connected_resource +create tstlm LmObj +LmObj lm_service_discovery_connected_resource SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 101. lm_send_im_with_reply_unexistjid_gizmo +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGizmoJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 102. lm_add_contact_unexistjid_gizmo +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 103. lm_remove_contact_unexisting_gizmo +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGizmoJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 104. lm_add_contact_unexistjid_gtalk +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 105. lm_remove_contact_unexisting_gtalk +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD UnexistGTalkJID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 106. lm_add_contact_long_gtalkid +create tstlm LmObj +LmObj lm_add_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 107. lm_remove_contact_long_gtalkid +create tstlm LmObj +LmObj lm_remove_contact SERVER USERNAME PASSWORD LONGGMAILUSERID SMILEYMESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + +[Test] +title 108. lm_send_im_with_reply +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 109. lm_fetching_empty_contactlist +create tstlm LmObj +LmObj lm_fetching_contactlist SERVER EMPTYCONTACT EMPTYPASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 110. lm_change_own_presence +create tstlm LmObj +LmObj lm_change_own_presence SERVER USERNAME PASSWORD RECIPIENT MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 111. lm_send_im_with_reply_invalid_gtalk +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD UnexistGTalkJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + +[Test] +title 112. lm_send_im_with_reply_invalid_gtalkdomain_only +create tstlm LmObj +LmObj lm_send_im_with_reply SERVER USERNAME PASSWORD OnlyDomainofJID MESSAGE RESOURCE PROXY_SERVER PROXY_PORT +delete LmObj +[Endtest] + + + + + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/eabi/tstlmu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/eabi/tstlmu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + _Z9LibEntryLR13CTestModuleIf @ 1 NONAME + diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ?Description +* +*/ + + + + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these +DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + +PRJ_EXPORTS +../init/TestFramework.ini /epoc32/winscw/c/TestFramework/TestFramework.ini +../conf/tstlm_gtalk.cfg /epoc32/winscw/c/TestFramework/tstlm_gtalk.cfg +../conf/tstlm_gtalk1.cfg /epoc32/winscw/c/TestFramework/tstlm_gtalk1.cfg +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in /epoc32/include +// Example: + + + +PRJ_TESTMMPFILES +// NOTE: If using ARS requirements .mmp file operation should be done under this. +// 'abld test build' +tstlm.mmp +PRJ_MMPFILES +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: +//tstlm.mmp + +// End of File diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/group/tstlm.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/group/tstlm.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ?Description +* +*/ + + +#include +TARGET tstlm.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E3 + +CAPABILITY ALL -TCB + + +//TARGETPATH ?target_path +DEFFILE tstlm.def + +MACRO SYMBIAN + + +SOURCEPATH ../src +SOURCE tstlm.cpp +SOURCE tstlmBlocks.cpp + +//RESOURCE resource_file +//RESOURCE resource_file2 + +USERINCLUDE ../inc + +SYSTEMINCLUDE /epoc32/include +SYSTEMINCLUDE /epoc32/include/internal + +//SYSTEMINCLUDE /epoc32/include/domain/osextensions +USERINCLUDE ../../inc +//#ifdef __S60_32__ +SYSTEMINCLUDE /epoc32/include/stdapis +//SYSTEMINCLUDE /epoc32/include/stdapis/glib-2.0 +//SYSTEMINCLUDE /epoc32/include/stdapis/glib-2.0/glib +//SYSTEMINCLUDE /epoc32/include/stdapis/openssl +//#endif + +//#ifndef __S60_50__ +//SYSTEMINCLUDE /epoc32/include/osextensions/stdapis +//SYSTEMINCLUDE /epoc32/include/osextensions/stdapis/glib-2.0 +//SYSTEMINCLUDE /epoc32/include/osextensions/stdapis/glib-2.0/glib +//SYSTEMINCLUDE /epoc32/include/osextensions/stdapis/openssl +//#endif +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_BOOST_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE +OS_LAYER_LIBUTILITY_SYSTEMINCLUDE + + + + + +LIBRARY euser.lib +LIBRARY stiftestinterface.lib +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libglib.lib +LIBRARY loudmouth.lib + +LANG SC + +//EPOCALLOWDLLDATA + +/* +START WINS +?wins_specific_information +END + +START MARM +?marm_specific_information +END +*/ +// Other possible keywords: + +// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes) +/* +START BITMAP ?target +TARGETPATH ?emulated_path_on_target_machine +HEADER +SOURCE ?color_depth ?source_bitmap +END +*/ +// DEFFILE ?filename +// AIF ?filename + +// End of File diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/group/tstlm.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/group/tstlm.pkg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,66 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of the License "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; + +; Languages +&EN + +; Provide value for uid +#{"STIF"},(0x00000000),1,1,0,TYPE=SA + +; Series60 product id for S60 3.0 +[0x101F7961], 0, 0, 0, {"Series60ProductID"} + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Logo +; None + +; Package signature - Optional +; None + +; Start of Package body + +; Condition blocks +; None + +; Options list +; None + +; Install files +"\epoc32\release\armv5\udeb\tstlm.dll" - "!:\Sys\Bin\tstlm.dll" +;CFG FILES +"..\conf\tstlm_gtalk.cfg"-"C:\TestFramework\tstlm_gtalk.cfg" +"..\conf\tstlm_gtalk1.cfg"-"C:\TestFramework\tstlm_gtalk1.cfg" +"..\init\TestFramework.ini"-"C:\TestFramework\TestFramework.ini" + +;ini file +"..\init\TestFramework.ini"-"C:\TestFramework\TestFramework.ini" + + +; Embedded SIS +; None + +; End of Package body + +; PKG dependencies +; None + +; PKG capabilities +; None diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/inc/tstlm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/inc/tstlm.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: tstlm.h +* +*/ + + + + +#ifndef TSTLM_H +#define TSTLM_H + +// INCLUDES +#include +#include +#include + + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def +// Logging path +_LIT( KtstlmLogPath, "\\logs\\testframework\\tstlm\\" ); +// Log file +_LIT( KtstlmLogFile, "tstlm.txt" ); + +// FUNCTION PROTOTYPES +//?type ?function_name(?arg_list); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; +class Ctstlm; + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// CLASS DECLARATION + +/** +* Ctstlm test class for STIF Test Framework TestScripter. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(Ctstlm) : public CScriptBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static Ctstlm* NewL( CTestModuleIf& aTestModuleIf ); + + /** + * Destructor. + */ + virtual ~Ctstlm(); + + public: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + protected: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + protected: // Functions from base classes + + /** + * From ?base_class ?member_description + */ + //?type ?member_function(); + + private: + + /** + * C++ default constructor. + */ + Ctstlm( CTestModuleIf& aTestModuleIf ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + void Delete(); + + /** + * Test methods are listed below. + */ + + /** + * Example test method. + * @since ?Series60_version + * @param aItem Script line containing parameters. + * @return Symbian OS error code. + */ + + // LmConnection + virtual TInt lm_connection_newL( CStifItemParser& aItem ); + virtual TInt lm_new_with_contextL( CStifItemParser& aItem ); + virtual TInt lm_connection_openL( CStifItemParser& aItem ); + virtual TInt lm_connection_closeL ( CStifItemParser& aItem ); + virtual TInt lm_authenticateL ( CStifItemParser& aItem ); + virtual TInt lm_connection_is_openL ( CStifItemParser& aItem ); + virtual TInt lm_is_authenticatedL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_get_serverL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_get_jidL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_get_portL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_get_sslL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_get_proxyL ( CStifItemParser& aItem ); + + virtual TInt lm_connection_sendL(CStifItemParser& aItem ); + virtual TInt lm_connection_send400charL(CStifItemParser& aItem ); + virtual TInt lm_connection_send_repeatedL(CStifItemParser& aItem ); + + + virtual TInt lm_send_with_replyL ( CStifItemParser& aItem ); + virtual TInt register_message_handlerL ( CStifItemParser& aItem ); + virtual TInt set_disconnect_functionL ( CStifItemParser& aItem ); + virtual TInt lm_connection_send_rawL ( CStifItemParser& aItem ); + virtual TInt lm_connection_get_stateL ( CStifItemParser& aItem ); + virtual TInt lm_connection_refL ( CStifItemParser& aItem ); + virtual TInt lm_connection_unrefL ( CStifItemParser& aItem ); + + virtual TInt lm_connection_is_open_WhenConnectionIsClosedL ( CStifItemParser& aItem ); + virtual TInt lm_is_authenticated_WhenNotAuthenticatedL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_server_WithNULL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_jid_WithNULL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_port_WithNULL ( CStifItemParser& aItem ); + virtual TInt lm_connection_set_ssl_WithNULL ( CStifItemParser& aItem ); + virtual TInt lm_connection_closeWhenNotOpenedL ( CStifItemParser& aItem ); + // LmMessage + virtual TInt lm_message_newL ( CStifItemParser& aItem ); + virtual TInt lm_message_new_with_sub_typeL ( CStifItemParser& aItem ); + virtual TInt lm_message_get_typeL ( CStifItemParser& aItem ); + virtual TInt lm_message_get_sub_typeL ( CStifItemParser& aItem ); + virtual TInt lm_message_get_nodeL ( CStifItemParser& aItem ); + virtual TInt lm_message_refL ( CStifItemParser& aItem ); + virtual TInt lm_message_unrefL ( CStifItemParser& aItem ); + + // LmMessageHanlder + virtual TInt lm_message_handler_newL ( CStifItemParser& aItem ); + virtual TInt lm_message_handler_invalidateL ( CStifItemParser& aItem ); + virtual TInt lm_message_handler_is_validL ( CStifItemParser& aItem ); + virtual TInt lm_message_handler_refL ( CStifItemParser& aItem ); + virtual TInt lm_message_handler_unrefL ( CStifItemParser& aItem ); + + // LmMessageNode + + virtual TInt lm_message_node_set_get_valueL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_add_childL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_get_childL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_find_childL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_set_get_attributesL ( CStifItemParser& aItem ); + + + virtual TInt lm_message_node_set_get_raw_modeL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_refL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_unrefL ( CStifItemParser& aItem ); + virtual TInt lm_message_node_to_stringL ( CStifItemParser& aItem ); + + // LmSSL + virtual TInt lm_ssl_newL( CStifItemParser& aItem ); + virtual TInt lm_ssl_is_supportedL( CStifItemParser& aItem ); + virtual TInt lm_ssl_get_fingerprintL( CStifItemParser& aItem ); + virtual TInt lm_ssl_refL( CStifItemParser& aItem ); + virtual TInt lm_ssl_unrefL( CStifItemParser& aItem ); + + // LmProxy + virtual TInt lm_proxy_newL( CStifItemParser& aItem ); + virtual TInt lm_proxy_new_with_serverL( CStifItemParser& aItem ); + virtual TInt lm_proxy_set_get_typeL( CStifItemParser& aItem ); + virtual TInt lm_proxy_set_get_serverL( CStifItemParser& aItem ); + virtual TInt lm_proxy_set_get_portL( CStifItemParser& aItem ); + virtual TInt lm_proxy_set_get_usernameL( CStifItemParser& aItem ); + virtual TInt lm_proxy_set_get_passwordL( CStifItemParser& aItem ); + virtual TInt lm_proxy_refL( CStifItemParser& aItem ); + virtual TInt lm_proxy_unrefL( CStifItemParser& aItem ); + + // lm-send-sync example + virtual TInt lm_send_syncL ( CStifItemParser& aItem ); + + //fetching contact list + + virtual TInt lm_fetching_contactlist_L( CStifItemParser& aItem ); + + virtual TInt lm_fetching_presenceL( CStifItemParser& aItem ); + + // subscribe presence for contact + + virtual TInt lm_subscribe_contact_L( CStifItemParser& aItem ); + + + virtual TInt lm_authenticate_WithUnexistingJID( CStifItemParser& aItem ); + virtual TInt lm_authenticate_WithBadPasswordL( CStifItemParser& aItem ); + virtual TInt lm_authenticate_WhenConnectionIsNotOpenedL( CStifItemParser& aItem ); + virtual TInt lm_connection_open_with_badserverL(CStifItemParser& aItem); + + virtual TInt lm_connection_send_receiveL(CStifItemParser& aItem); + virtual TInt lm_login_testL(CStifItemParser& aItem); + + virtual TInt lm_add_contactL(CStifItemParser& aItem); + virtual TInt lm_remove_contactL(CStifItemParser& aItem); + virtual TInt lm_connection_cancel_openL(CStifItemParser& aItem); + virtual TInt lm_connection_get_privacy_listsL(CStifItemParser& aItem); + virtual TInt lm_connection_set_privacy_listsL(CStifItemParser& aItem); + virtual TInt lm_connection_send_image_bytestream_msgL(CStifItemParser& aItem); + virtual TInt lm_connection_send_image_bytestream_iqL(CStifItemParser& aItem); + virtual TInt lm_connection_send_multiple_connL(CStifItemParser& aItem); + virtual TInt lm_connection_block_contactL(CStifItemParser& aItem); + virtual TInt lm_connection_unblock_contactL(CStifItemParser& aItem); + virtual TInt lm_connection_set_active_listL(CStifItemParser& aItem); + virtual TInt lm_connection_set_unexist_active_listL(CStifItemParser& aItem); + virtual TInt lm_connection_set_decline_active_listL(CStifItemParser& aItem); + virtual TInt lm_connection_get_one_privacy_listL(CStifItemParser& aItem); + virtual TInt lm_connection_set_one_privacy_listL(CStifItemParser& aItem); + virtual TInt lm_connection_get_many_privacy_list_from_listnameL(CStifItemParser& aItem); + virtual TInt lm_connection_set_one_unexist_privacy_listL(CStifItemParser& aItem); + virtual TInt lm_connection_get_one_unexist_privacy_listL(CStifItemParser& aItem); + virtual TInt lm_connection_create_one_privacy_listL(CStifItemParser& aItem); + virtual TInt lm_service_discoveryL(CStifItemParser& aItem); + virtual TInt lm_service_discovery_connected_resourceL(CStifItemParser& aItem); + virtual TInt lm_simple_communications_blockingL(CStifItemParser& aItem); + virtual TInt lm_send_im_with_replyL(CStifItemParser& aItem); + virtual TInt lm_receive_any_messageL(CStifItemParser& aItem); + virtual TInt lm_login_multiple_sessionsL(CStifItemParser& aItem); + virtual TInt lm_change_own_presenceL(CStifItemParser& aItem); + virtual TInt lm_login_test_invalid_serverL(CStifItemParser& aItem); + virtual TInt lm_login_test_invalid_portL(CStifItemParser& aItem); + + virtual TInt lm_memory_leak_testL(CStifItemParser& aItem); + virtual TInt lm_nft_updating_presenceL(CStifItemParser& aItem); + virtual TInt lm_nft_presence_notificationL(CStifItemParser& aItem); + virtual TInt lm_nft_send_text_messageL(CStifItemParser& aItem); + virtual TInt lm_nft_open_conversation_with_multipleL(CStifItemParser& aItem); + virtual TInt lm_nft_fetch300_contactL(CStifItemParser& aItem); + virtual TInt lm_nft_loginlogoutmultipletime(CStifItemParser& aItem); + virtual TInt lm_nft_receiving100_message_L(CStifItemParser& aItem); + public: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + protected: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + private: // Data + + // ?one_line_short_description_of_data + //?data_declaration; + + // Reserved pointer for future extension + //TAny* iReserved; + + public: // Friend classes + //?friend_class_declaration; + protected: // Friend classes + //?friend_class_declaration; + private: // Friend classes + //?friend_class_declaration; + + }; + +#endif // TSTLM_H + +// End of File diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/init/TestFramework.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/init/TestFramework.ini Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +# +# This is STIFTestFramework initialization file +# Comment lines start with '#'-character. +# See STIF TestFramework users guide.doc for instructions + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Engine_Defaults] + +TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment', + 'TestCases' or 'FullReport' + +CreateTestReport= YES # Possible values: YES or NO + +TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFileName= TestReport + +TestReportFormat= TXT # Possible values: TXT or HTML +TestReportOutput= FILE # Possible values: FILE or RDEBUG +TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting + +[End_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Module configurations start + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\tstlm_gtalk.cfg +[End_Module] + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\tstlm_gtalk1.cfg +[End_Module] + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Logger_Defaults] + +[End_Logger_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# End of file diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/src/tstlm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/src/tstlm.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,171 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: tstlm.cpp +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "tstlm.h" +#include +//#include + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ctstlm::Ctstlm +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +Ctstlm::Ctstlm( + CTestModuleIf& aTestModuleIf ): + CScriptBase( aTestModuleIf ) + { + //MrtInit(); + setenv("G_SLICE","always-malloc",1); + setenv("LM_DEBUG","ALL",1); + } + +// ----------------------------------------------------------------------------- +// Ctstlm::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void Ctstlm::ConstructL() + { + iLog = CStifLogger::NewL( KtstlmLogPath, + KtstlmLogFile, + CStifLogger::ETxt, + CStifLogger::EFile, + EFalse ); + + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksMem ); + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksRequests ); + TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksHandles ); + } + +// ----------------------------------------------------------------------------- +// Ctstlm::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +Ctstlm* Ctstlm::NewL( + CTestModuleIf& aTestModuleIf ) + { + Ctstlm* self = new (ELeave) Ctstlm( aTestModuleIf ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +Ctstlm::~Ctstlm() + { + + // Delete resources allocated from test methods + Delete(); + + // Delete logger + delete iLog; + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point. +// Returns: CScriptBase: New CScriptBase derived object +// ----------------------------------------------------------------------------- +// +EXPORT_C CScriptBase* LibEntryL( + CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework + { + + return ( CScriptBase* ) Ctstlm::NewL( aTestModuleIf ); + + } + +// ----------------------------------------------------------------------------- +// E32Dll is a DLL entry point function. +// Returns: KErrNone +// ----------------------------------------------------------------------------- +// +#ifndef EKA2 // Hide Dll entry point to EKA2 +GLDEF_C TInt E32Dll( + TDllReason /*aReason*/) // Reason code + { + return(KErrNone); + + } +#endif // EKA2 + +// End of File diff -r 000000000000 -r d0f3a028347a loudmouth/tsrc/src/tstlmBlocks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loudmouth/tsrc/src/tstlmBlocks.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,14822 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: tstlmblocks.cpp +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include "tstlm.h" + +#include "loudmouth/loudmouth.h" +#include +#include // for g_stpcpy +#include +#include + +#include + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +#define UNEXIST_PORT 0 +#define MYPORT 4321 +#define HAVE_OPENSSL +#define FAKEPORT NULL +//You need to use 5223 for ssl+sasl and 5222 for non-ssl+sasl connection + +#define GTALK_SSL_PORT 443 +#define SSL_INVALID_PORT 999 + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES + +typedef enum +{ + RC_OK, + RC_ERROR +} RC_Code_t; + +typedef struct +{ + gchar *recipient; + gchar *message; +} MessageData; + +typedef struct +{ + gchar *proxy_server; + guint proxy_port; +}ProxyData; + +typedef struct +{ + gchar *server; + gchar *username; + gchar *password; + gchar *resource; + MessageData *msg_data; +#ifdef __WINSCW__ + ProxyData *proxy_data; +#endif +} ConnectData; + +typedef struct +{ + ConnectData *connect_data; + GMainLoop *main_loop; + RC_Code_t rCode; +} AuthData; + +typedef struct +{ + GMainLoop *main_loop; + RC_Code_t Test_Success; + int count; +} HandleData; + +typedef struct +{ + ConnectData *connect_data; + LmMessage* message; + LmMessageHandler* handler; + GMainLoop *main_loop; + RC_Code_t rCode; +} SendStreamData; +// ======== MODULE DATA STRUCTURES ========= +typedef enum + { + XMPP_PRESENCE_TYPE_ONLINE, + XMPP_PRESENCE_TYPE_CHAT, + XMPP_PRESENCE_TYPE_AWAY, + XMPP_PRESENCE_TYPE_XA, + XMPP_PRESENCE_TYPE_DND, + XMPP_PRESENCE_TYPE_INVISIBLE, + XMPP_PRESENCE_TYPE_UNAVAILABLE + } JabberPresenceType; + +// LOCAL FUNCTION PROTOTYPES + +// Function to read data from the cfg file +static RC_Code_t read_data ( ConnectData*& connect_data, + CStifItemParser& aItem ); +// Function to free the allocated resources +static void free_data ( ConnectData*& connect_data ); + +// Callback function used in lm_connection_open +static void connection_open_cb ( LmConnection *connection, + gboolean success, + gpointer data ); + +static void wrong_input_in_open_cb ( LmConnection *connection, + gboolean success, + gpointer data ); + +//Callback function set in lm_connection_authenticate() call +//from lm-connection_send +static void connection_auth_cb ( LmConnection *connection, + gboolean success, + gpointer data ); + +//Callback from lm_login_test method after auth +static void lm_login_cb ( LmConnection * connection, + gboolean success, + gpointer data ); +// Callback function called by lm_connection_open in Lm_AuthenticateL +// Will call authenticate method from inside this callback. +// It uses the correct input data +static void auth_in_connection_cb( LmConnection *connection, + gboolean success, + gpointer *data ); + +// Callback function set in auth_from_open_cb for handling +//wrong input data during authenticate. Written to handle negative test cases. +static void wrong_input_auth_cb ( LmConnection *connection, + gboolean success, + gpointer data ); +// Callback function set by lm_connection_open call. +//written to handle the negative test cases for authenticate +static void auth_from_open_cb ( LmConnection *connection, + gboolean success, + gpointer *data ); +// Callback function to handle messages +static LmHandlerResult handle_messages ( LmMessageHandler *handler, + LmConnection *conneciton, + LmMessage *message, + gpointer user_data ); +static LmHandlerResult handle_100_messages ( LmMessageHandler *handler, + LmConnection *conneciton, + LmMessage *message, + gpointer user_data ); +// Callback function called when connection is closed +static void connection_close_cb ( LmConnection *connection, + LmDisconnectReason reason, + gpointer user_data ); + +// Callback function called when presence is changed +static void jabber_presence_handler_cb ( LmConnection *connection, + LmDisconnectReason reason, + gpointer user_data ); +static void message_response_cb ( LmConnection *connection, + LmDisconnectReason reason, + gpointer user_data ); + +// Get the MessageType in Type +static void GetMessageType ( LmMessageType MessageType, gchar *Type ); +// Get MessageSubType in SubType +static void GetMessageSubType ( LmMessageSubType MessageSubType, + gchar *SubType ); + +// Callback function called if something goes wrong during the connection phase +static LmSSLResponse ssl_cb ( LmSSL *ssl, + LmSSLStatus status, + gpointer user_data ); + +#ifdef __WINSCW__ +// Set connection to connect through a proxy +static void SetProxy ( LmConnection *connection, ProxyData *connect_data ); +#endif + +// Set SSL for connection +static void SSLInit ( LmConnection *connection ); + +// Returns the username from the JID ( username@domainname/resource ) +static gchar *get_user_name ( const gchar *jid ); + + +static JabberPresenceType +jabber_presence_type_from_string ( const gchar *string ); + + +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS ============================== + +//----------------------------------------------------------------------------- +// function_name : read_data +// description : Reads data from the CFG file +// Returns : None +//----------------------------------------------------------------------------- +// +static RC_Code_t +read_data ( ConnectData*& connect_data, CStifItemParser& aItem ) + { + TPtrC string; + TBuf8 temp; + MessageData *msg_data = NULL; + +#ifdef __WINSCW__ + ProxyData *proxy_data = NULL; + TInt proxy_port; +#endif + + + connect_data = g_new0 ( ConnectData, 1 ); + if ( !connect_data ) + { + return RC_ERROR; + } + + msg_data = g_new0 ( MessageData, 1 ); + if ( !msg_data ) + { + free_data ( connect_data ); + return RC_ERROR; + } + + connect_data->msg_data = msg_data; + +#ifdef __WINSCW__ + proxy_data = g_new0 ( ProxyData, 1 ); + if ( !proxy_data ) + { + free_data ( connect_data ); + return RC_ERROR; + } + connect_data->proxy_data = proxy_data; +#endif + + // Read server name + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->server = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->server ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->server, ( gchar * ) temp.Ptr() ); + } + + // Read Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->username = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->username ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->username, ( gchar * ) temp.Ptr() ); + } + + // Read Password corresponding to Username + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->password = g_new0 ( gchar, temp.Length () ); + if ( !connect_data->password ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->password, ( gchar *) temp.Ptr() ); + } + + // Read recipient + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->recipient = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->recipient ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( msg_data->recipient, ( gchar * ) temp.Ptr() ); + } + + // Read Message + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + msg_data->message = g_new0 ( gchar, temp.Length() ); + if ( !msg_data->message ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( msg_data->message, ( gchar * ) temp.Ptr() ); + } + + // Read resource identifier + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + connect_data->resource = g_new0 ( gchar, temp.Length() ); + if ( !connect_data->resource ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( connect_data->resource, ( gchar * ) temp.Ptr() ); + } + +#ifdef __WINSCW__ + // Read proxy server and proxy port + if ( aItem.GetNextString ( string ) == KErrNone ) + { + temp.Copy ( string ); + temp.Append ( '\0' ); + proxy_data->proxy_server = g_new0 ( gchar, temp.Length() ); + if ( !proxy_data->proxy_server ) + { + free_data ( connect_data ); + return RC_ERROR; + } + g_stpcpy ( proxy_data->proxy_server, ( gchar * ) temp.Ptr() ); + } + + if ( aItem.GetNextInt ( proxy_port ) == KErrNone ) + { + proxy_data->proxy_port = proxy_port; + } +#endif + + return RC_OK; + } + + +//----------------------------------------------------------------------------- +// function_name : free_data +// description : Deallocates all the data +// Returns : None +//----------------------------------------------------------------------------- +// +static void +free_data ( ConnectData*& connect_data ) + { + if ( connect_data ) + { + if ( connect_data->server ) + { + g_free ( connect_data->server ); + connect_data->server = NULL; + } + + if ( connect_data->username ) + { + g_free ( connect_data->username ); + connect_data->username = NULL; + } + + if ( connect_data->password ) + { + g_free ( connect_data->password ); + connect_data->password = NULL; + } + + if ( connect_data->msg_data ) + { + if ( connect_data->msg_data->recipient ) + { + g_free ( connect_data->msg_data->recipient ); + connect_data->msg_data->recipient = NULL; + } + if ( connect_data->msg_data->message ) + { + g_free ( connect_data->msg_data->message ); + connect_data->msg_data->message = NULL; + } + g_free ( connect_data->msg_data ); + connect_data->msg_data = NULL; + } + + if ( connect_data->resource ) + { + g_free ( connect_data->resource ); + connect_data->resource = NULL; + } + + #ifdef __WINSCW__ + if ( connect_data->proxy_data ) + { + if ( connect_data->proxy_data->proxy_server ) + { + g_free ( connect_data->proxy_data->proxy_server ); + connect_data->proxy_data->proxy_server = NULL; + } + g_free ( connect_data->proxy_data ); + connect_data->proxy_data = NULL; + } + #endif + g_free ( connect_data ); + connect_data = NULL; + } + } + + +//----------------------------------------------------------------------------- +// funnction_name : connection_open_cb +// description : callback function called by lm_connection_open +// Returns : None +//----------------------------------------------------------------------------- +// +static void +connection_open_cb ( LmConnection *connection, + gboolean success /*success*/, + gpointer data ) + { + + gboolean result = success ; + GMainLoop *main_loop = ( GMainLoop * ) data; + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + /* send whitespace to the server every 30 seconds */ + lm_connection_set_keep_alive_rate (connection, 30); + } + + +//----------------------------------------------------------------------------- +// funnction_name : wrong_input_in_open_cb +// description : callback function called by lm_connection_open when the wrong +//input like wrong server , user id etc is given +// Returns : None +//----------------------------------------------------------------------------- +// +static void +wrong_input_in_open_cb ( LmConnection */*connection*/, + gboolean success /*success*/, + gpointer data ) + { + + gboolean result = success; + AuthData *auth_data = ( AuthData * ) data; + + //Result is false when the wrong input parameters were successfully handled. + if (result == FALSE) + { + auth_data->rCode = RC_OK; + } + else + { + //Result is true, when the wrong input was not handled successfully. + auth_data->rCode = RC_ERROR; + } + g_main_loop_quit ( auth_data->main_loop ); + } +//----------------------------------------------------------------------------- +// funnction_name : wrong_input_auth_cb +// description : callback function called by lm_connection_open +// Returns : None +//----------------------------------------------------------------------------- +// +static void +wrong_input_auth_cb ( LmConnection */*connection*/, + gboolean success, + gpointer data ) + { + gboolean result = success; + AuthData *auth_data = ( AuthData * ) data; + //Result is false when the wrong input parameters were successfully handled. + if (result == FALSE) + { + auth_data->rCode = RC_OK; + } + else + { + //Result is true, when the wrong input was not handled successfully. + auth_data->rCode = RC_ERROR; + } + g_main_loop_quit ( auth_data->main_loop ); + } + +//----------------------------------------------------------------------------- +// funnction_name : connection_auth_cb +// description : callback function set by lm_connection_authenticate +// in lm_connection_sendL() +// Returns : None +//----------------------------------------------------------------------------- +// +static void connection_auth_cb ( LmConnection */*connection*/, + gboolean /*success*/, + gpointer data ) + { + GMainLoop *main_loop = ( GMainLoop * ) data; + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + } + +//----------------------------------------------------------------------------- +// function_name : auth_in_connection_cb +// description : callback function called for lm_connection_open +// Returns : RC_OK if successfull, RC_ERROR otherwise +//----------------------------------------------------------------------------- +static void +auth_in_connection_cb ( LmConnection *connection, + gboolean success, + gpointer *data ) + { + AuthData *auth_data = ( AuthData * ) data; + + if ( !success ) + { + // Connection failed + auth_data->rCode = RC_ERROR; + g_main_loop_quit ( auth_data->main_loop ); + } + + // Extract the username from the JID + gchar *username = get_user_name ( auth_data->connect_data->username ); + + if ( !lm_connection_authenticate ( connection, + username, + auth_data->connect_data->password, + auth_data->connect_data->resource, + NULL, + auth_data->connect_data->msg_data, + NULL, + NULL ) ) + { + auth_data->rCode = RC_ERROR; + g_free ( username ); + g_main_loop_quit ( auth_data->main_loop ); + } + g_free ( username ); + + auth_data->rCode = RC_OK; + g_main_loop_quit ( auth_data->main_loop ); + + } + +//----------------------------------------------------------------------------- +// function_name : auth_from_open_cb +// description : callback function called for lm_connection_authenticate +// Returns : RC_OK if successfull, RC_ERROR otherwise +//----------------------------------------------------------------------------- +static void +auth_from_open_cb ( LmConnection *connection, + gboolean success, + gpointer *data ) + { + AuthData *auth_data = ( AuthData * ) data; + + if ( !success ) + { + // Connection failed + auth_data->rCode = RC_ERROR; + g_main_loop_quit ( auth_data->main_loop ); + } + + // Extract the username from the JID + gchar *username = get_user_name ( auth_data->connect_data->username ); + + if ( !lm_connection_authenticate ( connection, + username, + auth_data->connect_data->password, + auth_data->connect_data->resource, + ( LmResultFunction ) wrong_input_auth_cb, + auth_data , + NULL, + NULL ) ) + { + auth_data->rCode = RC_ERROR; + g_free ( username ); + g_main_loop_quit ( auth_data->main_loop ); + } + g_free ( username ); + + } + + +//-------------------------------------------------------------------------------- +// function_name : handle_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_messages ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* /*message*/, + gpointer user_data ) + { + HandleData *handle_data = ( HandleData * )user_data; + + if ( handle_data ) + { + handle_data->Test_Success = RC_OK; + + g_main_loop_quit ( handle_data->main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//-------------------------------------------------------------------------------- +// function_name : handle_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_100_messages ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* /*message*/, + gpointer user_data ) + { + HandleData *handle_data = ( HandleData * )user_data; + //static int count=0; + handle_data->count++; + GMainLoop *main_loop = ( GMainLoop * )user_data; + //count++; + if(handle_data->count==5) + { + g_main_loop_quit ( handle_data->main_loop ); + // g_main_loop_quit ( main_loop ); + } + //} + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//-------------------------------------------------------------------------------- +// function_name : handle_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_100_presence_notification ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* /*message*/, + gpointer user_data ) + { + HandleData *handle_data = ( HandleData * )user_data; + handle_data->count++; + GMainLoop *main_loop = ( GMainLoop * )user_data; + if(handle_data->count==100) + { + g_main_loop_quit ( handle_data->main_loop ); + + } + + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//-------------------------------------------------------------------------------- +// function_name : connection_close_cb +// description : callback function called when connection is closed +// Returns : RC_OK if called +//-------------------------------------------------------------------------------- +static void +connection_close_cb ( LmConnection */*connection*/, + LmDisconnectReason reason, + gpointer user_data ) + { + HandleData *handle_data = ( HandleData * ) user_data; + + switch ( reason ) + { + case LM_DISCONNECT_REASON_OK: + handle_data->Test_Success = RC_OK; + break; + case LM_DISCONNECT_REASON_PING_TIME_OUT: + /* No break, fall through */ + case LM_DISCONNECT_REASON_HUP: + case LM_DISCONNECT_REASON_ERROR: + case LM_DISCONNECT_REASON_UNKNOWN: + handle_data->Test_Success = RC_ERROR; + break; + default: + handle_data->Test_Success = RC_ERROR; + break; + } + + } + + +//------------------------------------------------------------------------------ +// function_name : GetMessageType +// description : Gets LmMessageType in Type +// Returns : None +//------------------------------------------------------------------------------ +static void +GetMessageType ( LmMessageType MessageType, gchar *Type ) +{ + switch ( MessageType ) + { + case LM_MESSAGE_TYPE_MESSAGE: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_MESSAGE" ); + break; + case LM_MESSAGE_TYPE_PRESENCE: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_MESSAGE" ); + break; + case LM_MESSAGE_TYPE_IQ: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_IQ" ); + break; + case LM_MESSAGE_TYPE_STREAM: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_STREAM" ); + break; + case LM_MESSAGE_TYPE_STREAM_ERROR: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_STREAM_ERROR" ); + break; + case LM_MESSAGE_TYPE_UNKNOWN: + g_stpcpy ( Type, "LM_MESSAGE_TYPE_UNKNOWN" ); + break; + } +} + + +//------------------------------------------------------------------------------ +// function_name : GetMessageSubType +// description : Gets LmMessageSubType in SubType +// Returns : None +//------------------------------------------------------------------------------ +static void +GetMessageSubType ( LmMessageSubType MessageSubType, gchar *SubType ) +{ + switch ( MessageSubType ) + { + case LM_MESSAGE_SUB_TYPE_NOT_SET: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_NOT_SET" ); + break; + case LM_MESSAGE_SUB_TYPE_AVAILABLE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_AVAILABLE" ); + break; + case LM_MESSAGE_SUB_TYPE_NORMAL: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_NORMAL" ); + break; + case LM_MESSAGE_SUB_TYPE_CHAT: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_CHAT" ); + break; + case LM_MESSAGE_SUB_TYPE_GROUPCHAT: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_GROUPCHAT" ); + break; + case LM_MESSAGE_SUB_TYPE_HEADLINE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_HEADLINE" ); + break; + case LM_MESSAGE_SUB_TYPE_UNAVAILABLE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_UNAVAILABLE" ); + break; + case LM_MESSAGE_SUB_TYPE_PROBE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_PROBE" ); + break; + case LM_MESSAGE_SUB_TYPE_SUBSCRIBE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_SUBSCRIBE" ); + break; + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE" ); + break; + case LM_MESSAGE_SUB_TYPE_SUBSCRIBED: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_SUBSCRIBED" ); + break; + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED" ); + break; + case LM_MESSAGE_SUB_TYPE_GET: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_GET" ); + break; + case LM_MESSAGE_SUB_TYPE_SET: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_SET" ); + break; + case LM_MESSAGE_SUB_TYPE_RESULT: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_RESULT" ); + break; + case LM_MESSAGE_SUB_TYPE_ERROR: + g_stpcpy ( SubType, "LM_MESSAGE_SUB_TYPE_ERROR" ); + break; + } +} + + +// --------------------------------------------------------------------------- +// jabber_presence_type_from_string: Returns the presence type +// --------------------------------------------------------------------------- +// +static JabberPresenceType +jabber_presence_type_from_string ( const gchar *string ) + { + + if ( string == NULL ) + return XMPP_PRESENCE_TYPE_ONLINE; + + if ( !strcmp ( string, "online" ) ) + return XMPP_PRESENCE_TYPE_ONLINE; + else if ( !strcmp ( string, "chat" ) ) + return XMPP_PRESENCE_TYPE_CHAT; + else if ( !strcmp ( string, "away" ) ) + return XMPP_PRESENCE_TYPE_AWAY; + else if ( !strcmp ( string, "xa" ) ) + return XMPP_PRESENCE_TYPE_XA; + else if ( !strcmp ( string, "dnd" ) ) + return XMPP_PRESENCE_TYPE_DND; + else if ( !strcmp ( string, "invisible" ) ) + return XMPP_PRESENCE_TYPE_INVISIBLE; + else if ( !strcmp ( string, "unavailable" ) ) + return XMPP_PRESENCE_TYPE_UNAVAILABLE; + else + return XMPP_PRESENCE_TYPE_ONLINE; + } + + +// --------------------------------------------------------------------------- +// function_name : ssl_cb +// description : This function is called if something goes wrong +// during the connecting phase. +// Arguements : +// ssl : An LmSSL +// status : The status informing what went wrong +// user_data : User data provided in the callback +// +// Returns : User should return LM_SSL_RESPONSE_CONTINUE if +// connection should proceed. otherwise +// LM_SSL_RESPONSE_STOP. +// --------------------------------------------------------------------------- +// +static LmSSLResponse +ssl_cb ( LmSSL */*ssl*/, LmSSLStatus status, gpointer /*user_data*/ ) + { + + g_print ( "SSL status :%d\n", status ); + + switch ( status ) + { + case LM_SSL_STATUS_NO_CERT_FOUND: + g_printerr ("No certificate found!\n"); + break; + case LM_SSL_STATUS_UNTRUSTED_CERT: + g_printerr ("Certificate is not trusted!\n"); + break; + case LM_SSL_STATUS_CERT_EXPIRED: + g_printerr ("Certificate has expired!\n"); + break; + case LM_SSL_STATUS_CERT_NOT_ACTIVATED: + g_printerr ("Certificate has not been activated!\n"); + break; + case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH: + g_printerr ("Certificate hostname does not match expected hostname!\n"); + break; + case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: + g_printerr ( "fingerprint error!\n" ); + break; + case LM_SSL_STATUS_GENERIC_ERROR: + g_printerr ("Generic SSL error!\n"); + break; + } + + return LM_SSL_RESPONSE_CONTINUE; + } + + +// --------------------------------------------------------------------------- +// function_name : SetProxy +// description : Sets the connection to use proxy +// Arguements : +// connection : LmConnection +// connect_data : ConnectData +// Returns : None +// --------------------------------------------------------------------------- +// +#ifdef __WINSCW__ +static void +SetProxy ( LmConnection *connection, ProxyData *proxy_data ) + { + LmProxy *proxy = NULL; + + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + lm_proxy_set_server ( proxy, proxy_data->proxy_server ); + lm_proxy_set_port ( proxy, proxy_data->proxy_port ); + lm_connection_set_proxy ( connection, proxy ); + lm_proxy_unref ( proxy ); + } +#endif + +// --------------------------------------------------------------------------- +// function_name : SSLInit +// description : Sets the connection to use SSL +// Arguements : +// connection : LmConnection +// Returns : None +// --------------------------------------------------------------------------- +// +static void +SSLInit ( LmConnection *connection ) + { + LmSSL *ssl = NULL; + + ssl = lm_ssl_new ( NULL, ( LmSSLFunction ) ssl_cb, NULL, NULL ); + lm_connection_set_ssl ( connection, ssl ); + lm_ssl_unref ( ssl ); + lm_connection_set_keep_alive_rate (connection, 30); + } + + +// --------------------------------------------------------------------------- +// function_name : get_user_name +// description : Returns the username from the jid +// Arguements : +// jid : jid +// Returns : username +// --------------------------------------------------------------------------- +// +static gchar * +get_user_name ( const gchar *jid ) + { + const gchar *ch; + + g_return_val_if_fail ( jid != NULL, NULL ); + + ch = strchr ( jid, '@' ); + if ( !ch ) + return ( gchar *) jid; + + return g_strndup ( jid, ch - jid ); + } + +// --------------------------------------------------------------------------- +// jabber_presence_handler_cb: Callback function to handle the presence info +// --------------------------------------------------------------------------- +// +static LmHandlerResult +jabber_presence_handler_cb ( LmMessageHandler * /*handler*/, + LmConnection * /*connection*/, + LmMessage *message, + gpointer user_data ) + { + const gchar *jid; + const gchar *show; + const gchar *status; + + LmMessageNode *node; + JabberPresenceType type; + + if(message != NULL) + { + // Get the JID attribute + jid = lm_message_node_get_attribute ( message->node, "from" ); + + // Get the show attribute + + node = lm_message_node_get_child ( message->node, "show" ); + show = node ? ( node->value ) : "online"; + + // Get the status attribute + node = lm_message_node_get_child ( message->node, "status" ); + status = node ? ( node->value ) : NULL; + + type = jabber_presence_type_from_string ( show ); + } + + + GMainLoop *main_loop = ( GMainLoop * ) user_data; + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Ctstlm::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void Ctstlm::Delete() + { + + } + +// ----------------------------------------------------------------------------- +// Ctstlm::RunMethodL +// Run specified method. Contains also table of test mothods and their names. +// ----------------------------------------------------------------------------- +// +TInt Ctstlm::RunMethodL( + CStifItemParser& aItem ) + { + iLog->Log ( _L ( "In RunMethodL method" ) ); + + + //TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksRequests ); + //TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksHandles ); + + static TStifFunctionInfo const KFunctions[] = + { + // Copy this line for every implemented function. + // First string is the function name used in TestScripter script file. + // Second is the actual implementation member function. + + // LmConnection + ENTRY( "lm_connection_new", Ctstlm::lm_connection_newL ), + ENTRY( "lm_new_with_context", Ctstlm::lm_new_with_contextL ), + ENTRY( "lm_connection_open", Ctstlm::lm_connection_openL ), + ENTRY( "lm_connection_is_open_WhenConnectionIsClosed", Ctstlm::lm_connection_is_open_WhenConnectionIsClosedL), + ENTRY( "lm_connection_is_authenticated_WhenNot_Authenticated", Ctstlm::lm_is_authenticated_WhenNotAuthenticatedL), + ENTRY( "lm_connection_set_server_withNULL", Ctstlm::lm_connection_set_server_WithNULL), + ENTRY( "lm_connection_set_jid_WithNull", Ctstlm::lm_connection_set_jid_WithNULL), + ENTRY( "lm_connection_set_port_WithNULL", Ctstlm::lm_connection_set_port_WithNULL), + ENTRY( "lm_connection_set_ssl_WithNULL", Ctstlm::lm_connection_set_ssl_WithNULL), + ENTRY( "lm_connection_close", Ctstlm::lm_connection_closeL ), + ENTRY( "lm_connection_closeWhenNotOpen", Ctstlm::lm_connection_closeWhenNotOpenedL ), + ENTRY( "lm_authenticate", Ctstlm::lm_authenticateL ), + ENTRY( "lm_connection_is_open", Ctstlm::lm_connection_is_openL ), + ENTRY( "lm_is_authenticated", Ctstlm::lm_is_authenticatedL ), + ENTRY( "lm_connection_set_get_server", Ctstlm::lm_connection_set_get_serverL ), + ENTRY( "lm_connection_set_get_jid", Ctstlm::lm_connection_set_get_jidL ), + ENTRY( "lm_connection_set_get_port", Ctstlm::lm_connection_set_get_portL ), + ENTRY( "lm_connection_set_get_ssl", Ctstlm::lm_connection_set_get_sslL ), + ENTRY( "lm_connection_set_get_proxy", Ctstlm::lm_connection_set_get_proxyL ), + + ENTRY( "lm_connection_send", Ctstlm::lm_connection_sendL ), + ENTRY( "lm_connection_send400char", Ctstlm::lm_connection_send400charL ), + ENTRY( "lm_connection_send_repeated", Ctstlm::lm_connection_send_repeatedL ), + + ENTRY( "lm_send_with_reply", Ctstlm::lm_send_with_replyL ), + ENTRY( "register_message_handler", Ctstlm::register_message_handlerL ), + ENTRY( "set_disconnect_function", Ctstlm::set_disconnect_functionL ), + ENTRY( "lm_connection_send_raw", Ctstlm::lm_connection_send_rawL ), + ENTRY( "lm_connection_get_state", Ctstlm::lm_connection_get_stateL ), + ENTRY( "lm_connection_ref", Ctstlm::lm_connection_refL ), + ENTRY( "lm_connection_unref", Ctstlm::lm_connection_unrefL ), + + // LmMessage + ENTRY( "lm_message_new", Ctstlm::lm_message_newL ), + ENTRY( "lm_message_new_with_sub_type", Ctstlm::lm_message_new_with_sub_typeL ), + ENTRY( "lm_message_get_type", Ctstlm::lm_message_get_typeL ), + ENTRY( "lm_message_get_sub_type", Ctstlm::lm_message_get_sub_typeL ), + ENTRY( "lm_message_get_node", Ctstlm::lm_message_get_nodeL ), + ENTRY( "lm_message_ref", Ctstlm::lm_message_refL ), + ENTRY( "lm_message_unref", Ctstlm::lm_message_unrefL ), + + // LmMessageHandler + ENTRY( "lm_message_handler_new", Ctstlm::lm_message_handler_newL ), + ENTRY( "lm_message_handler_invalidate", Ctstlm::lm_message_handler_invalidateL ), + ENTRY( "lm_message_handler_is_valid", Ctstlm::lm_message_handler_is_validL ), + ENTRY( "lm_message_handler_ref", Ctstlm::lm_message_handler_refL ), + ENTRY( "lm_message_handler_unref", Ctstlm::lm_message_handler_unrefL ), + + // LmMessageNode + ENTRY( "lm_message_node_set_get_value", Ctstlm::lm_message_node_set_get_valueL ), + ENTRY( "lm_message_node_add_child", Ctstlm::lm_message_node_add_childL ), + ENTRY( "lm_message_node_get_child", Ctstlm::lm_message_node_get_childL ), + ENTRY( "lm_message_node_find_child", Ctstlm::lm_message_node_find_childL ), + + ENTRY( "lm_message_node_set_get_attributes", Ctstlm::lm_message_node_set_get_attributesL ), + + ENTRY( "lm_message_node_set_get_raw_mode", Ctstlm::lm_message_node_set_get_raw_modeL ), + + ENTRY( "lm_message_node_ref", Ctstlm::lm_message_node_refL ), + ENTRY( "lm_message_node_unref", Ctstlm::lm_message_node_unrefL ), + + ENTRY( "lm_message_node_to_string", Ctstlm::lm_message_node_to_stringL ), + + // LmSSL + ENTRY( "lm_ssl_new", Ctstlm::lm_ssl_newL ), + ENTRY( "lm_ssl_is_supported", Ctstlm::lm_ssl_is_supportedL ), + ENTRY( "lm_ssl_get_fingerprint", Ctstlm::lm_ssl_get_fingerprintL ), + ENTRY( "lm_ssl_ref", Ctstlm::lm_ssl_refL ), + ENTRY( "lm_ssl_unref", Ctstlm::lm_ssl_unrefL ), + + // LmProxy + ENTRY( "lm_proxy_new", Ctstlm::lm_proxy_newL ), + ENTRY( "lm_proxy_new_with_server", Ctstlm::lm_proxy_new_with_serverL ), + ENTRY( "lm_proxy_set_get_type", Ctstlm::lm_proxy_set_get_typeL ), + ENTRY( "lm_proxy_set_get_server", Ctstlm::lm_proxy_set_get_serverL ), + ENTRY( "lm_proxy_set_get_port", Ctstlm::lm_proxy_set_get_portL ), + ENTRY( "lm_proxy_set_get_username", Ctstlm::lm_proxy_set_get_usernameL ), + ENTRY( "lm_proxy_set_get_password", Ctstlm::lm_proxy_set_get_passwordL ), + ENTRY( "lm_proxy_ref", Ctstlm::lm_proxy_refL ), + ENTRY( "lm_proxy_unref", Ctstlm::lm_proxy_unrefL ), + + // lm-send-sync example + ENTRY( "lm_send_sync", Ctstlm::lm_send_syncL ), + + // lm contact list fetching code + + ENTRY( "lm_fetching_contactlist", Ctstlm::lm_fetching_contactlist_L ), + ENTRY( "lm_fetching_presence", Ctstlm::lm_fetching_presenceL ), + ENTRY( "lm_subscribe_contact", Ctstlm::lm_subscribe_contact_L ), + ENTRY( "lm_authenticate_unexistjid", Ctstlm::lm_authenticate_WithUnexistingJID ), + ENTRY( "lm_authenticate_badpassword", Ctstlm::lm_authenticate_WithBadPasswordL ), + ENTRY( "lm_authenticate_connectionisnotcreated", Ctstlm::lm_authenticate_WhenConnectionIsNotOpenedL ), + ENTRY( "lm_connection_open_with_bad_server", Ctstlm::lm_connection_open_with_badserverL ), + ENTRY( "lm_connection_send_receive", Ctstlm::lm_connection_send_receiveL ), + ENTRY( "lm_login_test", Ctstlm::lm_login_testL ), + ENTRY( "lm_add_contact", Ctstlm::lm_add_contactL ), + ENTRY( "lm_remove_contact", Ctstlm::lm_remove_contactL ), + ENTRY( "lm_connection_cancel_open", Ctstlm::lm_connection_cancel_openL ), + ENTRY( "lm_connection_get_privacy_lists", Ctstlm::lm_connection_get_privacy_listsL ), + ENTRY( "lm_connection_set_privacy_lists", Ctstlm::lm_connection_set_privacy_listsL ), + ENTRY( "lm_connection_send_image_bytestream_msg", Ctstlm::lm_connection_send_image_bytestream_msgL ), + ENTRY( "lm_connection_send_image_bytestream_iq", Ctstlm::lm_connection_send_image_bytestream_iqL ), + ENTRY( "lm_connection_send_multiple_conn", Ctstlm::lm_connection_send_multiple_connL ), + ENTRY( "lm_connection_block_contact", Ctstlm::lm_connection_block_contactL ), + ENTRY( "lm_connection_unblock_contact", Ctstlm::lm_connection_unblock_contactL ), + ENTRY( "lm_connection_set_active_list", Ctstlm::lm_connection_set_active_listL ), + ENTRY( "lm_connection_set_unexist_active_list", Ctstlm::lm_connection_set_unexist_active_listL ), + ENTRY( "lm_connection_set_decline_active_list", Ctstlm::lm_connection_set_decline_active_listL ), + ENTRY( "lm_connection_get_one_privacy_list", Ctstlm::lm_connection_get_one_privacy_listL ), + ENTRY( "lm_connection_set_one_privacy_list", Ctstlm::lm_connection_set_one_privacy_listL ), + ENTRY( "lm_connection_get_many_privacy_list_from_listname", Ctstlm::lm_connection_get_many_privacy_list_from_listnameL ), + ENTRY( "lm_connection_set_one_unexist_privacy_list", Ctstlm::lm_connection_set_one_unexist_privacy_listL ), + ENTRY( "lm_connection_get_one_unexist_privacy_list", Ctstlm::lm_connection_get_one_unexist_privacy_listL ), + ENTRY( "lm_connection_create_one_privacy_list", Ctstlm::lm_connection_create_one_privacy_listL ), + ENTRY( "lm_service_discovery", Ctstlm::lm_service_discoveryL ), + ENTRY( "lm_service_discovery_connected_resource", Ctstlm::lm_service_discovery_connected_resourceL ), + ENTRY( "lm_simple_communications_blocking", Ctstlm::lm_simple_communications_blockingL ), + ENTRY( "lm_send_im_with_reply", Ctstlm::lm_send_im_with_replyL ), + ENTRY( "lm_receive_any_message", Ctstlm::lm_receive_any_messageL ), + ENTRY( "lm_login_multiple_sessions", Ctstlm::lm_login_multiple_sessionsL ), + ENTRY( "lm_change_own_presence", Ctstlm::lm_change_own_presenceL ), + ENTRY( "lm_login_test_invalid_server", Ctstlm::lm_login_test_invalid_serverL ), + ENTRY( "lm_login_test_invalid_port", Ctstlm::lm_login_test_invalid_portL ), + ENTRY( "lm_memory_leak_test", Ctstlm::lm_memory_leak_testL ), + ENTRY( "lm_nft_updating_presence", Ctstlm::lm_nft_updating_presenceL ), + ENTRY( "lm_nft_presence_notification", Ctstlm::lm_nft_presence_notificationL ), + ENTRY( "lm_nft_send_text_message", Ctstlm::lm_nft_send_text_messageL ), + ENTRY( "lm_nft_open_conversation_with_multiple",Ctstlm::lm_nft_open_conversation_with_multipleL ), + ENTRY( "lm_nft_fetch300_contact", Ctstlm::lm_nft_fetch300_contactL ), + ENTRY( "lm_nft_loginlogoutmultipletime", Ctstlm::lm_nft_loginlogoutmultipletime ), + ENTRY( "lm_nft_receiving100_message_L", Ctstlm::lm_nft_receiving100_message_L ), + + }; + + const TInt count = sizeof( KFunctions ) / + sizeof( TStifFunctionInfo ); + + return RunInternalL( KFunctions, count, aItem ); + + } + + +//---------------------------------------------------------------------------- +// Ctstlm::lm_connection_newL +// Description : Creates a new closed connection. Server can be NULL but must +// be set before calling lm_connection_open() +// Arguements : +// server : The hostname of the server for the connection +// Retrurns : A newly created LmConnection, should be unreffed with +// lm_connection_unref() +//---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_newL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + SET_LOW_MEMORY_TRAP ( NULL ); + + iLog->Log ( _L("In lm_connection_newL" ) ); + + + +__UHEAP_MARK; +__UHEAP_RESET; + + // Read data from the cfg file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + +__UHEAP_FAILNEXT(1); + + //----------------------- + connection = lm_connection_new ( connect_data->server ); + //----------------------- + + // Free the allocated resources + free_data ( connect_data ); + + if ( connection == NULL ) + { + iLog->Log ( _L( "lm_connection_new failed to allocate memory" ) ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); +__UHEAP_MARKEND; + + REMOVE_LOW_MEMORY_TRAP (); + + iLog->Log ( _L( "lm_connection_new test case passed" ) ); + + return KErrNone; + } + + +//---------------------------------------------------------------------------- +// Ctstlm::lm_connection_new_with_context +// Description : Creates a new closed connection running in a certain context +// Arguements : +// server : The hostname of the server for the connection +// context : The context this connection should be running on +// Retrurns : A newly created Lmconnection, should be unreffed with +// lm_connection_unref() +//---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_new_with_contextL ( CStifItemParser& /* aItem */ ) + { + GMainContext *context; + LmConnection *connection = NULL; + + iLog->Log ( _L( "In lm_connection_new_with_contextL" ) ); + + context = g_main_context_new (); + connection = lm_connection_new_with_context ( NULL, context ); + if ( connection == NULL ) + { + iLog->Log ( _L ( "lm_connection_new_with_context failed" ) ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_new_with_context test case passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_open +// Description : An async call to open connection. When the connection is open +// function 'connection_open_cb' is called +// Arguements : +// connection : LmConnection to open +// function : Callback function that will be called when the connection +// is open +// user_data : User data that will be passed to function +// notify : Function for freeing that user_data, can be NULL +// error : location to store error +// Returns : TRUE if everything went fine, FALSE otherwise +// +// Requieres : This test case requires GUI for selecting Access point +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_openL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + GMainLoop *main_loop = NULL; + + iLog->Log ( _L ( "In lm_connection_open" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + //context = g_main_context_new (); + //connection = lm_connection_new_with_context ( connect_data->server, context ); + + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + + // Set proxy for emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set connection to use SSL + SSLInit ( connection ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_open succeded" ) ); + return KErrNone; + + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_close +// Description : A synchronous call to close the connection +// Arguements : +// connection : LmConnection to close +// error : location to store error, or NULL +// Retrurns :TRUE if no errors were detected, otherwise FALSE +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_closeL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + iLog->Log ( _L ( "In lm_connection_close" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + // Set proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + if ( lm_connection_close ( connection, NULL ) == FALSE ) + { + iLog->Log ( _L ( "lm_connection_close failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( "lm_connection_close passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_closeWhenNotOpenedL +// Description : A synchronous call to close the connection +// Arguements : +// connection : LmConnection to close +// error : location to store error, or NULL +// Retrurns :TRUE if no errors were detected, otherwise FALSE +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_closeWhenNotOpenedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + iLog->Log ( _L ( "In lm_connection_close" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + + if ( lm_connection_close ( connection, NULL ) == TRUE ) + { + iLog->Log ( _L ( "lm_connection_close failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( "lm_connection_closeWhenNotOpenedL passed" ) ); + + return KErrNone; + } + + + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_authenticateL +// Description : Tries to authenticate a user against the server +// Arguements : +// connnection : LmConnection to authenticate +// username : Username used to authenticate +// password : Password corresponding to username +// resource : Resource used for this connection +// function : Callback function called when authentication is finished +// user_data : Userdata passed to callback function when called +// notify : Function for freeing user_data, can be NULL +// error : location to store error, or NULL +// Returns : TRUE if no errors were detected, FALSE otherwise +// Requieres : This test case requires GUI for selecting Access point +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_authenticateL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + AuthData *auth_data = NULL; + + iLog->Log ( _L ( "In lm_authenticateL" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + g_free ( auth_data ); + return KErrGeneral; + } + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + auth_data->rCode = RC_ERROR; + connection = lm_connection_new ( auth_data->connect_data->server ); + if ( connection == NULL ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + SSLInit ( connection ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) auth_in_connection_cb, + auth_data, + NULL, + NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode != RC_OK ) + { + iLog->Log ( _L ( "lm_authenticateL failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_free ( auth_data ); + + iLog->Log ( _L ( "lm_authenticateL passed" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_is_open +// Description : Check if connection is currently open or not +// Arguements : +// connection : an LmConnection to check if it is open +// Returns : TRUE if connection is open and FALSE if it is closed +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_is_openL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gboolean NotOpen = FALSE; + + iLog->Log ( _L ( "In lm_connection_is_open" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + SSLInit ( connection ); + + // Check for connection in case of connection not yet opened + if ( !lm_connection_is_open ( connection ) ) + { + iLog->Log ( _L ( "Connection is not open" ) ); + NotOpen = TRUE; + } + + // Check for open connection in case of connection opened + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + if ( !lm_connection_is_open ( connection ) && FALSE == NotOpen ) + { + iLog->Log ( _L ( "lm_connection_is_open failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_is_open passed" ) ); + + return KErrNone; + } +///////////////////////////////////////////////////////// +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_is_open_WhenConnectionIsClosedL +// Description : Check if connection is currently open or not +// Arguements : +// connection : an LmConnection to check if it is open +// Returns : TRUE if connection is open and FALSE if it is closed +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_is_open_WhenConnectionIsClosedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gboolean NotOpen = FALSE; + + iLog->Log ( _L ( "lm_connection_is_open_WhenConnectionIsClosedL" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( " lm_connection_is_open" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + if ( lm_connection_is_open ( connection ) ) + { + iLog->Log ( _L ( "lm_connection_is_open_WhenConnectionIsClosedL failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_is_open_WhenConnectionIsClosedL passed" ) ); + + return KErrNone; + } + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_is_authenticated +// Description : Check if connection is authenticated or not +// Arguements : +// connection : an LmConnection to check +// Returns : TRUE if connection is authenticated, FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_is_authenticatedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gboolean NotAuthenticated = FALSE; + + iLog->Log ( _L ( "In lm_connection_is_authenticated" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the connection to use gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID to be used for connection + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // Open a connection + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + // Check for authentication before the connection is authenticated + if ( !lm_connection_is_authenticated ( connection ) ) + { + iLog->Log ( _L ( "Connection not yet authenticated" ) ); + NotAuthenticated = TRUE; + } + + // Authenticate the connection + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Check for authentication after the connection is authenticated + if ( !lm_connection_is_authenticated ( connection ) && + FALSE == NotAuthenticated ) + { + iLog->Log ( _L ( "lm_connection_is_authenticated failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_is_authenticated passed" ) ); + + return KErrNone; + } + + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_get_server +// Description : Sets the server address for connection to server. Notice that +// connection can't be open while doing this. +// Arguements : +// connection : an LmConnection +// server : Address of the server ( name of the server ) +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_get_serverL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + gchar *ServerName = "ganapati.nokia.com"; + ConnectData *connect_data = NULL; + gchar *NewServerName; + + iLog->Log ( _L ( "In lm_connection_set_server" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( " lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + + + // Set the servers name before the connection + lm_connection_set_server ( connection, ServerName ); + + // Verify the server name + NewServerName = (gchar *)lm_connection_get_server ( connection ); + + if ( strcmp ( NewServerName, ServerName ) != 0 ) + { + iLog->Log ( _L ( "lm_connection_set_server failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Server name modified successfully + iLog->Log ( _L ( "lm_connection_set_server passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm:lm_connection_set_server_WithNULL +// Description : Sets the server address for connection to server. Notice that +// connection can't be open while doing this. +// Arguements : +// connection : an LmConnection +// server : Address of the server ( name of the server ) +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_server_WithNULL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + gchar *ServerName = "\0"; + ConnectData *connect_data = NULL; + gchar *NewServerName; + + iLog->Log ( _L ( "In lm_connection_set_server" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( " lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + + + // Set the servers name before the connection + lm_connection_set_server ( connection, ServerName ); + + // Verify the server name + NewServerName = (gchar *)lm_connection_get_server ( connection ); + + if ( strcmp ( NewServerName, ServerName ) != 0 ) + { + iLog->Log ( _L ( "lm_connection_set_server failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Server name modified successfully + iLog->Log ( _L ( "lm_connection_set_server passed" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_get_jid +// Description : Sets the JID to be used for connection +// Arguements : +// connection : an LmConnection +// jid : JID to be used for connection +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_get_jidL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gchar *Jid = "connect.nokia.com"; + const gchar *GetJid = NULL; + + iLog->Log ( _L ( "In lm_connection_set_jid" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new close connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set new jid + Jid = g_strdup_printf ( "%s@%s", connect_data->username, connect_data->server ); + lm_connection_set_jid ( connection, Jid ); + + + // Verify the Jid + GetJid = lm_connection_get_jid ( connection ); + if ( strcmp ( Jid, GetJid ) != 0 ) + { + iLog->Log ( _L ( "lm_connection_set_jid failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + // Remove a referece on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( "lm_connection_set_jid passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_jid_WithNULL +// Description : Sets the JID to be used for connection +// Arguements : +// connection : an LmConnection +// jid : JID to be used for connection +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_jid_WithNULL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gchar *Jid = "\0"; + const gchar *GetJid = NULL; + + iLog->Log ( _L ( "In lm_connection_set_jid" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new close connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set new jid + Jid = g_strdup_printf ( "%s@%s", connect_data->username, connect_data->server ); + lm_connection_set_jid ( connection, Jid ); + + + // Verify the Jid + GetJid = lm_connection_get_jid ( connection ); + if ( strcmp ( Jid, GetJid ) != 0 ) + { + iLog->Log ( _L ( "lm_connection_set_jid failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + // Remove a referece on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( "lm_connection_set_jid passed" ) ); + + return KErrNone; + } + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_get_port +// Description : Sets the port that connection will be using +// Arguements : +// connection : an LmConnection +// port : server port +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_get_portL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + guint LmPort; + + // Open a new closed connection + connection = lm_connection_new ( NULL ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + return KErrGeneral; + } + + // Sets the port + lm_connection_set_port ( connection, MYPORT ); + + // Get the port + LmPort = lm_connection_get_port ( connection ); + + // Verify the port used by the connection + if ( LmPort != MYPORT ) + { + iLog->Log ( _L ( "lm_connection_set_port failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + // Remove a reference on connection + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_set_port passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_port_WithNULL +// Description : Sets the port that connection will be using +// Arguements : +// connection : an LmConnection +// port : server port +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_port_WithNULL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + guint LmPort; + + // Open a new closed connection + connection = lm_connection_new ( NULL ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + return KErrGeneral; + } + + // Sets the port + lm_connection_set_port ( connection, FAKEPORT ); + + // Get the port + LmPort = lm_connection_get_port ( connection ); + + // Verify the port used by the connection + if ( LmPort != FAKEPORT ) + { + iLog->Log ( _L ( "lm_connection_set_port failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + // Remove a reference on connection + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_set_port passed" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_get_ssl +// Description : Sets SSL struct or unset if ssl is NULL. +// If set connection will use SSL for the connection +// Arguements : +// connection : an LmConnection +// ssl : an LmSSL +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_get_sslL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + LmSSL *ssl = NULL; + + iLog->Log ( _L ( "In lm_connection_set_ssl" ) ); + + if ( lm_ssl_is_supported() ) + { + connection = lm_connection_new ( NULL ); + + ssl = lm_ssl_new ( NULL, NULL, NULL, NULL ); + + lm_connection_set_ssl ( connection, ssl ); + lm_ssl_unref ( ssl ); + + if ( !lm_connection_get_ssl ( connection ) ) + { + iLog->Log ( _L ( "lm_connection_set_ssl failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_set_ssl passed" ) ); + + return KErrNone; + } + + iLog->Log ( _L ( "ssl not supported" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_ssl_WithNULL +// Description : Sets SSL struct or unset if ssl is NULL. +// If set connection will use SSL for the connection +// Arguements : +// connection : an LmConnection +// ssl : an LmSSL +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_ssl_WithNULL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + LmSSL *ssl = NULL; + + iLog->Log ( _L ( "In lm_connection_set_ssl" ) ); + + if ( lm_ssl_is_supported() ) + { + connection = lm_connection_new ( NULL ); + + ssl = lm_ssl_new ( NULL, NULL, NULL, NULL ); + + lm_connection_set_ssl ( connection, ssl ); + lm_ssl_unref ( ssl ); + + if ( !lm_connection_get_ssl ( connection ) ) + { + iLog->Log ( _L ( "lm_connection_set_ssl failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_set_ssl passed" ) ); + + return KErrNone; + } + + iLog->Log ( _L ( "ssl not supported" ) ); + + return KErrNone; + } + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_get_proxy +// Description : Sets the proxy to use for this connection. To unset pass NULL +// Arguements : +// connection : an LmConnection +// proxy : an LmProxy +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_get_proxyL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection; + LmProxy *Proxy; + + iLog->Log ( _L ( "In lm_connection_set_proxy" ) ); + + connection = lm_connection_new ( NULL ); + + Proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + + // Set proxy + lm_connection_set_proxy ( connection, Proxy ); + lm_proxy_unref ( Proxy ); + + // Verify proxy setttings + if ( !lm_connection_get_proxy ( connection ) ) + { + iLog->Log ( _L ( "lm_connection_set_proxy failed" ) ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_set_proxy passed") ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_sendL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_sendL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "In lm_connection_send" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; +} + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_send_with_replyL +// Description : Send a LmMessage which will result in a reply +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// handler : LmMessageHandler that will be used when reply to a message +// arrives +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_send_with_replyL ( CStifItemParser& aItem ) + { + LmConnection *connection; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode *q_node; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_send_with_reply" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the port to gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // Open a connection with the server + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attributes ( q_node, "xmlns", "jabber:iq:auth", NULL ); + lm_message_node_add_child ( q_node, "username", connect_data->username ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Send message to the server + handler = lm_message_handler_new ( handle_messages, main_loop, NULL ); + //we are sending a dummy username request to server and the server should reply with error or not supported message + //we handle this in the handler and quit the mainloop. + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref ( handler ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref ( handler ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_send_with_reply passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::register_message_handlerL +// Description : Registers a LmMessageHandler to handle incoming messages of +// certain type. +// Arguements : +// connection : Connection to register a handle for +// handler : Message handler to register +// type : Message type that handler will handle +// priority : The priority in which to call handler +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::register_message_handlerL ( CStifItemParser& aItem ) + { + LmConnection *connection; + ConnectData *connect_data; + LmMessage *msg; + LmMessageHandler *handler; + HandleData *handle_data; + GMainLoop *main_loop = NULL; + + iLog->Log ( _L ( "In register_message_handlerL" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Create a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + SSLInit ( connection ); + + // Open a connection with the server + main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + handle_data = g_new0 ( HandleData, 1 ); + if ( !handle_data ) + { + iLog->Log ( _L ( "Memory allocation failed for handle_data" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + handle_data->main_loop = main_loop; + handle_data->Test_Success = RC_ERROR; + + // Register a message handler + handler = lm_message_handler_new ( handle_messages, handle_data, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL ); + lm_message_handler_unref ( handler ); + + + // Construct a message + msg = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_IQ ); + lm_message_node_add_child ( msg->node, "query", NULL ); + + + //Send message to the server + //Since we are sending dummy query to the recipient, we are expecting + //an error message. This indicates the response was successfully received. + if ( !lm_connection_send ( connection, msg, NULL ) ) + { + iLog->Log ( _L ( "lm_message_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( msg ); + return KErrGeneral; + } + + // Wait for the reply from the server + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + // Free the allocated resources + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( msg ); + + // Verify wheather the callback function called or not + if ( RC_OK != handle_data->Test_Success ) + { + iLog->Log ( _L ( "register_message_handlerL failed" ) ); + g_free ( handle_data ); + return KErrGeneral; + } + + g_free ( handle_data ); + free_data ( connect_data ); + iLog->Log ( _L ( "register_message_handlerL passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::set_disconnect_functionL +// Description : Set the callback that will be called when a connection is +// closed +// Arguements : +// connection : Connection to register disconnect callback for +// function : Function to be called when connection is closed +// user_data : User data passed to a function +// notify : Function to free user_data +// Returns : None +//----------------------------------------------------------------------------- +// +TInt Ctstlm::set_disconnect_functionL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "In set_disconnect_functionL" ) ); + + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Create a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + SSLInit ( connection ); + + + // Open a connection with the server + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + handle_data = g_new0 ( HandleData, 1 ); + if ( !handle_data ) + { + iLog->Log ( _L ( "Memory allocation failed for handle_data" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + return KErrGeneral; + } + handle_data->Test_Success = RC_ERROR; + + // Set a Callback function that will be called when connection is closed + lm_connection_set_disconnect_function ( connection, + connection_close_cb, + handle_data, + NULL ); + + // Close the opened connection + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + + // Check wheather callback function is called or not + if ( RC_OK != handle_data->Test_Success ) + { + iLog->Log ( _L ( "set_disconnect_functionL failed" ) ); + g_free ( handle_data ); + return KErrGeneral; + } + + g_free ( handle_data ); + + iLog->Log ( _L ( "set_disconnect_functionL passed" ) ); + free_data ( connect_data ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_raw +// Description : Asynchronus call to send a raw string. +// Arguements : +// connection : Connection used to send +// str : The string to send, the entire string will be sent +// error : Set if error was detected during sending +// Returns : TRUE if no errors were detected during sending, FALSE +// otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_rawL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + GError *error = NULL; + + iLog->Log ( _L ( "In lm_connection_send_raw" ) ); + + // Read data from the cfg file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Create a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + SSLInit ( connection ); + + // Open a connection with the server + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + // Send a raw message + if ( !lm_connection_send_raw ( connection, + connect_data->msg_data->message, + &error ) ) + { + iLog->Log ( _L ( "lm_connection_send_raw failed: %s"), error->message ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_send_raw passed" ) ); + + return KErrNone; + } + + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_get_state +// Description : Returns the state of the connection +// Arguements : +// connection : Connection to get state +// Returns : The state of the connection +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_get_stateL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmConnectionState state; + + iLog->Log ( _L ( "In lm_connection_get_state" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Create a new closed connection + connection = lm_connection_new ( connect_data->server ); + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + SSLInit ( connection ); + + // Verify the state when the connection is closed + state = lm_connection_get_state ( connection ); + + if ( LM_CONNECTION_STATE_CLOSED != state ) + { + iLog->Log ( _L ( "lm_connection_get_state failed:closed" ) ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Verify the state after opening the connection + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + state = lm_connection_get_state ( connection ); + + if ( LM_CONNECTION_STATE_OPEN != state ) + { + iLog->Log ( _L ( "lm_connection_get_state failed: open" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + state = lm_connection_get_state ( connection ); + + if ( LM_CONNECTION_STATE_AUTHENTICATED != state ) + { + iLog->Log ( _L ( "lm_connection_get_state failed: authenticated" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_connection_get_state passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_ref +// Description : Add a reference on connection +// Arguements : +// connection : Connection to a add a reference to +// Returns : Returns the same connection +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_refL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + + iLog->Log ( _L ("In lm_connection_unref" ) ); + + // Create a new closed connection + connection = lm_connection_new ( NULL ); + + // Add a reference on connection + connection = lm_connection_ref ( connection ); + + // Loudmouth don't have any API to check the ref count on connection + // Therefore lm_connection_ref is considered as passed. + + // Decrement the reference count and free the memory + lm_connection_unref ( connection ); + lm_connection_unref ( connection ); + + iLog->Log ( _L ( "lm_connection_ref passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_unref +// Description : Removes the reference on connection. If there are no +// references to connection, it will be freed and shouldn't +// used again +// Check the total available heap space +// Create a new closed connection, +// Check that available heap space is reduced +// Decrement the reference on connection +// Check the available heap is equal to what it was before +// Arguements : +// connection : Connection to remove reference from +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_unrefL ( CStifItemParser& /*aItem*/ ) + { + LmConnection *connection = NULL; + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_available_before; + TInt heap_available_after; + + iLog->Log ( _L ( "In lm_connection_unref" ) ); +__UHEAP_MARK; + // Get the heap space before creating closed connection + heap_available_before = heap_handle.Available ( largest_free_block ); + + // Create a new closed connection + connection = lm_connection_new ( NULL ); + + // Decrement the reference on connection + lm_connection_unref ( connection ); + + // Get the heap space after freeing memory + heap_available_after = heap_handle.Available ( largest_free_block ); + + if ( heap_available_after != heap_available_before ) + { + iLog->Log ( _L ( "{heap_available_before = %d, heap_available_before = %d}" ), + heap_available_before, heap_available_after ); + iLog->Log ( _L ( "Available memeory is not as expected after free!" ) ); + return KErrGeneral; + } +__UHEAP_MARKEND; + iLog->Log ( _L ( "{ Expected:heap_available_before is equal to heap_available_after }" ) ); + iLog->Log ( _L ( "heap_available_before = %d, heap_available_after = %d" ), + heap_available_before, heap_available_after ); + iLog->Log ( _L ( "lm_connection_unref passed" ) ); + + return KErrNone; + + } + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_new +// Description:Creates a new LmMessage which can be sent with +// lm_connection_send() or lm_connection_send_with_reply(). +// Arguements : +// to : recipient jid +// type : message type +// Returns : a newly created LmMessage +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_newL ( CStifItemParser& aItem ) + { + LmMessage *message; + ConnectData *connect_data = NULL; + LmMessageType MessageType; + gchar Type[256]; + + iLog->Log ( _L ( "\tIn lm_message_new" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "\tread_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Construct a message with a type=LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "\tConstruct a message" ) ); + + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "\tlm_message_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + + // Verify the message type + iLog->Log ( _L ( "\tVerify the message type" ) ); + + MessageType = lm_message_get_type ( message ); + if ( LM_MESSAGE_TYPE_MESSAGE != MessageType ) + { + iLog->Log ( _L( "\tExpected message type: LM_MESSAGE_TYPE_MESSAGE" ) ); + memset ( Type, '\0', sizeof ( Type ) ); + GetMessageType ( MessageType, Type ); + iLog->Log ( _L8 ( "\tActual message type : %s" ), Type ); + + iLog->Log ( _L ( "\tlm_message_get_type failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_message_unref ( message ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_message_new passed" ) ); + + return KErrNone; + + } + + + // --------------------------------------------------------------------------- +// Ctstlm::lm_message_new_with_sub_type +// Description:Creates a new LmMessage with subtype set. +// Arguements : +// to : recipient jid +// type : message type +// sub_type : message sub type +// Returns : a newly created LmMessage +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_new_with_sub_typeL ( CStifItemParser& aItem ) + { + LmMessage *message; + ConnectData *connect_data = NULL; + LmMessageType MessageType; + LmMessageSubType MessageSubType; + gchar Type[256]; + gchar SubType[256]; + + iLog->Log ( _L ( "In lm_message_new_with_sub_type" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "\tread_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Construct a message with type and sub type + message = lm_message_new_with_sub_type ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + if ( !message ) + { + iLog->Log ( _L ( "\tlm_message_new_with_sub_type failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + + // Verify the message type + MessageType = lm_message_get_type ( message ); + if ( LM_MESSAGE_TYPE_IQ != MessageType ) + { + iLog->Log ( _L ( "\tExpected message type: LM_MESSAGE_TYPE_IQ" ) ); + memset ( Type, '\0', sizeof ( Type ) ); + GetMessageType ( MessageType, Type ); + iLog->Log ( _L8 ( "\tActual message type : %s"), Type ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Verify the message sub type + MessageSubType = lm_message_get_sub_type ( message ); + if ( LM_MESSAGE_SUB_TYPE_SET != MessageSubType ) + { + iLog->Log ( _L ( "\tExpected message subtype: LM_MESSAGE_SUB_TYPE_SET" ) ); + memset ( SubType, '\0', sizeof ( SubType ) ); + GetMessageSubType ( MessageSubType, SubType ); + iLog->Log ( _L8 ( "\tActual message subtype : %s" ), SubType ); + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_message_unref ( message ); + + free_data ( connect_data ); + iLog->Log ( _L ( "lm_message_new_with_sub_type passed" ) ); + + return KErrNone; + } + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_get_type +// Description:Fetches the type of the message +// Arguements : +// message : an LmMessage +// Returns : the message type +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_get_typeL ( CStifItemParser& /*aItem*/ ) + { + LmMessage *message = NULL; + LmMessageType MessageType; + gchar Type[256]; + + iLog->Log ( _L ( "In lm_message_get_type" ) ); + memset ( Type, '\0', sizeof ( Type ) ); + + // Construct a message with a type + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_PRESENCE ); + if ( !message ) + { + iLog->Log ( _L ( "\tlm_message_new failed while constructing PRESENCE msg" ) ); + return KErrGeneral; + } + + // Verify the message type=LM_MESSAGE_TYPE_PRESENCE + iLog->Log ( _L ( "\tMessage type verification" ) ); + + MessageType = lm_message_get_type ( message ); + if ( LM_MESSAGE_TYPE_PRESENCE != MessageType ) + { + iLog->Log ( _L ( "\tExpected message type: LM_MESSAGE_TYPE_PRESENCE" ) ) ; + memset ( Type, '\0', sizeof ( Type ) ); + GetMessageType ( MessageType, Type ); + iLog->Log ( _L8 ( "\tActual message type :%s" ), Type ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Construct another message with type=LM_MESSAGE_TYPE_IQ + iLog->Log ( _L ( "\tConstruct a message with another type" ) ); + + lm_message_unref ( message ); + message = NULL; + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_IQ ); + if ( !message ) + { + iLog->Log ( _L ( "\tlm_message_new failed while constructing IQ message " ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Verify the message type + iLog->Log ( _L ( "\tVerify the message type" ) ); + + MessageType = lm_message_get_type ( message ); + if ( LM_MESSAGE_TYPE_IQ != MessageType ) + { + iLog->Log ( _L ( "\tExpected message type: LM_MESSAGE_TYPE_IQ" ) ); + memset ( Type, '\0', sizeof ( Type ) ); + GetMessageType ( MessageType, Type ); + iLog->Log ( _L8 ( "\tActual message type : %s" ), Type ); + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_message_unref ( message ); + + iLog->Log ( _L ( "\tlm_message_get_type passed" ) ); + + return KErrNone; + } + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_get_sub_type +// Description:Fetches the sub type of the message +// Arguements : +// message : an LmMessage +// Returns : the message sub type +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_get_sub_typeL ( CStifItemParser& /*aItem*/ ) + { + LmMessage *message = NULL; + LmMessageSubType MessageSubType; + gchar SubType[256]; + + iLog->Log ( _L ( "In lm_message_get_sub_type" ) ); + + // Construct a message with type and subtype=LM_MESSAGE_SUB_TYPE_SUBSCRIBE + iLog->Log ( _L ( "\tConstruct a message with type & subtype" ) ); + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_MESSAGE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new_with_sub_type failed for SUBSCRIBE" ) ); + return KErrGeneral; + } + + // Verify message subtype + MessageSubType = lm_message_get_sub_type ( message ); + if ( LM_MESSAGE_SUB_TYPE_SUBSCRIBE != MessageSubType ) + { + iLog->Log ( _L ( "\tExpected MessageSubType: LM_MESSAGE_SUB_TYPE_SUBSCRIBE" ) ); + memset ( SubType, '\0', sizeof ( SubType ) ); + GetMessageSubType ( MessageSubType, SubType ); + iLog->Log ( _L8 ( "\tActual MessageSubType : %s" ), SubType ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Construct another message with subtype=LM_MESSAGE_SUB_TYPE_CHAT + lm_message_unref ( message ); + message = NULL; + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_MESSAGE, + LM_MESSAGE_SUB_TYPE_CHAT ); + if ( !message ) + { + iLog->Log ( _L ( "\tlm_message_new_with_sub_type failed for CHAT" ) ); + return KErrGeneral; + } + + // Verify message subtype + MessageSubType = lm_message_get_sub_type ( message ); + if ( LM_MESSAGE_SUB_TYPE_CHAT != MessageSubType ) + { + iLog->Log ( _L ( "\tExpected MessageSubType: LM_MESSAGE_SUB_TYPE_CHAT" ) ); + + memset ( SubType, '\0', sizeof ( SubType ) ); + GetMessageSubType ( MessageSubType, SubType ); + iLog->Log ( _L8 ( "\tActual MessageSubType : %s" ), SubType ); + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_message_unref ( message ); + + iLog->Log ( _L ( "\tlm_message_get_sub_type passed" ) ); + + return KErrNone; + } + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_get_node +// Description:Retrives the root node from LmMessage +// Arguements : +// message : an LmMessage +// Returns : an LmMessageNode +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_get_nodeL ( CStifItemParser& /*aItem*/ ) + { + LmMessage *message; + LmMessageNode *Node = NULL; + + iLog->Log ( _L ( "In lm_message_get_node" ) ); + + // Construct a message with type=LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive root node from the message + iLog->Log ( _L ( "Retrive root node from message" ) ); + + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_get_node passed" ) ); + + return KErrNone; + } + + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_ref +// Description:Adds a reference to message +// Arguements : +// message : an LmMessage +// Returns : an message +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_refL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + + iLog->Log ( _L ( "In lm_message_ref" ) ); + + // Construct a message + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Add a reference to message + message = lm_message_ref ( message ); + + // Loudmouth don't have any API to check the ref count on message + // Therefore lm_message_ref is considered as passed. + + // Decrement the reference(2 times) to message and free the memory + lm_message_unref ( message ); + lm_message_unref ( message ); + + iLog->Log ( _L ( "lm_message_ref passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_unref +// Description:Removes a reference from message. When no more references are +// present, the message is freed. +// Check the total available heap space +// Construct a new message by using lm_message_new +// Check that available heap space is reduced +// Decrement the reference from message +// Check the available heap is equal to what it was before +// Arguements : +// message : an LmMessage +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_unrefL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message; + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_available_before; + TInt heap_available_after; + + iLog->Log ( _L ( "In lm_message_unref" ) ); + + // Get the total heap space before constructing a message + iLog->Log ( _L ( "Getting the heap size before message construction" ) ); + heap_available_before = heap_handle.Available ( largest_free_block ); + + // Construct a message + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Decrement the reference from message + iLog->Log ( _L ( "Remove the reference from the message" ) ); + lm_message_unref ( message ); + + // Get the heap space after freeing memory + iLog->Log ( _L ( "Getting the heap size after freeing the memory" ) ); + heap_available_after = heap_handle.Available ( largest_free_block ); + + // Compare the heap size + iLog->Log ( _L ( "Comparing heap size before and after freeing memory" ) ); + + if ( heap_available_after != heap_available_before ) + { + iLog->Log ( _L ( "heap_available_before = %d, heap_available_after = %d" ), + heap_available_before, heap_available_after ); + iLog->Log ( _L ( "Available memory is not as expected after freeing" ) ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Expected: heap_available_before is equal to heap_available_after" ) ); + iLog->Log ( _L ( "heap_available_before = %d, heap_available_after = %d" ), + heap_available_before, heap_available_after ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_handler_new +// Description:Creates a new message handler.This can be set to handle incoming +// messages and when a message of type the handler is registered to +// handle is received function will be called and user_data will be +// passed to it. notify is called when the message handler is freed, +// that way any memory allocated by user_data can be freed. +// Arguements : +// function : a callback +// user_data : user data passed to function +// notify : function called when the message handler is freed +// Returns : a newly created message handler +// +// Note : This test case requires UI mode to select Access point +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_handler_newL ( CStifItemParser& /*aItem*/ ) +{ + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_message_handler_new" ) ); + + // Create a new message handler + handler = lm_message_handler_new ( handle_messages, NULL, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + return KErrGeneral; + } + + // Validate the handler + if ( !lm_message_handler_is_valid ( handler ) ) + { + iLog->Log ( _L ( "message handler is not valid" ) ); + lm_message_handler_unref ( handler ); + return KErrGeneral; + } + + iLog->Log ( _L ( "lm_message_handler_new passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_handler_invalidate +// Description:Invalidates the handler. Useful if you need to cancel a reply +// Arguements : +// handler : an LmMessageHandler +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_handler_invalidateL ( CStifItemParser& /*aItem*/ ) +{ + LmMessageHandler *handler = NULL; + gboolean IsValid; + + iLog->Log ( _L ( "In lm_message_handler_invalidate" ) ); + + // Create a new message handler + iLog->Log ( _L ( "Creat a new message handler" ) ); + + handler = lm_message_handler_new ( handle_messages, NULL, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + return KErrGeneral; + } + + // Invalidate the message handler ( handler->valid = FALSE ) + iLog->Log ( _L ( "Invalidate the handler" ) ); + lm_message_handler_invalidate ( handler ); + + // Check for validity of message handler + iLog->Log ( _L ( "Checking validity of message handler" ) ); + + IsValid = lm_message_handler_is_valid ( handler ); + if ( IsValid ) + { + iLog->Log ( _L ( "lm_message_handler_invalidate failed" ) ); + lm_message_handler_unref ( handler ); + return KErrGeneral; + } + + lm_message_handler_unref ( handler ); + + iLog->Log ( _L ( "lm_message_handler_invalidate passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_handler_is_valid +// Description:Fetches whether the handler is valid or not. +// Arguements : +// handler : an LmMessageHandler +// Returns : TRUE if handler is valid, otherwise FALSE +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_handler_is_validL ( CStifItemParser& /*aItem*/ ) +{ + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_message_handler_is_valid" ) ); + + // Create a new message handler + iLog->Log ( _L ( "Constructing new message handler" ) ); + handler = lm_message_handler_new ( handle_messages, NULL, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + return KErrGeneral; + } + + // Check the validity of the message handler + iLog->Log ( _L ( "Check for validity of message handler" ) ); + if ( !lm_message_handler_is_valid ( handler ) ) + { + iLog->Log ( _L ( "lm_message_handler_is_valid failed" ) ); + lm_message_handler_unref ( handler ); + return KErrGeneral; + } + + // Invalidate the handler ( set handler->valid = FALSE ) + iLog->Log ( _L ( "Invalidate the message handler" ) ); + lm_message_handler_invalidate ( handler ); + + // check for validity of message handler after invalidating + iLog->Log ( _L ( "Check for validity after invalidating" ) ); + + if ( lm_message_handler_is_valid ( handler ) ) + { + iLog->Log ( _L ( "lm_message_handler_is_valid failed" ) ); + lm_message_handler_unref ( handler ); + return KErrGeneral; + } + + lm_message_handler_unref ( handler ); + + iLog->Log ( _L ( "lm_message_handler_is_valid passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_handler_ref +// Description:Adds a reference to handler +// Arguements : +// handler : an LmMessageHandler +// Returns : the message handler +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_handler_refL ( CStifItemParser& /*aItem*/ ) +{ + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_message_handler_ref" ) ); + + // Create a new message handler + iLog->Log ( _L ( "Construct a new message handler" ) ); + + handler = lm_message_handler_new ( handle_messages, NULL, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + return KErrGeneral; + } + + // Loudmouth don't have any API to check reference to handler + // Therefore this test is considered as passed without checking + + iLog->Log ( _L ( "Remove a reference from the message handler" ) ); + lm_message_handler_unref ( handler ); + + iLog->Log ( _L ( "lm_message_handler_ref passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_handler_unref +// Description:Removes a reference from handler. When no more references are +// present, the handler is freed +// Check the total available heap space +// Construct a new message handler +// Check that available heap space is reduced +// Remove reference from the message handler +// Check the available heap is equal to what it was before +// Arguements : +// handler : an LmMessageHandler +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_handler_unrefL ( CStifItemParser& /*aItem*/ ) +{ + LmMessageHandler *handler = NULL; + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_avail_before; + TInt heap_avail_after; + + iLog->Log ( _L ( "Inlm_message_handler_unref" ) ); + + // Get the total heap size before creating new message handler + iLog->Log ( _L ( "Get the heap size before allocating memory" ) ); + heap_avail_before = heap_handle.Available ( largest_free_block ); + + // Create a new message handler + iLog->Log ( _L ( "Construct a new message handler" ) ); + + handler = lm_message_handler_new ( handle_messages, NULL, NULL ); + if ( !handler ) + { + iLog->Log ( _L ( "lm_message_handler_new failed" ) ); + return KErrGeneral; + } + + // Remove a reference from the message handler + iLog->Log ( _L ( "Freeing allocated memory" ) ); + lm_message_handler_unref ( handler ); + + // Get the heap size after removing reference from message handler + iLog->Log ( _L ( "Get the heap size after freeing memory" ) ); + heap_avail_after = heap_handle.Available ( largest_free_block ); + + // Compare the heap size + iLog->Log ( _L ( "Compare the heap size after freeing memory" ) ); + + if ( heap_avail_before != heap_avail_after ) + { + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + iLog->Log ( _L ( "Available memory is not as expected after freeing" ) ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Expected: heap_avail_before is equal to heap_avail_after" ) ); + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + + return KErrNone; +} + + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_set_value +// Description:Sets the value of node. If a prev value is set it will be freed +// Arguements : +// Node : an LmMessageNode +// value : the new value +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_set_get_valueL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + const gchar *SetUsername = "Nokia"; + + iLog->Log ( _L ( "In lm_message_node_get_value" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retriving root node from the message" ) ); + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Set the value of the node + iLog->Log ( _L ( "Set the value of the node" ) ); + lm_message_node_set_value ( Node, SetUsername ); + + // Retrive the value of node + iLog->Log ( _L ( "Retrive the value of the node" ) ); + const gchar *GetUsername = lm_message_node_get_value ( Node ); + + // Verify the result + iLog->Log ( _L ( "Verify value of node" ) ); + if ( strcmp ( SetUsername, GetUsername ) ) + { + iLog->Log ( _L ( "lm_message_set_value failed" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_set_value passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_add_child +// Description:Add a child node with a name and value +// Arguements : +// node : an LmMessageNode +// name : name of the new child +// value : value of the new child +// Returns : the newly created child +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_add_childL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + const gchar *Username = "Nokia"; + + iLog->Log ( _L ( "In lm_message_node_add_child" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from message" ) ); + + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Add a child + iLog->Log ( _L ( "Add a child 'username' to node" ) ); + lm_message_node_add_child ( Node, "username", Username ); + + // Verify the child + iLog->Log ( _L ( "Verify the child" ) ); + if ( !lm_message_node_get_child ( Node, "username" ) ) + { + iLog->Log ( _L ( "lm_message_add_child failed" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Freeing allocated resources" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_add_child passed" ) ); + + return KErrNone; +} + + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_find_child +// Description:Locates a child among all children of node. The entire tree will +// be searched until a child with a name child_name is located. +// Arguements : +// node : an LmMessageNode +// name : name of the child to find +// Returns : located child or NULL if not found +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_find_childL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + const gchar *Username = "Nokia"; + const gchar *Password = "Nokia"; + + iLog->Log ( _L ( "In lm_message_node_find_child" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from the message" ) ); + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Add childrens + iLog->Log ( _L ( "Adding childrens 'username' and 'password'" ) ); + lm_message_node_add_child ( Node, "username", Username ); + lm_message_node_add_child ( Node, "password", Password ); + + // Locate the child 'username' + iLog->Log ( _L ( "Locate the child 'username'" ) ); + if ( !lm_message_node_find_child ( Node, "username" ) ) + { + iLog->Log ( _L ( "lm_message_node_find_child: child 'username' not found" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + // Locate the child 'password' + if ( !lm_message_node_get_child ( Node, "password" ) ) + { + iLog->Log ( _L ( "lm_message_node_find_child: child 'password' not found" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_find_child passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_set_get_attributes +// Description:Sets a list of attributes. The arguements should be names and +// correspoinding values and needs to be ended with NULL. +// Arguements : +// node : an LmMessageNode +// name : first attribute, should be fallowed by string with value +// .. : rest of the name/value pairs +// Returns : None +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_set_get_attributesL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + const gchar *Value = "Nokia"; + + iLog->Log ( _L ( "In lm_message_node_set_attributes" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from the message" ) ); + + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Set attributes + iLog->Log ( _L ("Setting attributes 'username', 'password' and 'xmlns'" ) ); + lm_message_node_set_attributes ( Node, + "username", Value, + "password", Value, + "xmlns", "jabber:iq:register", + NULL ); + + // Verify the attributes set + iLog->Log ( _L (" Verify the attributes" ) ); + + if ( !lm_message_node_get_attribute ( Node, "username" ) ) + { + iLog->Log ( _L ( "lm_message_set_attributes failed for username" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + if ( !lm_message_node_get_attribute ( Node, "password" ) ) + { + iLog->Log ( _L ( "lm_message_set_attributes failed for password" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + if ( !lm_message_node_get_attribute ( Node, "xmlns" ) ) + { + iLog->Log ( _L ( "lm_message_set_attributes failed for xmlns" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_set_attributes passed" ) ); + + return KErrNone; +} + + + + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_set_get_raw_mode +// Description:Checks if the nodes values should be sent as raw mode +// Arguements : +// node : an LmMessageNode +// Returns : TRUE if nodes value should be sent as is +// FALSE if the value will be escaped before sending +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_set_get_raw_modeL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + + iLog->Log ( _L ( "In lm_message_node_set_raw_mode" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from message" ) ); + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Set the raw mode to TRUE + iLog->Log ( _L ( "Set the node to raw mode" ) ); + lm_message_node_set_raw_mode ( Node, TRUE ); + + // Check if the Node is in raw mode or not after setting + iLog->Log ( _L ( "Check for raw mode after setting" ) ); + if ( !lm_message_node_get_raw_mode ( Node ) ) + { + iLog->Log ( _L ( "get_raw_mode returned FALSE after setting raw mode" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + // Set the raw mode to FALSE + iLog->Log ( _L ( "Unset the raw mode" ) ); + lm_message_node_set_raw_mode ( Node, FALSE ); + + // Check for raw mode + iLog->Log ( _L ( "Check for raw mode after unsetting" ) ); + if ( lm_message_node_get_raw_mode ( Node ) ) + { + iLog->Log ( _L ( "get_raw_mode returned TRUE after unsetting" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_set_raw_mode passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_ref +// Description:Adds a reference to node +// Arguements : +// node : an LmMessageNode +// Returns : the node +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_refL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + + iLog->Log ( _L ( "In lm_message_node_ref" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from message" ) ); + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Add a reference to node + lm_message_node_ref ( Node ); + + // Loudmouth dont have any API to check reference on message node + // Therefore lm_message_node_ref is considered as passed without checking + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_ref passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_unref +// Description: Removes a reference from the the node. When no more +// reference are present, the node is freed. When freed +// lm_message_node_unref() will be called on all children. +// Check the size of the heap just to verify whether node +// is freed or not when no more references to the node +// Arguements : +// node : an LmMessageNode +// Returns : Node +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_unrefL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_avail_before; + TInt heap_avail_after; + + iLog->Log ( _L ( "In lm_message_node_unref" ) ); + + // Get the heap size before constructing a message + heap_avail_before = heap_handle.Available ( largest_free_block ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from message" ) ); + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Remove reference from the message + iLog->Log ( _L ( "Remove reference from the message" ) ); + lm_message_unref ( message ); + + // Remove reference from the node + iLog->Log ( _L ( "Remove a reference from the node" ) ); + lm_message_node_unref ( Node ); + + // Get the heap size after removing references + heap_avail_after = heap_handle.Available ( largest_free_block ); + + // Verify the heap size + if ( heap_avail_after != heap_avail_before ) + { + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + iLog->Log ( _L ( "Available memory is not as expected after freeing" ) ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Expected: heap_available_before is equal to heap_available_after" ) ); + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_to_string +// Description:Returns an XML string representing the node. This is what +// is sent over the connection. This is used internally by +// loudmouth and is external for debugging purposes +// Arguements : +// node : an LmMessageNode +// Returns : an XML string representation of node +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_to_stringL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + gchar *XmlString = NULL; + + + iLog->Log ( _L ( "In lm_message_node_to_string" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_PRESENCE + iLog->Log ( _L ( "Construct a message with type=presence" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_PRESENCE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed for type = PRESENCE" ) ); + return KErrGeneral; + } + + // Convert node to XML string + XmlString = lm_message_node_to_string ( message->node ); + + // Check in XML string for stanza + if ( !g_strrstr ( XmlString, "presence" ) ) + { + iLog->Log ( _L ( "XML string doesnt contain stanza" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + lm_message_unref ( message ); + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_IQ ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed for type = IQ" ) ); + return KErrGeneral; + } + + // Convert the message node to XML string + XmlString = lm_message_node_to_string ( message->node ); + + // Check in XML string for stanza + if ( !g_strrstr ( XmlString, "iq" ) ) + { + iLog->Log ( _L ( "XML string doesnt contain stanza" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + iLog->Log ( _L ( "lm_message_node_to_string passed" ) ); + lm_message_unref ( message ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_ssl_new +// Description: Creates a new ssl struct +// Arguements : +// expected_fingerprint : The expected fingerprint. ssl_function will be +// called if there is a mismatch. NULL if you +// are not interested in this check. +// ssl_cb : Callback called to inform the user of a problem +// during setting up the SSL connection and how +// to proceed. +// user_data : Data sent with the callback +// notify : Function to free user_data when the connection +// is finished. +// Returns : A new LmSSL struct +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_ssl_newL ( CStifItemParser& /*aItem*/ ) +{ + LmSSL *ssl = NULL; + + iLog->Log ( _L ( "In lm_ssl_new" ) ); + + ssl = lm_ssl_new ( NULL, ( LmSSLFunction ) ssl_cb, NULL, NULL ); + if ( !ssl ) + { + iLog->Log ( _L ( "lm_ssl_new failed" ) ); + return KErrGeneral; + } + + lm_ssl_unref ( ssl ); + + iLog->Log ( _L ( "lm_ssl_new passed" ) ); + + return KErrNone; +} + +// --------------------------------------------------------------------------- +// Ctstlm::lm_ssl_is_supportedL +// Description: Checks wheather the Loudmouth supports SSL or not. +// Arguements : None +// Returns : TRUE if loudmouth supports SSL, FALSE otherwise +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_ssl_is_supportedL ( CStifItemParser& /*aItem*/ ) +{ + iLog->Log ( _L ( "In lm_ssl_is_supported" ) ); + + if ( !lm_ssl_is_supported() ) + { + iLog->Log ( _L ( "Loudmouth installation doesn't support SSL" ) ); + } + else + { + iLog->Log ( _L ( "Loudmouth supports SSL" ) ); + } + + iLog->Log ( _L ( "lm_ssl_is_supported passed" ) ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_ssl_get_fingerprintL +// Description: Returns the MD5 fingerprint of the remote server's certificate. +// Arguements : +// ssl : An LmSSL +// Returns : A 16-byte array indicating fingerprint or NULL if unknow +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_ssl_get_fingerprintL ( CStifItemParser& /*aItem*/ ) +{ + LmSSL *ssl; + + iLog->Log ( _L ( "In lm_ssl_get_fingerprint" ) ); + + ssl = lm_ssl_new ( "--ssl", ( LmSSLFunction )ssl_cb, NULL, NULL ); + + const gchar *fingerprint = lm_ssl_get_fingerprint ( ssl ); + if ( !fingerprint ) + { + iLog->Log ( _L ( "Not able to get the remote server's certificate" ) ); + } + + iLog->Log ( _L ( "lm_ssl_get_fingerprint passed" ) ); + lm_ssl_unref ( ssl ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_ssl_ref +// Description: Adds a reference to ssl +// Arguements : +// ssl : An LmSSL +// Returns : LmSSL +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_ssl_refL ( CStifItemParser& /*aItem*/ ) +{ + LmSSL *ssl; + + iLog->Log ( _L ( "In lm_ssl_ref" ) ); + + ssl = lm_ssl_new ( NULL, NULL, NULL, NULL ); + if ( !ssl ) + { + iLog->Log ( _L ( "lm_ssl_new failed" ) ); + return KErrGeneral; + } + + // Add a reference to ssl + lm_ssl_ref ( ssl ); + + // Loudmouth don't have any API to get the reference to ssl. + // Therefore this test case is considered as passed without verifying it + lm_ssl_unref ( ssl ); + + iLog->Log ( _L ( "lm_ssl_ref passed" ) ); + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_ssl_unref +// Description: Removes a reference from ssl. +// When no more references are present, ssl is freed. +// Check the heap size to ensure that lm_ssl_unref frees the ssl +// when no more references are present. +// Arguements : +// ssl : An LmSSL +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_ssl_unrefL ( CStifItemParser& /*aItem*/ ) +{ + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_avail_before; + TInt heap_avail_after; + + LmSSL *ssl = NULL; + + iLog->Log ( _L ( "In lm_ssl_unref" ) ); + + // Get the heap size before creating a new ssl + heap_avail_before = heap_handle.Available ( largest_free_block ); + + // Create a new ssl + ssl = lm_ssl_new ( NULL, NULL, NULL, NULL ); + if ( !ssl ) + { + iLog->Log ( _L ( "lm_ssl_new failed" ) ); + return KErrGeneral; + } + + // Remove a reference from the ssl + lm_ssl_unref ( ssl ); + + // Get the heap size after freeing memory + heap_avail_after = heap_handle.Available ( largest_free_block ); + + // Compare the heap size + if ( heap_avail_after != heap_avail_before ) + { + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + iLog->Log ( _L ( "Available memory is not as expected after unref" ) ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Expected: heap_avail_before is equal to heap_avail_after" ) ); + iLog->Log ( _L ( "heap_avail_before = %d, heap_avail_after = %d" ), + heap_avail_before, heap_avail_after ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_new +// Description:Creates a new proxy +// Arguements : +// type : proxy type (LM_PROXY_TYPE_NONE/LM_PROXY_TYPE_HTTP) +// Returns : a newly created proxy +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_newL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + LmProxyType Type; + + iLog->Log ( _L ( "In lm_proxy_new" ) ); + + iLog->Log ( _L ( "Create a new proxy" ) ); + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + // Verify the proxy type + iLog->Log ( _L ( "Proxy type verification" ) ); + + Type = lm_proxy_get_type ( proxy ); + if ( LM_PROXY_TYPE_HTTP != Type ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_new passed" ) ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_new_with_server +// Description:Creates a new proxy +// Arguements : +// type : proxy type (LM_PROXY_TYPE_NONE/LM_PROXY_TYPE_HTTP) +// server : proxy server +// port : proxy server port +// Returns : a newly created proxy +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_new_with_serverL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + guint port = 8000; + const gchar *server = "nokia.com"; + + + iLog->Log ( _L ( "In lm_proxy_new_with_server" ) ); + // Create a new proxy with the server + proxy = lm_proxy_new_with_server ( LM_PROXY_TYPE_HTTP, server, port ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new_with_server failed" ) ); + return KErrGeneral; + } + + // Verify proxy type, server and port + iLog->Log ( _L ( "Verify server, type and port in proxy" ) ); + + if ( LM_PROXY_TYPE_HTTP != lm_proxy_get_type ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_new_with_server failed for proxy type setting" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + if ( strcmp ( server, lm_proxy_get_server ( proxy ) ) ) + { + iLog->Log ( _L ( "lm_proxy_new_with_server failed for server setting" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + if ( port != lm_proxy_get_port ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_new_with_server failed for port setting" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_new_with_server passed" ) ); + + return KErrNone; +} + + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_set_get_type +// Description:Sets the proxy type for proxy to type +// Arguements : +// proxy : an LmProxy +// type : proxy type +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_set_get_typeL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + + iLog->Log ( _L ( "In lm_proxy_set_get_type" ) ); + + // Create a new proxy with type=LM_PROXY_TYPE_NONE + proxy = lm_proxy_new ( LM_PROXY_TYPE_NONE ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Set the proxy type=LM_PROXY_TYPE_HTTP + lm_proxy_set_type ( proxy, LM_PROXY_TYPE_HTTP ); + + // Verify the proxy type for LM_PROXY_TYPE_HTTP + if ( LM_PROXY_TYPE_HTTP != lm_proxy_get_type ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_set_type failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_set_get_type passed" ) ); + + return KErrNone; +} + + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_set_get_server +// Description:Sets the server address for proxy +// Arguements : +// proxy : an LmProxy +// server : address of the proxy server +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_set_get_serverL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + const gchar *server = "nokia.com"; + + iLog->Log ( _L ( "In lm_proxy_get_server" ) ); + + // Create a new proxy with type = LM_PROXY_TYPE_HTTP + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Set the proxy server to "nokia.com" + lm_proxy_set_server ( proxy, server ); + + // Verify the server address in proxy + if ( strcmp ( server, lm_proxy_get_server ( proxy ) ) ) + { + iLog->Log ( _L ( "lm_proxy_set_server failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_set_server passed" ) ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_set_port +// Description:Sets the server port that proxy will be using +// Arguements : +// proxy : an LmProxy +// port : proxy server port +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_set_get_portL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + guint port1 = 80; + guint port2 = 21; + + iLog->Log ( _L ( "In lm_proxy_set_get_port" ) ); + + // Create new proxy + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Set the port = port1 + lm_proxy_set_port ( proxy, port1 ); + + // Verify the port + if ( port1 != lm_proxy_get_port ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_set_port failed for port = %d" ), port1 ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + // Set the port = port2 + lm_proxy_set_port ( proxy, port2 ); + + // Verify the port + if ( port2 != lm_proxy_get_port ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_set_port failed for port = %d" ), port2 ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_set_get_port passed" ) ); + + return KErrNone; +} + + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_set_username +// Description:Sets the username for proxy or NULL to unset +// Arguements : +// proxy : an LmProxy +// username : username +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_set_get_usernameL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + const gchar *user1 = "nokia"; + const gchar *user2 = "linux"; + + iLog->Log ( _L ( "In lm_proxy_set_get_username" ) ); + + // Create a new proxy + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Set the proxy username to "nokia" + lm_proxy_set_username ( proxy, user1 ); + + // Verify the proxy username + if ( strcmp ( user1, lm_proxy_get_username ( proxy ) ) ) + { + iLog->Log ( _L ( "lm_proxy_set_username failed for user1" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + // Set the proxy username to "linux" + lm_proxy_set_username ( proxy, user2); + + // Verify the proxy username + if ( strcmp ( user2, lm_proxy_get_username ( proxy ) ) ) + { + iLog->Log ( _L ( "lm_proxy_set_username failed for user2" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + lm_proxy_unref ( proxy ); + + iLog->Log ( _L ( "lm_proxy_set_get_username passed" ) ); + + return KErrNone; +} + + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_set_password +// Description:Sets the password for proxy +// Arguements : +// proxy : an LmProxy +// Returns : the proxy password +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_set_get_passwordL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + const gchar *password = "nokia"; + + iLog->Log ( _L ( "In lm_proxy_set_get_passrod" ) ); + + // Create a new proxy + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Set the password proxy to "nokia" + lm_proxy_set_password ( proxy, password ); + + // Verify the password + if ( strcmp ( password, lm_proxy_get_password ( proxy ) ) ) + { + iLog->Log ( _L ( "lm_proxy_set_password failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + // Unset the password + lm_proxy_set_password ( proxy, NULL ); + + // Verify the password + if ( lm_proxy_get_password ( proxy ) ) + { + iLog->Log ( _L ( "lm_proxy_set_password failed" ) ); + lm_proxy_unref ( proxy ); + return KErrGeneral; + } + + iLog->Log ( _L ( "lm_proxy_set_password passed" ) ); + lm_proxy_unref ( proxy ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_ref +// Description:Adds a reference to proxy +// Arguements : +// proxy : an LmProxy +// Returns : the proxy +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_refL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + + iLog->Log ( _L ( "In lm_proxy_ref" ) ); + + // Creat a new proxy + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Add a reference to proxy + proxy = lm_proxy_ref ( proxy ); + + // Loudmouth don't provide API for getting reference to the proxy + // Therefore this test case is considered as passed without checking + iLog->Log ( _L ( "lm_proxy_ref passed" ) ); + lm_proxy_unref ( proxy ); + lm_proxy_unref ( proxy ); + + return KErrNone; +} + + +// --------------------------------------------------------------------------- +// Ctstlm::lm_proxy_unref +// Description:Removes a reference from the proxy +// When no more rererences are present proxy is freed +// Check the heap size to ensure that lm_proxy_unref free +// the proxy when no more references are present. +// Arguements : +// proxy : an LmProxy +// Returns : None +// --------------------------------------------------------------------------- +// +TInt Ctstlm::lm_proxy_unrefL ( CStifItemParser& /*aItem*/ ) +{ + LmProxy *proxy = NULL; + + RHeap& heap_handle = User::Heap(); + TInt largest_free_block; + TInt heap_avail_before; + TInt heap_avail_after; + + iLog->Log ( _L ( "In lm_proxy_unref" ) ); + + // Get the heap size before creating a new proxy + heap_avail_before = heap_handle.Available ( largest_free_block ); + + // Create a new proxy + proxy = lm_proxy_new ( LM_PROXY_TYPE_HTTP ); + if ( !proxy ) + { + iLog->Log ( _L ( "lm_proxy_new failed" ) ); + return KErrGeneral; + } + + // Remove a reference from the proxy + lm_proxy_unref ( proxy ); + + // Get the heap size + heap_avail_after = heap_handle.Available ( largest_free_block ); + + // Compare the heap size + if ( heap_avail_after != heap_avail_before ) + { + iLog->Log ( _L ( "heap_available_before = %d, heap_available_after = %d" ), + heap_avail_before, heap_avail_after ); + iLog->Log ( _L ( "Available memory is not as expected after freeing" ) ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Expected: heap_available_before is equal to heap_available_after" ) ); + iLog->Log ( _L ( "heap_available_before = %d, heap_available_after = %d" ), + heap_avail_before, heap_avail_after ); + iLog->Log ( _L ( "lm_message_unref passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_send_sync +// Description : Opens a connection with the gtalk server and sends a jabber +// message to the another person +// Requires : This test case requires GUI mode for selecting Access point +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_send_syncL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + LmMessage *message = NULL; + + ConnectData *connect_data = NULL; + + GError *error = NULL; + + iLog->Log ( _L ( "In lm_send_sync" ) ); + + // Read data from the CFG file + iLog->Log ( _L ( "Reading data from the CFG file" ) ); + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "Read data from the CFG file" ) ); + iLog->Log ( _L8 ( "Server name: %s" ), connect_data->server ); + + // Open a new closed connection + iLog->Log ( _L ( "Open a new closed connection" ) ); + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "New closed connection opened" ) ); + + iLog->Log ( _L ( "Setting jid" ) ); + lm_connection_set_jid ( connection, connect_data->username ); + + iLog->Log ( _L ( "Setting gtalks SSL port" ) ); + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Proxy settings for emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set connection to use SSL + iLog->Log ( _L ( "Setting SSL for the connection" ) ); + SSLInit ( connection ); + + iLog->Log ( _L ( "Open a connection with the server" ) ); + //Calling connection open + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + iLog->Log ( _L ( "connection with the server successfull" ) ); + + iLog->Log ( _L ( "Getting the username from the server" ) ); + iLog->Log ( _L8 ( "jid: %s" ), connect_data->username ); + // Get the user from the full JID + gchar *username = get_user_name ( connect_data->username ); + iLog->Log ( _L ( "after extracting from the jid: %s" ), username ); + + + iLog->Log ( _L ( "Authenticating with the server" ) ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + iLog->Log ( _L ( "Authentication done" ) ); + + // Send a message to the server + iLog->Log ( _L8 ( "Create a new message: %s" ), + connect_data->msg_data->recipient ); + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "Add a node" ) ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message ); + + + iLog->Log ( _L ( "Send message to the server" ) ); + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "Message has been sent" ) ); + + iLog->Log ( _L ( "Free the allocated resources" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + iLog->Log ( _L ( "Freed" ) ); + + iLog->Log ( _L ( "lm_send_sync passed" ) ); + + return KErrNone; + } + + //----------------------------------------------------------------------------- +// Ctstlm::lm_is_authenticated_WhenNotAuthenticatedL +// Description : Check if connection is authenticated or not +// Arguements : +// connection : an LmConnection to check +// Returns : TRUE if connection is authenticated, FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_is_authenticated_WhenNotAuthenticatedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + gboolean NotAuthenticated = FALSE; + + iLog->Log ( _L ( "In lm_connection_is_authenticated" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the connection to use gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID to be used for connection + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // Open a connection + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + // Check for authentication after the connection is authenticated + if ( lm_connection_is_authenticated ( connection ) ) + { + iLog->Log ( _L ( "lm_is_authenticated_WhenNotAuthenticatedL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_is_authenticated_WhenNotAuthenticatedL passed" ) ); + + return KErrNone; + } + + + +//-------------------------------------------------------------------------------- +// function_name : handle_fetch_contactlist_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_fetch_contactlist_messages ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + break; + case LM_MESSAGE_SUB_TYPE_ERROR: + //return NULL; + break; + // default: + // g_assert_not_reached (); + // break; + } + + q_node = lm_message_node_get_child (reply->node, "query"); + + if (!q_node) + { + //return NULL; + } + + item_node = lm_message_node_get_child (q_node, "item"); + + while (item_node) + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(item_node,"jid"); + char* friendname; + const char* atstring = "@"; + friendname = strtok((char*)reply_string,atstring ); + item_node = item_node->next; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_fetching_contactlistL +// Description : fetching contact list +// Arguements : +// connection : +// message : +// error : +// Returns : +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_fetching_contactlist_L ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode *q_node; + //LmMessageSubType type; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_fetching_contactlist_L" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + //Open call + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node, + "xmlns", "jabber:iq:roster", + NULL); + // Send message to the server + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_fetching_contactlist_L passed" ) ); + + return KErrNone; + } + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_fetching_presenceL +// Description : fetching contact list +// Arguements : +// connection : +// message : +// error : +// Returns : +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_fetching_presenceL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + //LmMessageNode *q_node; + // LmMessageSubType type; + LmMessageHandler *handler = NULL; + GMainLoop *main_loop = NULL; + + iLog->Log ( _L ( "In lm_fetching_presenceL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + + gboolean result = lm_connection_send ( connection, message, NULL ); + // Close the connection + main_loop = g_main_loop_new ( NULL, FALSE ); + + //------------------------------------------------------------------------ + // + // Register a handler to recieve and update presence information + // + handler = lm_message_handler_new ( + (LmHandleMessageFunction)jabber_presence_handler_cb, + main_loop, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_NORMAL ); + + //------------------------------------------------------------------------ + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + // Remove a reference on message + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + + // Message sending passed + iLog->Log ( _L ( "lm_fetching_presenceL passed" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_subscribe_contact_L +// Description : fetching contact list +// Arguements : +// connection : +// message : +// error : +// Returns : +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_subscribe_contact_L ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + //LmMessageNode *q_node; + //LmMessageSubType type; + + iLog->Log ( _L ( "In lm_subscribe_contact_L" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // Open a connection with the server + GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) connection_open_cb, + main_loop1, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop1 ); + free_data ( connect_data ); + return KErrGeneral; + } + + + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + GMainLoop *main_loop2 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop2,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop2 ); + g_main_loop_unref ( main_loop2 ); + g_free ( username ); + + + gchar *jid = "rakesh.harsha@gmail.com"; + message = lm_message_new (jid, LM_MESSAGE_TYPE_PRESENCE ); + lm_message_node_set_attribute ( message->node, "type", "subscribe" ); + //Send the message + if ( !lm_connection_send ( connection, message, NULL ) ) + { + lm_message_unref ( message ); + return KErrGeneral; + } + + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + // Remove a reference on message + lm_message_unref ( message ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_subscribe_contact_L passed" ) ); + return KErrNone; + } + + + + //----------------------------------------------------------------------------- +// Ctstlm::lm_authenticate_WithUnexistingJID +// Description : Tries to authenticate a user against the server. +// Arguements : +// connection : an LmConnection +// username : Username used to authenticate +// password : Password corresponding to Username +// resource : Resource used for this connection +// error : location to store error, or NULL +// Returns : TRUE if no errors were detected & authentication was +// successful, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_authenticate_WithUnexistingJID ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + //ConnectData *connect_data = NULL; + AuthData *auth_data = NULL; + //GMainLoop *main_loop = NULL; + //GMainContext *context = NULL; + + iLog->Log ( _L ( "In lm_connection_authenticate" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + g_free ( auth_data ); + return KErrGeneral; + } + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + auth_data->rCode = RC_ERROR; + + //connection = lm_connection_new_with_context ( connect_data->server,context ); + connection = lm_connection_new ( auth_data->connect_data->server ); + if ( connection == NULL ) + { + iLog->Log ( _L ( "lm_connection_new_with_context failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + SSLInit ( connection ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) connection_open_cb, + auth_data->main_loop, + NULL, + NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + + // Extract the username from the JID + gchar *username = get_user_name ( auth_data->connect_data->username ); + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + if ( !lm_connection_authenticate ( connection, + username, + auth_data->connect_data->password, + auth_data->connect_data->resource, + ( LmResultFunction ) wrong_input_auth_cb, + auth_data , + NULL, + NULL ) ) + { + auth_data->rCode = RC_ERROR; + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + g_free ( username ); + g_main_loop_unref ( auth_data->main_loop ); + free_data ( auth_data->connect_data ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( username ); + + + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode == RC_ERROR ) + { + iLog->Log ( _L ( "lm_authenticate_WithUnexistingJID failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_free ( auth_data ); + + iLog->Log ( _L ( "lm_authenticate_WithUnexistingJID passed" ) ); + + return KErrNone; +} + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_authenticate_WithBadPasswordL +// Description : Tries to authenticate a user against the server. +// Arguements : +// connection : an LmConnection +// username : Username used to authenticate +// password : Password corresponding to Username +// resource : Resource used for this connection +// error : location to store error, or NULL +// Returns : TRUE if no errors were detected & authentication was +// successful, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_authenticate_WithBadPasswordL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + //ConnectData *connect_data = NULL; + AuthData *auth_data = NULL; + //GMainLoop *main_loop = NULL; + //GMainContext *context = NULL; + + iLog->Log ( _L ( "In lm_connection_authenticate" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + g_free ( auth_data ); + return KErrGeneral; + } + + //context = g_main_context_new (); + //main_loop = g_main_loop_new ( context, FALSE ); + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + //auth_data->connect_data = connect_data; + auth_data->rCode = RC_ERROR; + //auth_data->main_loop = main_loop; + + //connection = lm_connection_new_with_context ( connect_data->server,context ); + connection = lm_connection_new ( auth_data->connect_data->server ); + if ( connection == NULL ) + { + iLog->Log ( _L ( "lm_connection_new_with_context failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + SSLInit ( connection ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) auth_from_open_cb, + auth_data, + NULL, + NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode == RC_ERROR ) + { + iLog->Log ( _L ( "lm_authenticate_WithBadPasswordL failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_free ( auth_data ); + + iLog->Log ( _L ( "lm_authenticate_WithBadPasswordL passed" ) ); + + return KErrNone; +} + + //----------------------------------------------------------------------------- +// Ctstlm::lm_authenticate_WhenConnectionIsNotOpenedL +// Description : Tries to authenticate a user against the server.handles +// a reply to the authentication in callback method +// Arguments : +// connection : an LmConnection +// username : Username used to authenticate +// password : Password corresponding to Username +// resource : Resource used for this connection +// error : location to store error, or NULL +// Returns : TRUE if no errors were detected & authentication was +// successful, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_authenticate_WhenConnectionIsNotOpenedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + + iLog->Log ( _L ( "In lm_authenticate_WhenConnectionIsNotOpenedL" ) ); + + // Read data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( connection == NULL) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + SSLInit ( connection ); + + + + // Get the username from the JID + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server without doing a connection open + if (! lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_open_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_authenticate_WhenConnectionIsNotOpened passed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + //returning kerrnone since we are testing negative scenario and this call is + //expected to return false + return KErrNone; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + + iLog->Log ( _L ( "lm_authenticate_WhenConnectionIsNotOpened when connection is not opened failed since connection must be already open" ) ); + //Returning KErrNone, since the test case could not be tested as the connection must be open + //The control will never come here for the test case :) + return KErrNone; + } + + + //----------------------------------------------------------------------------- +// Ctstlm::lm_connection_open_with_badserver server name +// Description : Tries to authenticate a user against the wrong server. +// Arguements : +// connection : an LmConnection +// username : Username used to authenticate +// password : Password corresponding to Username +// resource : Resource used for this connection +// error : location to store error, or NULL +// Returns : TRUE if no errors were detected & authentication was +// successful, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_open_with_badserverL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + //ConnectData *connect_data = NULL; + AuthData *auth_data = NULL; + //GMainLoop *main_loop = NULL; + //GMainContext *context = NULL; + + iLog->Log ( _L ( "In lm_connection_open_with_badserverL" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + g_free ( auth_data ); + return KErrGeneral; + } + + //context = g_main_context_new (); + //main_loop = g_main_loop_new ( context, FALSE ); + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + //auth_data->connect_data = connect_data; + auth_data->rCode = RC_ERROR; + //auth_data->main_loop = main_loop; + + //connection = lm_connection_new_with_context ( connect_data->server,context ); + connection = lm_connection_new ( auth_data->connect_data->server ); + if ( connection == NULL ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + SSLInit ( connection ); + + if ( !lm_connection_open ( connection, + ( LmResultFunction ) wrong_input_in_open_cb, + auth_data, + NULL, + NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" ) ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( auth_data ); + return KErrGeneral; + } + + + g_main_loop_run ( auth_data->main_loop ); + iLog->Log ( _L ( "main loop exited returned" ) ); + g_main_loop_unref ( auth_data->main_loop ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode == RC_ERROR ) + { + iLog->Log ( _L ( "lm_connection_open_with_badserver failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_free ( auth_data ); + + iLog->Log ( _L ( "lm_connection_open_with_badserver passed" ) ); + + return KErrNone; +} + + +// ---------------------------------------------------------------------------- +// Ctstlm::lm_message_node_get_child +// Description:Fetches the child from node. If child is not found as an +// immediate child of node, NULL is returned +// Arguements : +// node : an LmMessageNode +// name : name of the new child +// value : value of the new child +// Returns : the child node or NULL if child not found +// ---------------------------------------------------------------------------- +// +TInt Ctstlm::lm_message_node_get_childL ( CStifItemParser& /*aItem*/ ) +{ + LmMessage *message = NULL; + LmMessageNode *Node = NULL; + const gchar *Username = "Nokia"; + const gchar *Password = "Nokia"; + + iLog->Log ( _L ( "In lm_message_node_get_child" ) ); + + // Construct a message with type = LM_MESSAGE_TYPE_MESSAGE + iLog->Log ( _L ( "Construct a message" ) ); + + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + if ( !message ) + { + iLog->Log ( _L ( "lm_message_new failed" ) ); + return KErrGeneral; + } + + // Retrive the root node from message + iLog->Log ( _L ( "Retrive the root node from the message" ) ); + + Node = lm_message_get_node ( message ); + if ( !Node ) + { + iLog->Log ( _L ( "lm_message_get_node failed" ) ); + lm_message_unref ( message ); + return KErrGeneral; + } + + // Add childrens + iLog->Log ( _L ( "Adding childrens 'username' and 'password'" ) ); + lm_message_node_add_child ( Node, "username", Username ); + lm_message_node_add_child ( Node, "password", Password ); + + // Verify the childs + iLog->Log ( _L ( "Verify the childs" ) ); + + if ( !lm_message_node_get_child ( Node, "username" ) ) + { + iLog->Log ( _L ( "lm_message_get_child failed" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + if ( !lm_message_node_get_child ( Node, "password" ) ) + { + iLog->Log ( _L ( "lm_message_get_child failed" ) ); + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + return KErrGeneral; + } + + lm_message_unref ( message ); + lm_message_node_unref ( Node ); + + iLog->Log ( _L ( "lm_message_node_get_child passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_receive_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_receive_messages ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* /*message*/, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + + +//----------------------------------------------------------------------------- +// function_name : connection_auth_cb +// description : callback function set by lm_connection_authenticate +// in lm_connection_sendL() +// Returns : None +//----------------------------------------------------------------------------- +// +static void lm_login_cb ( LmConnection * /*connection*/, + gboolean success, + gpointer data ) + { + gboolean result = success; + AuthData *auth_data = ( AuthData * ) data; + //Result is false when the wrong input parameters were successfully handled. + if (result == FALSE) + { + auth_data->rCode = RC_OK; + } + else + { + //Result is true, when the wrong input was not handled successfully. + auth_data->rCode = RC_ERROR; + } + g_main_loop_quit ( auth_data->main_loop ); + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_login_testL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_login_testL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + //ConnectData *connect_data = NULL; + AuthData *auth_data = NULL; + + + iLog->Log ( _L ( "In lm_login_testL" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + // Read a data from the CFG file + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( auth_data->connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( auth_data->connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + auth_data->main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( auth_data->main_loop ); + free_data ( auth_data->connect_data ); + + g_free(auth_data); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( auth_data->main_loop ); + + g_main_loop_unref ( auth_data->main_loop ); + + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( auth_data->connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + auth_data->connect_data->password, + auth_data->connect_data->resource, + ( LmResultFunction ) lm_login_cb, + auth_data,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( username ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( username ); + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode == RC_ERROR ) + { + iLog->Log ( _L ( "lm_login_testL failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + g_free ( auth_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_login_testL passed" ) ); + + return KErrNone; +} + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send400charL +// Description : Asynchronous call to send a message of 400 characters +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send400charL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "In lm_connection_send" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + + gchar* msg = {"sdfsadFsdfsadfsdfsdjfksdjfl;jdsf;jsadfl;jsdvdfggdfg: \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer \ + fjsdljfsldfjsfwerpwerpweripwierweirpiwepriwperiwperipwer"}; + + lm_message_node_add_child ( message->node, "body", + msg ); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + // Remove a reference on message + lm_message_unref ( message ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; + + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_repeatedL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_repeatedL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "In lm_connection_send_repeatedL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_repeatedL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_repeatedL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_repeatedL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_repeatedL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; +} +//-------------------------------------------------------------------------------- +// function_name : handle_add_contact +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_add_contact ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_SET: + { + /* + + + + Servants + + + + */ + q_node = lm_message_node_get_child (reply->node, "query"); + if (q_node) + { + item_node = lm_message_node_get_child (q_node, "item"); + if(item_node) + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(item_node,"jid"); + } + + } + + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + + + */ + //return NULL; + LmMessageNode* error_node=NULL; + LmMessageNode* error_node_child=NULL; + error_node = lm_message_node_get_child (reply->node, "error"); + if(error_node) + { + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + error_node_child = lm_message_node_get_child (error_node, "item-not-found"); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_add_contactL +// Description : Asynchronous call to add a new contact +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_add_contactL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode *q_node,*item_node; + LmMessageHandler* handler = NULL; + + iLog->Log ( _L ( "In lm_add_contactL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /***********fetch contact list********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node,"xmlns", "jabber:iq:roster",NULL); + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + // Send message to the server + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /****send own presence********/ + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + gboolean result = lm_connection_send ( connection, message, NULL ); + lm_message_unref ( message ); + + /*********Send request to add a contact**********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient ); + //If we specify the name we cannot add the contact, maybe the name has to be unique. + /*lm_message_node_set_attribute ( item_node, "name", "harsh_rakesh" ); + if ( group ) + { + lm_message_node_add_child ( item, "group", group ); + }*/ + + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + // Send subscription request to the server + message = lm_message_new_with_sub_type ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE ); + result = lm_connection_send ( connection, message, NULL ) ; + // Remove a reference on message + lm_message_unref ( message ); + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_add_contactL passed" ) ); + + return KErrNone; +} +//----------------------------------------------------------------------------- +// Ctstlm::lm_remove_contactL +// Description : Asynchronous call to add a new contact +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_remove_contactL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode *q_node,*item_node; + LmMessageHandler* handler = NULL; + TBool result = EFalse; + + iLog->Log ( _L ( "In lm_remove_contactL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /***********fetch contact list********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node,"xmlns", "jabber:iq:roster",NULL); + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + // Send message to the server + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /*********Send request to ADD a contact**********************/ + //If we specify the name we cannot add the contact, maybe the name has to be unique. + /*lm_message_node_set_attribute ( item_node, "name", "harsh_rakesh" ); + if ( group ) + { + lm_message_node_add_child ( item, "group", group ); + } + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient ); + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + // Send subscription request to the server + message = lm_message_new_with_sub_type ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE ); + result = lm_connection_send ( connection, message, NULL ) ; + lm_message_unref ( message ); + + /*********Send request to REMOVE a contact**********************/ + /* + + + + + + */ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient ); + lm_message_node_set_attribute ( item_node, "subscription", "remove" ); + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_remove_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /***********FETCH contact list********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node,"xmlns", "jabber:iq:roster",NULL); + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + // Send message to the server + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /*********Send request to ADD a contact**********************/ + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient); + + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + // Send subscription request to the server + message = lm_message_new_with_sub_type ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE ); + result = lm_connection_send ( connection, message, NULL ) ; + // Remove a reference on message + lm_message_unref ( message ); + + /***********FETCH contact list********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node,"xmlns", "jabber:iq:roster",NULL); + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + // Send message to the server + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /*********Send request to REMOVE a contact**********************/ + /* + + + + + + */ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient ); + lm_message_node_set_attribute ( item_node, "subscription", "remove" ); + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_remove_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /***********FETCH contact list********************/ + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node,"xmlns", "jabber:iq:roster",NULL); + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + // Send message to the server + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + /*********Send request to ADD a contact**********************/ + //If we specify the name we cannot add the contact, maybe the name has to be unique. + /*lm_message_node_set_attribute ( item_node, "name", "harsh_rakesh" ); + if ( group ) + { + lm_message_node_add_child ( item, "group", group ); + } + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + item_node = lm_message_node_add_child ( q_node, "item", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:roster" ); + lm_message_node_set_attribute ( item_node, "jid", connect_data->msg_data->recipient ); + // Send message to the server + handler = lm_message_handler_new ( handle_add_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + // Send subscription request to the server + message = lm_message_new_with_sub_type ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_SUBSCRIBE ); + result = lm_connection_send ( connection, message, NULL ) ; + lm_message_unref ( message ); + + /***********cleanup*****************/ + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_remove_contactL passed" ) ); + + return KErrNone; +} +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_receiveL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send and receive +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_receiveL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessage *messagetoself = NULL; + LmMessageHandler *handler = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "In lm_connection_send" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + //------------------------------------------------------------------------ + //Send own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + + gboolean result = lm_connection_send ( connection, message, NULL ); + + //------------------------------------------------------------------------ + // + // Register a handler to recieve msgs + // + main_loop = g_main_loop_new ( NULL, FALSE ); + handler = lm_message_handler_new ( + (LmHandleMessageFunction)handle_messages, + main_loop, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_FIRST ); + + // Construct a message for sending to self + messagetoself = lm_message_new ( connect_data->username, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, messagetoself, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( messagetoself ); + lm_message_unref ( message ); + g_main_loop_unref ( main_loop ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + return KErrGeneral; + } + // Wait for the message sent to self + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_handler_unref(handler); + // Remove a reference on message + lm_message_unref ( message ); + lm_message_unref ( messagetoself ); + + //------------------------------------------------------------------------ + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; +} + + + +//----------------------------------------------------------------------------- +// funnction_name : connection_open_cancel_cb +// description : callback function called by lm_connection_open +// Returns : None +//----------------------------------------------------------------------------- +// +static void +connection_open_cancel_cb ( LmConnection * /*connection*/, + gboolean success /*success*/, + gpointer data ) + { + + gboolean result = success ; + GMainLoop *main_loop = ( GMainLoop * ) data; + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_cancel_openL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_cancel_openL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + + iLog->Log ( _L ( "In lm_connection_cancel_openL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cancel_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + if(!lm_connection_is_open(connection)) + { + lm_connection_cancel_open(connection); + //lm_connection_unref(connection); + } + + //g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_cancel_openL passed" ) ); + + return KErrNone; + } + +//-------------------------------------------------------------------------------- +// function_name : handle_get_privacy_lists +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_get_privacy_lists ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + /* + + + + + + + + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* list_name1,*list_name2,*list_name3,*list_name4; + q_node = lm_message_node_get_child (reply->node, "query"); + item_node = lm_message_node_get_child (q_node, "list"); + list_name1 = lm_message_node_get_attribute(item_node,"name"); + + item_node = lm_message_node_get_child(q_node, "list"); + list_name2 = lm_message_node_get_attribute(item_node,"name"); + + item_node = lm_message_node_get_child (q_node, "active"); + if(item_node!=NULL) + list_name3 = lm_message_node_get_attribute(item_node,"name"); + + item_node = lm_message_node_get_child (q_node, "default"); + if(item_node!=NULL) + list_name4 = lm_message_node_get_attribute(item_node,"name"); + + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + OR + + + + */ + const char* error_type; + q_node = lm_message_node_get_child (reply->node, "query"); + item_node = lm_message_node_get_child (q_node, "error"); + error_type = lm_message_node_get_attribute(item_node,"type"); + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + + if (!q_node) + { + //return NULL; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_get_privacy_listsL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_get_privacy_listsL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_get_privacy_listsL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_get_privacy_listsL passed" ) ); + + return KErrNone; +} + + +//-------------------------------------------------------------------------------- +// function_name : handle_set_privacy_lists +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_set_privacy_lists ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + /* + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + */ + if (q_node) + { + LmMessageNode* error_node = NULL; + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_privacy_listsL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_privacy_listsL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_privacy_listsL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + + + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "deny" ); + lm_message_node_set_attribute ( item_node2, "order", "3" ); + + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "active" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "deny" ); + lm_message_node_set_attribute ( item_node2, "order", "4" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_privacy_listsL passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_send_image_cb +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_send_image_cb ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + SendStreamData *stream_data = ( SendStreamData * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + ... + + + + */ + + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + q_node = lm_message_node_get_child (reply->node, "error"); + if (q_node) + { + const char* error_code; + error_code = lm_message_node_get_attribute(q_node,"code"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + if(item_node==NULL) + { + item_node = lm_message_node_get_child (q_node, "remote-server-timeout"); + } + } + + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( stream_data->main_loop ) + { + g_main_loop_quit ( stream_data->main_loop ); + } + lm_message_unref(stream_data->message); + lm_message_handler_unref(stream_data->handler); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//-------------------------------------------------------------------------------- +// function_name : handle_send_image_stream_msg_open_cb +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_send_image_stream_msg_open_cb ( LmMessageHandler* /*handler*/, + LmConnection* connection, + LmMessage* reply, + gpointer user_data ) + { + SendStreamData *stream_data = ( SendStreamData * )user_data; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode *item_node1 = NULL; + LmMessageNode *item_node2 = NULL; + LmMessageNode* item_node = NULL; + LmMessage * message = NULL; + LmMessageHandler* handler = NULL; + type = lm_message_get_sub_type (reply); + /* + //success response + + + //error response + + + + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(q_node,"id"); + + /****************************************************/ + // send bytes in message + /* + + + qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ + WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu + IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P + AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH + kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA + + + + + + + */ + message = lm_message_new ( NULL, LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_set_attribute ( message->node, "to", "donna.prima@gmail.com" ); + q_node = lm_message_node_add_child ( message->node, "data", + "qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ \ + WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu \ + IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P \ + AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH \ + kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA" ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/ibb" ); + lm_message_node_set_attribute ( q_node, "sid", "mySID" ); + lm_message_node_set_attribute ( q_node, "seq", "0" ); + + q_node = lm_message_node_add_child ( message->node, "amp", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/amp" ); + item_node1 = lm_message_node_add_child ( q_node, "rule", NULL ); + lm_message_node_set_attribute ( item_node1, "condition", "deliver" ); + lm_message_node_set_attribute ( item_node1, "value", "stored" ); + lm_message_node_set_attribute ( item_node1, "action", "error" ); + item_node2 = lm_message_node_add_child ( q_node, "rule", NULL ); + lm_message_node_set_attribute ( item_node1, "condition", "match-resource" ); + lm_message_node_set_attribute ( item_node1, "value", "exact" ); + lm_message_node_set_attribute ( item_node1, "action", "error" ); + + stream_data->message = message; + + // Send message to the server + handler = lm_message_handler_new ( handle_send_image_cb, stream_data, NULL ); + + stream_data->handler = handler; + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + //lm_connection_close ( connection, NULL ); + //lm_connection_unref ( connection ); + lm_message_unref ( stream_data->message ); + lm_message_handler_unref(stream_data->handler); + if ( stream_data->main_loop) + { + g_main_loop_quit ( stream_data->main_loop ); + } + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + /****************************************************/ + break; + } + + case LM_MESSAGE_SUB_TYPE_ERROR: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + q_node = lm_message_node_get_child (reply->node, "error"); + if (q_node) + { + const char* error_code; + error_code = lm_message_node_get_attribute(q_node,"code"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + } + if ( stream_data->main_loop) + { + g_main_loop_quit ( stream_data->main_loop ); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_image_bytestream_msgL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_image_bytestream_msgL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + SendStreamData* stream_data = NULL; + iLog->Log ( _L ( "In lm_connection_send_imageL" ) ); + + stream_data = g_new0 ( SendStreamData, 1 ); + if (! stream_data ) + { + return KErrGeneral; + } + if ( read_data ( stream_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( stream_data->connect_data ); + g_free ( stream_data ); + return KErrGeneral; + } + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + stream_data->rCode = RC_ERROR; + + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( stream_data->connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( stream_data->connect_data ); + g_free(stream_data); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, stream_data->connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, stream_data->connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + stream_data->main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( stream_data->main_loop ); + free_data ( stream_data->connect_data ); + g_free(stream_data); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + + + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( stream_data->connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + stream_data->connect_data->password, + stream_data->connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + stream_data->main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( stream_data->connect_data ); + g_main_loop_unref ( stream_data->main_loop ); + g_free(stream_data); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + g_free ( username ); + + /**************************************/ + //Opening a byte stream + /* + + + + */ + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + lm_message_node_set_attribute ( message->node, "to", "donna.prima@gmail.com" ); + q_node = lm_message_node_add_child ( message->node, "open", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/ibb" ); + lm_message_node_set_attribute ( q_node, "sid", "mySID" ); + lm_message_node_set_attribute ( q_node, "block-size", "4096" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_send_image_stream_msg_open_cb, stream_data, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( stream_data->connect_data ); + g_main_loop_unref ( stream_data->main_loop ); + g_free(stream_data); + return KErrGeneral; + } + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + /***************************************/ + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send_imageL passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_send_image_iq_cb +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_send_image_iq_cb ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + SendStreamData* stream_data = ( SendStreamData * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + ... + + + + + */ + + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + q_node = lm_message_node_get_child (reply->node, "error"); + if (q_node) + { + const char* error_code; + error_code = lm_message_node_get_attribute(q_node,"code"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + if(item_node==NULL) + { + item_node = lm_message_node_get_child (q_node, "remote-server-timeout"); + } + } + + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( stream_data->main_loop ) + { + g_main_loop_quit ( stream_data->main_loop ); + } + lm_message_unref(stream_data->message); + lm_message_handler_unref(stream_data->handler); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//-------------------------------------------------------------------------------- +// function_name : handle_send_image_stream_iq_open_cb +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_send_image_stream_iq_open_cb ( LmMessageHandler* /*handler*/, + LmConnection* connection, + LmMessage* reply, + gpointer user_data ) + { + SendStreamData *stream_data = ( SendStreamData * )user_data; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode* item_node = NULL; + LmMessage * message = NULL; + LmMessageHandler* handler = NULL; + type = lm_message_get_sub_type (reply); + /* + //success response + + + //error response + + + + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(q_node,"id"); + + /****************************************************/ + // send bytes in message + /* + + + qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ + WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu + IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P + AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH + kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA + + + */ + message = lm_message_new_with_sub_type( NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + lm_message_node_set_attribute ( message->node, "to", "donna.prima@gmail.com" ); + q_node = lm_message_node_add_child ( message->node, "data", + "qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ \ + WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu \ + IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P \ + AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH \ + kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA" ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/ibb" ); + lm_message_node_set_attribute ( q_node, "sid", "mySID" ); + lm_message_node_set_attribute ( q_node, "seq", "0" ); + stream_data->message = message; + + // Send message to the server + handler = lm_message_handler_new ( handle_send_image_iq_cb, stream_data, NULL ); + stream_data->handler = handler; + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + lm_message_unref ( stream_data->message ); + lm_message_handler_unref(stream_data->handler); + if ( stream_data->main_loop) + { + g_main_loop_quit ( stream_data->main_loop ); + } + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + /****************************************************/ + break; + } + + case LM_MESSAGE_SUB_TYPE_ERROR: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + q_node = lm_message_node_get_child (reply->node, "error"); + if (q_node) + { + const char* error_code; + error_code = lm_message_node_get_attribute(q_node,"code"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + } + if ( stream_data->main_loop) + { + g_main_loop_quit ( stream_data->main_loop ); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_image_bytestream_iqL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_image_bytestream_iqL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node= NULL; + LmMessageHandler *handler = NULL; + SendStreamData* stream_data = NULL; + iLog->Log ( _L ( "In lm_connection_send_imageL" ) ); + + stream_data = g_new0 ( SendStreamData, 1 ); + if (! stream_data ) + { + return KErrGeneral; + } + if ( read_data ( stream_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( stream_data->connect_data ); + g_free ( stream_data ); + return KErrGeneral; + } + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + stream_data->rCode = RC_ERROR; + + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( stream_data->connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( stream_data->connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, stream_data->connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, stream_data->connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + stream_data->main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( stream_data->main_loop ); + free_data ( stream_data->connect_data ); + g_free(stream_data); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( stream_data->connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + stream_data->connect_data->password, + stream_data->connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + stream_data->main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( stream_data->connect_data ); + g_main_loop_unref ( stream_data->main_loop ); + g_free(stream_data); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + g_free ( username ); + /**************************************/ + //Opening a byte stream + /* + + + + */ + stream_data->main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + lm_message_node_set_attribute ( message->node, "to", "donna.prima@gmail.com" ); + q_node = lm_message_node_add_child ( message->node, "open", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/ibb" ); + lm_message_node_set_attribute ( q_node, "sid", "mySID" ); + lm_message_node_set_attribute ( q_node, "block-size", "4096" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_send_image_stream_iq_open_cb, stream_data, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( stream_data->connect_data ); + g_free(stream_data); + g_main_loop_unref ( stream_data->main_loop ); + return KErrGeneral; + } + g_main_loop_run ( stream_data->main_loop ); + g_main_loop_unref ( stream_data->main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + /****************************************************/ + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( stream_data->connect_data ); + g_free(stream_data); + // Message sending passed + iLog->Log ( _L ( "lm_connection_send_imageL passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_send_multiple_connL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_send_multiple_connL ( CStifItemParser& aItem ) + { + LmConnection *connection1 = NULL; + LmConnection *connection2 = NULL; + ConnectData *connect_data1 = NULL; + LmMessage *message; + iLog->Log ( _L ( "In lm_connection_send_multiple_connL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data1, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data1 ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection1 = lm_connection_new ( connect_data1->server ); + connection2 = lm_connection_new ( connect_data1->server ); + + + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection1 || !connection2 ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data1 ); + //free_data ( connect_data2 ); + return KErrGeneral; + } + + // Set the gtalk's SSL port and Set the JID + lm_connection_set_port ( connection1, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection1, connect_data1->username ); + + // Set the gtalk's SSL port and Set the JID + lm_connection_set_port ( connection2, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection2, connect_data1->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection1, connect_data1->proxy_data ); + SetProxy ( connection2, connect_data1->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection1 ); + SSLInit ( connection2 ); + /********************************************************/ + //CONNECTION1 + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection1, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection1 ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data1 ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data1->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection1, + username, + connect_data1->password, + connect_data1->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + free_data ( connect_data1 ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /****************************************************/ + //CONNECTION1 MSG + // Construct a message + message = lm_message_new ( connect_data1->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data1->msg_data->message); + // Send message to the server + if ( !lm_connection_send ( connection1, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + lm_connection_unref ( connection2 ); + lm_message_unref ( message ); + free_data ( connect_data1 ); + return KErrGeneral; + } + // Remove a reference on message + lm_message_unref ( message ); + + /***********************************************/ + //CONNECTION2 + main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection2, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + lm_connection_unref ( connection2 ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data1 ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + username = get_user_name ( connect_data1->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection2, + username, + connect_data1->password, + /*connect_data2->resource*/ + "RSC1234", + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + lm_connection_close ( connection2, NULL ); + lm_connection_unref ( connection2 ); + free_data ( connect_data1 ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + /***********************************************/ + // CONNECTION2 MSG + // Construct a message + message = lm_message_new ( connect_data1->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data1->msg_data->message); + // Send message to the server + if ( !lm_connection_send ( connection2, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection2, NULL ); + lm_connection_unref ( connection2 ); + lm_message_unref ( message ); + free_data ( connect_data1); + return KErrGeneral; + } + // Remove a reference on message + lm_message_unref ( message ); + + /**********************************************/ + // Close the connection + lm_connection_close ( connection1, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection1 ); + free_data ( connect_data1 ); + + // Close the connection + lm_connection_close ( connection2, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection2 ); + + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send_multiple_connL passed" ) ); + + return KErrNone; +} +//-------------------------------------------------------------------------------- +// function_name : handle_block_contact +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_block_contact ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + /* + + */ + /* + + + + + + + + + + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + break; + case LM_MESSAGE_SUB_TYPE_ERROR: + //return NULL; + break; + // default: + // g_assert_not_reached (); + // break; + } + + // q_node = lm_message_node_get_child (reply->node, "query"); + + if (!q_node) + { + //return NULL; + } + + //item_node = lm_message_node_get_child (q_node, "id"); + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_block_contactL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_block_contactL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node = NULL; + LmMessageNode* item_node1 = NULL; + LmMessageNode* item_node2 = NULL; + LmMessageNode* item_node3 = NULL; + + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_block_contactL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + /**********************************/ + /* + + + + [] + [] + [] + [] + + + + */ + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "deny" ); + lm_message_node_set_attribute ( item_node2, "order", "1" ); + item_node3 = lm_message_node_add_child ( item_node2, "presence-in", NULL ); + item_node3 = lm_message_node_add_child ( item_node2, "message", NULL ); + + + // Send message to the server + handler = lm_message_handler_new ( handle_block_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + /**********************************/ + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_get_one_privacy_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + /************************************/ + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_block_contactL passed" ) ); + + return KErrNone; +} +//-------------------------------------------------------------------------------- +// function_name : handle_unblock_contact +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_unblock_contact ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node,*item_node; + type = lm_message_get_sub_type (reply); + /* + + */ + /* + + + + + + + + + + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + break; + case LM_MESSAGE_SUB_TYPE_ERROR: + //return NULL; + break; + // default: + // g_assert_not_reached (); + // break; + } + + // q_node = lm_message_node_get_child (reply->node, "query"); + + if (!q_node) + { + //return NULL; + } + + //item_node = lm_message_node_get_child (q_node, "id"); + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_unblock_contactL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_unblock_contactL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node = NULL; + LmMessageNode* item_node1 = NULL; + LmMessageNode* item_node2 = NULL; + LmMessageNode* item_node3 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_unblock_contactL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /**********************************/ + // Construct a message with type=LM_MESSAGE_TYPE_IQ + main_loop = g_main_loop_new ( NULL, FALSE ); + + /* + + + + [] + [] + [] + [] + + + + */ + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "allow" ); + lm_message_node_set_attribute ( item_node2, "order", "1" ); + item_node3 = lm_message_node_add_child ( item_node2, "presence-in", NULL ); + item_node3 = lm_message_node_add_child ( item_node2, "message", NULL ); + + // Send message to the server + handler = lm_message_handler_new ( handle_unblock_contact, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_connection_unblock_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + /**********************************/ + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_get_one_privacy_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + /************************************/ + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_unblock_contactL passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_set_active_list +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_set_active_list ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *error_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + /* + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* id; + id = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + + */ + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + break; + } + // default: + // g_assert_not_reached (); + // break; + } + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_active_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_active_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_active_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "active", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_active_list, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_active_listL passed" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_unexist_active_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_unexist_active_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_unexist_active_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "active", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "publicunexist" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_active_list, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_unexist_active_listL passed" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_decline_active_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_decline_active_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_decline_active_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "active", NULL ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_active_list, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_connection_set_decline_active_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_decline_active_listL passed" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_get_one_privacy_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_get_one_privacy_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_get_one_privacy_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_get_one_privacy_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_get_one_privacy_listL passed" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_one_privacy_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_one_privacy_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_one_privacy_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "deny" ); + lm_message_node_set_attribute ( item_node2, "order", "3" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_connection_set_one_privacy_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_one_privacy_listL passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_create_one_privacy_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_create_one_privacy_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_create_one_privacy_listL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "publicnewlist" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "allow" ); + lm_message_node_set_attribute ( item_node2, "order", "10" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_connection_create_one_privacy_listL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + /*****************************/ + //Now retrieve all the privacy lists and see if it is created + // Construct a message with type=LM_MESSAGE_TYPE_IQ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + /*******************************/ + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_create_one_privacy_listL passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_get_many_privacy_lists +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_get_many_privacy_lists ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *error_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + + /* */ + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* id; + id = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + */ + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + break; + } + // default: + // g_assert_not_reached (); + // break; + } + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_get_many_privacy_list_from_listnameL +// Description : Asynchronous call to get more than one privacy list details by +// specifying the name. The server should return error, since we +// can only retrieve info of one list at a time +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_get_many_privacy_list_from_listnameL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2, *item_node3 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_get_many_privacy_list_from_listname" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "public" ); + item_node2 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node2, "name", "private" ); + item_node3 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node3, "name", "default" ); + + + // Send message to the server + handler = lm_message_handler_new ( handle_get_many_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_get_many_privacy_list_from_listname failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_get_many_privacy_list_from_listname passed" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_get_one_unexist_privacy_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_get_one_unexist_privacy_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_get_one_unexist_privacy_list" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node, "name", "publicunexist" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_get_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_get_one_unexist_privacy_list failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_get_one_unexist_privacy_list passed" ) ); + return KErrNone; +} + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_connection_set_one_unexist_privacy_listL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_connection_set_one_unexist_privacy_listL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode* q_node, *item_node1, *item_node2 = NULL; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "In lm_connection_set_one_unexist_privacy_list" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + +// Construct a message with type=LM_MESSAGE_TYPE_IQ + /* + + + + + + + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "jabber:iq:privacy" ); + item_node1 = lm_message_node_add_child ( q_node, "list", NULL ); + lm_message_node_set_attribute ( item_node1, "name", "publicunexist" ); + item_node2 = lm_message_node_add_child ( item_node1, "item", NULL ); + lm_message_node_set_attribute ( item_node2, "type", "jid" ); + lm_message_node_set_attribute ( item_node2, "value", "rakesh_harsh@chat.gizmoproject.com" ); + lm_message_node_set_attribute ( item_node2, "action", "deny" ); + lm_message_node_set_attribute ( item_node2, "order", "3" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_set_privacy_lists, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_connection_set_one_unexist_privacy_list passed" ) ); + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_service_discovery +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_service_discovery ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + /* + + + ... + + ... + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + */ + if (reply->node) + { + LmMessageNode* error_node = NULL; + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + item_node = lm_message_node_get_child (reply->node, "feature-not-implemented"); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_service_discoveryL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_service_discoveryL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode * q_node = NULL; + LmMessageHandler *handler = NULL; + iLog->Log ( _L ( "In lm_service_discoveryL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + /* + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (connect_data->server, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/disco#info" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_service_discovery, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_service_discoveryL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_service_discoveryL passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_service_discovery_connected_resourceL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_service_discovery_connected_resourceL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode * q_node = NULL; + LmMessageHandler *handler = NULL; + iLog->Log ( _L ( "In lm_service_discovery_connected_resourceL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + /* + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type ("testlmnokia@chat.gizmoproject.com/mytest12345rt17", + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "query", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "http://jabber.org/protocol/disco#info" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_service_discovery, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_add_contactL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_service_discovery_connected_resourceL passed" ) ); + + return KErrNone; +} + + +//-------------------------------------------------------------------------------- +// function_name : handle_simple_communications_blocking +// description : callback function to handle messages +// XEP-0191: Simple Communications Blocking +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_simple_communications_blocking ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + /* + + + ... + + ... + + + */ + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* + + + + + + */ + if (reply->node) + { + LmMessageNode* error_node = NULL; + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + item_node = lm_message_node_get_child (error_node, "feature-not-implemented"); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_simple_communications_blockingL +// Description : Asynchronous call to send a message +// XEP-0191: Simple Communications Blocking +// Not implemented by Gizmo +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_simple_communications_blockingL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode * q_node = NULL; + LmMessageHandler *handler = NULL; + iLog->Log ( _L ( "In lm_simple_communications_blockingL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + /* + + + + */ + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET ); + q_node = lm_message_node_add_child ( message->node, "blocklist", NULL ); + lm_message_node_set_attribute ( q_node, "xmlns", "urn:xmpp:blocking" ); + + // Send message to the server + handler = lm_message_handler_new ( handle_simple_communications_blocking, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply in lm_simple_communications_blockingL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_simple_communications_blockingL passed" ) ); + + return KErrNone; +} +//-------------------------------------------------------------------------------- +// function_name : handle_send_im +// description : callback function to handle messages +// XEP-0191: Simple Communications Blocking +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_send_im ( LmMessageHandler*/* handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + GMainLoop *main_loop = ( GMainLoop * )user_data; + LmMessageSubType type; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + /* //with gizmo + + Hello + + + + + */ + if (reply->node) + { + LmMessageNode* error_node = NULL; + const char* msg_error_type; + msg_error_type = lm_message_node_get_attribute(reply->node,"type"); + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + item_node = lm_message_node_get_child (error_node, "feature-not-implemented"); + if(item_node == NULL) + { + item_node = lm_message_node_get_child (error_node, "service-unavailable"); + } + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + if ( main_loop ) + { + g_main_loop_quit ( main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } +//----------------------------------------------------------------------------- +// Ctstlm::lm_send_im_with_replyL +// Description : Asynchronous call to send a message. Needs a response +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_send_im_with_replyL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageHandler *handler = NULL; + iLog->Log ( _L ( "In lm_send_im_with_replyL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + //------------------------------------------------------------------------ + //Send own presence +// message = lm_message_new_with_sub_type ( NULL, +// LM_MESSAGE_TYPE_PRESENCE, +// LM_MESSAGE_SUB_TYPE_AVAILABLE ); + + // gboolean result = lm_connection_send ( connection, message, NULL ); + // lm_message_unref ( message ); + //------------------------------------------------------------------------ + // + // Register a handler to recieve msgs + // + main_loop = g_main_loop_new ( NULL, FALSE ); + + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_send_im_with_replyL failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + lm_message_handler_unref(handler); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + handler = lm_message_handler_new ( + (LmHandleMessageFunction)handle_send_im, + main_loop, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_FIRST ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + + // Remove a reference on message + lm_message_unref ( message ); + lm_message_handler_unref(handler); + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_send_im_with_replyL passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_receive_any_messageL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send and receive +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_receive_any_messageL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageHandler *handler = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "In lm_receive_any_message" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + //------------------------------------------------------------------------ + //Send own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + + gboolean result = lm_connection_send ( connection, message, NULL ); + + //------------------------------------------------------------------------ + // + // Register a handler to recieve msgs + // + main_loop = g_main_loop_new ( NULL, FALSE ); + handler = lm_message_handler_new ( + (LmHandleMessageFunction)handle_messages, + main_loop, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_FIRST ); + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + //------------------------------------------------------------------------ + lm_message_unref(message); + lm_message_handler_unref(handler); + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; +} + +//-------------------------------------------------------------------------------- +// function_name : handle_multiple_session_messages +// description : callback function to handle messages +// Returns : LmHandlerResult +//-------------------------------------------------------------------------------- +static LmHandlerResult +handle_multiple_session_messages ( LmMessageHandler* /*handler*/, + LmConnection* /*connection*/, + LmMessage* reply, + gpointer user_data ) + { + HandleData *handle_data = ( HandleData * )user_data; + + if ( handle_data ) + { + handle_data->Test_Success = RC_OK; + LmMessageSubType type; + LmMessageNode *q_node = NULL; + LmMessageNode *item_node = NULL; + type = lm_message_get_sub_type (reply); + + switch (type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + { + const char* reply_string; + reply_string = lm_message_node_get_attribute(reply->node,"id"); + break; + } + case LM_MESSAGE_SUB_TYPE_ERROR: + { + if (q_node) + { + LmMessageNode* error_node = NULL; + error_node = lm_message_node_get_child(reply->node,"error"); + const char* error_code; + error_code = lm_message_node_get_attribute(error_node,"code"); + const char* error_type; + error_type = lm_message_node_get_attribute(error_node,"type"); + item_node = lm_message_node_get_child (q_node, "feature-not-implemented"); + } + break; + } + // default: + // g_assert_not_reached (); + // break; + } + + + g_main_loop_quit ( handle_data->main_loop ); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_login_multiple_sessionsL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send and receive +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_login_multiple_sessionsL ( CStifItemParser& aItem ) + { + LmConnection *connection1 = NULL; + LmConnection *connection2 = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageHandler *handler1 = NULL; + LmMessageHandler *handler2 = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "In lm_receive_any_message" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection1 = lm_connection_new ( connect_data->server ); + connection2 = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection1 || !connection2 ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port and Set the JID + lm_connection_set_port ( connection1, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection1, connect_data->username ); + lm_connection_set_port ( connection2, GTALK_SSL_PORT ); + lm_connection_set_jid ( connection2, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection1, connect_data->proxy_data ); + SetProxy ( connection2, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection1 ); + SSLInit ( connection2 ); + /*********************************************************/ + //Login with connection1 + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection1, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection1 ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection1, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + //Send own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + gboolean result = lm_connection_send ( connection1, message, NULL ); + + //Dont unref message here. It will be used to send agn . + //lm_message_unref(message); + + + // Register a handler to recieve msgs + main_loop = g_main_loop_new ( NULL, FALSE ); + handler1 = lm_message_handler_new ( + (LmHandleMessageFunction)handle_multiple_session_messages, + main_loop, + NULL ); + lm_connection_register_message_handler ( connection1, + handler1, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_FIRST ); + /*********************************************************/ + //Login with CONNECTION2 + GMainLoop* main_loop1 = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection2, ( LmResultFunction ) connection_open_cb, + main_loop1, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection2 ); + g_main_loop_unref ( main_loop1 ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop1 ); + g_main_loop_unref ( main_loop1 ); + main_loop1 = g_main_loop_new ( NULL, FALSE ); + // Authenticate with the server + if ( !lm_connection_authenticate ( connection2, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection2, NULL ); + lm_connection_unref ( connection2 ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop1 ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + //Send own presence + result = lm_connection_send ( connection2, message, NULL ); + lm_message_unref(message); + /*********************************************************/ + // Conn2 should have logged out. Send message should not work. + // Construct a message +// main_loop1 = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + // Send message to the server + handler2 = lm_message_handler_new ( handle_send_im, main_loop, NULL ); + if ( !lm_connection_send_with_reply ( connection1, message, handler2, NULL ) ) + { + iLog->Log ( _L ( "lm_send_im_with_replyL failed" ) ); + lm_connection_close ( connection1, NULL ); + lm_connection_unref ( connection1 ); + g_main_loop_unref ( main_loop ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_unref(message); + lm_message_handler_unref(handler2); + + /***********************************************************/ + //Run the registered main loop for logout callbacks + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + // Close the connection + lm_connection_close ( connection1, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection1 ); + + // Close the connection + lm_connection_close ( connection2, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection2 ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm::lm_change_own_presenceL +// Description : Changing own presence information +// Arguements : +// connection : +// message : +// error : +// Returns : +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_change_own_presenceL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode *show_node = NULL; + LmMessageNode *status_node = NULL; + LmMessageHandler *handler = NULL; + GMainLoop *main_loop = NULL; + + iLog->Log ( _L ( "In lm_change_own_presenceL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /* + + dnd + Wooing Juliet + Ja dvořím Juliet + + */ + + //publish own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + gboolean result = lm_connection_send ( connection, message, NULL ); + //lm_connection_send_with_reply( + // Remove a reference on message + lm_message_unref ( message ); + + //------------------------------------------------------------------------ + // + // Register a handler to recieve and update presence information + // + main_loop = g_main_loop_new ( NULL, FALSE ); + + handler = lm_message_handler_new ( + (LmHandleMessageFunction)jabber_presence_handler_cb, + main_loop, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_NORMAL ); + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_handler_unref(handler); + //------------------------------------------------------------------------ + + + + //Change presence again + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + lm_message_node_set_attributes ( message->node, "xml:lang", "en", NULL ); + show_node = lm_message_node_add_child ( message->node, "show", "busy" ); + status_node = lm_message_node_add_child ( message->node, "status", "goal goal goal" ); + result = lm_connection_send ( connection, message, NULL ); + // Remove a reference on message + lm_message_unref ( message ); + + //Change presence again + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + lm_message_node_set_attributes ( message->node, "xml:lang", "en", NULL ); + show_node = lm_message_node_add_child ( message->node, "show", "away" ); + status_node = lm_message_node_add_child ( message->node, "status", "imagine a world without nokia!" ); + result = lm_connection_send ( connection, message, NULL ); + // Remove a reference on message + lm_message_unref ( message ); + + //Change presence again + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + lm_message_node_set_attributes ( message->node, "xml:lang", "en", NULL ); + show_node = lm_message_node_add_child ( message->node, "show", "available" ); + status_node = lm_message_node_add_child ( message->node, "status", "there comes a time..." ); + result = lm_connection_send ( connection, message, NULL ); + // Remove a reference on message + lm_message_unref ( message ); + + + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_fetching_presenceL passed" ) ); + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// Ctstlm::lm_login_test_invalid_settingsL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_login_test_invalid_portL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + + iLog->Log ( _L ( "In lm_login_test_invalid_portL" ) ); + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, SSL_INVALID_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop* main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( "lm_login_test_invalid_port: Invalid settings is handled correctly" ) ); + return KErrNone; +} + +//----------------------------------------------------------------------------- +// Ctstlm:: lm_login_test_invalid_serverL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm:: lm_login_test_invalid_serverL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + + + iLog->Log ( _L ( "In lm_login_test_invalid_serverL" ) ); + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, SSL_INVALID_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop* main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + iLog->Log ( _L ( " lm_login_test_invalid_server: Invalid settings is handled correctly" ) ); + return KErrNone; +} + + +//----------------------------------------------------------------------------- +// Ctstlm::lm_memory_leak_testL +// Description : Asynchronous call to send a message +// Arguements : +// connection : an LmConnection used to send message +// message : LmMessage to send +// error : location to store error, or NULL +// Returns : Returns TRUE if no errors were detected while sending, +// FALSE otherwise +//----------------------------------------------------------------------------- +// +TInt Ctstlm::lm_memory_leak_testL ( CStifItemParser& aItem ) + { + LmConnection *connection = NULL; + //ConnectData *connect_data = NULL; + AuthData *auth_data = NULL; + + + iLog->Log ( _L ( "In lm_memory_leak_testL" ) ); + + auth_data = g_new0 ( AuthData, 1 ); + if ( !auth_data ) + { + iLog->Log ( _L ( "memory allocation failed for auth_data" ) ); + return KErrGeneral; + } + + // Read a data from the CFG file + if ( read_data ( auth_data->connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( auth_data->connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( auth_data->connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( auth_data->connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, auth_data->connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, auth_data->connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + auth_data->main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( auth_data->main_loop ); + free_data ( auth_data->connect_data ); + g_free(auth_data); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( auth_data->main_loop ); + + g_main_loop_unref ( auth_data->main_loop ); + + + auth_data->main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( auth_data->connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + auth_data->connect_data->password, + auth_data->connect_data->resource, + ( LmResultFunction ) lm_login_cb, + auth_data,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( username ); + g_free ( auth_data ); + return KErrGeneral; + } + + g_main_loop_run ( auth_data->main_loop ); + g_main_loop_unref ( auth_data->main_loop ); + g_free ( username ); + + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( auth_data->connect_data ); + + if ( auth_data->rCode == RC_ERROR ) + { + iLog->Log ( _L ( "lm_memory_leak_testL failed" ) ); + g_free ( auth_data ); + return KErrGeneral; + } + g_free ( auth_data ); + + + + return KErrNone; +} +// NFT test cases + +TInt Ctstlm::lm_nft_updating_presenceL(CStifItemParser& aItem) + { + + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode *show_node = NULL; + LmMessageNode *status_node = NULL; + LmMessageHandler *handler = NULL; + GMainLoop *main_loop = NULL; + + iLog->Log ( _L ( "In lm_nft_updating_presenceL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /* + + dnd + Wooing Juliet + Ja dvořím Juliet + + */ + + //publish own presence + //updating presence multiple time + for (TInt i =1 ;i<100 ;i++) + { + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + gboolean result = lm_connection_send ( connection, message, NULL ); + //lm_connection_send_with_reply( + // Remove a reference on message + lm_message_unref ( message ); + + //Change presence again + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + lm_message_node_set_attributes ( message->node, "xml:lang", "en", NULL ); + show_node = lm_message_node_add_child ( message->node, "show", "busy" ); + status_node = lm_message_node_add_child ( message->node, "status", "goal goal goal" ); + result = lm_connection_send ( connection, message, NULL ); + // Remove a reference on message + lm_message_unref ( message ); + + } + + + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_nft_updating_presenceL" ) ); + + return KErrNone; + + } + +TInt Ctstlm ::lm_nft_presence_notificationL(CStifItemParser& aItem) + { + + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageNode *show_node = NULL; + LmMessageNode *status_node = NULL; + LmMessageHandler *handler = NULL; + GMainLoop *main_loop = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "lm_nft_presence_notificationL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator +#ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); +#endif + + // Set the connection to use SSL + SSLInit ( connection ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + /* + + dnd + Wooing Juliet + Ja dvořím Juliet + + */ + + //publish own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + gboolean result = lm_connection_send ( connection, message, NULL ); + //lm_connection_send_with_reply( + // Remove a reference on message + lm_message_unref ( message ); + + //------------------------------------------------------------------------ + // + // Register a handler to recieve and update presence information + // + + main_loop = g_main_loop_new ( NULL, FALSE ); + handle_data = g_new0 ( HandleData, 1 ); + handle_data->main_loop=main_loop; + handle_data->count=0; + handler = lm_message_handler_new ( + (LmHandleMessageFunction)handle_100_presence_notification, + handle_data, + NULL ); + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_NORMAL ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + lm_message_handler_unref(handler); + + + + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + // Message sending passed + iLog->Log ( _L ( "lm_nft_presence_notificationL" ) ); + + return KErrNone; + + + } + + TInt Ctstlm::lm_nft_send_text_messageL(CStifItemParser& aItem) + { + + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "In lm_nft_send_text_messageL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<100 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + //free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_nft_send_text_messageL" ) ); + + return KErrNone; + + } + TInt Ctstlm::lm_nft_open_conversation_with_multipleL(CStifItemParser& aItem) + { + + + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "lm_nft_open_conversation_with_multipleL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + // Construct a message + //receipient1 + const char *receipient = "rakesh.harsh@gmail.com"; + message = lm_message_new ( receipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient1 = "rakesh.harsha@gmail.com"; + message = lm_message_new ( receipient1, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient2 = "testlm123@gmail.com"; + message = lm_message_new ( receipient2, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + + const char *receipient3 = "nokiatestlm@gmail.com"; + message = lm_message_new ( receipient3, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient4 = "testui123@gmail.com"; + message = lm_message_new ( receipient4, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient5 = "immeco10@gmail.com"; + message = lm_message_new ( receipient5, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient6 = "immeco11@gmail.com"; + message = lm_message_new ( receipient6, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient7 = "immeco11@gmail.com"; + message = lm_message_new ( receipient7, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient8 = "test.isoserver@gmail.com"; + message = lm_message_new ( receipient8, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient9 = "tele1236@gmail.com"; + message = lm_message_new ( receipient9, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + const char *receipient10 = "meco5555@gmail.com"; + message = lm_message_new ( receipient10, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + for(TInt i =0 ; i<20 ;i++) + { + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + } + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_nft_open_conversation_with_multipleL" ) ); + + return KErrNone; + + } + TInt Ctstlm::lm_nft_fetch300_contactL(CStifItemParser& aItem) + { + + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + LmMessageNode *q_node; + //LmMessageSubType type; + LmMessageHandler *handler = NULL; + + iLog->Log ( _L ( "lm_nft_fetch300_contactL" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + //Open call + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + main_loop = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction )connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + + + // Construct a message + main_loop = g_main_loop_new ( NULL, FALSE ); + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + q_node = lm_message_node_add_child (message->node, "query", NULL); + lm_message_node_set_attributes (q_node, + "xmlns", "jabber:iq:roster", + NULL); + // Send message to the server + handler = lm_message_handler_new ( handle_fetch_contactlist_messages, main_loop, NULL ); + + if ( !lm_connection_send_with_reply ( connection, message, handler, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send_with_reply failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + return KErrGeneral; + } + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_nft_fetch300_contactL" ) ); + + return KErrNone; + + } + + TInt Ctstlm::lm_nft_loginlogoutmultipletime(CStifItemParser& aItem) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message; + + iLog->Log ( _L ( "lm_nft_loginlogoutmultipletime" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + //second time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + //*main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //*username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//third time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + // gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//fourth time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + // gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//five time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//fifth time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//sixth time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//seventh time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//eight time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//ninth time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_connection_send passed" ) ); + +//tenth time + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + // *main_loop = g_main_loop_new ( NULL, FALSE ); + + iLog->Log ( _L ( "before lm_connection_open" ) ); + + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + + g_main_loop_run ( main_loop ); + + g_main_loop_unref ( main_loop ); + + + // GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + + // Get the username from the JID + //gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop1,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop1 ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop1 ); + + g_main_loop_unref ( main_loop1 ); + + + g_free ( username ); + + // Construct a message + message = lm_message_new ( connect_data->msg_data->recipient, + LM_MESSAGE_TYPE_MESSAGE ); + lm_message_node_add_child ( message->node, "body", + connect_data->msg_data->message); + + // Send message to the server + if ( !lm_connection_send ( connection, message, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_send failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + lm_message_unref ( message ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Close the connection + lm_connection_close ( connection, NULL ); + + // Remove a reference on connection + lm_connection_unref ( connection ); + + // Remove a reference on message + lm_message_unref ( message ); + + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_nft_loginlogoutmultipletime" ) ); + + + return KErrNone; +} + + TInt Ctstlm::lm_nft_receiving100_message_L(CStifItemParser& aItem) + { + LmConnection *connection = NULL; + ConnectData *connect_data = NULL; + LmMessage *message = NULL; + LmMessageHandler *handler = NULL; + HandleData *handle_data = NULL; + + iLog->Log ( _L ( "lm_nft_receiving100_message_L" ) ); + + // Read a data from the CFG file + if ( read_data ( connect_data, aItem ) != RC_OK ) + { + iLog->Log ( _L ( "read_data failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + iLog->Log ( _L ( "after read_data" ) ); + + // Open a new closed connection + connection = lm_connection_new ( connect_data->server ); + iLog->Log ( _L ( "after lm_connection_new " ) ); + if ( !connection ) + { + iLog->Log ( _L ( "lm_connection_new failed" ) ); + free_data ( connect_data ); + return KErrGeneral; + } + + // Set the gtalk's SSL port + lm_connection_set_port ( connection, GTALK_SSL_PORT ); + + // Set the JID + lm_connection_set_jid ( connection, connect_data->username ); + + // Proxy settings for Emulator + #ifdef __WINSCW__ + SetProxy ( connection, connect_data->proxy_data ); + #endif + + // Set the connection to use SSL + SSLInit ( connection ); + + GMainLoop *main_loop = g_main_loop_new ( NULL, FALSE ); + iLog->Log ( _L ( "before lm_connection_open" ) ); + if ( !lm_connection_open ( connection, ( LmResultFunction ) connection_open_cb, + main_loop, NULL, NULL ) ) + { + iLog->Log ( _L ( "lm_connection_open failed" )); + lm_connection_unref ( connection ); + g_main_loop_unref ( main_loop ); + free_data ( connect_data ); + return KErrGeneral; + } + + iLog->Log ( _L ( "after lm_connection_open" ) ); + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + + main_loop = g_main_loop_new ( NULL, FALSE ); + // Get the username from the JID + gchar *username = get_user_name ( connect_data->username ); + + // Authenticate with the server + if ( !lm_connection_authenticate ( connection, + username, + connect_data->password, + connect_data->resource, + ( LmResultFunction ) connection_auth_cb, + main_loop,NULL,NULL ) ) + { + iLog->Log ( _L ( "lm_connection_authenticate failed" ) ); + lm_connection_close ( connection, NULL ); + lm_connection_unref ( connection ); + free_data ( connect_data ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + return KErrGeneral; + } + + g_main_loop_run ( main_loop ); + g_main_loop_unref ( main_loop ); + g_free ( username ); + + //------------------------------------------------------------------------ + //Send own presence + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE ); + + gboolean result = lm_connection_send ( connection, message, NULL ); + // GMainLoop *main_loop1; + + //------------------------------------------------------------------------ + // + // Register a handler to recieve msgs + // + handle_data = g_new0 ( HandleData, 1 ); + GMainLoop *main_loop1 = g_main_loop_new ( NULL, FALSE ); + handle_data->main_loop=main_loop1; + handle_data->count=0; + handler = lm_message_handler_new ( + (LmHandleMessageFunction)handle_100_messages, + handle_data, + NULL ); + + lm_connection_register_message_handler ( connection, + handler, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_FIRST ); + + g_main_loop_run ( main_loop1 ); + g_main_loop_unref ( main_loop1 ); + //------------------------------------------------------------------------ + + lm_message_unref(message); + lm_message_handler_unref(handler); + // Close the connection + lm_connection_close ( connection, NULL ); + // Remove a reference on connection + lm_connection_unref ( connection ); + free_data ( connect_data ); + + // Message sending passed + iLog->Log ( _L ( "lm_nft_receiving100_message_L" ) ); + + return KErrNone; +} +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: constant declaration class + * + * +*/ + +#include + + +#include "../messagequeue_api/group/bld.inf" + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS \ No newline at end of file diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +/* +* ============================================================================ +* Name : msg_enums.h +* Part of : message queue library +* Version : %version: 2 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/msg_enums.h MW_LAYER_PLATFORM_EXPORT_PATH(msg_enums.h) +../inc/msgliterals.h MW_LAYER_PLATFORM_EXPORT_PATH(msgliterals.h) +../inc/msgqinternal.h MW_LAYER_PLATFORM_EXPORT_PATH(msgqinternal.h) +../inc/msgqlib.h MW_LAYER_PLATFORM_EXPORT_PATH(msgqlib.h) + + \ No newline at end of file diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/inc/msg_enums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/inc/msg_enums.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,225 @@ +/* +* ============================================================================ +* Name : msg_enums.h +* Part of : message queue library +* Version : %version: 3 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#ifndef __MSG_ENUMS_H__ +#define __MSG_ENUMS_H__ + +#include +#include +#define MAX_PARAM_LEN 1024 + + +/** +* set of resuest ids from the clients +*/ +//enum Request_Types Request_Types; +enum Request_Types + { + // login + ELogin_Request = 1, + // logout + ELogout_Request, + EServer_DisConnect_Request, + //Fetch Contact : only used when there are no contacts + EFetch_Contacts_Error, + //to send a message + ESend_Request, + //For send error + ESend_Error, + //to fetch the presence + EPresence_Request, + // to add a list + EAdd_List_Request, + // to delete a list + EDelete_List_Request, + // to rename a list + ERename_List_Request, + // to add a contact + EAdd_Contact_Request, + // to delete a contact + EDelete_Contact_Request, + //accept a local pending request + EAccept_Contact_Request, + //Reject local pending request + EReject_Contact_Request, + // to rename a contact + ERename_Conatct_Request, + //to receive message + EText_Message_Receive, + //The order here should not be changed + //The logic in code is heavily dependant + //on the order of these three enums + // to fetch the contacts from server + ECurrent_Member_Contacts, + //local pending + ELocal_Pending_Contacts, + //remote pending + ERemote_Pending_Contacts, + + //user is our client and contact is othr end + //user -> contact + //contact -> user + + //Some other contact trying to add client + ETrying_To_Add_Contact, + //User added a contact + EKnown_Contact_Added, + //User added contact and it is remote pending + ESubscribe_Remote_Pending, + //Remote pending request rejected or user removed the contact from list + ESubscribe_Removed_Or_Rejected, + //Remote pending request accepted for subscribe of contact presence + //So now the user can know the presence of contact + ESubscribe_RP_Accepted, + //Remote pending request accepted for publish of users presence + //So now the contact can know the presence of user + EPublish_RP_Accepted, + //Removed from publish list + EPublish_Removed_Or_Rejected, + // + ETrying_To_Add_Contact_Known, + // + ETrying_To_Add_Contact_Publish, + + //to update own presence + EUpdateOwnPresence, + //to update own avtar + EUpdateOwnAvtar, + //clear avatar + EClearOwnAvatar, + //presence notification + EPresenceNotification, + + //Kill the process + EKill_Process, + //Search for contacts + ESearch, + + //get the search keys + ESearch_Get_Keys, + + //Search state changed + ESearch_State_During, + + //Search state changed : Done + ESearch_State_Finished, + + EUserEndGprs, + + //Fetch the contacts + EFetchCachedContacts, + + // add if required + } ; + +/** +* message types send and recieve via queue +*/ +enum Message_Types + { + EInteger, + EString, + EChar, + EEnums + // add here if need + }; +/** +* Message header for request +*/ +typedef struct message_hdr_req message_hdr_req; + +struct message_hdr_req + { + gint message_type; //Type of the message + gchar continue_flag; + gint protocol_id;//from TRequestId + gint session_id;//from TRequestId + gint request_id;//from TRequestId + }; + +/** +* Message header for response +*/ +typedef struct message_hdr_resp message_hdr_resp; + +struct message_hdr_resp + { + //Warning : !!!!!!!!!!!!!! The order should not be changed + message_hdr_req hdr_req; + gchar continue_flag; + gint response; //success or not + gint error_type; //if not, error type + }; + + +/** +* operations state enums variables +*/ + +enum Login_State + { + // default request error + EGeneral_Err = -1, + // connected to server successfully + EConnected, + // connecting to server in progress + EConnecting, + // not connected to server or logged off + ENotConnected + + // add if required + }; + +/** +* error codes.. +*/ +enum error_codes + { + INVALID_PARAMETERES = -7000, + DBUS_CONNECTION_ERROR, + TP_CONNMGR_ERROR, + TP_CONNECTION_ERROR, + TP_HASHTABLE_ERROR, + MEM_ALLOCATION_ERROR, + NOT_CONNECTED, + CONNECTION_STATUS_ERROR, + MSG_Q_SEND_FAILED, + TP_SEARCH_CHAN_ERROR, + TP_SEARCH_IFACE_ERROR, + TP_AVATAR_IFACE_ERROR, + + ELOGIN_AUTHENTICATION, //CASE 3 FRM SPEC + ELOGIN_NONE_SPECIFIED,//CAN BE USER CANCELLING THE A/P ETC., CASE 0 FRM SPEC + ELOGIN_NETWORK_ERROR, //For the network errors + ELOGIN_AUTHORIZATION, //ALL SSL RELATED ERRORS OTHR CASES + }; + +#endif //__MSG_ENUMS_H__ diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/inc/msgliterals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/inc/msgliterals.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,73 @@ +/* +* ============================================================================ +* Name : isoliterals.h +* Part of : isolation server. +* Version : %version: 1 % +* +* Copyright © 2007-2008 Nokia. All rights reserved. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ============================================================================ +* Template version: 1.0 +*/ + + +#ifndef __MSGLITERALS_H__ +#define __MSGLITERALS_H__ + +#include + +#define REQUEST_QUEUE 1 + +#define RESPONSE_QUEUE 2 + +#define RESPONSE_DATA_QUEUE 3 + +#define MAX_SIZE_DATA 1024 + +#define MAX_MSG_Q_SIZE 10 + +#define MAX_MSG_RECEIPIENTS ( 10 + 1 ) +#define MAX_MSG_SIZE 1024 + +#define PORTSRV 443 + + +#define TIME_OUT 500 + +#define ServerAddr "talk.google.com" +#define TestId "mytest" +#define ServerStr "server" +#define ResourceStr "resource" +#define AccountStr "account" +#define PasswdStr "password" +#define PortStr "port" +#define OldsslStr "old-ssl" + +#define NewChannelStr "NewChannel" +#define StatusChangedStr "StatusChanged" + +/** + * Macro for isoserver implementation to suppress warnings + * from unused formal parameters. + */ +#define UNUSED_FORMAL_PARAM(p) (void) p + +#endif //__MSGLITERALS_H__ \ No newline at end of file diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/inc/msgqinternal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/inc/msgqinternal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,69 @@ +/** + * @file MsgQInternal.h + * Description: Internal Header file for MsgQLib + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MSGQINTERNAL_H +#define MSGQINTERNAL_H + +#include +#ifdef __cplusplus +extern "C" { +#endif + +/* data strucure used for maintaining message queues */ + +typedef struct MsgQInfo* MSGQ_INFO_PTR; + +typedef struct MsgQInfo { + MSGQ_INFO_PTR next; /* next entry in list */ + ULONG qName; /* queue name */ + int qId; /* queue id */ + int semId ; /* semaphore id */ + ULONG sendState; /* message can be sent */ + ULONG numMsgs; /* number of messages queued */ + ULONG maxNumMsgs; /* maximum number of messages queued */ + struct msqid_ds* slMqInfo_p; /* msg q info */ +}MSGQ_INFO; + + +/* Linked List used for maintaining list of all message queues created */ + +typedef struct MsgQInfoList* MSGQ_INFO_LIST_PTR; + +typedef struct MsgQInfoList { + MSGQ_INFO_LIST_PTR next; /* next entry in list */ + ULONG qName; /* queue name */ +} MSGQ_INFO_LIST; + +/* Forward Declaration of Internal Functions */ +int InstallMsqQTable(ULONG qName, int qId, int semId, int* err); +void AddToMsgQTable(ULONG qName); +int RemoveFromMsqQTable(ULONG qName, int* err); +void DeleteFromMsgQTable(ULONG qName); +MSGQ_INFO* MsgQTableLookup(ULONG qName); + +#ifdef __cplusplus +} +#endif +#endif /* MSGQINTERNAL_H */ diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/inc/msgqlib.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/inc/msgqlib.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,168 @@ +/** + * @file MsgQLib.h + * Description: Header file for MsgQLib + * Copyright (c) 2007 Nokia Corporation. +* All rights reserved. +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer.Redistributions in binary form must +* reproduce the above copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Nokia Corporation nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific prior written +* permission. +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __MSGQLIB_H__ +#define __MSGQLIB_H__ + +#include <_ansi.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* MsgQLib sizes */ +#define MAX_MSG_LEN 2048 + +/* hash table parameters - table size must be a prime number */ +#define MSGQ_TBL_SZ 101 + +/* message send states */ +#define MSG_Q_READY 0 +#define MSG_Q_CLEANING 1 + + +#define NO_WAIT 0 +#define WAIT_FOREVER 0xFFFF + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +/* errors */ +#define KMsgQLibErr 0x100 +#define KMsgQLibNoMemoryErr (KMsgQLibErr | 1) /* out of memory */ +#define KMsgQLibQIdErr (KMsgQLibErr | 2) /* queue already in use or invalid */ +#define KMsgQLibParamErr (KMsgQLibErr | 3) /* illegal parm(s)/val(s) */ +#define KMsgQLibQFlushErr (KMsgQLibErr | 4) /* queue being flushed */ +#define KMsgQLibQShortErr (KMsgQLibErr | 5) /* internal error: inconsistency between #of msgs*/ + +#define MSG_Q_FIFO 1 +#define MSG_Q_PRIORITY 2 +#define MSG_PRI_NORMAL 3 +#define MSG_PRI_URGENT 4 +#define SEM_Q_FIFO 5 +#define SEM_Q_PRIORITY 6 + +#define OK 0 +#define ERROR -1 + +typedef unsigned long ULONG ; +typedef unsigned short ushort_t; + + +/** + * + * Creates a message queue with the argument passed + * + * @param qName - queue name + * @param maxMsgs - max messages in the queue + * @param qOptions - message queue options + * MSG_Q_FIFO + * MSG_Q_PRIORITY + * @param err - error code to be returned + * + * @return Returns status and error code + */ +IMPORT_C int MsgQCreate (ULONG qName, ULONG maxMsgs, ULONG qOptions, int* err); + +/** + * + * This function deletes a message queue + * + * @param qName - queue name + * @param err - error code to be returned + * + * @return Returns status and error code + **/ +IMPORT_C int MsgQDelete (ULONG qName, int* err); + +/** + * + * This function sends a message with internal copy + * + * @param qName - queue name + * @param msg - message to send + * @param nBytes - length of message + * @param priority - message priority + * @param timeout - milliseconds to wait + * @param err - error code to be returned + * + * @return Returns status and error code + **/ + +IMPORT_C int MsgQSend (ULONG qName, char* msg, ULONG nBytes, ULONG priority, int timeout, int* err); + +/** + * + * This function receives a message with internal copy + * + * @param qName - queue name + * @param msg - buffer for received message + * @param maxNBytes - length of buffer + * @param timeout - milliseconds to wait + * @param err - error code to be returned + * + * @return Returns status and error code + **/ + +IMPORT_C int MsgQReceive (ULONG qName, char* msg, ULONG maxNBytes, int timeout, int* err); + +/** + * + * This function checks how many messages are in a queue + * + * @param qName - queue name + * @param err - error code to be returned + * + * @return Returns status and error code + **/ +IMPORT_C int MsgQCheck (ULONG qName, int* err); + +/** + * This function checks the maximum number of messages in a queue + * + * @param qName - queue name + * @param err - error code to be returned + * + * @return Returns status and error code + **/ +IMPORT_C int MsgQMaxCheck (ULONG qName, int* err); + +/** + * + * This function empties the specified queue + * + * @param qName - queue name + * @param err - error code to be returned + * + * @return Returns status and error code + **/ +IMPORT_C int MsgQClean (ULONG qName, int* err); + +#ifdef __cplusplus +} +#endif + +#endif // __MSGQLIB_H__ diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/bmarm/messagequeue_apiu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/bmarm/messagequeue_apiu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + LibEntryL__FR13CTestModuleIf @ 1 NONAME R3UNUSED ; LibEntryL(CTestModuleIf &) + diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/bwins/messagequeue_apiu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/bwins/messagequeue_apiu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * __cdecl LibEntryL(class CTestModuleIf &) + diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/conf/messagequeue_api.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/conf/messagequeue_api.cfg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +[Test] +title TestMessageQCreate +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQCreate +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMessageQSend +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQSend +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMessageQDelete +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQDelete +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMessageQReceive +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQReceive +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMessageQClean +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQClean +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMessageQCheck +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMessageQCheck +delete messagequeue_apiobj +[Endtest] + +[Test] +title TestMsgQMaxCheck +create messagequeue_api messagequeue_apiobj +messagequeue_apiobj TestMsgQMaxCheck +delete messagequeue_apiobj +[Endtest] \ No newline at end of file diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/eabi/messagequeue_apiu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/eabi/messagequeue_apiu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +EXPORTS + _Z9LibEntryLR13CTestModuleIf @ 1 NONAME + diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these + + DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + +PRJ_EXPORTS +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in +// Example: +/* + +*/ +../init/TestFramework.ini /epoc32/winscw/c/TestFramework/TestFramework.ini +../conf/messagequeue_api.cfg /epoc32/winscw/c/TestFramework/messagequeue_api.cfg + + + +PRJ_MMPFILES +//messagequeue_api.mmp +//messagequeue_api_nrm.mmp +PRJ_TESTMMPFILES +messagequeue_api.mmp + + + + +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: + + +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,89 @@ +/*TYPE TESTCLASS*/ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: MMP file for STIF Test Framework's TestScripter +* testclass test module. +* +*/ + +#include + +TARGET messagequeue_api.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E3 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +// SECUREID 0x00000000 + +//TARGETPATH ?target_path +DEFFILE messagequeue_api.def + +USERINCLUDE ../inc + + + +SOURCEPATH ../src + +SOURCE messagequeue_api.cpp +SOURCE messagequeue_apiBlocks.cpp + +//RESOURCE resource_file +//RESOURCE resource_file2 + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_BOOST_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE +OS_LAYER_LIBUTILITY_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib +LIBRARY libc.lib +LIBRARY libglib.lib +LIBRARY libm.lib +LIBRARY OpenCMessageQueueLibrary.lib +LIBRARY libdbus.lib + +LANG SC + +/* +START WINS +?wins_specific_information +END + +START MARM +?marm_specific_information +END +*/ +// Other possible keywords: + +// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes) +/* +START BITMAP ?target +TARGETPATH ?emulated_path_on_target_machine +HEADER +SOURCE ?color_depth ?source_bitmap +END +*/ +// DEFFILE ?filename +// AIF ?filename + +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api.pkg Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,70 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; +; Installation file for STIF +; + +; Languages +&EN + +; Provide value for uid +#{"STIF"},(0x00000000),1,1,0,TYPE=SA + +; Series60 product id for S60 3.0 +[0x101F7961], 0, 0, 0, {"Series60ProductID"} + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Logo +; None + +; Package signature - Optional +; None + +; Start of Package body + +; Condition blocks +; None + +; Options list +; None + +; Install files +"\epoc32\release\armv5\udeb\messagequeue_api.dll" - "!:\Sys\Bin\messagequeue_api.dll" + +;CFG FILES + "..\conf\messagequeue_api.cfg"-"C:\TestFramework\messagequeue_api.cfg" + + + +"..\init\TestFramework.ini"-"C:\TestFramework\TestFramework.ini" + + + + +; Embedded SIS +; None + +; End of Package body + +; PKG dependencies +; None + +; PKG capabilities +; None diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_DoxyFile.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_DoxyFile.py Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,239 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +# Doxyfile 1.4.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = messagequeue_api +PROJECT_NUMBER = +OUTPUT_DIRECTORY = \messagequeue_api\ +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = YES +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = \messagequeue_api\ +FILE_PATTERNS = *.h \ + *.rh \ + *.hrh +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = NO +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = YES +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = YES +RTF_OUTPUT = Doc +COMPACT_RTF = YES +RTF_HYPERLINKS = YES +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = NONSHARABLE_CLASS +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_DoxyFile.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_DoxyFile.txt Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,239 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +# Doxyfile 1.4.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = messagequeue_api +PROJECT_NUMBER = +OUTPUT_DIRECTORY = \messagequeue_api\ +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = YES +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = \messagequeue_api\ +FILE_PATTERNS = *.h \ + *.rh \ + *.hrh +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = NO +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = YES +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = YES +RTF_OUTPUT = Doc +COMPACT_RTF = YES +RTF_HYPERLINKS = YES +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = NONSHARABLE_CLASS +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_nrm.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/group/messagequeue_api_nrm.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,75 @@ +/*TYPE TESTCLASS*/ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: MMP file for STIF Test Framework's TestScripter +* testclass test module. +* +*/ + +#include + +TARGET messagequeue_api.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E3 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 +/* Remove comments and replace 0x00000000 with correct secure id */ +// SECUREID 0x00000000 + +//TARGETPATH ?target_path +DEFFILE messagequeue_api.def + +USERINCLUDE ../inc + +OS_LAYER_SYSTEMINCLUDE + +SOURCEPATH ../src + +SOURCE messagequeue_api.cpp +SOURCE messagequeue_apiBlocks.cpp + +//RESOURCE resource_file +//RESOURCE resource_file2 + +LIBRARY euser.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib + +LANG SC + +/* +START WINS +?wins_specific_information +END + +START MARM +?marm_specific_information +END +*/ +// Other possible keywords: + +// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes) +/* +START BITMAP ?target +TARGETPATH ?emulated_path_on_target_machine +HEADER +SOURCE ?color_depth ?source_bitmap +END +*/ +// DEFFILE ?filename +// AIF ?filename + +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/inc/messagequeue_api.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/inc/messagequeue_api.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: STIF testclass declaration +* +*/ + +#ifndef MESSAGEQUEUE_API_H +#define MESSAGEQUEUE_API_H + +// INCLUDES +#include +#include +#include +#include + + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def +#define TEST_CLASS_VERSION_MAJOR 0 +#define TEST_CLASS_VERSION_MINOR 0 +#define TEST_CLASS_VERSION_BUILD 0 + +// Logging path +_LIT( Kmessagequeue_apiLogPath, "\\logs\\testframework\\messagequeue_api\\" ); +// Log file +_LIT( Kmessagequeue_apiLogFile, "messagequeue_api.txt" ); +_LIT( Kmessagequeue_apiLogFileWithTitle, "messagequeue_api_[%S].txt" ); + +// FUNCTION PROTOTYPES +//?type ?function_name(?arg_list); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; +class Cmessagequeue_api; + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// CLASS DECLARATION + +/** +* Cmessagequeue_api test class for STIF Test Framework TestScripter. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +NONSHARABLE_CLASS(Cmessagequeue_api) : public CScriptBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static Cmessagequeue_api* NewL( CTestModuleIf& aTestModuleIf ); + + /** + * Destructor. + */ + virtual ~Cmessagequeue_api(); + + public: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + protected: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + protected: // Functions from base classes + + /** + * From ?base_class ?member_description + */ + //?type ?member_function(); + + private: + + /** + * C++ default constructor. + */ + Cmessagequeue_api( CTestModuleIf& aTestModuleIf ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + void Delete(); + + /** + * Test methods are listed below. + */ + + /** + * Example test method. + * @since ?Series60_version + * @param aItem Script line containing parameters. + * @return Symbian OS error code. + */ + virtual TInt TestMessageQCreate( CStifItemParser& aItem ); + virtual TInt TestMessageQSend( CStifItemParser& aItem ); + virtual TInt TestMessageQDelete( CStifItemParser& aItem ); + virtual TInt TestMessageQReceive(CStifItemParser& aItem ); + virtual TInt TestMessageQClean(CStifItemParser& aItem ); + virtual TInt TestMessageQCheck(CStifItemParser& aItem ); + virtual TInt TestMsgQMaxCheck(CStifItemParser& aItem ); + + + /** + * Method used to log version of test class + */ + void SendTestClassVersion(); + + //ADD NEW METHOD DEC HERE + //[TestMethods] - Do not remove + + public: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + protected: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + private: // Data + + // ?one_line_short_description_of_data + //?data_declaration; + + // Reserved pointer for future extension + //TAny* iReserved; + + public: // Friend classes + //?friend_class_declaration; + protected: // Friend classes + //?friend_class_declaration; + private: // Friend classes + //?friend_class_declaration; + + }; + +#endif // MESSAGEQUEUE_API_H + +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/init/TestFramework.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/init/TestFramework.ini Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,48 @@ +# +# This is STIFTestFramework initialization file +# Comment lines start with '#'-character. +# See STIF TestFramework users guide.doc for instructions + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Engine_Defaults] + +TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment', + 'TestCases' or 'FullReport' + +CreateTestReport= YES # Possible values: YES or NO + +TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFileName= TestReport + +TestReportFormat= TXT # Possible values: TXT or HTML +TestReportOutput= FILE # Possible values: FILE or RDEBUG +TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting + +[End_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Module configurations start + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\messagequeue_api.cfg +[End_Module] + +[New_Module] +ModuleName= testscripter +TestCaseFile= C:\testframework\isolationserver_manual.cfg +[End_Module] + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +[Logger_Defaults] + +[End_Logger_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# End of file diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/src/messagequeue_api.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/src/messagequeue_api.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,200 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This file contains testclass implementation. +* +*/ + +// INCLUDE FILES +#include +#include "messagequeue_api.h" +#include + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::Cmessagequeue_api +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +Cmessagequeue_api::Cmessagequeue_api( + CTestModuleIf& aTestModuleIf ): + CScriptBase( aTestModuleIf ) + { + User::After(1000000); + } + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void Cmessagequeue_api::ConstructL() + { + //Read logger settings to check whether test case name is to be + //appended to log file name. + RSettingServer settingServer; + TInt ret = settingServer.Connect(); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Struct to StifLogger settigs. + TLoggerSettings loggerSettings; + // Parse StifLogger defaults from STIF initialization file. + ret = settingServer.GetLoggerSettings(loggerSettings); + if(ret != KErrNone) + { + User::Leave(ret); + } + // Close Setting server session + settingServer.Close(); + + TFileName logFileName; + + if(loggerSettings.iAddTestCaseTitle) + { + TName title; + TestModuleIf().GetTestCaseTitleL(title); + logFileName.Format(Kmessagequeue_apiLogFileWithTitle, &title); + } + else + { + logFileName.Copy(Kmessagequeue_apiLogFile); + } + + iLog = CStifLogger::NewL( Kmessagequeue_apiLogPath, + logFileName, + CStifLogger::ETxt, + CStifLogger::EFile, + EFalse ); + + SendTestClassVersion(); + } + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +Cmessagequeue_api* Cmessagequeue_api::NewL( + CTestModuleIf& aTestModuleIf ) + { + Cmessagequeue_api* self = new (ELeave) Cmessagequeue_api( aTestModuleIf ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +Cmessagequeue_api::~Cmessagequeue_api() + { + + // Delete resources allocated from test methods + Delete(); + + // Delete logger + delete iLog; + + } + +//----------------------------------------------------------------------------- +// Cmessagequeue_api::SendTestClassVersion +// Method used to send version of test class +//----------------------------------------------------------------------------- +// +void Cmessagequeue_api::SendTestClassVersion() + { + TVersion moduleVersion; + moduleVersion.iMajor = TEST_CLASS_VERSION_MAJOR; + moduleVersion.iMinor = TEST_CLASS_VERSION_MINOR; + moduleVersion.iBuild = TEST_CLASS_VERSION_BUILD; + + TFileName moduleName; + moduleName = _L("messagequeue_api.dll"); + + TBool newVersionOfMethod = ETrue; + TestModuleIf().SendTestModuleVersion(moduleVersion, moduleName, newVersionOfMethod); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point. +// Returns: CScriptBase: New CScriptBase derived object +// ----------------------------------------------------------------------------- +// +EXPORT_C CScriptBase* LibEntryL( + CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework + { + + return ( CScriptBase* ) Cmessagequeue_api::NewL( aTestModuleIf ); + + } + + +// End of File diff -r 000000000000 -r d0f3a028347a opensrv_plat/messagequeue_api/tsrc/src/messagequeue_apiBlocks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/opensrv_plat/messagequeue_api/tsrc/src/messagequeue_apiBlocks.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,662 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This file contains testclass implementation. +* +*/ + +// [INCLUDE FILES] - do not remove +#include +#include +#include +#include +#include +#include +#include +#include +#include "messagequeue_api.h" + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ?function_name ?description. +// ?description +// Returns: ?value_1: ?description +// ?value_n: ?description_line1 +// ?description_line2 +// ----------------------------------------------------------------------------- +// +/* +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg) // ?description + { + + ?code // ?comment + + // ?comment + ?code + } +*/ + //----------------------------------------------------------------------------- +// function_name : running isolation server exe +// description : Deallocates all the data +// Returns : None +//----------------------------------------------------------------------------- + int run_isoserver() + { + // running isoserver + RProcess isosrv_launcher; + TInt lunch_err = 0; + _LIT(KProcess, "isoserver.exe"); + lunch_err = isosrv_launcher.Create( KProcess, KNullDesC ); + if ( KErrNone != lunch_err ) + { + return KErrGeneral; + + } + isosrv_launcher.Resume(); + return KErrNone; + } +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void Cmessagequeue_api::Delete() + { + + } + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::RunMethodL +// Run specified method. Contains also table of test mothods and their names. +// ----------------------------------------------------------------------------- +// +TInt Cmessagequeue_api::RunMethodL( + CStifItemParser& aItem ) + { + + static TStifFunctionInfo const KFunctions[] = + { + // Copy this line for every implemented function. + // First string is the function name used in TestScripter script file. + // Second is the actual implementation member function. + ENTRY( "TestMessageQCreate", Cmessagequeue_api::TestMessageQCreate ), + ENTRY( "TestMessageQSend", Cmessagequeue_api::TestMessageQSend ), + ENTRY( "TestMessageQDelete", Cmessagequeue_api::TestMessageQDelete ), + ENTRY( "TestMessageQReceive", Cmessagequeue_api::TestMessageQReceive ), + ENTRY( "TestMessageQClean", Cmessagequeue_api::TestMessageQClean ), + ENTRY( "TestMessageQCheck", Cmessagequeue_api::TestMessageQCheck ), + ENTRY( "TestMsgQMaxCheck", Cmessagequeue_api::TestMsgQMaxCheck ), + //ADD NEW ENTRY HERE + // [test cases entries] - Do not remove + + }; + + const TInt count = sizeof( KFunctions ) / + sizeof( TStifFunctionInfo ); + + return RunInternalL( KFunctions, count, aItem ); + + } + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::ExampleL +// Example test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmessagequeue_api::TestMessageQCreate( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + return KErrNone; + + } + + +TInt Cmessagequeue_api::TestMessageQSend( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + return KErrNone; + + } + + +TInt Cmessagequeue_api::TestMessageQDelete( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + result=MsgQDelete( REQUEST_QUEUE, &err ); + if(result) + { + iLog->Log ( _L ( "failing at message queue" ) ); + return KErrGeneral; + } + return KErrNone; + + } + +TInt Cmessagequeue_api::TestMessageQReceive( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + //create message queue for response request + result = MsgQCreate(RESPONSE_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQReceive(RESPONSE_QUEUE, rmsg, MAX_MSG_SIZE, timeout, &err); + + if (status < 0) + { + return KErrGeneral; + + } + + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + result=MsgQDelete( REQUEST_QUEUE, &err ); + if(result) + { + iLog->Log ( _L ( "failing at message queue" ) ); + return KErrGeneral; + } + return KErrNone; + + } + + +TInt Cmessagequeue_api::TestMessageQCheck( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0,r1=0 ,r2=0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + r1 = MsgQCheck(REQUEST_QUEUE,&err); + + result = MsgQClean(REQUEST_QUEUE,&err); + + r2 = MsgQCheck(REQUEST_QUEUE,&err); + + if(r1==r2) + { + iLog->Log ( _L ( "message q clean is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + result=MsgQDelete( REQUEST_QUEUE, &err ); + if(result) + { + iLog->Log ( _L ( "failing at message queue" ) ); + return KErrGeneral; + } + return KErrNone; + +} + +TInt Cmessagequeue_api::TestMessageQClean( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0,r1=0 ,r2=0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + r1 = MsgQCheck(REQUEST_QUEUE,&err); + + r1 = MsgQMaxCheck(REQUEST_QUEUE,&err); + + result = MsgQClean(REQUEST_QUEUE,&err); + + r2 = MsgQCheck(REQUEST_QUEUE,&err); + + if(r1==r2) + { + iLog->Log ( _L ( "message q clean is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + result=MsgQDelete( REQUEST_QUEUE, &err ); + if(result) + { + iLog->Log ( _L ( "failing at message queue" ) ); + return KErrGeneral; + } + return KErrNone; + +} + +TInt Cmessagequeue_api::TestMsgQMaxCheck( CStifItemParser& aItem ) + { + char smsg[MAX_MSG_SIZE]; + char rmsg[MAX_MSG_SIZE]; + int index=0; + int timeout = 100; + int nBytes; + int result = 0,r1=0 ,r2=0; + int err = 0; + int status = 0; + int run_iso; + FILE *fp; + message_hdr_req *msgHdr = NULL; + message_hdr_resp* msg_struct = NULL; + TInt return_value = 0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + //running isoserver + run_iso = run_isoserver(); + if(run_iso) + { + iLog->Log ( _L ( "running isolation server is failed" ) ); + return KErrGeneral; + } + //create message queue for send request + result = MsgQCreate(REQUEST_QUEUE, MAX_MSG_Q_SIZE , MSG_Q_FIFO, &err); + if(err) + { + iLog->Log ( _L ( "creating requet queue is failed" ) ); + return KErrGeneral; + } + + //request formation + memset( smsg, '\0', MAX_MSG_SIZE ); + + //message header use + msgHdr = ( message_hdr_req* ) malloc( sizeof( message_hdr_req ) ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + + msgHdr->message_type = ELogin_Request; + + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + /* Send Message to queueOne */ + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + + r1 = MsgQCheck(REQUEST_QUEUE,&err); + + r1 = MsgQMaxCheck(REQUEST_QUEUE,&err); + + result = MsgQClean(REQUEST_QUEUE,&err); + + r2 = MsgQCheck(REQUEST_QUEUE,&err); + + if(r1==r2) + { + iLog->Log ( _L ( "message q clean is failed" ) ); + return KErrGeneral; + } + index=0; + memset( smsg, '\0', MAX_MSG_SIZE ); + memset( rmsg, '\0', MAX_MSG_SIZE ); + memset( msgHdr, '\0', sizeof( message_hdr_req ) ); + msgHdr->message_type = EKill_Process; + memcpy( smsg, msgHdr, sizeof( message_hdr_req ) ); + index += sizeof( message_hdr_req ); + result = MsgQSend(REQUEST_QUEUE, smsg, index, MSG_PRI_NORMAL, timeout, &err); + free(msgHdr); + result=MsgQDelete( REQUEST_QUEUE, &err ); + if(result) + { + iLog->Log ( _L ( "failing at message queue" ) ); + return KErrGeneral; + } + return KErrNone; + +} + +// ----------------------------------------------------------------------------- +// Cmessagequeue_api::?member_function +// ?implementation_description +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +/* +TInt Cmessagequeue_api::?member_function( + CItemParser& aItem ) + { + + ?code + + } +*/ + +// ========================== OTHER EXPORTED FUNCTIONS ========================= +// None + +// [End of File] - Do not remove diff -r 000000000000 -r d0f3a028347a package_definition.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/package_definition.xml Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r d0f3a028347a sysdef_1_4_0.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysdef_1_4_0.dtd Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r d0f3a028347a telepathygabble/bwins/libgabble-convenienceU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/bwins/libgabble-convenienceU.DEF Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,27 @@ +EXPORTS + _gabble_connection_manager_register @ 1 NONAME + gabble_connection_get_type @ 2 NONAME + gabble_connection_manager_get_type @ 3 NONAME + gabble_debug_set_flags @ 4 NONAME + gabble_debug_set_flags_from_env @ 5 NONAME + gabble_disco_get_type @ 6 NONAME + gabble_im_channel_get_type @ 7 NONAME + gabble_im_factory_get_type @ 8 NONAME + gabble_media_channel_get_type @ 9 NONAME + gabble_media_factory_get_type @ 10 NONAME + gabble_media_session_get_type @ 11 NONAME + gabble_media_stream_get_type @ 12 NONAME + gabble_muc_channel_get_type @ 13 NONAME + gabble_muc_factory_get_type @ 14 NONAME + gabble_presence_cache_get_type @ 15 NONAME + gabble_presence_get_type @ 16 NONAME + gabble_register_get_type @ 17 NONAME + gabble_roomlist_channel_get_type @ 18 NONAME + gabble_roster_channel_get_type @ 19 NONAME + gabble_roster_get_type @ 20 NONAME + gabble_search_channel_get_type @ 21 NONAME + gabble_search_factory_get_type @ 22 NONAME + gabble_vcard_manager_get_type @ 23 NONAME + telepathy_errors_get_type @ 24 NONAME + telepathy_errors_quark @ 25 NONAME + diff -r 000000000000 -r d0f3a028347a telepathygabble/data/jabber.service --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/data/jabber.service Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.Telepathy.ConnectionManager.gabble +Exec=\\epoc32\\RELEASE\\winscw\\udeb\\tg.exe diff -r 000000000000 -r d0f3a028347a telepathygabble/data/jabber.service_hw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/data/jabber.service_hw Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.Telepathy.ConnectionManager.gabble +Exec=z:\\sys\\bin\\tg.exe diff -r 000000000000 -r d0f3a028347a telepathygabble/data/org.freedesktop.Telepathy.ConnectionManager.gabble.service --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/data/org.freedesktop.Telepathy.ConnectionManager.gabble.service Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.Telepathy.ConnectionManager.gabble +Exec=telepathy-gabble diff -r 000000000000 -r d0f3a028347a telepathygabble/data/org.freedesktop.Telepathy.ConnectionManager.gabble.service.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/data/org.freedesktop.Telepathy.ConnectionManager.gabble.service.in Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.Telepathy.ConnectionManager.gabble +Exec=@bindir@/telepathy-gabble diff -r 000000000000 -r d0f3a028347a telepathygabble/eabi/libgabble-convenienceu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/eabi/libgabble-convenienceu.def Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,27 @@ +EXPORTS + _gabble_connection_manager_register @ 1 NONAME + gabble_connection_get_type @ 2 NONAME + gabble_connection_manager_get_type @ 3 NONAME + gabble_debug_set_flags @ 4 NONAME + gabble_debug_set_flags_from_env @ 5 NONAME + gabble_disco_get_type @ 6 NONAME + gabble_im_channel_get_type @ 7 NONAME + gabble_im_factory_get_type @ 8 NONAME + gabble_media_channel_get_type @ 9 NONAME + gabble_media_factory_get_type @ 10 NONAME + gabble_media_session_get_type @ 11 NONAME + gabble_media_stream_get_type @ 12 NONAME + gabble_muc_channel_get_type @ 13 NONAME + gabble_muc_factory_get_type @ 14 NONAME + gabble_presence_cache_get_type @ 15 NONAME + gabble_presence_get_type @ 16 NONAME + gabble_register_get_type @ 17 NONAME + gabble_roomlist_channel_get_type @ 18 NONAME + gabble_roster_channel_get_type @ 19 NONAME + gabble_roster_get_type @ 20 NONAME + gabble_search_channel_get_type @ 21 NONAME + gabble_search_factory_get_type @ 22 NONAME + gabble_vcard_manager_get_type @ 23 NONAME + telepathy_errors_get_type @ 24 NONAME + telepathy_errors_quark @ 25 NONAME + diff -r 000000000000 -r d0f3a028347a telepathygabble/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/group/bld.inf Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* + * bld.inf + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ +// Project configuration file for dbus + +// Project platforms +PRJ_PLATFORMS +WINSCW ARMV5 + +#include + +// Project exports +PRJ_EXPORTS +../rom/telepathygabble.iby CORE_MW_LAYER_IBY_EXPORT_PATH(telepathygabble.iby) +../data/jabber.service /epoc32/winscw/c/data/dbus/dbus1/services/jabber.service +../data/jabber.service_hw /epoc32/winscw/c/data/dbus/dbus1/services/jabber.service_hw + + +// MMP files for project components +PRJ_MMPFILES +libgabble-convenience.mmp +telepathy-gabble.mmp + +PRJ_TESTMMPFILES diff -r 000000000000 -r d0f3a028347a telepathygabble/group/libgabble-convenience.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/group/libgabble-convenience.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,146 @@ +/* + * libgabble-convenience.mmp + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +// General properties +#include +TARGET libgabble-convenience.dll +TARGETTYPE DLL +CAPABILITY CAP_GENERAL_DLL +UID 0x1000008d 0x2000F852 + +VERSION 10.0 + +#ifndef WINSCW +// Allow global writeable static data +EPOCALLOWDLLDATA +#endif + +// Macros +MACRO SYMBIAN +MACRO HAVE_CONFIG_H +MACRO HAVE_ERRNO_H VERBOSE + +#ifdef WINSCW +MACRO EMULATOR +#endif + + +SOURCEPATH ../src + +// User include paths +USERINCLUDE ../inc +USERINCLUDE ../../loudmouth/inc + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE +// Source files +SOURCEPATH ../src + +SOURCE gabble-connection-manager-signals-marshal.c +SOURCE gabble-connection-signals-marshal.c +SOURCE gabble-register-signals-marshal.c +SOURCE gabble-im-channel-signals-marshal.c +SOURCE gabble-muc-channel-signals-marshal.c +SOURCE gabble-media-channel-signals-marshal.c +SOURCE gabble-media-session-signals-marshal.c +SOURCE gabble-media-session-enumtypes.c +SOURCE gabble-media-stream-signals-marshal.c +SOURCE gabble-presence-cache-signals-marshal.c +SOURCE gabble-roster-channel-signals-marshal.c +SOURCE gabble-roomlist-channel-signals-marshal.c +SOURCE group-mixin-signals-marshal.c +SOURCE properties-mixin-signals-marshal.c +SOURCE telepathy-errors-enumtypes.c +SOURCE text-mixin-signals-marshal.c + +SOURCE tp-channel-factory-iface-signals-marshal.c +SOURCE capabilities.c +SOURCE debug.c +SOURCE disco.c +SOURCE gabble-error.c +SOURCE gabble-connection-manager.c +SOURCE gabble-connection.c +SOURCE gabble-im-channel.c +SOURCE gabble-muc-channel.c +SOURCE gabble-media-channel.c +SOURCE gabble-media-session.c +SOURCE gabble-media-stream.c +SOURCE gabble-presence.c +SOURCE gabble-presence-cache.c +SOURCE gabble-register.c +SOURCE gabble-roster-channel.c +SOURCE gabble-roomlist-channel.c +SOURCE gheap.c +SOURCE gintset.c +SOURCE group-mixin.c +SOURCE handles.c +SOURCE handle-set.c +SOURCE jingle-info.c +SOURCE im-factory.c +SOURCE search-keys-info.c + +SOURCE search-factory.c +SOURCE gabble-search-channel.c +SOURCE search-mixin.c +SOURCE search-mixin-signals-marshal.c + +SOURCE media-factory.c +SOURCE muc-factory.c +SOURCE properties-mixin.c +SOURCE roster.c +SOURCE telepathy-errors.c +SOURCE telepathy-helpers.c +SOURCE text-mixin.c +SOURCE tp-channel-iface.c +SOURCE tp-channel-factory-iface.c +SOURCE util.c +SOURCE vcard-manager.c +SOURCE base64.c +SOURCE sha1.c + +#ifdef WINSCW +SOURCE libgabble_wsd.cpp +#endif + + +// Library dependencies +#ifdef GCCE +STATICLIBRARY libcrt0_gcce.lib +#else +STATICLIBRARY libcrt0.lib +#endif +LIBRARY libc.lib +LIBRARY libglib.lib +LIBRARY libgobject.lib +LIBRARY libdbus.lib +LIBRARY libdbus-glib.lib +LIBRARY loudmouth.lib +#ifdef WINSCW +LIBRARY euser.lib // Needed in order to use Symbian services +//wsd solution +LIBRARY ewsd.lib +#endif + diff -r 000000000000 -r d0f3a028347a telepathygabble/group/telepathy-gabble.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/group/telepathy-gabble.mmp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,85 @@ +/* + * telepathy-gabble.mmp + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + + */ +// General properties +#include +TARGET tg.exe +TARGETTYPE exe +CAPABILITY NetworkServices + +UID 0x1000008d 0x2000F853 + +VERSION 10.0 +//EPOCHEAPSIZE 4096 4194304 // min. 4KB ja max 4MB +#ifndef WINSCW +EPOCHEAPSIZE 4194304 67108864 // min. 4MB ja max 64MB +EPOCSTACKSIZE 61440 +#endif +#ifndef WINSCW +// Allow global writeable static data +EPOCALLOWDLLDATA +#endif + +// Macros +MACRO SYMBIAN +MACRO HAVE_CONFIG_H +MACRO HAVE_ERRNO_H VERBOSE + +SOURCEPATH ../src + +// User include paths +USERINCLUDE ../inc +USERINCLUDE ../../loudmouth/inc + +// System include paths + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +OS_LAYER_SSL_SYSTEMINCLUDE +OS_LAYER_STDCPP_SYSTEMINCLUDE +OS_LAYER_DBUS_SYSTEMINCLUDE + + + + +// Source files +SOURCEPATH ../src + +SOURCE gabble.c + +// Library dependencies +#ifdef GCCE +STATICLIBRARY libcrt0_gcce.lib +#else +STATICLIBRARY libcrt0.lib +#endif +LIBRARY libc.lib +LIBRARY euser.lib // Needed in order to use Symbian services +LIBRARY libglib.lib +LIBRARY libgobject.lib +LIBRARY libdbus.lib +LIBRARY libgabble-convenience.lib +LIBRARY libdbus-glib.lib + + + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/ansi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/ansi.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,42 @@ +/* + * ansi.h - Header for GabbleConnection + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __ANSI_H__ +#define __ANSI_H__ + +#define ANSI_RESET "\x1b[0m" +#define ANSI_BOLD_ON "\x1b[1m" +#define ANSI_INVERSE_ON "\x1b[7m" +#define ANSI_BOLD_OFF "\x1b[22m" +#define ANSI_FG_BLACK "\x1b[30m" +#define ANSI_FG_RED "\x1b[31m" +#define ANSI_FG_GREEN "\x1b[32m" +#define ANSI_FG_YELLOW "\x1b[33m" +#define ANSI_FG_BLUE "\x1b[34m" +#define ANSI_FG_MAGENTA "\x1b[35m" +#define ANSI_FG_CYAN "\x1b[36m" +#define ANSI_FG_WHITE "\x1b[37m" +#define ANSI_BG_RED "\x1b[41m" +#define ANSI_BG_GREEN "\x1b[42m" +#define ANSI_BG_YELLOW "\x1b[43m" +#define ANSI_BG_BLUE "\x1b[44m" +#define ANSI_BG_MAGENTA "\x1b[45m" +#define ANSI_BG_CYAN "\x1b[46m" +#define ANSI_BG_WHITE "\x1b[47m" + +#endif /* __ANSI_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/base64.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/base64.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,28 @@ +/* + * base64.h - Base 64 encoding/decoding implementation + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BASE64_H__ +#define __BASE64_H__ + +#include + +gchar *base64_encode (guint len, const gchar *str); +GString *base64_decode (const gchar *str); + +#endif /* __BASE64_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/capabilities.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/capabilities.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,81 @@ +/* + * capabilities.h - Connection.Interface.Capabilities constants and utilities + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_CAPABILITIES__H__ +#define __GABBLE_CAPABILITIES__H__ + +#include + +#include "gabble-presence.h" + +#define BUNDLE_VOICE_V1 "voice-v1" +#define BUNDLE_JINGLE_AUDIO "jingle-audio" +#define BUNDLE_JINGLE_VIDEO "jingle-video" + +typedef struct _Feature Feature; + +struct _Feature +{ + const gchar *bundle; + const gchar *ns; + GabblePresenceCapabilities caps; +}; + +/* + * capabilities_get_features + * + * Return a linked list of const Feature structs corresponding to the given + * GabblePresenceCapabilities. + */ +GSList * +capabilities_get_features (GabblePresenceCapabilities caps); + +/* + * capabilities_fill_cache + * + * Fill up the given GabblePresenceCache with known feature nodes + */ +void +capabilities_fill_cache (GabblePresenceCache *cache); + +/* + * capabilities_get_initial_caps + * + * Return the GabblePresenceCapabilities we always have + */ +GabblePresenceCapabilities +capabilities_get_initial_caps (); + +typedef GabblePresenceCapabilities (*TypeFlagsToCapsFunc) (guint typeflags); +typedef guint (*CapsToTypeFlagsFunc) (GabblePresenceCapabilities caps); + +typedef struct _CapabilityConversionData CapabilityConversionData; + +struct _CapabilityConversionData +{ + const gchar *iface; + TypeFlagsToCapsFunc tf2c_fn; + CapsToTypeFlagsFunc c2tf_fn; +}; + +extern const CapabilityConversionData capabilities_conversions[]; + +#endif /* __GABBLE_CAPABILITIES__H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/config.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,104 @@ +/* + * config.h - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* DBus services directory */ +#undef DBUS_SERVICES_DIR + +/* Enable backtrace output on crashes */ +#undef ENABLE_BACKTRACE + +/* Enable debug code */ +#undef ENABLE_DEBUG + +/* Enable handle leak debug code */ +#undef ENABLE_HANDLE_LEAK_DEBUG + +/* Define to 1 if you have the `backtrace' function. */ +#undef HAVE_BACKTRACE + +/* Define to 1 if you have the `backtrace_symbols_fd' function. */ +#undef HAVE_BACKTRACE_SYMBOLS_FD + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXECINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `signal' function. */ +#undef HAVE_SIGNAL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#define VERSION "1.0" diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/debug.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,102 @@ +/* + * debug.h - Header for GabbleConnection + * Copyright (C) 2005 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __DEBUG_H__ +#define __DEBUG_H_ + +#include "config.h" + +#include + +#include "gabble_enums.h" + + +/*#ifdef ENABLE_DEBUG bsr */ + +G_BEGIN_DECLS + +/*Moved to gabble_enums.h +typedef enum +{ + GABBLE_DEBUG_PRESENCE = 1 << 0, + GABBLE_DEBUG_GROUPS = 1 << 1, + GABBLE_DEBUG_ROSTER = 1 << 2, + GABBLE_DEBUG_DISCO = 1 << 3, + GABBLE_DEBUG_PROPERTIES = 1 << 4, + GABBLE_DEBUG_ROOMLIST = 1 << 5, + GABBLE_DEBUG_MEDIA = 1 << 6, + GABBLE_DEBUG_MUC = 1 << 7, + GABBLE_DEBUG_CONNECTION = 1 << 8, + GABBLE_DEBUG_IM = 1 << 9, + GABBLE_DEBUG_PERSIST = 1 << 10, + GABBLE_DEBUG_VCARD = 1 << 11, +} GabbleDebugFlags; +*/ + +#ifdef SYMBIAN +IMPORT_C +#endif +void gabble_debug_set_flags_from_env (); +#ifdef SYMBIAN +IMPORT_C +#endif +void gabble_debug_set_flags (GabbleDebugFlags flags); + +gboolean gabble_debug_flag_is_set (GabbleDebugFlags flag); +void gabble_debug (GabbleDebugFlags flag, const gchar *format, ...); + /* bsr G_GNUC_PRINTF (2, 3); */ +#ifdef ENABLE_DEBUG /* bsr */ +#ifdef DEBUG_FLAG + +/*#define DEBUG(format, ...) \ + gabble_debug(DEBUG_FLAG, "%s: " format, G_STRFUNC, ##__VA_ARGS__) +*/ + +#define DEBUG G_DEBUG + static inline void G_DEBUG (const gchar *format, ...) + { + gabble_debug(DEBUG_FLAG, "%s: " format, G_STRFUNC, ##__VA_ARGS__) + } + +#define DEBUGGING gabble_debug_flag_is_set(DEBUG_FLAG) + +#define NODE_DEBUG(n, s) \ +G_STMT_START { \ + gchar *debug_tmp = lm_message_node_to_string (n); \ + gabble_debug (DEBUG_FLAG, "%s: " s ":\n%s", G_STRFUNC, debug_tmp); \ + g_free (debug_tmp); \ +} G_STMT_END + +#else /* DEBUG_FLAG */ +#define DEBUG 0 +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +#else /* ENABLE_DEBUG */ + +#define DEBUG +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) + +#endif /* ENABLE_DEBUG */ + +G_END_DECLS + +#endif + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/disco.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/disco.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,137 @@ +/* + * disco.h - Headers for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ + +#ifndef __GABBLE_DISCO_H__ +#define __GABBLE_DISCO_H__ + +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" + +G_BEGIN_DECLS + +typedef enum +{ + GABBLE_DISCO_TYPE_INFO, + GABBLE_DISCO_TYPE_ITEMS +} GabbleDiscoType; + +typedef struct _GabbleDiscoClass GabbleDiscoClass; +typedef struct _GabbleDiscoRequest GabbleDiscoRequest; + +/** + * GabbleDiscoError: + * @GABBLE_DISCO_ERROR_CANCELLED: The DISCO request was cancelled + * @GABBLE_DISCO_ERROR_TIMEOUT: The DISCO request timed out + * @GABBLE_DISCO_ERROR_UNKNOWN: An unknown error occured + */ +typedef enum +{ + GABBLE_DISCO_ERROR_CANCELLED, + GABBLE_DISCO_ERROR_TIMEOUT, + GABBLE_DISCO_ERROR_UNKNOWN +} GabbleDiscoError; + +GQuark gabble_disco_error_quark (void); +#define GABBLE_DISCO_ERROR gabble_disco_error_quark () + +IMPORT_C GType gabble_disco_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_DISCO \ + (gabble_disco_get_type()) +#define GABBLE_DISCO(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_DISCO, GabbleDisco)) +#define GABBLE_DISCO_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_DISCO, GabbleDiscoClass)) +#define GABBLE_IS_DISCO(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_DISCO)) +#define GABBLE_IS_DISCO_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_DISCO)) +#define GABBLE_DISCO_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_DISCO, GabbleDiscoClass)) + +struct _GabbleDiscoClass { + GObjectClass parent_class; +}; + +struct _GabbleDisco { + GObject parent; + gpointer priv; +}; + +typedef void (*GabbleDiscoCb)(GabbleDisco *self, GabbleDiscoRequest *request, const gchar *jid, const gchar *node, LmMessageNode *query_result, GError* error, gpointer user_data); + +GabbleDisco *gabble_disco_new (GabbleConnection *); + +GabbleDiscoRequest *gabble_disco_request (GabbleDisco *self, + GabbleDiscoType type, const gchar *jid, const char *node, + GabbleDiscoCb callback, gpointer user_data, GObject *object, + GError **error); +GabbleDiscoRequest *gabble_disco_request_with_timeout (GabbleDisco *self, + GabbleDiscoType type, const gchar *jid, const char *node, + guint timeout, GabbleDiscoCb callback, gpointer user_data, + GObject *object, GError **error); + +void gabble_disco_cancel_request (GabbleDisco *, GabbleDiscoRequest *); + +/* Pipelines */ + +typedef struct _GabbleDiscoItem GabbleDiscoItem; + +struct _GabbleDiscoItem { + const gchar *jid; + const char *name; + const char *type; + const char *category; + GHashTable *features; +}; + +typedef void (*GabbleDiscoPipelineCb)(gpointer pipeline, + GabbleDiscoItem *item, + gpointer user_data); + +typedef void (*GabbleDiscoEndCb)(gpointer pipeline, + gpointer user_data); + +gpointer gabble_disco_pipeline_init (GabbleDisco *disco, + GabbleDiscoPipelineCb callback, + GabbleDiscoEndCb end_callback, + gpointer user_data); + +void gabble_disco_pipeline_run (gpointer self, const char *server); +void gabble_disco_pipeline_destroy (gpointer self); + +/* Service discovery */ + +void gabble_disco_service_discovery (GabbleDisco *disco, const char *server); +const GabbleDiscoItem * +gabble_disco_service_find (GabbleDisco *disco, + const char *type, + const char *category, + const char *feature); + +G_END_DECLS + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,697 @@ +/* + * gabble-connection-glue.h - + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_connection_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_connection_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:1) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* NONE:STRING,UINT,UINT,BOOLEAN,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:2) */ +extern void dbus_glib_marshal_gabble_connection_VOID__STRING_UINT_UINT_BOOLEAN_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_VOID__STRING_UINT_UINT_BOOLEAN_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_UINT_UINT_BOOLEAN_POINTER) (gpointer data1, + gpointer arg_1, + guint arg_2, + guint arg_3, + gboolean arg_4, + gpointer arg_5, + gpointer data2); + register GMarshalFunc_VOID__STRING_UINT_UINT_BOOLEAN_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_UINT_UINT_BOOLEAN_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_boolean (param_values + 4), + g_marshal_value_peek_pointer (param_values + 5), + data2); +} +#define dbus_glib_marshal_gabble_connection_NONE__STRING_UINT_UINT_BOOLEAN_POINTER dbus_glib_marshal_gabble_connection_VOID__STRING_UINT_UINT_BOOLEAN_POINTER + +/* BOOLEAN:BOXED,BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:3) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_BOXED_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:4) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,STRING,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:5) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_STRING_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_STRING_POINTER_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:STRING,BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:6) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_BOXED_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:7) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:8) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* NONE:UINT,BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:9) */ +extern void dbus_glib_marshal_gabble_connection_VOID__UINT_BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_VOID__UINT_BOXED_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_BOXED_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); +} +#define dbus_glib_marshal_gabble_connection_NONE__UINT_BOXED_POINTER dbus_glib_marshal_gabble_connection_VOID__UINT_BOXED_POINTER + +/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:10) */ +extern void dbus_glib_marshal_gabble_connection_VOID__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_VOID__BOXED_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} +#define dbus_glib_marshal_gabble_connection_NONE__BOXED_POINTER dbus_glib_marshal_gabble_connection_VOID__BOXED_POINTER + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:11) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.R2YJIU:12) */ +extern void dbus_glib_marshal_gabble_connection_BOOLEAN__UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_BOOLEAN__UINT_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_connection_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_connection_methods[] = { + { (GCallback) gabble_connection_connect, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_connection_disconnect, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER, 48 }, + { (GCallback) gabble_connection_get_interfaces, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 99 }, + { (GCallback) gabble_connection_get_protocol, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 167 }, + { (GCallback) gabble_connection_get_self_handle, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 232 }, + { (GCallback) gabble_connection_get_status, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 299 }, + { (GCallback) gabble_connection_hold_handles, dbus_glib_marshal_gabble_connection_NONE__UINT_BOXED_POINTER, 362 }, + { (GCallback) gabble_connection_inspect_handles, dbus_glib_marshal_gabble_connection_NONE__UINT_BOXED_POINTER, 443 }, + { (GCallback) gabble_connection_list_channels, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 541 }, + { (GCallback) gabble_connection_release_handles, dbus_glib_marshal_gabble_connection_NONE__UINT_BOXED_POINTER, 613 }, + { (GCallback) gabble_connection_request_channel, dbus_glib_marshal_gabble_connection_NONE__STRING_UINT_UINT_BOOLEAN_POINTER, 697 }, + { (GCallback) gabble_connection_request_handles, dbus_glib_marshal_gabble_connection_NONE__UINT_BOXED_POINTER, 822 }, + { (GCallback) gabble_connection_get_alias_flags, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 918 }, + { (GCallback) gabble_connection_request_aliases, dbus_glib_marshal_gabble_connection_NONE__BOXED_POINTER, 1004 }, + { (GCallback) gabble_connection_set_aliases, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER, 1106 }, + { (GCallback) gabble_connection_advertise_capabilities, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_BOXED_POINTER_POINTER, 1192 }, + { (GCallback) gabble_connection_get_capabilities, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER_POINTER, 1318 }, + { (GCallback) gabble_connection_add_status, dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_BOXED_POINTER, 1429 }, + { (GCallback) gabble_connection_clear_status, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER, 1523 }, + { (GCallback) gabble_connection_get_presence, dbus_glib_marshal_gabble_connection_NONE__BOXED_POINTER, 1594 }, + { (GCallback) gabble_connection_get_statuses, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 1707 }, + { (GCallback) gabble_connection_remove_status, dbus_glib_marshal_gabble_connection_BOOLEAN__STRING_POINTER, 1804 }, + { (GCallback) gabble_connection_request_presence, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER, 1887 }, + { (GCallback) gabble_connection_set_last_activity_time, dbus_glib_marshal_gabble_connection_BOOLEAN__UINT_POINTER, 1976 }, + { (GCallback) gabble_connection_set_status, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER, 2064 }, + { (GCallback) gabble_connection_get_properties, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_POINTER_POINTER, 2154 }, + { (GCallback) gabble_connection_list_properties, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER_POINTER, 2241 }, + { (GCallback) gabble_connection_set_properties, dbus_glib_marshal_gabble_connection_NONE__BOXED_POINTER, 2315 }, + { (GCallback) gabble_connection_set_avatar, dbus_glib_marshal_gabble_connection_BOOLEAN__BOXED_STRING_POINTER_POINTER, 2683 }, + { (GCallback) gabble_connection_clear_avatar, dbus_glib_marshal_gabble_connection_BOOLEAN__POINTER, 2790 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_connection_object_info = { + 0, + dbus_glib_gabble_connection_methods, + 33, +"org.freedesktop.Telepathy.Connection\0Connect\0S\0\0org.freedesktop.Telepathy.Connection\0Disconnect\0S\0\0org.freedesktop.Telepathy.Connection\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Connection\0GetProtocol\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Connection\0GetSelfHandle\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Connection\0GetStatus\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Connection\0HoldHandles\0A\0handle_type\0I\0u\0handles\0I\0au\0\0org.freedesktop.Telepathy.Connection\0InspectHandles\0A\0handle_type\0I\0u\0handles\0I\0au\0arg2\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Connection\0ListChannels\0S\0arg0\0O\0F\0N\0a(osuu)\0\0org.freedesktop.Telepathy.Connection\0ReleaseHandles\0A\0handle_type\0I\0u\0handles\0I\0au\0\0org.freedesktop.Telepathy.Connection\0RequestChannel\0A\0type\0I\0s\0handle_type\0I\0u\0handle\0I\0u\0suppress_handler\0I\0b\0arg4\0O\0F\0N\0o\0\0org.freedesktop.Telepathy.Connection\0RequestHandles\0A\0handle_type\0I\0u\0names\0I\0as\0arg2\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Connection.Interface.Aliasing\0GetAliasFlags\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Connection.Interface.Aliasing\0RequestAliases\0A\0contacts\0I\0au\0arg1\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Connection.Interface.Aliasing\0SetAliases\0S\0aliases\0I\0a{us}\0\0org.freedesktop.Telepathy.Connection.Interface.Capabilities\0AdvertiseCapabilities\0S\0add\0I\0a(su)\0remove\0I\0as\0arg2\0O\0F\0N\0a(su)\0\0org.freedesktop.Telepathy.Connection.Interface.Capabilities\0GetCapabilities\0S\0handles\0I\0au\0arg1\0O\0F\0N\0a(usuu)\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0AddStatus\0S\0status\0I\0s\0parms\0I\0a{sv}\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0ClearStatus\0S\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0GetPresence\0A\0contacts\0I\0au\0arg1\0O\0F\0N\0a{u(ua{sa{sv}})}\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0GetStatuses\0S\0arg0\0O\0F\0N\0a{s(ubba{ss})}\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0RemoveStatus\0S\0status\0I\0s\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0RequestPresence\0S\0contacts\0I\0au\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0SetLastActivityTime\0S\0time\0I\0u\0\0org.freedesktop.Telepathy.Connection.Interface.Presence\0SetStatus\0S\0statuses\0I\0a{sa{sv}}\0\0org.freedesktop.Telepathy.Properties\0GetProperties\0S\0properties\0I\0au\0arg1\0O\0F\0N\0a(uv)\0\0org.freedesktop.Telepathy.Properties\0ListProperties\0S\0arg0\0O\0F\0N\0a(ussu)\0\0org.freedesktop.Telepathy.Properties\0SetProperties\0A\0properties\0I\0a(uv)\0\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0GetAvatarRequirements\0S\0arg0\0O\0F\0N\0asqqqqu\0\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0GetKnownAvatarTokens\0S\0contacts\0I\0au\0arg1\0O\0F\0N\0a{us}\0\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0RequestAvatars\0S\0contact\0I\0au\0\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0SetAvatar\0S\0avatar\0I\0ay\0mime_type\0I\0s\0arg2\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0ClearAvatar\0S\0\0\0", +"org.freedesktop.Telepathy.Connection\0NewChannel\0org.freedesktop.Telepathy.Connection\0StatusChanged\0org.freedesktop.Telepathy.Connection.Interface.Aliasing\0AliasesChanged\0org.freedesktop.Telepathy.Connection.Interface.Capabilities\0CapabilitiesChanged\0org.freedesktop.Telepathy.Connection.Interface.Presence\0PresenceUpdate\0org.freedesktop.Telepathy.Properties\0PropertiesChanged\0org.freedesktop.Telepathy.Properties\0PropertyFlagsChanged\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0AvatarUpdated\0org.freedesktop.Telepathy.Connection.Interface.Avatars\0AvatarRetrieved\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection-manager-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection-manager-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,247 @@ +/* + * gabble-connection-manager-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ + +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_connection_manager_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_connection_manager_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.H9O3HT:1) */ +extern void dbus_glib_marshal_gabble_connection_manager_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_manager_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:STRING,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.H9O3HT:2) */ +extern void dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:STRING,BOXED,POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.H9O3HT:3) */ +extern void dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer arg_5, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + g_marshal_value_peek_pointer (param_values + 5), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_connection_manager_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_connection_manager_methods[] = { + { (GCallback) gabble_connection_manager_get_parameters, dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_POINTER_POINTER, 0 }, + { (GCallback) gabble_connection_manager_list_protocols, dbus_glib_marshal_gabble_connection_manager_BOOLEAN__POINTER_POINTER, 90 }, + { (GCallback) gabble_connection_manager_request_connection, dbus_glib_marshal_gabble_connection_manager_BOOLEAN__STRING_BOXED_POINTER_POINTER_POINTER, 165 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_connection_manager_object_info = { + 0, + dbus_glib_gabble_connection_manager_methods, + 3, +"org.freedesktop.Telepathy.ConnectionManager\0GetParameters\0S\0proto\0I\0s\0arg1\0O\0F\0N\0a(susv)\0\0org.freedesktop.Telepathy.ConnectionManager\0ListProtocols\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.ConnectionManager\0RequestConnection\0S\0proto\0I\0s\0parameters\0I\0a{sv}\0arg2\0O\0F\0N\0s\0arg3\0O\0F\0N\0o\0\0\0", +"org.freedesktop.Telepathy.ConnectionManager\0NewConnection\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection-manager-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection-manager-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* + * gabble-connection-manager-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_connection_manager_marshal_MARSHAL_H__ +#define __gabble_connection_manager_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:STRING,STRING,STRING (gabble-connection-manager-signals-marshal.list:1) */ +extern void gabble_connection_manager_marshal_VOID__STRING_STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_connection_manager_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection-manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection-manager.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,171 @@ +/* + * gabble-connection-manager.h - Header for GabbleConnectionManager + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_CONNECTION_MANAGER_H__ +#define __GABBLE_CONNECTION_MANAGER_H__ + +#include +//vinod +#include +#include +#include +#include +#include + +#include "gabble-connection.h" +#include "telepathy-constants.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +//end +#define GABBLE_CONN_MGR_BUS_NAME "org.freedesktop.Telepathy.ConnectionManager.gabble" +#define GABBLE_CONN_MGR_OBJECT_PATH "/org/freedesktop/Telepathy/ConnectionManager/gabble" + +G_BEGIN_DECLS + +typedef struct _GabbleConnectionManager GabbleConnectionManager; +typedef struct _GabbleConnectionManagerClass GabbleConnectionManagerClass; + +struct _GabbleConnectionManagerClass { + GObjectClass parent_class; +}; + +struct _GabbleConnectionManager { + GObject parent; + + gpointer priv; +}; + +typedef struct { + const gchar *name; /* name as passed over dbus */ + const gchar *dtype; /* D-Bus type string */ + const GType gtype; /* glib type string */ + guint flags; /* combination of TP_CONN_MGR_PARAM_FLAG_foo */ + const gpointer def; /* default - gchar * or GINT_TO_POINTER */ + const gsize offset; /* internal use only */ +} GabbleParamSpec; + +typedef struct { + const gchar *name; + const GabbleParamSpec *parameters; /* terminated by a NULL name */ +} GabbleProtocolSpec; + +//start: vinod +/* private data */ + +typedef struct _GabbleParams GabbleParams; + +struct _GabbleParams { + guint set_mask; + + gchar *account; + gchar *password; + gchar *server; + gchar *resource; + gint priority; + guint port; + gboolean old_ssl; + gboolean do_register; + gboolean low_bandwidth; + gchar *https_proxy_server; + guint https_proxy_port; + gchar *fallback_conference_server; + gchar *stun_server; + guint stun_port; + gboolean ignore_ssl_errors; + gchar *alias; +}; + +//const GabbleProtocolSpec *gabble_protocols; /* terminated by a NULL name */ +static const GabbleParamSpec jabber_params[] = { + { "account", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, NULL, G_STRUCT_OFFSET(GabbleParams, account) }, + { "password", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, NULL, G_STRUCT_OFFSET(GabbleParams, password) }, + { "server", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET(GabbleParams, server) }, + { "resource", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GABBLE_PARAMS_DEFAULT_RESOURCE, G_STRUCT_OFFSET(GabbleParams, resource) }, + { "priority", DBUS_TYPE_INT16_AS_STRING, G_TYPE_INT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(0), G_STRUCT_OFFSET(GabbleParams, priority) }, + { "port", DBUS_TYPE_UINT16_AS_STRING, G_TYPE_UINT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(GABBLE_PARAMS_DEFAULT_PORT), G_STRUCT_OFFSET(GabbleParams, port) }, + { "old-ssl", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(FALSE), G_STRUCT_OFFSET(GabbleParams, old_ssl) }, + { "register", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(FALSE), G_STRUCT_OFFSET(GabbleParams, do_register) }, + { "low-bandwidth", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(FALSE), G_STRUCT_OFFSET(GabbleParams, low_bandwidth) }, + { "https-proxy-server", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET(GabbleParams, https_proxy_server) }, + { "https-proxy-port", DBUS_TYPE_UINT16_AS_STRING, G_TYPE_UINT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(GABBLE_PARAMS_DEFAULT_HTTPS_PROXY_PORT), G_STRUCT_OFFSET(GabbleParams, https_proxy_port) }, + { "fallback-conference-server", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET(GabbleParams, fallback_conference_server) }, + { "stun-server", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET(GabbleParams, stun_server) }, + { "stun-port", DBUS_TYPE_UINT16_AS_STRING, G_TYPE_UINT, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(GABBLE_PARAMS_DEFAULT_STUN_PORT), G_STRUCT_OFFSET(GabbleParams, stun_port) }, + { "ignore-ssl-errors", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER(FALSE), G_STRUCT_OFFSET(GabbleParams, ignore_ssl_errors) }, + { "alias", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, G_STRUCT_OFFSET(GabbleParams, alias) }, + { NULL, NULL, 0, 0, NULL, 0 } +}; + +static const GabbleProtocolSpec _gabble_protocols[] = { + { "jabber", jabber_params }, + //{ "jabber", jabber_params } + { NULL, NULL } //vinod + +}; + +const GabbleProtocolSpec *gabble_protocols = _gabble_protocols; + +//end: vinod + +IMPORT_C GType gabble_connection_manager_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_CONNECTION_MANAGER \ + (gabble_connection_manager_get_type()) +#define GABBLE_CONNECTION_MANAGER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_CONNECTION_MANAGER, GabbleConnectionManager)) +#define GABBLE_CONNECTION_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_CONNECTION_MANAGER, GabbleConnectionManagerClass)) +#define GABBLE_IS_CONNECTION_MANAGER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_CONNECTION_MANAGER)) +#define GABBLE_IS_CONNECTION_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_CONNECTION_MANAGER)) +#define GABBLE_CONNECTION_MANAGER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_CONNECTION_MANAGER, GabbleConnectionManagerClass)) + +#ifdef SYMBIAN +IMPORT_C +#endif +void _gabble_connection_manager_register (GabbleConnectionManager *self); + +gboolean +gabble_connection_manager_get_parameters (GabbleConnectionManager *self, + const gchar *proto, + GPtrArray **ret, + GError **error); + +gboolean +gabble_connection_manager_list_protocols (GabbleConnectionManager *self, + gchar ***ret, + GError **error); + +gboolean +gabble_connection_manager_request_connection (GabbleConnectionManager *self, + const gchar *proto, + GHashTable *parameters, + gchar **ret, + gchar **ret1, + GError **error); + + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_CONNECTION_MANAGER_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,46 @@ +/* + * gabble-connection-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_connection_marshal_MARSHAL_H__ +#define __gabble_connection_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:STRING,STRING,UINT,UINT,BOOLEAN (gabble-connection-signals-marshal.list:1) */ +extern void gabble_connection_marshal_VOID__STRING_STRING_UINT_UINT_BOOLEAN (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT (gabble-connection-signals-marshal.list:2) */ +extern void gabble_connection_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_connection_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-connection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-connection.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,334 @@ +/* + * gabble-connection.h - Header for GabbleConnection + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_CONNECTION_H__ +#define __GABBLE_CONNECTION_H__ + +#include +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" +#include "gabble-error.h" +#include "properties-mixin.h" +#include "telepathy-constants.h" + +G_BEGIN_DECLS + +/* Default parameters for optional parameters */ +#define GABBLE_PARAMS_DEFAULT_RESOURCE "Telepathy" +#define GABBLE_PARAMS_DEFAULT_PORT 5222 +#define GABBLE_PARAMS_DEFAULT_HTTPS_PROXY_PORT 443 +#define GABBLE_PARAMS_DEFAULT_STUN_PORT 3478 + +/* order must match array of statuses in gabble-connection.c */ +/* in increasing order of presence */ +typedef enum +{ + GABBLE_PRESENCE_OFFLINE = 0, + GABBLE_PRESENCE_HIDDEN, + GABBLE_PRESENCE_XA, + GABBLE_PRESENCE_AWAY, + GABBLE_PRESENCE_DND, + GABBLE_PRESENCE_AVAILABLE, + GABBLE_PRESENCE_CHAT, + LAST_GABBLE_PRESENCE +} GabblePresenceId; + +typedef enum +{ + GABBLE_CONNECTION_FEATURES_NONE = 0, + GABBLE_CONNECTION_FEATURES_GOOGLE_JINGLE_INFO = 1 << 0, + GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER = 1 << 1, + GABBLE_CONNECTION_FEATURES_PRESENCE_INVISIBLE = 1 << 2, + GABBLE_CONNECTION_FEATURES_PRIVACY = 1 << 3, + GABBLE_CONNECTION_FEATURES_SEARCH = 1 << 4, +} GabbleConnectionFeatures; + +typedef struct _GabbleConnectionClass GabbleConnectionClass; + +typedef LmHandlerResult (*GabbleConnectionMsgReplyFunc) (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data); + +struct _GabbleConnectionClass { + GObjectClass parent_class; + + GabblePropertiesMixinClass properties_class; +}; + +struct _GabbleConnection { + GObject parent; + + GabblePropertiesMixin properties; + + /* dbus object location */ + gchar *bus_name; + gchar *object_path; + + /* loudmouth connection */ + LmConnection *lmconn; + + /* connection status */ + TpConnectionStatus status; + + /* handles */ + GabbleHandleRepo *handles; + GabbleHandle self_handle; + + /* roster */ + GabbleRoster *roster; + + /* DISCO! */ + GabbleDisco *disco; + + /* connection feature flags */ + GabbleConnectionFeatures features; + + /* presence */ + GabblePresenceCache *presence_cache; + + /* vCard lookup helper */ + GabbleVCardManager *vcard_manager; + /* search related info */ + /* jid which supports search feature */ + gchar *search_service_jid; + /* key names on which search request can be made */ + gchar **search_key_names; + /* maps search key "label" to "var" */ + GHashTable *search_key_ht; + /* instruction by service to do search */ + gchar *search_instr; + /* gives the detailed info of search results*/ + gchar **search_reported_fields; + /* needed to support search with and without data forms*/ + gboolean search_form; + /*avatar sha1*/ + gchar* self_avatar_sha1; + gpointer priv; +}; + +typedef enum { + GABBLE_CONNECTION_ALIAS_NONE = 0, + GABBLE_CONNECTION_ALIAS_FROM_JID, + GABBLE_CONNECTION_ALIAS_FROM_VCARD, + GABBLE_CONNECTION_ALIAS_FROM_CONNMGR, + GABBLE_CONNECTION_ALIAS_FROM_PRESENCE, + GABBLE_CONNECTION_ALIAS_FROM_ROSTER +} GabbleConnectionAliasSource; + +IMPORT_C GType gabble_connection_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_CONNECTION \ + (gabble_connection_get_type()) +#define GABBLE_CONNECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_CONNECTION, GabbleConnection)) +#define GABBLE_CONNECTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_CONNECTION, GabbleConnectionClass)) +#define GABBLE_IS_CONNECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_CONNECTION)) +#define GABBLE_IS_CONNECTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_CONNECTION)) +#define GABBLE_CONNECTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_CONNECTION, GabbleConnectionClass)) + +gboolean _gabble_connection_set_properties_from_account (GabbleConnection *conn, const gchar *account, GError **error); +gboolean _gabble_connection_register (GabbleConnection *conn, char **bus_name, char **object_path, GError **error); +gboolean _gabble_connection_send (GabbleConnection *conn, LmMessage *msg, GError **error); +gboolean _gabble_connection_send_with_reply (GabbleConnection *conn, LmMessage *msg, GabbleConnectionMsgReplyFunc reply_func, GObject *object, gpointer user_data, GError **error); +void _gabble_connection_acknowledge_set_iq (GabbleConnection *conn, LmMessage *iq); +void _gabble_connection_send_iq_error (GabbleConnection *conn, LmMessage *message, GabbleXmppError error, const gchar *errmsg); + +GabbleConnectionAliasSource _gabble_connection_get_cached_alias (GabbleConnection *, GabbleHandle, gchar **); + +const char *_gabble_connection_find_conference_server (GabbleConnection *); + +gboolean +gabble_connection_add_status (GabbleConnection *self, + const gchar *status, + GHashTable *parms, + GError **error); + +gboolean +gabble_connection_advertise_capabilities (GabbleConnection *self, + const GPtrArray *add, + const gchar **remove, + GPtrArray **ret, + GError **error); + +gboolean +gabble_connection_clear_status (GabbleConnection *self, + GError **error); + +gboolean +gabble_connection_connect (GabbleConnection *self, + GError **error); + +//Mukesh - start +gboolean +gabble_connection_connect_blocking (GabbleConnection *self, + GError **error); +//Mukesh - end + +gboolean +gabble_connection_disconnect (GabbleConnection *self, + GError **error); + +gboolean +gabble_connection_get_alias_flags (GabbleConnection *self, + guint *ret, + GError **error); + +gboolean +gabble_connection_get_capabilities (GabbleConnection *self, + const GArray *handles, + GPtrArray **ret, + GError **error); + +gboolean +gabble_connection_get_interfaces (GabbleConnection *self, + gchar ***ret, + GError **error); + +void +gabble_connection_get_presence (GabbleConnection *self, + const GArray *contacts, + DBusGMethodInvocation *context); + +gboolean +gabble_connection_get_properties (GabbleConnection *self, + const GArray *properties, + GPtrArray **ret, + GError **error); + +gboolean +gabble_connection_get_protocol (GabbleConnection *self, + gchar **ret, + GError **error); + +gboolean +gabble_connection_get_self_handle (GabbleConnection *self, + guint *ret, + GError **error); + +gboolean +gabble_connection_get_status (GabbleConnection *self, + guint *ret, + GError **error); + +gboolean +gabble_connection_get_statuses (GabbleConnection *self, + GHashTable **ret, + GError **error); + +void +gabble_connection_hold_handles (GabbleConnection *self, + guint handle_type, + const GArray *handles, + DBusGMethodInvocation *context); + +void +gabble_connection_inspect_handles (GabbleConnection *self, + guint handle_type, + const GArray *handles, + DBusGMethodInvocation *context); + +gboolean +gabble_connection_list_channels (GabbleConnection *self, + GPtrArray **ret, + GError **error); + +gboolean +gabble_connection_list_properties (GabbleConnection *self, + GPtrArray **ret, + GError **error); + +void +gabble_connection_release_handles (GabbleConnection *self, + guint handle_type, + const GArray *handles, + DBusGMethodInvocation *context); + +gboolean +gabble_connection_remove_status (GabbleConnection *self, + const gchar *status, + GError **error); + +void +gabble_connection_request_aliases (GabbleConnection *self, + const GArray *contacts, + DBusGMethodInvocation *context); + +void +gabble_connection_request_channel (GabbleConnection *self, + const gchar *type, + guint handle_type, + guint handle, + gboolean suppress_handler, + DBusGMethodInvocation *context); + +void +gabble_connection_request_handles (GabbleConnection *self, + guint handle_type, + const gchar **names, + DBusGMethodInvocation *context); + +gboolean +gabble_connection_request_presence (GabbleConnection *self, + const GArray *contacts, + GError **error); + +gboolean +gabble_connection_set_aliases (GabbleConnection *self, + GHashTable *aliases, + GError **error); + +gboolean +gabble_connection_set_last_activity_time (GabbleConnection *self, + guint time, + GError **error); + +void +gabble_connection_set_properties (GabbleConnection *self, + const GPtrArray *properties, + DBusGMethodInvocation *context); + +gboolean +gabble_connection_set_status (GabbleConnection *self, + GHashTable *statuses, + GError **error); + +gboolean +gabble_connection_set_avatar( GabbleConnection *self, const GArray* bin_image, gchar* mime, gchar**avatar_sha1, GError** err ); + +gboolean +gabble_connection_clear_avatar( GabbleConnection *self, + GError **error); + + +LmMessage* gabble_connection_build_avatar(GabbleConnection *self, + const GArray* bin_image, gchar* mime ); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_CONNECTION_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-error.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-error.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,84 @@ +/* + * gabble-error.h - Header for Gabble's error handling API + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_ERROR_H__ +#define __GABBLE_ERROR_H__ + +#include +#include "loudmouth/loudmouth.h" + +typedef enum { + XMPP_ERROR_REDIRECT = 0, /* 302 */ + XMPP_ERROR_GONE, /* 302 */ + + XMPP_ERROR_BAD_REQUEST, /* 400 */ + XMPP_ERROR_UNEXPECTED_REQUEST, /* 400 */ + XMPP_ERROR_JID_MALFORMED, /* 400 */ + + XMPP_ERROR_NOT_AUTHORIZED, /* 401 */ + + XMPP_ERROR_PAYMENT_REQUIRED, /* 402 */ + + XMPP_ERROR_FORBIDDEN, /* 403 */ + + XMPP_ERROR_ITEM_NOT_FOUND, /* 404 */ + XMPP_ERROR_RECIPIENT_UNAVAILABLE, /* 404 */ + XMPP_ERROR_REMOTE_SERVER_NOT_FOUND, /* 404 */ + + XMPP_ERROR_NOT_ALLOWED, /* 405 */ + + XMPP_ERROR_NOT_ACCEPTABLE, /* 406 */ + + XMPP_ERROR_REGISTRATION_REQUIRED, /* 407 */ + XMPP_ERROR_SUBSCRIPTION_REQUIRED, /* 407 */ + + XMPP_ERROR_REMOTE_SERVER_TIMEOUT, /* 408, 504 */ + + XMPP_ERROR_CONFLICT, /* 409 */ + + XMPP_ERROR_INTERNAL_SERVER_ERROR, /* 500 */ + XMPP_ERROR_UNDEFINED_CONDITION, /* 500 */ + XMPP_ERROR_RESOURCE_CONSTRAINT, /* 500 */ + + XMPP_ERROR_FEATURE_NOT_IMPLEMENTED, /* 501 */ + + XMPP_ERROR_SERVICE_UNAVAILABLE, /* 502, 503, 510 */ + + XMPP_ERROR_JINGLE_OUT_OF_ORDER, + XMPP_ERROR_JINGLE_UNKOWN_SESSION, + XMPP_ERROR_JINGLE_UNSUPPORTED_CONTENT, + XMPP_ERROR_JINGLE_UNSUPPORTED_TRANSPORT, + + NUM_XMPP_ERRORS, + + INVALID_XMPP_ERROR, +} GabbleXmppError; + +GQuark gabble_xmpp_error_quark (void); +#define GABBLE_XMPP_ERROR gabble_xmpp_error_quark () + +GabbleXmppError gabble_xmpp_error_from_node (LmMessageNode *error_node); +GError *gabble_xmpp_error_to_g_error (GabbleXmppError error); +LmMessageNode *gabble_xmpp_error_to_node (GabbleXmppError error, LmMessageNode *parent_node, const gchar *errmsg); +const gchar *gabble_xmpp_error_string (GabbleXmppError error); +const gchar *gabble_xmpp_error_description (GabbleXmppError error); + +#endif /* __GABBLE_ERROR_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-im-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-im-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,387 @@ +/* + * gabble-im-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_im_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_im_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:1) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:2) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:3) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:4) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:5) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOOLEAN,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.8R94HT:6) */ +extern void dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOOLEAN_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOOLEAN_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER) (gpointer data1, + gboolean arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boolean (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_im_channel_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_im_channel_methods[] = { + { (GCallback) gabble_im_channel_close, dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_im_channel_get_channel_type, dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_im_channel_get_handle, dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_im_channel_get_interfaces, dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_im_channel_acknowledge_pending_messages, dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOXED_POINTER, 246 }, + { (GCallback) gabble_im_channel_get_message_types, dbus_glib_marshal_gabble_im_channel_BOOLEAN__POINTER_POINTER, 329 }, + { (GCallback) gabble_im_channel_list_pending_messages, dbus_glib_marshal_gabble_im_channel_BOOLEAN__BOOLEAN_POINTER_POINTER, 406 }, + { (GCallback) gabble_im_channel_send, dbus_glib_marshal_gabble_im_channel_BOOLEAN__UINT_STRING_POINTER, 504 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_im_channel_object_info = { + 0, + dbus_glib_gabble_im_channel_methods, + 8, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Type.Text\0AcknowledgePendingMessages\0S\0ids\0I\0au\0\0org.freedesktop.Telepathy.Channel.Type.Text\0GetMessageTypes\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Type.Text\0ListPendingMessages\0S\0clear\0I\0b\0arg1\0O\0F\0N\0a(uuuuus)\0\0org.freedesktop.Telepathy.Channel.Type.Text\0Send\0S\0type\0I\0u\0text\0I\0s\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Type.Text\0LostMessage\0org.freedesktop.Telepathy.Channel.Type.Text\0Received\0org.freedesktop.Telepathy.Channel.Type.Text\0SendError\0org.freedesktop.Telepathy.Channel.Type.Text\0Sent\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-im-channel-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-im-channel-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,30 @@ +/* + * gabble-im-channel-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_im_channel_marshal_MARSHAL_H__ +#define __gabble_im_channel_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +G_END_DECLS + +#endif /* __gabble_im_channel_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-im-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-im-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,114 @@ +/* + * gabble-im-channel.h - Header for GabbleIMChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_IM_CHANNEL_H__ +#define __GABBLE_IM_CHANNEL_H__ + +#include +#include + +#include "handles.h" +#include "telepathy-constants.h" +#include "text-mixin.h" + +G_BEGIN_DECLS + +typedef struct _GabbleIMChannel GabbleIMChannel; +typedef struct _GabbleIMChannelClass GabbleIMChannelClass; + +struct _GabbleIMChannelClass { + GObjectClass parent_class; + + GabbleTextMixinClass text_class; +}; + +struct _GabbleIMChannel { + GObject parent; + + GabbleTextMixin text; + + gpointer priv; +}; + +IMPORT_C GType gabble_im_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_IM_CHANNEL \ + (gabble_im_channel_get_type()) +#define GABBLE_IM_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_IM_CHANNEL, GabbleIMChannel)) +#define GABBLE_IM_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_IM_CHANNEL, GabbleIMChannelClass)) +#define GABBLE_IS_IM_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_IM_CHANNEL)) +#define GABBLE_IS_IM_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_IM_CHANNEL)) +#define GABBLE_IM_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_IM_CHANNEL, GabbleIMChannelClass)) + +gboolean _gabble_im_channel_receive (GabbleIMChannel *chan, TpChannelTextMessageType type, GabbleHandle sender, const char *from, time_t timestamp, const char *text); + +gboolean +gabble_im_channel_acknowledge_pending_messages (GabbleIMChannel *self, + const GArray *ids, + GError **error); + +gboolean +gabble_im_channel_close (GabbleIMChannel *self, + GError **error); + +gboolean +gabble_im_channel_get_channel_type (GabbleIMChannel *self, + gchar **ret, + GError **error); + +gboolean +gabble_im_channel_get_handle (GabbleIMChannel *self, + guint *ret, + guint *ret1, + GError **error); + +gboolean +gabble_im_channel_get_interfaces (GabbleIMChannel *self, + gchar ***ret, + GError **error); + +gboolean +gabble_im_channel_get_message_types (GabbleIMChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_im_channel_list_pending_messages (GabbleIMChannel *self, + gboolean clear, + GPtrArray **ret, + GError **error); + +gboolean +gabble_im_channel_send (GabbleIMChannel *self, + guint type, + const gchar *text, + GError **error); + + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_IM_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,550 @@ +/* + * gabble-media-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + + */ + +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_media_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_media_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:1) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:2) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_BOXED_POINTER_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:3) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:4) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:5) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:6) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:7) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_UINT_POINTER) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_UINT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:8) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.64D0HT:9) */ +extern void dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_media_channel_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_media_channel_methods[] = { + { (GCallback) gabble_media_channel_close, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_media_channel_get_channel_type, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_media_channel_get_handle, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_media_channel_get_interfaces, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_media_channel_add_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_STRING_POINTER, 246 }, + { (GCallback) gabble_media_channel_get_all_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER, 336 }, + { (GCallback) gabble_media_channel_get_group_flags, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 445 }, + { (GCallback) gabble_media_channel_get_handle_owners, dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER_POINTER, 525 }, + { (GCallback) gabble_media_channel_get_local_pending_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 621 }, + { (GCallback) gabble_media_channel_get_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 711 }, + { (GCallback) gabble_media_channel_get_remote_pending_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 789 }, + { (GCallback) gabble_media_channel_get_self_handle, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 880 }, + { (GCallback) gabble_media_channel_remove_members, dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_STRING_POINTER, 960 }, + { (GCallback) gabble_media_channel_get_session_handlers, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 1053 }, + { (GCallback) gabble_media_channel_list_streams, dbus_glib_marshal_gabble_media_channel_BOOLEAN__POINTER_POINTER, 1152 }, + { (GCallback) gabble_media_channel_remove_streams, dbus_glib_marshal_gabble_media_channel_BOOLEAN__BOXED_POINTER, 1241 }, + { (GCallback) gabble_media_channel_request_stream_direction, dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_UINT_POINTER, 1324 }, + { (GCallback) gabble_media_channel_request_streams, dbus_glib_marshal_gabble_media_channel_BOOLEAN__UINT_BOXED_POINTER_POINTER, 1438 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_media_channel_object_info = { + 0, + dbus_glib_gabble_media_channel_methods, + 18, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0AddMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetAllMembers\0S\0arg0\0O\0F\0N\0au\0arg1\0O\0F\0N\0au\0arg2\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetGroupFlags\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetHandleOwners\0S\0handles\0I\0au\0arg1\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetLocalPendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetRemotePendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetSelfHandle\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0RemoveMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0org.freedesktop.Telepathy.Channel.Interface.MediaSignalling\0GetSessionHandlers\0S\0arg0\0O\0F\0N\0a(os)\0\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0ListStreams\0S\0arg0\0O\0F\0N\0a(uuuuuu)\0\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0RemoveStreams\0S\0streams\0I\0au\0\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0RequestStreamDirection\0S\0stream_id\0I\0u\0stream_direction\0I\0u\0\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0RequestStreams\0S\0contact_handle\0I\0u\0types\0I\0au\0arg2\0O\0F\0N\0a(uuuuuu)\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Interface.Group\0GroupFlagsChanged\0org.freedesktop.Telepathy.Channel.Interface.Group\0MembersChanged\0org.freedesktop.Telepathy.Channel.Interface.MediaSignalling\0NewSessionHandler\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0StreamAdded\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0StreamDirectionChanged\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0StreamError\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0StreamRemoved\0org.freedesktop.Telepathy.Channel.Type.StreamedMedia\0StreamStateChanged\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-channel-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-channel-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,63 @@ +/* + * gabble-media-channel-signals-marshal.h - Header for GabbleRoomlistChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_media_channel_marshal_MARSHAL_H__ +#define __gabble_media_channel_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT,STRING (gabble-media-channel-signals-marshal.list:1) */ +extern void gabble_media_channel_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING,STRING (gabble-media-channel-signals-marshal.list:2) */ +extern void gabble_media_channel_marshal_VOID__STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT (gabble-media-channel-signals-marshal.list:3) */ +extern void gabble_media_channel_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT,UINT (gabble-media-channel-signals-marshal.list:4) */ +extern void gabble_media_channel_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_media_channel_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,203 @@ +/* + * gabble-media-channel.h - Header for GabbleMediaChannel + * Copyright (C) 2006 Collabora Ltd. + * Portions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_MEDIA_CHANNEL_H__ +#define __GABBLE_MEDIA_CHANNEL_H__ + +#include + +#include "gabble-media-session.h" +#include "group-mixin.h" +#include "handles.h" +#include "gabble-presence.h" + +G_BEGIN_DECLS + +typedef struct _GabbleMediaChannel GabbleMediaChannel; +typedef struct _GabbleMediaChannelClass GabbleMediaChannelClass; + +struct _GabbleMediaChannelClass { + GObjectClass parent_class; + + GabbleGroupMixinClass group_class; +}; + +struct _GabbleMediaChannel { + GObject parent; + + GabbleGroupMixin group; + + gpointer priv; +}; + +IMPORT_C GType gabble_media_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MEDIA_CHANNEL \ + (gabble_media_channel_get_type()) +#define GABBLE_MEDIA_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MEDIA_CHANNEL, GabbleMediaChannel)) +#define GABBLE_MEDIA_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MEDIA_CHANNEL, GabbleMediaChannelClass)) +#define GABBLE_IS_MEDIA_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MEDIA_CHANNEL)) +#define GABBLE_IS_MEDIA_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MEDIA_CHANNEL)) +#define GABBLE_MEDIA_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MEDIA_CHANNEL, GabbleMediaChannelClass)) + +gboolean +_gabble_media_channel_add_member (GObject *obj, + GabbleHandle handle, + const gchar *message, + GError **error); + +gboolean +gabble_media_channel_add_members (GabbleMediaChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + +gboolean +gabble_media_channel_close (GabbleMediaChannel *self, + GError **error); + +gboolean +gabble_media_channel_get_all_members (GabbleMediaChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error); + +gboolean +gabble_media_channel_get_channel_type (GabbleMediaChannel *self, + gchar **ret, + GError **error); + +gboolean +gabble_media_channel_get_group_flags (GabbleMediaChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_media_channel_get_handle (GabbleMediaChannel *self, + guint *ret, + guint *ret1, + GError **error); + +gboolean +gabble_media_channel_get_handle_owners (GabbleMediaChannel *self, + const GArray *handles, + GArray **ret, + GError **error); + +gboolean +gabble_media_channel_get_interfaces (GabbleMediaChannel *self, + gchar ***ret, + GError **error); + +gboolean +gabble_media_channel_get_local_pending_members (GabbleMediaChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_media_channel_get_members (GabbleMediaChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_media_channel_get_remote_pending_members (GabbleMediaChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_media_channel_get_self_handle (GabbleMediaChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_media_channel_get_session_handlers (GabbleMediaChannel *self, + GPtrArray **ret, + GError **error); + +gboolean +gabble_media_channel_list_streams (GabbleMediaChannel *self, + GPtrArray **ret, + GError **error); + +gboolean +gabble_media_channel_remove_members (GabbleMediaChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + +gboolean +gabble_media_channel_remove_streams (GabbleMediaChannel *self, + const GArray *streams, + GError **error); + +gboolean +gabble_media_channel_request_stream_direction (GabbleMediaChannel *self, + guint stream_id, + guint stream_direction, + GError **error); + +gboolean +gabble_media_channel_request_streams (GabbleMediaChannel *self, + guint contact_handle, + const GArray *types, + GPtrArray **ret, + GError **error); + +gboolean +_gabble_media_channel_dispatch_session_action (GabbleMediaChannel *chan, + GabbleHandle peer, + const gchar *peer_resource, + const gchar *sid, + LmMessage *message, + LmMessageNode *session_node, + const gchar *action, + GError **error); + +void +_gabble_media_channel_stream_state (GabbleMediaChannel *chan, + guint state); + +guint +_gabble_media_channel_get_stream_id (GabbleMediaChannel *chan); + +GabblePresenceCapabilities +_gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags); + +//moved definition to .c file +GabblePresenceCapabilities +_gabble_media_channel_typeflags_to_caps_tmp (guint flags); + +TpChannelMediaCapabilities +_gabble_media_channel_caps_to_typeflags (GabblePresenceCapabilities caps); + +//moved definition to .c file +guint +_gabble_media_channel_caps_to_typeflags_tmp (GabblePresenceCapabilities caps); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_MEDIA_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-session-enumtypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-session-enumtypes.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,40 @@ +/* + * gabble-media-session-enumtypes.h - Header for GabbleRoomlistChannel + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* Generated data (by glib-mkenums) */ + +#ifndef __GABBLE_MEDIA_SESSION_ENUM_TYPES_H__ +#define __GABBLE_MEDIA_SESSION_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS +/* enumerations from "gabble-media-session.h" */ +GType gabble_media_session_mode_get_type (void); +#define GABBLE_TYPE_MEDIA_SESSION_MODE (gabble_media_session_mode_get_type()) +GType jingle_session_state_get_type (void); +#define GABBLE_TYPE_SESSION_STATE (jingle_session_state_get_type()) +GType debug_message_type_get_type (void); +#define GABBLE_TYPE_MESSAGE_TYPE (debug_message_type_get_type()) +G_END_DECLS + +#endif /* __GABBLE_MEDIA_SESSION_ENUM_TYPES_H__ */ + +/* Generated data ends here */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-session-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-session-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,190 @@ +/* + * gabble-media-session-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_media_session_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_media_session_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:UINT,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.C5J0HT:1) */ +extern void dbus_glib_marshal_gabble_media_session_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_session_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.C5J0HT:2) */ +extern void dbus_glib_marshal_gabble_media_session_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_session_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_media_session_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_media_session_methods[] = { + { (GCallback) gabble_media_session_error, dbus_glib_marshal_gabble_media_session_BOOLEAN__UINT_STRING_POINTER, 0 }, + { (GCallback) gabble_media_session_ready, dbus_glib_marshal_gabble_media_session_BOOLEAN__POINTER, 78 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_media_session_object_info = { + 0, + dbus_glib_gabble_media_session_methods, + 2, +"org.freedesktop.Telepathy.Media.SessionHandler\0Error\0S\0errno\0I\0u\0message\0I\0s\0\0org.freedesktop.Telepathy.Media.SessionHandler\0Ready\0S\0\0\0", +"org.freedesktop.Telepathy.Media.SessionHandler\0NewStreamHandler\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-session-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-session-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,46 @@ +/* + * gabble-media-session-signals-marshal.h - Header for GabbleRoomlistChannel + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_media_session_marshal_MARSHAL_H__ +#define __gabble_media_session_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:STRING,UINT,UINT,UINT (gabble-media-session-signals-marshal.list:1) */ +extern void gabble_media_session_marshal_VOID__STRING_UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT (gabble-media-session-signals-marshal.list:2) */ +extern void gabble_media_session_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_media_session_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-session.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-session.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,221 @@ +/* + * gabble-media-session.h - Header for GabbleMediaSession + * Copyright (C) 2006 Collabora Ltd. + * Portions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_MEDIA_SESSION_H__ +#define __GABBLE_MEDIA_SESSION_H__ + +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" +#include "gabble-media-stream.h" +#include "telepathy-constants.h" + +G_BEGIN_DECLS + + +typedef enum +{ + MODE_GOOGLE, + MODE_JINGLE +} GabbleMediaSessionMode; + +typedef enum { + JS_STATE_INVALID = -1, + JS_STATE_PENDING_CREATED = 0, + JS_STATE_PENDING_INITIATE_SENT, + JS_STATE_PENDING_INITIATED, + JS_STATE_PENDING_ACCEPT_SENT, + JS_STATE_ACTIVE, + JS_STATE_ENDED +} JingleSessionState; + +typedef enum { + DEBUG_MSG_INFO = 0, + DEBUG_MSG_DUMP, + DEBUG_MSG_WARNING, + DEBUG_MSG_ERROR, + DEBUG_MSG_EVENT +} DebugMessageType; + +typedef struct _GabbleMediaSession GabbleMediaSession; +typedef struct _GabbleMediaSessionClass GabbleMediaSessionClass; + +struct _GabbleMediaSessionClass { + GObjectClass parent_class; +}; + +struct _GabbleMediaSession { + GObject parent; + + JingleInitiator initiator; + + gpointer priv; +}; + +IMPORT_C GType gabble_media_session_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MEDIA_SESSION \ + (gabble_media_session_get_type()) +#define GABBLE_MEDIA_SESSION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MEDIA_SESSION, GabbleMediaSession)) +#define GABBLE_MEDIA_SESSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MEDIA_SESSION, GabbleMediaSessionClass)) +#define GABBLE_IS_MEDIA_SESSION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MEDIA_SESSION)) +#define GABBLE_IS_MEDIA_SESSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MEDIA_SESSION)) +#define GABBLE_MEDIA_SESSION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MEDIA_SESSION, GabbleMediaSessionClass)) + +#define NODE_DEBUG(n, s) + +/* CONVENIENCE MACROS */ +#define MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL(s, m) \ + G_STMT_START { \ + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) \ + { \ + _gabble_media_session_debug (s, DEBUG_MSG_ERROR, m); \ + NODE_DEBUG (sent_msg->node, "message sent"); \ + NODE_DEBUG (reply_msg->node, "message reply"); \ + _gabble_media_session_terminate (s, INITIATOR_LOCAL, TP_CHANNEL_GROUP_CHANGE_REASON_ERROR); \ + return LM_HANDLER_RESULT_REMOVE_MESSAGE; \ + } \ + } G_STMT_END + +gboolean +gabble_media_session_error (GabbleMediaSession *self, + guint errno, + const gchar *message, + GError **error); + +gboolean +gabble_media_session_ready (GabbleMediaSession *self, + GError **error); + + +gboolean +_gabble_media_session_handle_action (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *session_node, + const gchar *action, + GError **error); + +LmMessage *_gabble_media_session_message_new (GabbleMediaSession *session, + const gchar *action, + LmMessageNode **session_node); + +void _gabble_media_session_accept (GabbleMediaSession *session); +void _gabble_media_session_remove_streams (GabbleMediaSession *session, GabbleMediaStream **streams, guint len); +void _gabble_media_session_terminate (GabbleMediaSession *session, JingleInitiator who, TpChannelGroupChangeReason why); + +gboolean _gabble_media_session_request_streams (GabbleMediaSession *session, + const GArray *types, + GPtrArray **ret, + GError **error); + +gboolean _gabble_media_session_request_stream_direction (GabbleMediaSession *, + GabbleMediaStream *, + TpMediaStreamDirection, + GError **); + +#ifndef _GMS_DEBUG_LEVEL +#define _GMS_DEBUG_LEVEL 2 +#endif + +#if _GMS_DEBUG_LEVEL +#ifdef ENABLE_DEBUG + +//#define GMS_DEBUG_INFO(s, ...) _gabble_media_session_debug (s, DEBUG_MSG_INFO, __VA_ARGS__) +//vinod +#define GMS_DEBUG_INFO G_GMS_DEBUG_INFO + static inline void G_GMS_DEBUG_INFO (const gchar *s, ...) + { + _gabble_media_session_debug (s, DEBUG_MSG_INFO, __VA_ARGS__) + } + + +#if _GMS_DEBUG_LEVEL > 1 +//#define GMS_DEBUG_DUMP(s, ...) _gabble_media_session_debug (s, DEBUG_MSG_DUMP, __VA_ARGS__) +//vinod +#define GMS_DEBUG_DUMP G_GMS_DEBUG_DUMP + static inline void G_GMS_DEBUG_DUMP (const gchar *s, ...) + { + _gabble_media_session_debug (s, DEBUG_MSG_DUMP, __VA_ARGS__) + } + +#else +#define GMS_DEBUG_DUMP(s, ...) +#endif +//#define GMS_DEBUG_WARNING(s, ...) _gabble_media_session_debug (s, DEBUG_MSG_WARNING, __VA_ARGS__) +//vinod +#define GMS_DEBUG_WARNING G_GMS_DEBUG_WARNING + static inline void G_GMS_DEBUG_WARNING (const gchar *s, ...) + { + _gabble_media_session_debug (s, DEBUG_MSG_WARNING, __VA_ARGS__) + } + +//#define GMS_DEBUG_ERROR(s, ...) _gabble_media_session_debug (s, DEBUG_MSG_ERROR, __VA_ARGS__) +//vinod +#define GMS_DEBUG_ERROR G_GMS_DEBUG_ERROR + static inline void G_GMS_DEBUG_ERROR (const gchar *s, ...) + { + _gabble_media_session_debug (s, DEBUG_MSG_ERROR, __VA_ARGS__) + } + + +//#define GMS_DEBUG_EVENT(s, ...) _gabble_media_session_debug (s, DEBUG_MSG_EVENT, __VA_ARGS__) +//vinod +#define GMS_DEBUG_EVENT G_GMS_DEBUG_EVENT + static inline void G_GMS_DEBUG_EVENT (const gchar *s, ...) + { + _gabble_media_session_debug (s, DEBUG_MSG_EVENT, __VA_ARGS__) + } + +void _gabble_media_session_debug (GabbleMediaSession *session, + DebugMessageType type, + const gchar *format, ...) + G_GNUC_PRINTF (3, 4); + +#else + +void _gabble_media_session_debug (GabbleMediaSession *session, + DebugMessageType type, + const gchar *format, ...) + G_GNUC_PRINTF (3, 4); + +//#define GMS_DEBUG_INFO(s, ...) +#define GMS_DEBUG_INFO +//#define GMS_DEBUG_DUMP(s, ...) +#define GMS_DEBUG_DUMP +//#define GMS_DEBUG_WARNING(s, ...) +#define GMS_DEBUG_WARNING +//#define GMS_DEBUG_ERROR(s, ...) +#define GMS_DEBUG_ERROR +//#define GMS_DEBUG_EVENT(s, ...) +#define GMS_DEBUG_EVENT + +#endif /* ENABLE_DEBUG */ +#endif /* _GMS_DEBUG_LEVEL */ + +G_END_DECLS + +#endif /* #ifndef __GABBLE_MEDIA_SESSION_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-stream-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-stream-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,389 @@ +/* + * gabble-media-stream-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_media_stream_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_media_stream_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:STRING,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:1) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:2) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:3) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:STRING,BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:4) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:UINT,POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:5) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.RGD2HT:6) */ +extern void dbus_glib_marshal_gabble_media_stream_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_media_stream_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_media_stream_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_media_stream_methods[] = { + { (GCallback) gabble_media_stream_codec_choice, dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_POINTER, 0 }, + { (GCallback) gabble_media_stream_error, dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_STRING_POINTER, 74 }, + { (GCallback) gabble_media_stream_native_candidates_prepared, dbus_glib_marshal_gabble_media_stream_BOOLEAN__POINTER, 151 }, + { (GCallback) gabble_media_stream_new_active_candidate_pair, dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_STRING_POINTER, 225 }, + { (GCallback) gabble_media_stream_new_native_candidate, dbus_glib_marshal_gabble_media_stream_BOOLEAN__STRING_BOXED_POINTER, 345 }, + { (GCallback) gabble_media_stream_ready, dbus_glib_marshal_gabble_media_stream_BOOLEAN__BOXED_POINTER, 457 }, + { (GCallback) gabble_media_stream_set_local_codecs, dbus_glib_marshal_gabble_media_stream_BOOLEAN__BOXED_POINTER, 535 }, + { (GCallback) gabble_media_stream_stream_state, dbus_glib_marshal_gabble_media_stream_BOOLEAN__UINT_POINTER, 622 }, + { (GCallback) gabble_media_stream_supported_codecs, dbus_glib_marshal_gabble_media_stream_BOOLEAN__BOXED_POINTER, 693 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_media_stream_object_info = { + 0, + dbus_glib_gabble_media_stream_methods, + 9, +"org.freedesktop.Telepathy.Media.StreamHandler\0CodecChoice\0S\0codec_id\0I\0u\0\0org.freedesktop.Telepathy.Media.StreamHandler\0Error\0S\0errno\0I\0u\0message\0I\0s\0\0org.freedesktop.Telepathy.Media.StreamHandler\0NativeCandidatesPrepared\0S\0\0org.freedesktop.Telepathy.Media.StreamHandler\0NewActiveCandidatePair\0S\0native_candidate_id\0I\0s\0remote_candidate_id\0I\0s\0\0org.freedesktop.Telepathy.Media.StreamHandler\0NewNativeCandidate\0S\0candidate_id\0I\0s\0transports\0I\0a(usuussduss)\0\0org.freedesktop.Telepathy.Media.StreamHandler\0Ready\0S\0codecs\0I\0a(usuuua{ss})\0\0org.freedesktop.Telepathy.Media.StreamHandler\0SetLocalCodecs\0S\0codecs\0I\0a(usuuua{ss})\0\0org.freedesktop.Telepathy.Media.StreamHandler\0StreamState\0S\0state\0I\0u\0\0org.freedesktop.Telepathy.Media.StreamHandler\0SupportedCodecs\0S\0codecs\0I\0a(usuuua{ss})\0\0\0", +"org.freedesktop.Telepathy.Media.StreamHandler\0AddRemoteCandidate\0org.freedesktop.Telepathy.Media.StreamHandler\0Close\0org.freedesktop.Telepathy.Media.StreamHandler\0RemoveRemoteCandidate\0org.freedesktop.Telepathy.Media.StreamHandler\0SetActiveCandidatePair\0org.freedesktop.Telepathy.Media.StreamHandler\0SetRemoteCandidateList\0org.freedesktop.Telepathy.Media.StreamHandler\0SetRemoteCodecs\0org.freedesktop.Telepathy.Media.StreamHandler\0SetStreamPlaying\0org.freedesktop.Telepathy.Media.StreamHandler\0SetStreamSending\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-stream-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-stream-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,55 @@ +/* + * gabble-media-stream-signals-marshal.h + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_media_stream_marshal_MARSHAL_H__ +#define __gabble_media_stream_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:STRING,BOXED (gabble-media-stream-signals-marshal.list:1) */ +extern void gabble_media_stream_marshal_VOID__STRING_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING,STRING (gabble-media-stream-signals-marshal.list:2) */ +extern void gabble_media_stream_marshal_VOID__STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,STRING (gabble-media-stream-signals-marshal.list:3) */ +extern void gabble_media_stream_marshal_VOID__UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_media_stream_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-media-stream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-media-stream.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,178 @@ +/* + * gabble-media-stream.h - Header for GabbleMediaStream + * Copyright (C) 2006 Collabora Ltd. + * Portions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_MEDIA_STREAM_H__ +#define __GABBLE_MEDIA_STREAM_H__ + +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" +#include "telepathy-constants.h" + +G_BEGIN_DECLS + +typedef enum +{ + STREAM_SIG_STATE_NEW, + STREAM_SIG_STATE_SENT, + STREAM_SIG_STATE_ACKNOWLEDGED, + STREAM_SIG_STATE_REMOVING +} StreamSignallingState; + +typedef guint32 CombinedStreamDirection; + +typedef struct _GabbleMediaStream GabbleMediaStream; +typedef struct _GabbleMediaStreamClass GabbleMediaStreamClass; + +struct _GabbleMediaStreamClass { + GObjectClass parent_class; +}; + +struct _GabbleMediaStream { + GObject parent; + + gchar *name; + + JingleInitiator initiator; + TpMediaStreamState connection_state; + StreamSignallingState signalling_state; + + CombinedStreamDirection combined_direction; + gboolean got_local_codecs; + gboolean playing; + + gpointer priv; +}; + +IMPORT_C GType gabble_media_stream_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MEDIA_STREAM \ + (gabble_media_stream_get_type()) +#define GABBLE_MEDIA_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MEDIA_STREAM, GabbleMediaStream)) +#define GABBLE_MEDIA_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MEDIA_STREAM, GabbleMediaStreamClass)) +#define GABBLE_IS_MEDIA_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MEDIA_STREAM)) +#define GABBLE_IS_MEDIA_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MEDIA_STREAM)) +#define GABBLE_MEDIA_STREAM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MEDIA_STREAM, GabbleMediaStreamClass)) + +#define TP_TYPE_TRANSPORT_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_STRING, \ + G_TYPE_DOUBLE, \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_STRING, \ + G_TYPE_INVALID)) +#define TP_TYPE_TRANSPORT_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_TRANSPORT_STRUCT)) +#define TP_TYPE_CANDIDATE_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_STRING, \ + TP_TYPE_TRANSPORT_LIST, \ + G_TYPE_INVALID)) +#define TP_TYPE_CANDIDATE_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_CANDIDATE_STRUCT)) + +#define TP_TYPE_CODEC_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + DBUS_TYPE_G_STRING_STRING_HASHTABLE, \ + G_TYPE_INVALID)) +#define TP_TYPE_CODEC_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_CODEC_STRUCT)) + +#define COMBINED_DIRECTION_GET_DIRECTION(d) \ + ((TpMediaStreamDirection) ((d) & TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL)) +#define COMBINED_DIRECTION_GET_PENDING_SEND(d) \ + ((TpMediaStreamPendingSend) ((d) >> 2)) +#define MAKE_COMBINED_DIRECTION(d, p) \ + ((CombinedStreamDirection) ((d) | ((p) << 2))) + +gboolean +gabble_media_stream_codec_choice (GabbleMediaStream *self, + guint codec_id, + GError **error); + +gboolean +gabble_media_stream_error (GabbleMediaStream *self, + guint errno, + const gchar *message, + GError **error); + +gboolean +gabble_media_stream_native_candidates_prepared (GabbleMediaStream *self, + GError **error); + +gboolean +gabble_media_stream_new_active_candidate_pair (GabbleMediaStream *self, + const gchar *native_candidate_id, + const gchar *remote_candidate_id, + GError **error); + +gboolean +gabble_media_stream_new_native_candidate (GabbleMediaStream *self, + const gchar *candidate_id, + const GPtrArray *transports, + GError **error); + +gboolean +gabble_media_stream_ready (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error); + +gboolean +gabble_media_stream_set_local_codecs (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error); + +gboolean +gabble_media_stream_stream_state (GabbleMediaStream *self, + guint state, + GError **error); + +gboolean +gabble_media_stream_supported_codecs (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error); + + +void _gabble_media_stream_close (GabbleMediaStream *close); +gboolean _gabble_media_stream_post_remote_codecs (GabbleMediaStream *stream, LmMessage *message, LmMessageNode *desc_node, GError **error); +gboolean _gabble_media_stream_post_remote_candidates (GabbleMediaStream *stream, LmMessage *message, LmMessageNode *transport_node, GError **error); +LmMessageNode *_gabble_media_stream_add_content_node (GabbleMediaStream *stream, LmMessageNode *session_node); +void _gabble_media_stream_content_node_add_description (GabbleMediaStream *stream, LmMessageNode *content_node); +LmMessageNode *_gabble_media_stream_content_node_add_transport (GabbleMediaStream *stream, LmMessageNode *content_node); +void _gabble_media_stream_update_sending (GabbleMediaStream *stream, gboolean start_sending); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_MEDIA_STREAM_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-muc-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-muc-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,639 @@ +/* + * gabble-muc-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_muc_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_muc_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:1) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:2) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:3) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:4) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* NONE:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:5) */ +extern void dbus_glib_marshal_gabble_muc_channel_VOID__STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_VOID__STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} +#define dbus_glib_marshal_gabble_muc_channel_NONE__STRING_POINTER dbus_glib_marshal_gabble_muc_channel_VOID__STRING_POINTER + +/* BOOLEAN:UINT,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:6) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__UINT_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__UINT_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__UINT_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:7) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* NONE:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:8) */ +extern void dbus_glib_marshal_gabble_muc_channel_VOID__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_VOID__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} +#define dbus_glib_marshal_gabble_muc_channel_NONE__BOXED_POINTER dbus_glib_marshal_gabble_muc_channel_VOID__BOXED_POINTER + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:9) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:10) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOOLEAN,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.U374HT:11) */ +extern void dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOOLEAN_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOOLEAN_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER) (gpointer data1, + gboolean arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOOLEAN_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boolean (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_muc_channel_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_muc_channel_methods[] = { + { (GCallback) gabble_muc_channel_close, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_muc_channel_get_channel_type, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_muc_channel_get_handle, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_muc_channel_get_interfaces, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_muc_channel_add_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_STRING_POINTER, 246 }, + { (GCallback) gabble_muc_channel_get_all_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER, 336 }, + { (GCallback) gabble_muc_channel_get_group_flags, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 445 }, + { (GCallback) gabble_muc_channel_get_handle_owners, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER_POINTER, 525 }, + { (GCallback) gabble_muc_channel_get_local_pending_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 621 }, + { (GCallback) gabble_muc_channel_get_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 711 }, + { (GCallback) gabble_muc_channel_get_remote_pending_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 789 }, + { (GCallback) gabble_muc_channel_get_self_handle, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 880 }, + { (GCallback) gabble_muc_channel_remove_members, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_STRING_POINTER, 960 }, + { (GCallback) gabble_muc_channel_get_password_flags, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 1053 }, + { (GCallback) gabble_muc_channel_provide_password, dbus_glib_marshal_gabble_muc_channel_NONE__STRING_POINTER, 1139 }, + { (GCallback) gabble_muc_channel_acknowledge_pending_messages, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER, 1237 }, + { (GCallback) gabble_muc_channel_get_message_types, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 1320 }, + { (GCallback) gabble_muc_channel_list_pending_messages, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOOLEAN_POINTER_POINTER, 1397 }, + { (GCallback) gabble_muc_channel_send, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__UINT_STRING_POINTER, 1495 }, + { (GCallback) gabble_muc_channel_get_properties, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__BOXED_POINTER_POINTER, 1565 }, + { (GCallback) gabble_muc_channel_list_properties, dbus_glib_marshal_gabble_muc_channel_BOOLEAN__POINTER_POINTER, 1652 }, + { (GCallback) gabble_muc_channel_set_properties, dbus_glib_marshal_gabble_muc_channel_NONE__BOXED_POINTER, 1726 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_muc_channel_object_info = { + 0, + dbus_glib_gabble_muc_channel_methods, + 22, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0AddMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetAllMembers\0S\0arg0\0O\0F\0N\0au\0arg1\0O\0F\0N\0au\0arg2\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetGroupFlags\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetHandleOwners\0S\0handles\0I\0au\0arg1\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetLocalPendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetRemotePendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetSelfHandle\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0RemoveMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0org.freedesktop.Telepathy.Channel.Interface.Password\0GetPasswordFlags\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Password\0ProvidePassword\0A\0password\0I\0s\0arg1\0O\0F\0N\0b\0\0org.freedesktop.Telepathy.Channel.Type.Text\0AcknowledgePendingMessages\0S\0ids\0I\0au\0\0org.freedesktop.Telepathy.Channel.Type.Text\0GetMessageTypes\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Type.Text\0ListPendingMessages\0S\0clear\0I\0b\0arg1\0O\0F\0N\0a(uuuuus)\0\0org.freedesktop.Telepathy.Channel.Type.Text\0Send\0S\0type\0I\0u\0text\0I\0s\0\0org.freedesktop.Telepathy.Properties\0GetProperties\0S\0properties\0I\0au\0arg1\0O\0F\0N\0a(uv)\0\0org.freedesktop.Telepathy.Properties\0ListProperties\0S\0arg0\0O\0F\0N\0a(ussu)\0\0org.freedesktop.Telepathy.Properties\0SetProperties\0A\0properties\0I\0a(uv)\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Interface.Group\0GroupFlagsChanged\0org.freedesktop.Telepathy.Channel.Interface.Group\0MembersChanged\0org.freedesktop.Telepathy.Channel.Interface.Password\0PasswordFlagsChanged\0org.freedesktop.Telepathy.Channel.Type.Text\0LostMessage\0org.freedesktop.Telepathy.Channel.Type.Text\0Received\0org.freedesktop.Telepathy.Channel.Type.Text\0SendError\0org.freedesktop.Telepathy.Channel.Type.Text\0Sent\0org.freedesktop.Telepathy.Properties\0PropertiesChanged\0org.freedesktop.Telepathy.Properties\0PropertyFlagsChanged\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-muc-channel-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-muc-channel-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* + * gabble-muc-channel-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_muc_channel_marshal_MARSHAL_H__ +#define __gabble_muc_channel_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT (gabble-muc-channel-signals-marshal.list:1) */ +extern void gabble_muc_channel_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_muc_channel_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-muc-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-muc-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,199 @@ +/* + * gabble-muc-channel.h - Header for GabbleMucChannel + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_MUC_CHANNEL_H__ +#define __GABBLE_MUC_CHANNEL_H__ + +#include + +#include "group-mixin.h" +#include "properties-mixin.h" +#include "text-mixin.h" +#include "handles.h" + +G_BEGIN_DECLS + +typedef struct _GabbleMucChannel GabbleMucChannel; +typedef struct _GabbleMucChannelClass GabbleMucChannelClass; + +struct _GabbleMucChannelClass { + GObjectClass parent_class; + + GabbleGroupMixinClass group_class; + GabblePropertiesMixinClass properties_class; + GabbleTextMixinClass text_class; +}; + +struct _GabbleMucChannel { + GObject parent; + + GabbleGroupMixin group; + GabblePropertiesMixin properties; + GabbleTextMixin text; + + gpointer priv; +}; + +IMPORT_C GType gabble_muc_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MUC_CHANNEL \ + (gabble_muc_channel_get_type()) +#define GABBLE_MUC_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MUC_CHANNEL, GabbleMucChannel)) +#define GABBLE_MUC_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MUC_CHANNEL, GabbleMucChannelClass)) +#define GABBLE_IS_MUC_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MUC_CHANNEL)) +#define GABBLE_IS_MUC_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MUC_CHANNEL)) +#define GABBLE_MUC_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MUC_CHANNEL, GabbleMucChannelClass)) + +gboolean _gabble_muc_channel_is_ready (GabbleMucChannel *chan); +void _gabble_muc_channel_presence_error (GabbleMucChannel *chan, const gchar *jid, LmMessageNode *pres_node); +void _gabble_muc_channel_member_presence_updated (GabbleMucChannel *chan, GabbleHandle handle, LmMessage *message, LmMessageNode *x_node); +gboolean _gabble_muc_channel_receive (GabbleMucChannel *chan, TpChannelTextMessageType msg_type, TpHandleType handle_type, GabbleHandle sender, time_t timestamp, const gchar *text, LmMessage *msg); + +void _gabble_muc_channel_handle_invited (GabbleMucChannel *chan, GabbleHandle inviter, const gchar *message); + +gboolean +gabble_muc_channel_acknowledge_pending_messages (GabbleMucChannel *self, + const GArray *ids, + GError **error); + +gboolean +gabble_muc_channel_add_members (GabbleMucChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + +gboolean +gabble_muc_channel_close (GabbleMucChannel *self, + GError **error); + +gboolean +gabble_muc_channel_get_all_members (GabbleMucChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error); + +gboolean +gabble_muc_channel_get_channel_type (GabbleMucChannel *self, + gchar **ret, + GError **error); + +gboolean +gabble_muc_channel_get_group_flags (GabbleMucChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_muc_channel_get_handle (GabbleMucChannel *self, + guint *ret, + guint *ret1, + GError **error); + +gboolean +gabble_muc_channel_get_handle_owners (GabbleMucChannel *self, + const GArray *handles, + GArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_interfaces (GabbleMucChannel *self, + gchar ***ret, + GError **error); + +gboolean +gabble_muc_channel_get_local_pending_members (GabbleMucChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_members (GabbleMucChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_message_types (GabbleMucChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_password_flags (GabbleMucChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_muc_channel_get_properties (GabbleMucChannel *self, + const GArray *properties, + GPtrArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_remote_pending_members (GabbleMucChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_muc_channel_get_self_handle (GabbleMucChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_muc_channel_list_pending_messages (GabbleMucChannel *self, + gboolean clear, + GPtrArray **ret, + GError **error); + +gboolean +gabble_muc_channel_list_properties (GabbleMucChannel *self, + GPtrArray **ret, + GError **error); + +void +gabble_muc_channel_provide_password (GabbleMucChannel *self, + const gchar *password, + DBusGMethodInvocation *context); + +gboolean +gabble_muc_channel_remove_members (GabbleMucChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + +gboolean +gabble_muc_channel_send (GabbleMucChannel *self, + guint type, + const gchar *text, + GError **error); + +void +gabble_muc_channel_set_properties (GabbleMucChannel *self, + const GPtrArray *properties, + DBusGMethodInvocation *context); + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_MUC_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-presence-cache-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-presence-cache-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* + * gabble-presence-cache-signals-marshal.h - Header for GabbleRoomlistChannel + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_presence_cache_marshal_MARSHAL_H__ +#define __gabble_presence_cache_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT,UINT (gabble-presence-cache-signals-marshal.list:1) */ +extern void gabble_presence_cache_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_presence_cache_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-presence-cache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-presence-cache.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,85 @@ +/* + * gabble-presence-cache.h - Headers for Gabble's contact presence cache + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_PRESENCE_CACHE_H__ +#define __GABBLE_PRESENCE_CACHE_H__ + +#include + +#include "gabble-presence.h" +#include "handles.h" + +G_BEGIN_DECLS + +#define GABBLE_TYPE_PRESENCE_CACHE gabble_presence_cache_get_type() + +#define GABBLE_PRESENCE_CACHE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GABBLE_TYPE_PRESENCE_CACHE, GabblePresenceCache)) + +#define GABBLE_PRESENCE_CACHE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + GABBLE_TYPE_PRESENCE_CACHE, GabblePresenceCacheClass)) + +#define GABBLE_IS_PRESENCE_CACHE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + GABBLE_TYPE_PRESENCE_CACHE)) + +#define GABBLE_IS_PRESENCE_CACHE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + GABBLE_TYPE_PRESENCE_CACHE)) + +#define GABBLE_PRESENCE_CACHE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + GABBLE_TYPE_PRESENCE_CACHE, GabblePresenceCacheClass)) + +#define JABBER_PRESENCE_SHOW_AWAY "away" +#define JABBER_PRESENCE_SHOW_CHAT "chat" +#define JABBER_PRESENCE_SHOW_DND "dnd" +#define JABBER_PRESENCE_SHOW_XA "xa" + +struct _GabblePresenceCache { + GObject parent; + gpointer priv; +}; + +typedef struct _GabblePresenceCacheClass GabblePresenceCacheClass; + +struct _GabblePresenceCacheClass { + GObjectClass parent_class; +}; + +IMPORT_C GType gabble_presence_cache_get_type (void); + +GabblePresenceCache *gabble_presence_cache_new (GabbleConnection *conn); +GabblePresence *gabble_presence_cache_get (GabblePresenceCache *cache, + GabbleHandle handle); +void gabble_presence_cache_update (GabblePresenceCache *cache, + GabbleHandle handle, const gchar *resource, GabblePresenceId presence_id, + const gchar *status_message, gint8 priority); +void gabble_presence_cache_maybe_remove (GabblePresenceCache *cache, + GabbleHandle handle); +void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache, + const gchar *node, GabblePresenceCapabilities caps); + +G_END_DECLS + +#endif /* __GABBLE_PRESENCE_CACHE_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-presence.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-presence.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,104 @@ +/* + * gabble-presence.h - Headers for Gabble's per-contact presence structure + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef __GABBLE_PRESENCE_H__ +#define __GABBLE_PRESENCE_H__ + +#include + +#include "gabble-connection.h" +#include "gabble_enums.h" + +G_BEGIN_DECLS + +#define GABBLE_TYPE_PRESENCE gabble_presence_get_type() + +#define GABBLE_PRESENCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GABBLE_TYPE_PRESENCE, GabblePresence)) + +#define GABBLE_PRESENCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + GABBLE_TYPE_PRESENCE, GabblePresenceClass)) + +#define GABBLE_IS_PRESENCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + GABBLE_TYPE_PRESENCE)) + +#define GABBLE_IS_PRESENCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + GABBLE_TYPE_PRESENCE)) + +#define GABBLE_PRESENCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + GABBLE_TYPE_PRESENCE, GabblePresenceClass)) +/*Moved to gabble_enums.h +typedef enum { + PRESENCE_CAP_NONE = 0, + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P = 1 << 0, + PRESENCE_CAP_GOOGLE_VOICE = 1 << 1, + PRESENCE_CAP_JINGLE = 1 << 2, + PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO = 1 << 3, + PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO = 1 << 4, +} GabblePresenceCapabilities;*/ + +typedef struct _GabblePresence GabblePresence; + +struct _GabblePresence { + GObject parent; + GabblePresenceCapabilities caps; + GabblePresenceId status; + gchar *status_message; + gchar *nickname; + gchar *avatar_sha1; + gboolean keep_unavailable; + gpointer priv; +}; + +typedef struct _GabblePresenceClass GabblePresenceClass; + +struct _GabblePresenceClass { + GObjectClass parent_class; +}; + +IMPORT_C GType gabble_presence_get_type (void); + +GabblePresence* gabble_presence_new (void); + +gboolean gabble_presence_update (GabblePresence *presence, const gchar *resource, GabblePresenceId status, const gchar *status_message, gint8 priority); + +void gabble_presence_set_capabilities (GabblePresence *presence, const gchar *resource, GabblePresenceCapabilities caps, guint serial); + +const gchar *gabble_presence_pick_resource_by_caps (GabblePresence *presence, GabblePresenceCapabilities caps); + +gboolean +gabble_presence_resource_has_caps (GabblePresence *presence, + const gchar *resource, + GabblePresenceCapabilities caps); + +LmMessage *gabble_presence_as_message (GabblePresence *presence, const gchar *resource); +gchar * +gabble_presence_dump (GabblePresence *presence); + +G_END_DECLS + +#endif /* __GABBLE_PRESENCE_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-register-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-register-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* + * gabble-register-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __gabble_register_marshal_MARSHAL_H__ +#define __gabble_register_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:BOOLEAN,INT,STRING (gabble-register-signals-marshal.list:1) */ +extern void gabble_register_marshal_VOID__BOOLEAN_INT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __gabble_register_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-register.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-register.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,65 @@ +/* + * gabble-register.h - Headers for Gabble account registration + * + * Copyright (C) 2006 Collabora Ltd. + + * @author Ole Andre Vadla Ravnaas + * + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_REGISTER_H__ +#define __GABBLE_REGISTER_H__ + +#include +#include "loudmouth/loudmouth.h" + +G_BEGIN_DECLS + +typedef struct _GabbleRegister GabbleRegister; +typedef struct _GabbleRegisterClass GabbleRegisterClass; + +IMPORT_C GType gabble_register_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_REGISTER \ + (gabble_register_get_type()) +#define GABBLE_REGISTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_REGISTER, GabbleRegister)) +#define GABBLE_REGISTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_REGISTER, GabbleRegisterClass)) +#define GABBLE_IS_REGISTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_REGISTER)) +#define GABBLE_IS_REGISTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_REGISTER)) +#define GABBLE_REGISTER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_REGISTER, GabbleRegisterClass)) + +struct _GabbleRegisterClass { + GObjectClass parent_class; +}; + +struct _GabbleRegister { + GObject parent; +}; + +GabbleRegister *gabble_register_new (GabbleConnection *conn); +void gabble_register_start (GabbleRegister *reg); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_REGISTER_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roomlist-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roomlist-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,240 @@ +/* + * gabble-roomlist-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_roomlist_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_roomlist_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.Q5SKIT:1) */ +extern void dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.Q5SKIT:2) */ +extern void dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.Q5SKIT:3) */ +extern void dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_roomlist_channel_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_roomlist_channel_methods[] = { + { (GCallback) gabble_roomlist_channel_close, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_roomlist_channel_get_channel_type, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_roomlist_channel_get_handle, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_roomlist_channel_get_interfaces, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_roomlist_channel_get_listing_rooms, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER_POINTER, 246 }, + { (GCallback) gabble_roomlist_channel_list_rooms, dbus_glib_marshal_gabble_roomlist_channel_BOOLEAN__POINTER, 326 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_roomlist_channel_object_info = { + 0, + dbus_glib_gabble_roomlist_channel_methods, + 6, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Type.RoomList\0GetListingRooms\0S\0arg0\0O\0F\0N\0b\0\0org.freedesktop.Telepathy.Channel.Type.RoomList\0ListRooms\0S\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Type.RoomList\0GotRooms\0org.freedesktop.Telepathy.Channel.Type.RoomList\0ListingRooms\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roomlist-channel-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roomlist-channel-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,29 @@ +/* + * gabble-roomlist-channel-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __gabble_roomlist_channel_marshal_MARSHAL_H__ +#define __gabble_roomlist_channel_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +G_END_DECLS + +#endif /* __gabble_roomlist_channel_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roomlist-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roomlist-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,93 @@ +/* + * gabble-roomlist-channel.h - Header for GabbleRoomlistChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_ROOMLIST_CHANNEL_H__ +#define __GABBLE_ROOMLIST_CHANNEL_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GabbleRoomlistChannel GabbleRoomlistChannel; +typedef struct _GabbleRoomlistChannelClass GabbleRoomlistChannelClass; + +struct _GabbleRoomlistChannelClass { + GObjectClass parent_class; +}; + +struct _GabbleRoomlistChannel { + GObject parent; + + gpointer priv; +}; + +IMPORT_C GType gabble_roomlist_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_ROOMLIST_CHANNEL \ + (gabble_roomlist_channel_get_type()) +#define GABBLE_ROOMLIST_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_ROOMLIST_CHANNEL, GabbleRoomlistChannel)) +#define GABBLE_ROOMLIST_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_ROOMLIST_CHANNEL, GabbleRoomlistChannelClass)) +#define GABBLE_IS_ROOMLIST_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_ROOMLIST_CHANNEL)) +#define GABBLE_IS_ROOMLIST_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_ROOMLIST_CHANNEL)) +#define GABBLE_ROOMLIST_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_ROOMLIST_CHANNEL, GabbleRoomlistChannelClass)) + + +GabbleRoomlistChannel *_gabble_roomlist_channel_new (GabbleConnection *conn, const gchar *object_path, const gchar *conference_server); + +gboolean +gabble_roomlist_channel_close (GabbleRoomlistChannel *self, + GError **error); + +gboolean +gabble_roomlist_channel_get_channel_type (GabbleRoomlistChannel *self, + gchar **ret, + GError **error); + +gboolean +gabble_roomlist_channel_get_handle (GabbleRoomlistChannel *self, + guint *ret, + guint *ret1, + GError **error); + +gboolean +gabble_roomlist_channel_get_interfaces (GabbleRoomlistChannel *self, + gchar ***ret, + GError **error); + +gboolean +gabble_roomlist_channel_get_listing_rooms (GabbleRoomlistChannel *self, + gboolean *ret, + GError **error); + +gboolean +gabble_roomlist_channel_list_rooms (GabbleRoomlistChannel *self, + GError **error); + + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_ROOMLIST_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roster-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roster-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,396 @@ +/* + * gabble-roster-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_roster_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_roster_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:1) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:2) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:3) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_STRING_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:4) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:5) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.KKEKIT:6) */ +extern void dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + g_marshal_value_peek_pointer (param_values + 4), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_roster_channel_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_roster_channel_methods[] = { + { (GCallback) gabble_roster_channel_close, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_roster_channel_get_channel_type, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_roster_channel_get_handle, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_roster_channel_get_interfaces, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_roster_channel_add_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_STRING_POINTER, 246 }, + { (GCallback) gabble_roster_channel_get_all_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER_POINTER_POINTER, 336 }, + { (GCallback) gabble_roster_channel_get_group_flags, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 445 }, + { (GCallback) gabble_roster_channel_get_handle_owners, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_POINTER_POINTER, 525 }, + { (GCallback) gabble_roster_channel_get_local_pending_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 621 }, + { (GCallback) gabble_roster_channel_get_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 711 }, + { (GCallback) gabble_roster_channel_get_remote_pending_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 789 }, + { (GCallback) gabble_roster_channel_get_self_handle, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__POINTER_POINTER, 880 }, + { (GCallback) gabble_roster_channel_remove_members, dbus_glib_marshal_gabble_roster_channel_BOOLEAN__BOXED_STRING_POINTER, 960 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_roster_channel_object_info = { + 0, + dbus_glib_gabble_roster_channel_methods, + 13, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0AddMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetAllMembers\0S\0arg0\0O\0F\0N\0au\0arg1\0O\0F\0N\0au\0arg2\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetGroupFlags\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetHandleOwners\0S\0handles\0I\0au\0arg1\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetLocalPendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetRemotePendingMembers\0S\0arg0\0O\0F\0N\0au\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0GetSelfHandle\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Interface.Group\0RemoveMembers\0S\0contacts\0I\0au\0message\0I\0s\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Interface.Group\0GroupFlagsChanged\0org.freedesktop.Telepathy.Channel.Interface.Group\0MembersChanged\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roster-channel-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roster-channel-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,29 @@ +/* + * gabble-roster-channel-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __gabble_roster_channel_marshal_MARSHAL_H__ +#define __gabble_roster_channel_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +G_END_DECLS + +#endif /* __gabble_roster_channel_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-roster-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-roster-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,139 @@ +/* + * gabble-roster-channel.h - Header for GabbleRosterChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_ROSTER_CHANNEL_H__ +#define __GABBLE_ROSTER_CHANNEL_H__ + +#include +#include "gintset.h" + +#include "gabble-types.h" +#include "group-mixin.h" + +G_BEGIN_DECLS + +typedef struct _GabbleRosterChannelClass GabbleRosterChannelClass; + +struct _GabbleRosterChannelClass { + GObjectClass parent_class; + + GabbleGroupMixinClass group_class; +}; + +struct _GabbleRosterChannel { + GObject parent; + + GabbleGroupMixin group; + + gpointer priv; +}; + +IMPORT_C GType gabble_roster_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_ROSTER_CHANNEL \ + (gabble_roster_channel_get_type()) +#define GABBLE_ROSTER_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_ROSTER_CHANNEL, GabbleRosterChannel)) +#define GABBLE_ROSTER_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_ROSTER_CHANNEL, GabbleRosterChannelClass)) +#define GABBLE_IS_ROSTER_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_ROSTER_CHANNEL)) +#define GABBLE_IS_ROSTER_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_ROSTER_CHANNEL)) +#define GABBLE_ROSTER_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_ROSTER_CHANNEL, GabbleRosterChannelClass)) + + +gboolean +gabble_roster_channel_add_members (GabbleRosterChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + +gboolean +gabble_roster_channel_close (GabbleRosterChannel *self, + GError **error); + +gboolean +gabble_roster_channel_get_all_members (GabbleRosterChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error); + +gboolean +gabble_roster_channel_get_channel_type (GabbleRosterChannel *self, + gchar **ret, + GError **error); + +gboolean +gabble_roster_channel_get_group_flags (GabbleRosterChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_roster_channel_get_handle (GabbleRosterChannel *self, + guint *ret, + guint *ret1, + GError **error); + +gboolean +gabble_roster_channel_get_handle_owners (GabbleRosterChannel *self, + const GArray *handles, + GArray **ret, + GError **error); + +gboolean +gabble_roster_channel_get_interfaces (GabbleRosterChannel *self, + gchar ***ret, + GError **error); + +gboolean +gabble_roster_channel_get_local_pending_members (GabbleRosterChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_roster_channel_get_members (GabbleRosterChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_roster_channel_get_remote_pending_members (GabbleRosterChannel *self, + GArray **ret, + GError **error); + +gboolean +gabble_roster_channel_get_self_handle (GabbleRosterChannel *self, + guint *ret, + GError **error); + +gboolean +gabble_roster_channel_remove_members (GabbleRosterChannel *self, + const GArray *contacts, + const gchar *message, + GError **error); + + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_ROSTER_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-search-channel-glue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-search-channel-glue.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,289 @@ +/* + * gabble-search-channel-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +/* Generated by dbus-binding-tool; do not edit! */ + + +#ifndef __dbus_glib_marshal_gabble_search_channel_MARSHAL_H__ +#define __dbus_glib_marshal_gabble_search_channel_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.69O99T:1) */ +extern void dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.69O99T:2) */ +extern void dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_pointer (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.69O99T:3) */ +extern void dbus_glib_marshal_gabble_search_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_search_channel_BOOLEAN__BOXED_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.69O99T:4) */ +extern void dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +void +dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +G_END_DECLS + +#endif /* __dbus_glib_marshal_gabble_search_MARSHAL_H__ */ + +#include +static const DBusGMethodInfo dbus_glib_gabble_search_channel_methods[] = { + { (GCallback) gabble_search_channel_close, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER, 0 }, + { (GCallback) gabble_search_channel_get_channel_type, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER, 43 }, + { (GCallback) gabble_search_channel_get_handle, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER_POINTER, 108 }, + { (GCallback) gabble_search_channel_get_interfaces, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER, 181 }, + { (GCallback) gabble_search_channel_get_search_keys, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER_POINTER, 246 }, + { (GCallback) gabble_search_channel_get_search_state, dbus_glib_marshal_gabble_search_channel_BOOLEAN__POINTER_POINTER, 343 }, + { (GCallback) gabble_search_channel_search, dbus_glib_marshal_gabble_search_channel_BOOLEAN__BOXED_POINTER, 427 }, +}; + +const DBusGObjectInfo dbus_glib_gabble_search_channel_object_info = { + 0, + dbus_glib_gabble_search_channel_methods, + 7, +"org.freedesktop.Telepathy.Channel\0Close\0S\0\0org.freedesktop.Telepathy.Channel\0GetChannelType\0S\0arg0\0O\0F\0N\0s\0\0org.freedesktop.Telepathy.Channel\0GetHandle\0S\0arg0\0O\0F\0N\0u\0arg1\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel\0GetInterfaces\0S\0arg0\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Type.ContactSearch\0GetSearchKeys\0S\0arg0\0O\0F\0N\0s\0arg1\0O\0F\0N\0as\0\0org.freedesktop.Telepathy.Channel.Type.ContactSearch\0GetSearchState\0S\0arg0\0O\0F\0N\0u\0\0org.freedesktop.Telepathy.Channel.Type.ContactSearch\0Search\0S\0terms\0I\0a{sv}\0\0\0", +"org.freedesktop.Telepathy.Channel\0Closed\0org.freedesktop.Telepathy.Channel.Type.ContactSearch\0SearchResultReceived\0org.freedesktop.Telepathy.Channel.Type.ContactSearch\0SearchStateChanged\0\0", +"\0" +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-search-channel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-search-channel.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,127 @@ +/* + * gabble-im-channel.h - Header for GabbleSearchChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_SEARCH_CHANNEL_H__ +#define __GABBLE_SEARCH_CHANNEL_H__ + +#include +#include + +#include "loudmouth/loudmouth.h" + + +#include "handles.h" +#include "telepathy-constants.h" +#include "search-mixin.h" + +G_BEGIN_DECLS + + + +extern LmHandlerResult +search_channel_iq_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data); + +typedef struct _GabbleSearchChannel GabbleSearchChannel; +typedef struct _GabbleSearchChannelClass GabbleSearchChannelClass; + +struct _GabbleSearchChannelClass { + GObjectClass parent_class; + + GabbleSearchMixinClass mixin_class; +}; + +struct _GabbleSearchChannel { + GObject parent; + LmMessageHandler *iq_cb; + GabbleSearchMixin search_mixin; + //todo: channel_index used for closing/removing the channel.. + //can this be done without index? + guint channel_index; + gpointer priv; +}; + +IMPORT_C GType gabble_search_channel_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_SEARCH_CHANNEL \ + (gabble_search_channel_get_type()) +#define GABBLE_SEARCH_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_SEARCH_CHANNEL, GabbleSearchChannel)) +#define GABBLE_SEARCH_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_SEARCH_CHANNEL, GabbleSearchChannelClass)) +#define GABBLE_IS_SEARCH_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_SEARCH_CHANNEL)) +#define GABBLE_IS_SEARCH_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_SEARCH_CHANNEL)) +#define GABBLE_SEARCH_CHANNEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_SEARCH_CHANNEL, GabbleSearchChannelClass)) + + + +gboolean +gabble_search_channel_close (GabbleSearchChannel *self, + GError **error); + +gboolean +gabble_search_channel_get_channel_type (GabbleSearchChannel *self, + gchar **ret, + GError **error); + + +gboolean +gabble_search_channel_get_interfaces (GabbleSearchChannel *self, + gchar ***ret, + GError **error); + + +gboolean +gabble_search_channel_get_search_keys ( GabbleSearchChannel *self, + gchar **instruction, + gchar ***key_names, + GError **error + ); + +gboolean +gabble_search_channel_get_search_state ( GabbleSearchChannel *self, + guint *ret, + GError **error + ); + +gboolean +gabble_search_channel_search ( GabbleSearchChannel *self, + GHashTable *params, + GError **error + ); + + +gboolean +gabble_search_channel_get_handle (GabbleSearchChannel *self, + guint *ret, + guint *ret1, + GError **error); + + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_SEARCH_CHANNEL_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble-types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble-types.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,44 @@ +/* + * gabble-types.h - Header for Gabble type definitions + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_TYPES_H__ +#define __GABBLE_TYPES_H__ + +G_BEGIN_DECLS + +typedef struct _GabbleConnection GabbleConnection; +typedef struct _GabbleDisco GabbleDisco; +typedef struct _GabbleHandleRepo GabbleHandleRepo; +typedef struct _GabblePresenceCache GabblePresenceCache; +typedef struct _GabbleRoster GabbleRoster; +typedef struct _GabbleRosterChannel GabbleRosterChannel; +typedef struct _GabbleVCardManager GabbleVCardManager; +typedef guint32 GabbleHandle; + +typedef enum { + INITIATOR_INVALID = -1, + INITIATOR_LOCAL = 0, + INITIATOR_REMOTE, +} JingleInitiator; + +G_END_DECLS + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,31 @@ +/* + * gabble.h - entry point and utility functions for telepathy-gabble + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_H__ +#define __GABBLE_H__ + +#include + +G_BEGIN_DECLS + +G_END_DECLS + +#endif /* #ifndef __GABBLE_H__*/ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gabble_enums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gabble_enums.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,76 @@ +/* + * gabble_enums.h - Header for GabbleConnection + * Copyright (C) 2005 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef enum_gabble +#define enum_gabble + +/* signal enum */ +#define LAST_SIGNAL_CON_MGR 2 +#define LAST_SIGNAL_CON 6 +#define LAST_SIGNAL_IM 1 +#define LAST_SIGNAL_MUC 4 +#define LAST_SIGNAL_MED_CHANNEL 7 +#define LAST_SIGNAL_MED_SESSION 3 +#define LAST_SIGNAL_MED_STREAM 13 +#define MAX_STREAM_NAME_LEN 8 +#define LAST_SIGNAL_PRE_CACHE 3 +#define LAST_SIGNAL_REGISTER 2 +#define LAST_SIGNAL_ROS_CHNL 3 +#define LAST_SIGNAL_ROOM_CHNL 3 +#define LAST_SIGNAL_ROSTER 1 +#define LAST_SIGNAL_VCARD_MGR 1 + +//todo: what it should be +#define LAST_SIGNAL_SEARCH 1 +typedef struct _GabbleAllocator GabbleAllocator; +struct _GabbleAllocator +{ + gulong size; + guint limit; + guint count; +}; + +typedef enum +{ + GABBLE_DEBUG_PRESENCE = 1 << 0, + GABBLE_DEBUG_GROUPS = 1 << 1, + GABBLE_DEBUG_ROSTER = 1 << 2, + GABBLE_DEBUG_DISCO = 1 << 3, + GABBLE_DEBUG_PROPERTIES = 1 << 4, + GABBLE_DEBUG_ROOMLIST = 1 << 5, + GABBLE_DEBUG_MEDIA = 1 << 6, + GABBLE_DEBUG_MUC = 1 << 7, + GABBLE_DEBUG_CONNECTION = 1 << 8, + GABBLE_DEBUG_IM = 1 << 9, + GABBLE_DEBUG_PERSIST = 1 << 10, + GABBLE_DEBUG_VCARD = 1 << 11, + GABBLE_DEBUG_SEARCH = 1 << 12, +} GabbleDebugFlags; + + +typedef enum { + PRESENCE_CAP_NONE = 0, + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P = 1 << 0, + PRESENCE_CAP_GOOGLE_VOICE = 1 << 1, + PRESENCE_CAP_JINGLE = 1 << 2, + PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO = 1 << 3, + PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO = 1 << 4, +} GabblePresenceCapabilities; + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gheap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gheap.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,40 @@ +/* + * Header file for GHeap + * + * + * Copyright (C) 2006 Nokia Corporation. + * Contact: Olli Salli (Nokia-M/Helsinki) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __G_HEAP_H__ +#define __G_HEAP_H__ + +#include + +typedef struct _GHeap GHeap; + +GHeap *g_heap_new (GCompareFunc comparator); +void g_heap_destroy (GHeap *); +void g_heap_clear (GHeap *); + +void g_heap_add (GHeap *heap, gpointer element); +gpointer g_heap_peek_first (GHeap *heap); +gpointer g_heap_extract_first (GHeap *heap); + +guint g_heap_size (GHeap *heap); + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/gintset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/gintset.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,53 @@ +/* gintset.h - Headers for a Glib-link set of integers + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __G_INTSET_H__ +#define __G_INTSET_H__ + +#include + +typedef struct _GIntSet GIntSet; +typedef void (*GIntFunc) (guint i, gpointer userdata); + +GIntSet *g_intset_new (); +void g_intset_destroy (GIntSet *); +void g_intset_clear (GIntSet *); + +void g_intset_add (GIntSet *set, guint element); +gboolean g_intset_remove (GIntSet *set, guint element); +gboolean g_intset_is_member (const GIntSet *set, guint element); + +void g_intset_foreach (const GIntSet *set, GIntFunc func, gpointer userdata); +GArray *g_intset_to_array (GIntSet *set); +GIntSet *g_intset_from_array (GArray *array); + +guint g_intset_size (const GIntSet *set); + +gboolean g_intset_is_equal (const GIntSet *left, const GIntSet *right); + +GIntSet *g_intset_copy (const GIntSet *orig); +GIntSet *g_intset_intersection (const GIntSet *left, const GIntSet *right); +GIntSet *g_intset_union (const GIntSet *left, const GIntSet *right); +GIntSet *g_intset_difference (const GIntSet *left, const GIntSet *right); +GIntSet *g_intset_symmetric_difference (const GIntSet *left, const GIntSet *right); + +gchar *g_intset_dump (const GIntSet *set); + +#endif /*__G_INTSET_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/group-mixin-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/group-mixin-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,46 @@ +/* + * group-mixin-signals-marshal.h + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __group_mixin_marshal_MARSHAL_H__ +#define __group_mixin_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT (group-mixin-signals-marshal.list:1) */ +extern void group_mixin_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING,BOXED,BOXED,BOXED,BOXED,UINT,UINT (group-mixin-signals-marshal.list:2) */ +extern void group_mixin_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __group_mixin_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/group-mixin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/group-mixin.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,99 @@ +/* + * group-mixin.h - Header for GabbleGroupMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * + * Portions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_GROUP_MIXIN_H__ +#define __GABBLE_GROUP_MIXIN_H__ + +#include "handles.h" +#include "handle-set.h" +#include "util.h" + +G_BEGIN_DECLS + +typedef struct _GabbleGroupMixinClass GabbleGroupMixinClass; +typedef struct _GabbleGroupMixin GabbleGroupMixin; +typedef struct _GabbleGroupMixinPrivate GabbleGroupMixinPrivate; + +typedef gboolean (*GabbleGroupMixinAddMemberFunc) (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); +typedef gboolean (*GabbleGroupMixinRemMemberFunc) (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); + +struct _GabbleGroupMixinClass { + GabbleGroupMixinAddMemberFunc add_member; + GabbleGroupMixinRemMemberFunc remove_member; + + guint group_flags_changed_signal_id; + guint members_changed_signal_id; +}; + +struct _GabbleGroupMixin { + GabbleHandleRepo *handle_repo; + GabbleHandle self_handle; + + TpChannelGroupFlags group_flags; + + GabbleHandleSet *members; + GabbleHandleSet *local_pending; + GabbleHandleSet *remote_pending; + + GabbleGroupMixinPrivate *priv; +}; + +/* TYPE MACROS */ +#define GABBLE_GROUP_MIXIN_CLASS_OFFSET_QUARK (gabble_group_mixin_class_get_offset_quark()) +#define GABBLE_GROUP_MIXIN_CLASS_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_CLASS_TYPE (o), GABBLE_GROUP_MIXIN_CLASS_OFFSET_QUARK))) +#define GABBLE_GROUP_MIXIN_CLASS(o) ((GabbleGroupMixinClass *) gabble_mixin_offset_cast (o, GABBLE_GROUP_MIXIN_CLASS_OFFSET (o))) + +#define GABBLE_GROUP_MIXIN_OFFSET_QUARK (gabble_group_mixin_get_offset_quark()) +#define GABBLE_GROUP_MIXIN_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_TYPE (o), GABBLE_GROUP_MIXIN_OFFSET_QUARK))) +#define GABBLE_GROUP_MIXIN(o) ((GabbleGroupMixin *) gabble_mixin_offset_cast (o, GABBLE_GROUP_MIXIN_OFFSET(o))) + +GQuark gabble_group_mixin_class_get_offset_quark (void); +GQuark gabble_group_mixin_get_offset_quark (void); + +void gabble_group_mixin_class_init (GObjectClass *obj_cls, glong offset, GabbleGroupMixinAddMemberFunc add_func, GabbleGroupMixinRemMemberFunc rem_func); + +void gabble_group_mixin_init (GObject *obj, glong offset, GabbleHandleRepo *handle_repo, GabbleHandle self_handle); +void gabble_group_mixin_finalize (GObject *obj); + +gboolean gabble_group_mixin_get_self_handle (GObject *obj, guint *ret, GError **error); +gboolean gabble_group_mixin_get_group_flags (GObject *obj, guint *ret, GError **error); + +gboolean gabble_group_mixin_add_members (GObject *obj, const GArray *contacts, const gchar *message, GError **error); +gboolean gabble_group_mixin_remove_members (GObject *obj, const GArray *contacts, const gchar *message, GError **error); + +gboolean gabble_group_mixin_get_members (GObject *obj, GArray **ret, GError **error); +gboolean gabble_group_mixin_get_local_pending_members (GObject *obj, GArray **ret, GError **error); +gboolean gabble_group_mixin_get_remote_pending_members (GObject *obj, GArray **ret, GError **error); +gboolean gabble_group_mixin_get_all_members (GObject *obj, GArray **ret, GArray **ret1, GArray **ret2, GError **error); + +gboolean gabble_group_mixin_get_handle_owners (GObject *obj, const GArray *handles, GArray **ret, GError **error); + +void gabble_group_mixin_change_flags (GObject *obj, TpChannelGroupFlags add, TpChannelGroupFlags remove); +gboolean gabble_group_mixin_change_members (GObject *obj, const gchar *message, GIntSet *add, GIntSet *remove, GIntSet *local_pending, GIntSet *remote_pending, GabbleHandle actor, guint reason); + +void gabble_group_mixin_add_handle_owner (GObject *obj, GabbleHandle local_handle, GabbleHandle owner_handle); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_GROUP_MIXIN_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/handle-set.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/handle-set.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,53 @@ +/* + * handle-set.h - a set which refs a handle when inserted + * + * Copyright (C) 2005,2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __HANDLE_SET_H__ +#define __HANDLE_SET_H__ + +#include "gintset.h" + +G_BEGIN_DECLS + +typedef struct _GabbleHandleSet GabbleHandleSet; +typedef void (*GabbleHandleFunc)(GabbleHandleSet *set, GabbleHandle handle, gpointer userdata); + +GabbleHandleSet * handle_set_new (GabbleHandleRepo *, TpHandleType type); +void handle_set_destroy (GabbleHandleSet *); + +GIntSet *handle_set_peek (GabbleHandleSet *set); + +void handle_set_add (GabbleHandleSet *set, GabbleHandle handle); +gboolean handle_set_remove (GabbleHandleSet *set, GabbleHandle handle); +gboolean handle_set_is_member (GabbleHandleSet *set, GabbleHandle handle); + +void handle_set_foreach (GabbleHandleSet *set, GabbleHandleFunc func, gpointer userdata); + +int handle_set_size (GabbleHandleSet *set); +GArray *handle_set_to_array (GabbleHandleSet *set); + +GIntSet *handle_set_update (GabbleHandleSet *set, const GIntSet *add); +GIntSet *handle_set_difference_update (GabbleHandleSet *set, const GIntSet *remove); + +G_END_DECLS + +#endif /*__HANDLE_SET_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/handles.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/handles.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,70 @@ +/* + * handles.h - mechanism to store and retrieve handles on a connection + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __HANDLES_H__ +#define __HANDLES_H__ + +#include + + +#include "gabble-types.h" +#include "telepathy-constants.h" + +G_BEGIN_DECLS + +typedef enum +{ + GABBLE_LIST_HANDLE_PUBLISH = 1, + GABBLE_LIST_HANDLE_SUBSCRIBE, + GABBLE_LIST_HANDLE_KNOWN, + GABBLE_LIST_HANDLE_DENY +} GabbleListHandle; + +gboolean gabble_handle_jid_is_valid (TpHandleType type, const gchar *jid, GError **error); +gboolean gabble_handle_type_is_valid (TpHandleType type, GError **error); + +GabbleHandleRepo *gabble_handle_repo_new (); +void gabble_handle_repo_destroy (GabbleHandleRepo *repo); + +gboolean gabble_handle_is_valid (GabbleHandleRepo *repo, TpHandleType type, GabbleHandle handle, GError **error); +gboolean gabble_handles_are_valid (GabbleHandleRepo *repo, TpHandleType type, const GArray *array, gboolean allow_zero, GError **error); + +gboolean gabble_handle_ref (GabbleHandleRepo *repo, TpHandleType type, GabbleHandle handle); +gboolean gabble_handle_unref (GabbleHandleRepo *repo, TpHandleType type, GabbleHandle handle); +const char *gabble_handle_inspect (GabbleHandleRepo *repo, TpHandleType type, GabbleHandle handle); + +GabbleHandle gabble_handle_for_contact (GabbleHandleRepo *repo, const char *jid, gboolean with_resource); +gboolean gabble_handle_for_room_exists (GabbleHandleRepo *repo, const gchar *jid, gboolean ignore_nick); +GabbleHandle gabble_handle_for_room (GabbleHandleRepo *repo, const gchar *jid); +GabbleHandle gabble_handle_for_list (GabbleHandleRepo *repo, const gchar *list); + +gboolean gabble_handle_set_qdata (GabbleHandleRepo *repo, TpHandleType type, + GabbleHandle handle, GQuark key_id, gpointer data, GDestroyNotify destroy); + +gpointer gabble_handle_get_qdata (GabbleHandleRepo *repo, TpHandleType type, + GabbleHandle handle, GQuark key_id); + +gboolean gabble_handle_client_hold (GabbleHandleRepo *repo, const gchar *client_name, GabbleHandle handle, TpHandleType type, GError **error); + +gboolean gabble_handle_client_release (GabbleHandleRepo *repo, const gchar *client_name, GabbleHandle handle, TpHandleType type, GError **error); + +G_END_DECLS + +#endif /* #ifndef __HANDLES_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/im-factory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/im-factory.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,60 @@ +/* + * im-factory.h - Header for GabbleImFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __IM_FACTORY_H__ +#define __IM_FACTORY_H__ + +#include + +#include "gabble-im-channel.h" + +G_BEGIN_DECLS + +typedef struct _GabbleImFactory GabbleImFactory; +typedef struct _GabbleImFactoryClass GabbleImFactoryClass; + +struct _GabbleImFactoryClass { + GObjectClass parent_class; +}; + +struct _GabbleImFactory { + GObject parent; +}; + +IMPORT_C GType gabble_im_factory_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_IM_FACTORY \ + (gabble_im_factory_get_type()) +#define GABBLE_IM_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_IM_FACTORY, GabbleImFactory)) +#define GABBLE_IM_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_IM_FACTORY, GabbleImFactoryClass)) +#define GABBLE_IS_IM_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_IM_FACTORY)) +#define GABBLE_IS_IM_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_IM_FACTORY)) +#define GABBLE_IM_FACTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_IM_FACTORY, GabbleImFactoryClass)) + + +G_END_DECLS + +#endif /* #ifndef __IM_FACTORY_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/jingle-info.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/jingle-info.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,34 @@ +/* + * jingle-info.h - Header for Jingle info discovery + * Copyright (C) 2006 Collabora Ltd. + * @author Ole Andre Vadla Ravnaas + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __JINGLE_INFO_H__ +#define __JINGLE_INFO_H__ + +#include "gabble-connection.h" + +G_BEGIN_DECLS + +void jingle_info_discover_servers (GabbleConnection *conn); +LmHandlerResult jingle_info_iq_callback (LmMessageHandler *handler, LmConnection *lmconn, LmMessage *message, gpointer user_data); + +G_END_DECLS + +#endif /* __JINGLE_INFO_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/libgabble_wsd_macros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/libgabble_wsd_macros.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,69 @@ +/* + * libgabble_wsd_macros.h - Header + * Copyright (C) 2006 Collabora Ltd. + * @author Ole Andre Vadla Ravnaas + * + + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _LIBGABBLEMACROS_WSD_DEFS_H_ +#define _LIBGABBLEMACROS_WSD_DEFS_H_ + +#if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#if EMULATOR +#undef EMULATOR +#endif +#ifdef GET_WSD_VAR_NAME +#undef GET_WSD_VAR_NAME +#endif + +#define EMULATOR (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) +#define GET_WSD_VAR_NAME(var,filename,prefix) _##prefix##_##filename##_##var + +#define RETURN_WSD_VAR(var,filename,prefix) (libgabble_ImpurePtr()->GET_WSD_VAR_NAME(var,filename,prefix)) + +#define GET_WSD_VAR_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (&RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define GET_WSD_ARRAY_FROM_TLS(var,filename,type,prefix)\ +type *_##prefix##_##filename##_##var()\ +{\ + return (RETURN_WSD_VAR(var,filename,prefix));\ +} + +#define VARIABLE_DECL(var,varprefix,filename,datatype)\ +datatype GET_WSD_VAR_NAME(var,filename,varprefix); + +#define VARIABLE_DECL_ARRAY(var,prefix,filename,datatype,size) \ +datatype GET_WSD_VAR_NAME(var,filename,prefix)[size]; + +#define VARIABLE_DECL_2DARRAY(var,prefix,filename,datatype,size,size1) \ +datatype GET_WSD_VAR_NAME(var,filename,prefix)[size][size1]; + + +#define GET_STATIC_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_VAR_FROM_TLS(var,filename,type) GET_WSD_VAR_FROM_TLS(var,filename,type,g) + +#define GET_STATIC_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,s) + +#define GET_GLOBAL_ARRAY_FROM_TLS(var,filename,type) GET_WSD_ARRAY_FROM_TLS(var,filename,type,g) + +#endif +#endif //_LIBGABBLEMACROS_WSD_DEFS_H_ \ No newline at end of file diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/libgabble_wsd_solution.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/libgabble_wsd_solution.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,236 @@ +/* + * libgabble_wsd_solution.h - Header + * Copyright (C) 2006 Collabora Ltd. + * @author Ole Andre Vadla Ravnaas + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _LIBGABBLE_WSD_H +#define _LIBGABBLE_WSD_H +#include "libgabble_wsd_macros.h" +//#include "debug.h" +#include "telepathy-errors.h" +#include "disco.h" +#include "gabble_enums.h" +#include "ghash.h" +#include "gabble-presence.h" +#include "gabble-media-session.h" + +#define MAX_GABBLE_UTILS_GCHAR_ARRAY_LEN 5 + + +#if EMULATOR +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef gboolean (*StreamHandlerFunc)(GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error); + + + + +typedef struct _Handler Handler; + +struct _Handler { + gchar actions[3][50]; + JingleSessionState min_allowed_state; + JingleSessionState max_allowed_state; + StreamHandlerFunc stream_handlers[4]; + JingleSessionState new_state; +}; + +struct libgabble_global_struct +{ + + VARIABLE_DECL(flags,s,gabble_debug,GabbleDebugFlags) + VARIABLE_DECL(log_handler,s,gabble_debug,guint) + VARIABLE_DECL(etype,s,gabble_enum_types,GType) + + VARIABLE_DECL(etype,s,gabble_media_session_enum_types,GType) + VARIABLE_DECL(etype1,s,gabble_media_session_enum_types,GType) + VARIABLE_DECL(etype2,s,gabble_media_session_enum_types,GType) + + VARIABLE_DECL(quark,s,gabble_disco,GQuark) + VARIABLE_DECL(quark,s,gabble_error,GQuark) + + + VARIABLE_DECL(ssl,s,gabble_conmgr,gboolean) + VARIABLE_DECL(httpport,s,gabble_conmgr,guint) + VARIABLE_DECL(httpproxyport,s,gabble_conmgr,guint) + VARIABLE_DECL_ARRAY(signals,s,gabble_conmgr,guint,LAST_SIGNAL_CON_MGR) + VARIABLE_DECL_ARRAY(signals,s,gabble_con,guint,LAST_SIGNAL_CON) + VARIABLE_DECL(arguments,s,gabble_con,GHashTable*) + VARIABLE_DECL_ARRAY(signals,s,gabble_im,guint,LAST_SIGNAL_IM) + + //todo: later ..see what it should be in search + VARIABLE_DECL_ARRAY(signals,s,gabble_search,guint,LAST_SIGNAL_SEARCH) + + VARIABLE_DECL_ARRAY(signals,s,gabble_muc,guint,LAST_SIGNAL_MUC) + VARIABLE_DECL_ARRAY(signals,s,gabble_med_chnl,guint,LAST_SIGNAL_MED_CHANNEL) + + VARIABLE_DECL_ARRAY(signals,s,gabble_med_sess,guint,LAST_SIGNAL_MED_SESSION) + + + + + VARIABLE_DECL(google_audio_caps,s,gabble_med_sess,GabblePresenceCapabilities) + VARIABLE_DECL(jingle_audio_caps,s,gabble_med_sess,GabblePresenceCapabilities) + VARIABLE_DECL(jingle_video_caps,s,gabble_med_sess,GabblePresenceCapabilities) + + VARIABLE_DECL_ARRAY(ret_sess,s,gabble_med_sess,gchar,MAX_STREAM_NAME_LEN) + + VARIABLE_DECL_ARRAY(signals,s,gabble_med_stream,guint,LAST_SIGNAL_MED_STREAM) + + VARIABLE_DECL_ARRAY(signals,s,gabble_pre_cache,guint,LAST_SIGNAL_PRE_CACHE) + + VARIABLE_DECL_ARRAY(signals,s,gabble_register,guint,LAST_SIGNAL_REGISTER) + + VARIABLE_DECL_ARRAY(signals,s,gabble_ros_chnl,guint,LAST_SIGNAL_ROS_CHNL) + + VARIABLE_DECL_ARRAY(signals,s,gabble_room_chnl,guint,LAST_SIGNAL_ROOM_CHNL) + + VARIABLE_DECL(offset_quark1,s,gabble_mixin,GQuark) + VARIABLE_DECL(offset_quark,s,gabble_mixin,GQuark) + + VARIABLE_DECL_ARRAY(signals,s,gabble_roster,guint,LAST_SIGNAL_ROSTER) + + VARIABLE_DECL(quark,s,gabble_errors,GQuark) + + VARIABLE_DECL(busCon,s,gabble_helpers,DBusGConnection*) + VARIABLE_DECL(bus_proxy,s,gabble_helpers,DBusGProxy*) + + VARIABLE_DECL(offset_quark1,s,gabble_txt_mixin,GQuark) + VARIABLE_DECL(offset_quark,s,gabble_txt_mixin,GQuark) + VARIABLE_DECL(alloc1,s,gabble_txt_mixin,GabbleAllocator) + + VARIABLE_DECL(offset_quark1,s,gabble_search_mixin,GQuark) + VARIABLE_DECL(offset_quark,s,gabble_search_mixin,GQuark) + //todo: check if this required for search + VARIABLE_DECL(alloc1,s,gabble_search_mixin,GabbleAllocator) + + VARIABLE_DECL(type,s,gabble_chnl_iface,GType) + VARIABLE_DECL(initialized,s,gabble_chnl_iface,gboolean) + + VARIABLE_DECL(type,s,gabble_fac_iface,GType) + VARIABLE_DECL(initialized,s,gabble_fac_iface,gboolean) + + VARIABLE_DECL_ARRAY(signals,s,gabble_vcard_mgr,guint,LAST_SIGNAL_VCARD_MGR) + VARIABLE_DECL(quark1,s,gabble_vcard_mgr,GQuark) + VARIABLE_DECL(quark2,s,gabble_vcard_mgr,GQuark) + + + VARIABLE_DECL(offset_quark1,s,gabble_grp_mixin,GQuark) + VARIABLE_DECL(offset_quark,s,gabble_grp_mixin,GQuark) + + + VARIABLE_DECL(gabble_disco_parent_class,s,gabble_disco,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_disco,GType) + + VARIABLE_DECL(gabble_connection_manager_parent_class,s,gabble_conmgr,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_conmgr,GType) + + VARIABLE_DECL(gabble_connection_parent_class,s,gabble_con,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_con,GType) + + VARIABLE_DECL(gabble_im_channel_parent_class,s,gabble_im,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_im,GType) + + VARIABLE_DECL(gabble_search_channel_parent_class,s,gabble_search,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_search,GType) + + VARIABLE_DECL(gabble_muc_channel_parent_class,s,gabble_muc,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_muc,GType) + + VARIABLE_DECL(gabble_media_channel_parent_class,s,gabble_med_chnl,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_med_chnl,GType) + + VARIABLE_DECL(gabble_media_stream_parent_class,s,gabble_med_stream,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_med_stream,GType) + + VARIABLE_DECL(gabble_presence_parent_class,s,gabble_presence,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_presence,GType) + + VARIABLE_DECL(gabble_presence_cache_parent_class,s,gabble_pre_cache,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_pre_cache,GType) + + VARIABLE_DECL(gabble_register_parent_class,s,gabble_register,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_register,GType) + + VARIABLE_DECL(gabble_roster_channel_parent_class,s,gabble_ros_chnl,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_ros_chnl,GType) + + VARIABLE_DECL(gabble_roomlist_channel_parent_class,s,gabble_room_chnl,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_room_chnl,GType) + + VARIABLE_DECL(gabble_im_factory_parent_class ,s,im_factory,gpointer) + VARIABLE_DECL(g_define_type_id,s,im_factory,GType) + + VARIABLE_DECL(gabble_search_factory_parent_class ,s,search_factory,gpointer) + VARIABLE_DECL(g_define_type_id,s,search_factory,GType) + + VARIABLE_DECL(gabble_media_factory_parent_class ,s,media_factory,gpointer) + VARIABLE_DECL(g_define_type_id,s,media_factory,GType) + + VARIABLE_DECL(gabble_muc_factory_parent_class ,s,muc_factory,gpointer) + VARIABLE_DECL(g_define_type_id,s,muc_factory,GType) + + VARIABLE_DECL(gabble_vcard_manager_parent_class ,s,gabble_vcard_mgr,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_vcard_mgr,GType) + + VARIABLE_DECL_ARRAY(keys,s,gabble_debug,GDebugKey,12) + + VARIABLE_DECL_ARRAY(NO_ALIAS,s,gabble_vcard_mgr,gchar,MAX_GABBLE_UTILS_GCHAR_ARRAY_LEN) + + + VARIABLE_DECL_2DARRAY(assumed_caps,s,gabble_con,gchar,3,150) + + VARIABLE_DECL_2DARRAY(muc_roles,s,gabble_muc,gchar,4,20) + VARIABLE_DECL_2DARRAY(muc_affiliations,s,gabble_muc,gchar,4,20) + + VARIABLE_DECL_2DARRAY(video_codec_params,s,gabble_med_stream,gchar,6,20) + + VARIABLE_DECL_2DARRAY(list_handle_strings,s,handles,char,4,20) + + VARIABLE_DECL_ARRAY(handlers,s,gabble_med_sess,Handler,10) + + VARIABLE_DECL(gabble_media_session_parent_class ,s,gabble_med_sess,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_med_sess,GType) + + VARIABLE_DECL(gabble_roster_parent_class ,s,gabble_roster,gpointer) + VARIABLE_DECL(g_define_type_id,s,gabble_roster,GType) + + + /*END-global vars*/ + + }; + +struct libgabble_global_struct * libgabble_ImpurePtr(); +int libgabble_Init(struct libgabble_global_struct *); +#ifdef __cplusplus +} +#endif +#endif //EMULATOR +#endif //header guard ifdef _LIBGABBLE_WSD_H + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/media-factory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/media-factory.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,63 @@ +/* + * media-factory.h - Header for GabbleMediaFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __MEDIA_FACTORY_H__ +#define __MEDIA_FACTORY_H__ + +#include + +#include "gabble-media-channel.h" + +G_BEGIN_DECLS + +typedef struct _GabbleMediaFactory GabbleMediaFactory; +typedef struct _GabbleMediaFactoryClass GabbleMediaFactoryClass; + +struct _GabbleMediaFactoryClass { + GObjectClass parent_class; +}; + +struct _GabbleMediaFactory { + GObject parent; +}; + +IMPORT_C GType gabble_media_factory_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MEDIA_FACTORY \ + (gabble_media_factory_get_type()) +#define GABBLE_MEDIA_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MEDIA_FACTORY, GabbleMediaFactory)) +#define GABBLE_MEDIA_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MEDIA_FACTORY, GabbleMediaFactoryClass)) +#define GABBLE_IS_MEDIA_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MEDIA_FACTORY)) +#define GABBLE_IS_MEDIA_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MEDIA_FACTORY)) +#define GABBLE_MEDIA_FACTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MEDIA_FACTORY, GabbleMediaFactoryClass)) + +const gchar * _gabble_media_factory_allocate_sid (GabbleMediaFactory *fac, GabbleMediaChannel *chan); +const gchar * _gabble_media_factory_register_sid (GabbleMediaFactory *fac, const gchar *sid, GabbleMediaChannel *chan); +void _gabble_media_factory_free_sid (GabbleMediaFactory *fac, const gchar *sid); + +G_END_DECLS + +#endif /* #ifndef __MEDIA_FACTORY_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/muc-factory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/muc-factory.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,56 @@ +/* + * muc-factory.h - Header for GabbleMucFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __MUC_FACTORY_H__ +#define __MUC_FACTORY_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GabbleMucFactory GabbleMucFactory; +typedef struct _GabbleMucFactoryClass GabbleMucFactoryClass; + +struct _GabbleMucFactoryClass { + GObjectClass parent_class; +}; + +struct _GabbleMucFactory { + GObject parent; +}; + +IMPORT_C GType gabble_muc_factory_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_MUC_FACTORY \ + (gabble_muc_factory_get_type()) +#define GABBLE_MUC_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_MUC_FACTORY, GabbleMucFactory)) +#define GABBLE_MUC_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_MUC_FACTORY, GabbleMucFactoryClass)) +#define GABBLE_IS_MUC_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_MUC_FACTORY)) +#define GABBLE_IS_MUC_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_MUC_FACTORY)) +#define GABBLE_MUC_FACTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MUC_FACTORY, GabbleMucFactoryClass)) + +G_END_DECLS + +#endif /* #ifndef __MUC_FACTORY_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/namespaces.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/namespaces.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,59 @@ +/* + * namespaces.h - XMPP namespace constants + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_NAMESPACES__H__ +#define __GABBLE_NAMESPACES__H__ + +#define NS_CAPS "http://jabber.org/protocol/caps" +#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info" +#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items" +#define NS_GABBLE_CAPS "http://telepathy.freedesktop.org/caps" +#define NS_GOOGLE_CAPS "http://www.google.com/xmpp/client/caps" +#define NS_GOOGLE_FEAT_SESSION "http://www.google.com/xmpp/protocol/session" +#define NS_GOOGLE_FEAT_VOICE "http://www.google.com/xmpp/protocol/voice/v1" +#define NS_GOOGLE_JINGLE_INFO "google:jingleinfo" +#define NS_GOOGLE_ROSTER "google:roster" +#define NS_GOOGLE_SESSION "http://www.google.com/session" +#define NS_GOOGLE_SESSION_PHONE "http://www.google.com/session/phone" +#define NS_GOOGLE_TRANSPORT_P2P "http://www.google.com/transport/p2p" +#define NS_JINGLE "http://jabber.org/protocol/jingle" +#define NS_JINGLE_DESCRIPTION_AUDIO "http://jabber.org/protocol/jingle/description/audio" +#define NS_JINGLE_DESCRIPTION_VIDEO "http://jabber.org/protocol/jingle/description/video" +#define NS_JINGLE_ERRORS "http://jabber.org/protocol/jingle#errors" +#define NS_JINGLE_TRANSPORT_ICE "http://jabber.org/protocol/jingle/transport/ice" +#define NS_MUC "http://jabber.org/protocol/muc" +#define NS_MUC_USER "http://jabber.org/protocol/muc#user" +#define NS_MUC_ADMIN "http://jabber.org/protocol/muc#admin" +#define NS_MUC_OWNER "http://jabber.org/protocol/muc#owner" +#define NS_NICK "http://jabber.org/protocol/nick" +#define NS_PRESENCE_INVISIBLE "presence-invisible" +#define NS_PRIVACY "jabber:iq:privacy" +#define NS_REGISTER "jabber:iq:register" +#define NS_ROSTER "jabber:iq:roster" +#define NS_VCARD_TEMP "vcard-temp" +#define NS_X_DATA "jabber:x:data" +#define NS_X_DELAY "jabber:x:delay" +#define NS_X_CONFERENCE "jabber:x:conference" +#define NS_XMPP_STANZAS "urn:ietf:params:xml:ns:xmpp-stanzas" +#define NS_SEARCH "jabber:iq:search" +#define NS_VCARD_TEMP "vcard-temp" +#define NS_VCARD_TEMP_UPDATE "vcard-temp:x:update" + +#endif /* __GABBLE_NAMESPACES__H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/properties-mixin-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/properties-mixin-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,30 @@ +/* + * properties-mixin-signals-marshal.h - Headers for Gabble roster helper + * + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __properties_mixin_marshal_MARSHAL_H__ +#define __properties_mixin_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +G_END_DECLS + +#endif /* __properties_mixin_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/properties-mixin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/properties-mixin.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,135 @@ +/* + * properties-mixin.h - Header for GabblePropertiesMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_PROPERTIES_MIXIN_H__ +#define __GABBLE_PROPERTIES_MIXIN_H__ + +#include "handles.h" +#include "handle-set.h" +#include "util.h" + +G_BEGIN_DECLS + +struct _GabblePropertySignature { + gchar *name; + GType type; +}; + +typedef struct _GabblePropertySignature GabblePropertySignature; + +struct _GabbleProperty { + GValue *value; + guint flags; +}; + +typedef struct _GabbleProperty GabbleProperty; + +typedef struct _GabblePropertiesContext GabblePropertiesContext; +typedef gboolean (*GabblePropertiesSetFunc) (GObject *obj, GabblePropertiesContext *ctx, GError **error); + +struct _GabblePropertiesMixinClass { + const GabblePropertySignature *signatures; + guint num_props; + + GabblePropertiesSetFunc set_properties; + + guint property_flags_changed_signal_id; + guint properties_changed_signal_id; +}; + +typedef struct _GabblePropertiesMixinClass GabblePropertiesMixinClass; + +typedef struct _GabblePropertiesMixinPrivate GabblePropertiesMixinPrivate; + +struct _GabblePropertiesMixin { + GabbleProperty *properties; + + GabblePropertiesMixinPrivate *priv; +}; + +typedef struct _GabblePropertiesMixin GabblePropertiesMixin; + +/* TYPE MACROS */ +#define GABBLE_PROPERTIES_MIXIN_CLASS_OFFSET_QUARK (gabble_properties_mixin_class_get_offset_quark()) +#define GABBLE_PROPERTIES_MIXIN_CLASS_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_CLASS_TYPE (o), GABBLE_PROPERTIES_MIXIN_CLASS_OFFSET_QUARK))) +#define GABBLE_PROPERTIES_MIXIN_CLASS(o) ((GabblePropertiesMixinClass *) gabble_mixin_offset_cast (o, GABBLE_PROPERTIES_MIXIN_CLASS_OFFSET (o))) + +#define GABBLE_PROPERTIES_MIXIN_OFFSET_QUARK (gabble_properties_mixin_get_offset_quark()) +#define GABBLE_PROPERTIES_MIXIN_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_TYPE (o), GABBLE_PROPERTIES_MIXIN_OFFSET_QUARK))) +#define GABBLE_PROPERTIES_MIXIN(o) ((GabblePropertiesMixin *) gabble_mixin_offset_cast (o, GABBLE_PROPERTIES_MIXIN_OFFSET (o))) + +#define TP_TYPE_PROPERTY_INFO_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_STRING, \ + G_TYPE_UINT, \ + G_TYPE_INVALID)) +#define TP_TYPE_PROPERTY_INFO_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_PROPERTY_INFO_STRUCT)) + +#define TP_TYPE_PROPERTY_VALUE_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_VALUE, \ + G_TYPE_INVALID)) +#define TP_TYPE_PROPERTY_VALUE_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_PROPERTY_VALUE_STRUCT)) + +#define TP_TYPE_PROPERTY_FLAGS_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_INVALID)) +#define TP_TYPE_PROPERTY_FLAGS_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_PROPERTY_FLAGS_STRUCT)) + +GQuark gabble_properties_mixin_class_get_offset_quark (void); +GQuark gabble_properties_mixin_get_offset_quark (void); + +void gabble_properties_mixin_class_init (GObjectClass *obj_cls, glong offset, const GabblePropertySignature *signatures, guint num_properties, GabblePropertiesSetFunc set_func); + +void gabble_properties_mixin_init (GObject *obj, glong offset); +void gabble_properties_mixin_finalize (GObject *obj); + +gboolean gabble_properties_mixin_list_properties (GObject *obj, GPtrArray **ret, GError **error); +gboolean gabble_properties_mixin_get_properties (GObject *obj, const GArray *properties, GPtrArray **ret, GError **error); +void gabble_properties_mixin_set_properties (GObject *obj, const GPtrArray *properties, DBusGMethodInvocation *context); + +gboolean gabble_properties_mixin_has_property (GObject *obj, const gchar *name, guint *property); + +gboolean gabble_properties_context_has (GabblePropertiesContext *ctx, guint property); +gboolean gabble_properties_context_has_other_than (GabblePropertiesContext *ctx, guint property); +const GValue *gabble_properties_context_get (GabblePropertiesContext *ctx, guint property); +guint gabble_properties_context_get_value_count (GabblePropertiesContext *ctx); +void gabble_properties_context_remove (GabblePropertiesContext *ctx, guint property); +void gabble_properties_context_return (GabblePropertiesContext *ctx, GError *error); +gboolean gabble_properties_context_return_if_done (GabblePropertiesContext *ctx); + +void gabble_properties_mixin_change_value (GObject *obj, guint prop_id, const GValue *new_value, GArray **props); +void gabble_properties_mixin_change_flags (GObject *obj, guint prop_id, TpPropertyFlags add, TpPropertyFlags remove, GArray **props); +void gabble_properties_mixin_emit_changed (GObject *obj, GArray **props); +void gabble_properties_mixin_emit_flags (GObject *obj, GArray **props); + +gboolean gabble_properties_mixin_is_readable (GObject *obj, guint prop_id); +gboolean gabble_properties_mixin_is_writable (GObject *obj, guint prop_id); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_PROPERTIES_MIXIN_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/roster.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/roster.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,80 @@ +/* + * roster.h - Headers for Gabble roster helper + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __ROSTER_H__ +#define __ROSTER_H__ + +#include + +#include "gabble-types.h" + +G_BEGIN_DECLS + +typedef struct _GabbleRosterClass GabbleRosterClass; + +IMPORT_C GType gabble_roster_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_ROSTER \ + (gabble_roster_get_type()) +#define GABBLE_ROSTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_ROSTER, GabbleRoster)) +#define GABBLE_ROSTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_ROSTER, GabbleRosterClass)) +#define GABBLE_IS_ROSTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_ROSTER)) +#define GABBLE_IS_ROSTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_ROSTER)) +#define GABBLE_ROSTER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_ROSTER, GabbleRosterClass)) + +struct _GabbleRosterClass { + GObjectClass parent_class; +}; + +struct _GabbleRoster { + GObject parent; + gpointer priv; +}; + +typedef enum +{ + GABBLE_ROSTER_SUBSCRIPTION_NONE = 0, + GABBLE_ROSTER_SUBSCRIPTION_FROM = 1 << 0, + GABBLE_ROSTER_SUBSCRIPTION_TO = 1 << 1, + GABBLE_ROSTER_SUBSCRIPTION_BOTH = GABBLE_ROSTER_SUBSCRIPTION_FROM | + GABBLE_ROSTER_SUBSCRIPTION_TO, + GABBLE_ROSTER_SUBSCRIPTION_REMOVE = 1 << 2, +} GabbleRosterSubscription; + +GabbleRoster *gabble_roster_new (GabbleConnection *); + +GabbleRosterSubscription gabble_roster_handle_get_subscription (GabbleRoster *, GabbleHandle); +gboolean gabble_roster_handle_set_blocked (GabbleRoster *, GabbleHandle, gboolean, GError **); +const gchar *gabble_roster_handle_get_name (GabbleRoster *, GabbleHandle); +gboolean gabble_roster_handle_set_name (GabbleRoster *, GabbleHandle, const gchar *, GError **); +gboolean gabble_roster_handle_remove (GabbleRoster *, GabbleHandle, GError **); +gboolean gabble_roster_handle_add (GabbleRoster *, GabbleHandle, GError **); +gboolean gabble_roster_handle_has_entry (GabbleRoster *, GabbleHandle); + +G_END_DECLS + +#endif /* __ROSTER_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/search-factory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/search-factory.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,60 @@ +/* + * search-factory.h - Header for GabbleSearchFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SEARCH_FACTORY_H__ +#define __SEARCH_FACTORY_H__ + +#include + +#include "gabble-search-channel.h" + +G_BEGIN_DECLS + +typedef struct _GabbleSearchFactory GabbleSearchFactory; +typedef struct _GabbleSearchFactoryClass GabbleSearchFactoryClass; + +struct _GabbleSearchFactoryClass { + GObjectClass parent_class; +}; + +struct _GabbleSearchFactory { + GObject parent; +}; + +IMPORT_C GType gabble_search_factory_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_SEARCH_FACTORY \ + (gabble_search_factory_get_type()) +#define GABBLE_SEARCH_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_SEARCH_FACTORY, GabbleSearchFactory)) +#define GABBLE_SEARCH_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_SEARCH_FACTORY, GabbleSearchFactoryClass)) +#define GABBLE_IS_SEARCH_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_SEARCH_FACTORY)) +#define GABBLE_IS_SEARCH_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_SEARCH_FACTORY)) +#define GABBLE_SEARCH_FACTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_SEARCH_FACTORY, GabbleSearchFactoryClass)) + + +G_END_DECLS + +#endif /* #ifndef __IM_FACTORY_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/search-keys-info.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/search-keys-info.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,36 @@ +/* + * search-keys-info.h - Header for Search Keys and reported fields + * Copyright (C) 2008 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SEARCH_KEYS_INFO_H__ +#define __SEARCH_KEYS_INFO_H__ + +#include "gabble-connection.h" + +G_BEGIN_DECLS + +void search_keys_info_discover (GabbleConnection *conn); +gboolean _gabble_submit_search_form (GabbleConnection *conn); +LmHandlerResult search_keys_iq_cb (LmMessageHandler *handler, LmConnection *lmconn, LmMessage *message, gpointer user_data); +void +get_search_keys_info (GabbleConnection *conn, const gchar *jid ); + +G_END_DECLS + +#endif /* __SEARCH_KEYS_INFO_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/search-mixin-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/search-mixin-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* + * search-mixin-signals-marshal.h - Headers for Telepathy Channel Factory interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __search_mixin_marshal_MARSHAL_H__ +#define __search_mixin_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT,UINT,UINT,UINT,STRING (search-mixin-signals-marshal.list:1) */ +extern void search_mixin_marshal_VOID__UINT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + + + + +G_END_DECLS + +#endif /* __search_mixin_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/search-mixin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/search-mixin.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,98 @@ +/* + * text-mixin.h - Header for GabbleSearchMixin + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_SEARCH_MIXIN_H__ +#define __GABBLE_SEARCH_MIXIN_H__ + +#include "handles.h" +#include "handle-set.h" +#include "util.h" + + + +G_BEGIN_DECLS + +typedef struct _GabbleSearchMixinClass GabbleSearchMixinClass; +typedef struct _GabbleSearchMixin GabbleSearchMixin; + +struct _GabbleSearchMixinClass { + guint search_result_received_signal_id; + guint search_state_changed_signal_id; +}; + +struct _GabbleSearchMixin { + + //todo: any data if required + guint search_state; + +}; + +GType gabble_search_mixin_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_SEARCH_MIXIN_CLASS_OFFSET_QUARK (gabble_search_mixin_class_get_offset_quark()) +#define GABBLE_SEARCH_MIXIN_CLASS_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_CLASS_TYPE (o), GABBLE_SEARCH_MIXIN_CLASS_OFFSET_QUARK))) +#define GABBLE_SEARCH_MIXIN_CLASS(o) ((GabbleSearchMixinClass *) gabble_mixin_offset_cast (o, GABBLE_SEARCH_MIXIN_CLASS_OFFSET (o))) + +#define GABBLE_SEARCH_MIXIN_OFFSET_QUARK (gabble_search_mixin_get_offset_quark()) +#define GABBLE_SEARCH_MIXIN_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_TYPE (o), GABBLE_SEARCH_MIXIN_OFFSET_QUARK))) +#define GABBLE_SEARCH_MIXIN(o) ((GabbleSearchMixin *) gabble_mixin_offset_cast (o, GABBLE_SEARCH_MIXIN_OFFSET (o))) + +GQuark gabble_search_mixin_class_get_offset_quark (void); +GQuark gabble_search_mixin_get_offset_quark (void); + +void gabble_search_mixin_class_init (GObjectClass *obj_cls, glong offset); +void gabble_search_mixin_init (GObject *obj, glong offset ); + +void gabble_search_mixin_finalize (GObject *obj); + +gboolean gabble_search_mixin_search (GObject *obj,GHashTable *params, + GabbleConnection *conn, + GError **error); + +gboolean gabble_search_mixin_get_search_state ( GObject *obj, guint *ret, + GError **error ); + +void +_gabble_search_mixin_emit_search_result_received (GObject *obj, + guint contact_handle, + GHashTable *values ); + +void +_gabble_search_mixin_emit_search_state_changed (GObject *obj, + guint search_state ); + + +void +_gabble_search_mixin_set_search_state (GObject *obj, guint state ); + +gboolean +gabble_search_mixin_get_search_keys ( GObject *obj, + gchar **ret_instruction, + gchar ***ret_searchkeys, + GabbleConnection *conn, + GError **error + ); + + +G_END_DECLS + +#endif /* #ifndef __GABBLE_SEARCH_MIXIN_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/sha1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/sha1.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2001-2003 Allan Saddi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ALLAN SADDI AND HIS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL ALLAN SADDI OR HIS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: sha1.h 347 2003-02-23 22:11:49Z asaddi $ + */ + +#ifndef _SHA1_H +#define _SHA1_H + +# include + +#define SHA1_HASH_SIZE 20 + +/* Hash size in 32-bit words */ +#define SHA1_HASH_WORDS 5 + +struct _SHA1Context { + uint64_t totalLength; + uint32_t hash[SHA1_HASH_WORDS]; + uint32_t bufferLength; + union { + uint32_t words[16]; + uint8_t bytes[64]; + } buffer; +#ifdef RUNTIME_ENDIAN + int littleEndian; +#endif /* RUNTIME_ENDIAN */ +}; + +typedef struct _SHA1Context SHA1Context; + +#ifdef __cplusplus +extern "C" { +#endif + +void SHA1Init (SHA1Context *sc); +void SHA1Update (SHA1Context *sc, const void *data, uint32_t len); +void SHA1Final (SHA1Context *sc, uint8_t hash[SHA1_HASH_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif /* _SHA1_H */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/telepathy-constants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/telepathy-constants.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,189 @@ +/* + * telepathy-constants.h - constants used in telepathy + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_CONSTANTS_H__ +#define __TELEPATHY_CONSTANTS_H__ + +#include +G_BEGIN_DECLS + +typedef enum { +TP_CHANNEL_GROUP_CHANGE_REASON_NONE = 0, +TP_CHANNEL_GROUP_CHANGE_REASON_OFFLINE = 1, +TP_CHANNEL_GROUP_CHANGE_REASON_KICKED = 2, +TP_CHANNEL_GROUP_CHANGE_REASON_BUSY = 3, +TP_CHANNEL_GROUP_CHANGE_REASON_INVITED = 4, +TP_CHANNEL_GROUP_CHANGE_REASON_BANNED = 5, +TP_CHANNEL_GROUP_CHANGE_REASON_ERROR = 6, +} TpChannelGroupChangeReason; + +typedef enum { +TP_CHANNEL_MEDIA_CAPABILITY_AUDIO = 1, +TP_CHANNEL_MEDIA_CAPABILITY_VIDEO = 2 +} TpChannelMediaCapabilities; + +typedef enum { +TP_CONN_ALIAS_FLAG_USER_SET = 1 +} TpConnAliasFlags; + +typedef enum { +TP_CONN_CAPABILITY_FLAG_CREATE = 1, +TP_CONN_CAPABILITY_FLAG_INVITE = 2 +} TpConnectionCapabilityFlags; + +typedef enum { +TP_HANDLE_TYPE_NONE = 0, +TP_HANDLE_TYPE_CONTACT = 1, +TP_HANDLE_TYPE_ROOM = 2, +TP_HANDLE_TYPE_LIST = 3 +} TpHandleType; + +typedef enum { +TP_CONN_MGR_PARAM_FLAG_REQUIRED = 1, +TP_CONN_MGR_PARAM_FLAG_REGISTER = 2, +TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT = 4 +} TpConnectionManagerParamFlags; + +typedef enum { +TP_CONN_PRESENCE_TYPE_UNSET = 0, +TP_CONN_PRESENCE_TYPE_OFFLINE = 1, +TP_CONN_PRESENCE_TYPE_AVAILABLE = 2, +TP_CONN_PRESENCE_TYPE_AWAY = 3, +TP_CONN_PRESENCE_TYPE_EXTENDED_AWAY = 4, +TP_CONN_PRESENCE_TYPE_HIDDEN = 5 +} TpConnectionPresenceType; + +typedef enum { +TP_CONN_STATUS_CONNECTED = 0, +TP_CONN_STATUS_CONNECTING = 1, +TP_CONN_STATUS_DISCONNECTED = 2, +TP_CONN_STATUS_NEW = 10000 +} TpConnectionStatus; + +typedef enum { +TP_CONN_STATUS_REASON_NONE_SPECIFIED = 0, +TP_CONN_STATUS_REASON_REQUESTED = 1, +TP_CONN_STATUS_REASON_NETWORK_ERROR = 2, +TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED = 3, +TP_CONN_STATUS_REASON_ENCRYPTION_ERROR = 4, +TP_CONN_STATUS_REASON_NAME_IN_USE = 5, +TP_CONN_STATUS_REASON_CERT_NOT_PROVIDED = 6, +TP_CONN_STATUS_REASON_CERT_UNTRUSTED = 7, +TP_CONN_STATUS_REASON_CERT_EXPIRED = 8, +TP_CONN_STATUS_REASON_CERT_NOT_ACTIVATED = 9, +TP_CONN_STATUS_REASON_CERT_HOSTNAME_MISMATCH = 10, +TP_CONN_STATUS_REASON_CERT_FINGERPRINT_MISMATCH = 11, +TP_CONN_STATUS_REASON_CERT_SELF_SIGNED = 12, +TP_CONN_STATUS_REASON_CERT_OTHER_ERROR = 13 +} TpConnectionStatusReason; + +typedef enum { +TP_CHANNEL_CONTACT_SEARCH_STATE_BEFORE = 0, +TP_CHANNEL_CONTACT_SEARCH_STATE_DURING = 1, +TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER = 2 +} TpChannelContactSearchState; + +typedef enum { +TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL = 0, +TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION = 1, +TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE = 2 +} TpChannelTextMessageType; + +typedef enum { +TP_CHANNEL_GROUP_FLAG_CAN_ADD = 1, +TP_CHANNEL_GROUP_FLAG_CAN_REMOVE = 2, +TP_CHANNEL_GROUP_FLAG_CAN_RESCIND = 4, +TP_CHANNEL_GROUP_FLAG_MESSAGE_ADD = 8, +TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE = 16, +TP_CHANNEL_GROUP_FLAG_MESSAGE_ACCEPT = 32, +TP_CHANNEL_GROUP_FLAG_MESSAGE_REJECT = 64, +TP_CHANNEL_GROUP_FLAG_MESSAGE_RESCIND = 128, +TP_CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES = 256, +} TpChannelGroupFlags; + +typedef enum { +TP_CHANNEL_HOLD_STATE_NONE = 0, +TP_CHANNEL_HOLD_STATE_SEND_ONLY = 1, +TP_CHANNEL_HOLD_STATE_RECV_ONLY = 2, +TP_CHANNEL_HOLD_STATE_BOTH = 3 +} TpChannelHoldState; + +typedef enum { +TP_CHANNEL_PASSWORD_FLAG_PROVIDE = 8 +} TpChannelPasswordFlags; + +typedef enum { +TP_CHANNEL_TEXT_MESSAGE_FLAG_TRUNCATED = 1 +} TpChannelTextMessageFlags; + +typedef enum { +TP_MEDIA_STREAM_TYPE_AUDIO = 0, +TP_MEDIA_STREAM_TYPE_VIDEO = 1 +} TpMediaStreamType; + +typedef enum { +TP_MEDIA_STREAM_DIRECTION_NONE = 0, +TP_MEDIA_STREAM_DIRECTION_SEND = 1, +TP_MEDIA_STREAM_DIRECTION_RECEIVE = 2, +TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL = 3 +} TpMediaStreamDirection; + +typedef enum { +TP_MEDIA_STREAM_PENDING_NONE = 0, +TP_MEDIA_STREAM_PENDING_LOCAL_SEND = 1, +TP_MEDIA_STREAM_PENDING_REMOTE_SEND = 2 +} TpMediaStreamPendingSend; + +typedef enum { +TP_MEDIA_STREAM_ERROR_UNKNOWN = 0, +TP_MEDIA_STREAM_ERROR_EOS = 1 +} TpMediaStreamError; + +typedef enum { +TP_MEDIA_STREAM_PROTO_UDP = 0, +TP_MEDIA_STREAM_PROTO_TCP = 1 +} TpMediaStreamProto; + +typedef enum { +TP_MEDIA_STREAM_TRANSPORT_TYPE_LOCAL = 0, +TP_MEDIA_STREAM_TRANSPORT_TYPE_DERIVED = 1, +TP_MEDIA_STREAM_TRANSPORT_TYPE_RELAY = 2 +} TpMediaStreamTransportType; + +typedef enum { +TP_CODEC_MEDIA_TYPE_AUDIO = 0, +TP_CODEC_MEDIA_TYPE_VIDEO = 1, +} TpCodecMediaType; + +typedef enum { +TP_MEDIA_STREAM_STATE_DISCONNECTED = 0, +TP_MEDIA_STREAM_STATE_CONNECTING = 1, +TP_MEDIA_STREAM_STATE_CONNECTED = 2 +} TpMediaStreamState; + +typedef enum { +TP_PROPERTY_FLAG_READ = 1, +TP_PROPERTY_FLAG_WRITE = 2 +} TpPropertyFlags; + +G_END_DECLS + + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/telepathy-errors-enumtypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/telepathy-errors-enumtypes.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,42 @@ +/* + * telepathy-errors-enumtypes.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + + */ +/* Generated data (by glib-mkenums) */ + +#ifndef __TELEPATHY_ERRORS_ENUM_TYPES_H__ +#define __TELEPATHY_ERRORS_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS +/* enumerations from "telepathy-errors.h" */ +#ifdef SYMBIAN +IMPORT_C +#endif +GType telepathy_errors_get_type (void); +#define TELEPATHY_TYPE_ERRORS (telepathy_errors_get_type()) +G_END_DECLS + +#endif /* __TELEPATHY_ERRORS_ENUM_TYPES_H__ */ + +/* Generated data ends here */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/telepathy-errors.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/telepathy-errors.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,68 @@ +/* + * telepathy-errors.h - Header for Telepathy error types + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_ERRORS_H__ +#define __TELEPATHY_ERRORS_H__ + +#include + +G_BEGIN_DECLS + +typedef enum +{ + ChannelBanned, /** You are banned from the channel. + */ + ChannelFull, /** The channel is full. + */ + ChannelInviteOnly, /** The requested channel is invite only. + */ + Disconnected, /** The connection is not currently connected and cannot + * be used. + */ + InvalidArgument, /** Raised when one of the provided arguments is invalid. + */ + InvalidHandle, /** The contact name specified is unknown on this channel + * or connection. + */ + NetworkError, /** Raised when there is an error reading from or writing + * to the network. + */ + NotAvailable, /** Raised when the requested functionality is temporarily + * unavailable. + */ + NotImplemented, /** Raised when the requested method, channel, etc is not + * available on this connection. + */ + PermissionDenied, /** The user is not permitted to perform the requested + * operation. + */ + MemoryFull /** Not able to allocate more memory + */ +} TelepathyErrors; + +#ifdef SYMBIAN +IMPORT_C +#endif +GQuark telepathy_errors_quark (void); +#define TELEPATHY_ERRORS telepathy_errors_quark () + +G_END_DECLS + +#endif /* #ifndef __TELEPATHY_ERRORS_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/telepathy-helpers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/telepathy-helpers.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* + * telepathy-helpers.h - Header for various helper functions + * for telepathy implementation + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_HELPERS_H__ +#define __TELEPATHY_HELPERS_H__ + +#include + +G_BEGIN_DECLS + +typedef struct +{ + gpointer key; + gpointer value; +} TpKeyValue; + +DBusGConnection * tp_get_bus (); +DBusGProxy * tp_get_bus_proxy (); +GSList *tp_hash_to_key_value_list (GHashTable *hash); +void tp_key_value_list_free (GSList *list); + +G_END_DECLS + +#endif /* __TELEPATHY_HELPERS_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/telepathy-interfaces.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/telepathy-interfaces.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,81 @@ +/* + * telepathy-interfaces.h - Header for Telepathy interface names + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TELEPATHY_INTERFACES_H__ +#define __TELEPATHY_INTERFACES_H__ + +#include + +G_BEGIN_DECLS + +#define TP_IFACE_CHANNEL_INTERFACE \ + "org.freedesktop.Telepathy.Channel" +#define TP_IFACE_CHANNEL_INTERFACE_DTMF \ + "org.freedesktop.Telepathy.Channel.Interface.DTMF" +#define TP_IFACE_CHANNEL_INTERFACE_GROUP \ + "org.freedesktop.Telepathy.Channel.Interface.Group" +#define TP_IFACE_CHANNEL_INTERFACE_HOLD \ + "org.freedesktop.Telepathy.Channel.Interface.Hold" +#define TP_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING \ + "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling" +#define TP_IFACE_CHANNEL_INTERFACE_PASSWORD \ + "org.freedesktop.Telepathy.Channel.Interface.Password" +#define TP_IFACE_CHANNEL_INTERFACE_TRANSFER \ + "org.freedesktop.Telepathy.Channel.Interface.Transfer" +#define TP_IFACE_CHANNEL_TYPE_CONTACT_LIST \ + "org.freedesktop.Telepathy.Channel.Type.ContactList" +#define TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH \ + "org.freedesktop.Telepathy.Channel.Type.ContactSearch" +#define TP_IFACE_CHANNEL_TYPE_ROOM_LIST \ + "org.freedesktop.Telepathy.Channel.Type.RoomList" +#define TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA \ + "org.freedesktop.Telepathy.Channel.Type.StreamedMedia" +#define TP_IFACE_CHANNEL_TYPE_TEXT \ + "org.freedesktop.Telepathy.Channel.Type.Text" +#define TP_IFACE_CONN_INTERFACE \ + "org.freedesktop.Telepathy.Connection" +#define TP_IFACE_CONN_INTERFACE_ALIASING \ + "org.freedesktop.Telepathy.Connection.Interface.Aliasing" +#define TP_IFACE_CONN_INTERFACE_CAPABILITIES \ + "org.freedesktop.Telepathy.Connection.Interface.Capabilities" +#define TP_IFACE_CONN_INTERFACE_CONTACT_INFO \ + "org.freedesktop.Telepathy.Connection.Interface.ContactInfo" +#define TP_IFACE_CONN_INTERFACE_FORWARDING \ + "org.freedesktop.Telepathy.Connection.Interface.Forwarding" +#define TP_IFACE_CONN_INTERFACE_PRESENCE \ + "org.freedesktop.Telepathy.Connection.Interface.Presence" +#define TP_IFACE_CONN_INTERFACE_PRIVACY \ + "org.freedesktop.Telepathy.Connection.Interface.Privacy" +#define TP_IFACE_CONN_INTERFACE_RENAMING \ + "org.freedesktop.Telepathy.Connection.Interface.Renaming" +#define TP_IFACE_CONN_MGR_INTERFACE \ + "org.freedesktop.Telepathy.ConnectionManager" +#define TP_IFACE_MEDIA_SESSION_HANDLER \ + "org.freedesktop.Telepathy.Media.SessionHandler" +#define TP_IFACE_MEDIA_STREAM_HANDLER \ + "org.freedesktop.Telepathy.Media.StreamHandler" +#define TP_IFACE_PROPERTIES \ + "org.freedesktop.Telepathy.Properties" +#define TP_IFACE_CONN_INTERFACE_AVATAR \ + "org.freedesktop.Telepathy.Connection.Interface.Avatars" + +G_END_DECLS + +#endif /* #ifndef __TELEPATHY_INTERFACES_H__*/ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/text-mixin-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/text-mixin-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,55 @@ +/* + * text-mixin-signals-marshal.h - Headers for Telepathy Channel Factory interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __text_mixin_marshal_MARSHAL_H__ +#define __text_mixin_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:UINT,UINT,UINT,UINT,UINT,STRING (text-mixin-signals-marshal.list:1) */ +extern void text_mixin_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT,UINT,STRING (text-mixin-signals-marshal.list:2) */ +extern void text_mixin_marshal_VOID__UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,UINT,STRING (text-mixin-signals-marshal.list:3) */ +extern void text_mixin_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __text_mixin_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/text-mixin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/text-mixin.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,96 @@ +/* + * text-mixin.h - Header for GabbleTextMixin + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_TEXT_MIXIN_H__ +#define __GABBLE_TEXT_MIXIN_H__ + +#include "handles.h" +#include "handle-set.h" +#include "util.h" + +typedef enum { + CHANNEL_TEXT_SEND_ERROR_UNKNOWN = 0, + CHANNEL_TEXT_SEND_ERROR_OFFLINE, + CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT, + CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED, + CHANNEL_TEXT_SEND_ERROR_TOO_LONG, + CHANNEL_TEXT_SEND_ERROR_NOT_IMPLEMENTED, + + CHANNEL_TEXT_SEND_NO_ERROR = -1 +} GabbleTextMixinSendError; + +G_BEGIN_DECLS + +typedef struct _GabbleTextMixinClass GabbleTextMixinClass; +typedef struct _GabbleTextMixin GabbleTextMixin; + +struct _GabbleTextMixinClass { + guint lost_message_signal_id; + guint received_signal_id; + guint send_error_signal_id; + guint sent_signal_id; +}; + +struct _GabbleTextMixin { + GabbleHandleRepo *handle_repo; + guint recv_id; + gboolean send_nick; + gboolean message_lost; + + GQueue *pending; + + GArray *msg_types; +}; + +GType gabble_text_mixin_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TEXT_MIXIN_CLASS_OFFSET_QUARK (gabble_text_mixin_class_get_offset_quark()) +#define GABBLE_TEXT_MIXIN_CLASS_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_CLASS_TYPE (o), GABBLE_TEXT_MIXIN_CLASS_OFFSET_QUARK))) +#define GABBLE_TEXT_MIXIN_CLASS(o) ((GabbleTextMixinClass *) gabble_mixin_offset_cast (o, GABBLE_TEXT_MIXIN_CLASS_OFFSET (o))) + +#define GABBLE_TEXT_MIXIN_OFFSET_QUARK (gabble_text_mixin_get_offset_quark()) +#define GABBLE_TEXT_MIXIN_OFFSET(o) (GPOINTER_TO_UINT (g_type_get_qdata (G_OBJECT_TYPE (o), GABBLE_TEXT_MIXIN_OFFSET_QUARK))) +#define GABBLE_TEXT_MIXIN(o) ((GabbleTextMixin *) gabble_mixin_offset_cast (o, GABBLE_TEXT_MIXIN_OFFSET (o))) + +GQuark gabble_text_mixin_class_get_offset_quark (void); +GQuark gabble_text_mixin_get_offset_quark (void); + +void gabble_text_mixin_class_init (GObjectClass *obj_cls, glong offset); +void gabble_text_mixin_init (GObject *obj, glong offset, GabbleHandleRepo *handle_repo, gboolean send_nick); +void gabble_text_mixin_set_message_types (GObject *obj, ...); +void gabble_text_mixin_finalize (GObject *obj); + +gboolean gabble_text_mixin_receive (GObject *obj, TpChannelTextMessageType type, GabbleHandle sender, time_t timestamp, const char *text); +gboolean gabble_text_mixin_acknowledge_pending_messages (GObject *obj, const GArray * ids, GError **error); +gboolean gabble_text_mixin_list_pending_messages (GObject *obj, gboolean clear, GPtrArray ** ret, GError **error); +gboolean gabble_text_mixin_send (GObject *obj, guint type, guint subtype, const char * recipient, const gchar * text, GabbleConnection *conn, gboolean emit_signal, GError **error); +void gabble_text_mixin_emit_sent (GObject *obj, time_t timestamp, guint type, const char *text); +gboolean gabble_text_mixin_get_message_types (GObject *obj, GArray **ret, GError **error); +void gabble_text_mixin_clear (GObject *obj); + +gboolean gabble_text_mixin_parse_incoming_message (LmMessage *message, const gchar **from, time_t *stamp, TpChannelTextMessageType *msgtype, const gchar **body, const gchar **body_offset, GabbleTextMixinSendError *send_error); + +void _gabble_text_mixin_send_error_signal (GObject *obj, GabbleTextMixinSendError error, time_t timestamp, TpChannelTextMessageType type, const gchar *text); + +G_END_DECLS + +#endif /* #ifndef __GABBLE_TEXT_MIXIN_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/tp-channel-factory-iface-signals-marshal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/tp-channel-factory-iface-signals-marshal.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,38 @@ +/* + * tp_channel_factory_iface_signals_marshal.h - Header for GabbleConnection + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __tp_channel_factory_iface_marshal_MARSHAL_H__ +#define __tp_channel_factory_iface_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* VOID:OBJECT,POINTER (tp-channel-factory-iface-signals-marshal.list:1) */ +extern void tp_channel_factory_iface_marshal_VOID__OBJECT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __tp_channel_factory_iface_marshal_MARSHAL_H__ */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/tp-channel-factory-iface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/tp-channel-factory-iface.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,88 @@ +/* + * tp-channel-factory-iface.h - Headers for Telepathy Channel Factory interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TP_CHANNEL_FACTORY_IFACE_H__ +#define __TP_CHANNEL_FACTORY_IFACE_H__ + +#include + +#include "telepathy-constants.h" +#include "tp-channel-iface.h" + +G_BEGIN_DECLS + +#define TP_TYPE_CHANNEL_FACTORY_IFACE tp_channel_factory_iface_get_type() + +#define TP_CHANNEL_FACTORY_IFACE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + TP_TYPE_CHANNEL_FACTORY_IFACE, TpChannelFactoryIface)) + +#define TP_CHANNEL_FACTORY_IFACE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + TP_TYPE_CHANNEL_FACTORY_IFACE, TpChannelFactoryIfaceClass)) + +#define TP_IS_CHANNEL_FACTORY_IFACE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + TP_TYPE_CHANNEL_FACTORY_IFACE)) + +#define TP_IS_CHANNEL_FACTORY_IFACE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + TP_TYPE_CHANNEL_FACTORY_IFACE)) + +#define TP_CHANNEL_FACTORY_IFACE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_INTERFACE ((obj), \ + TP_TYPE_CHANNEL_FACTORY_IFACE, TpChannelFactoryIfaceClass)) + +typedef struct _TpChannelFactoryIface TpChannelFactoryIface; +typedef struct _TpChannelFactoryIfaceClass TpChannelFactoryIfaceClass; + +typedef enum { + TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED = 0, + TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE, + TP_CHANNEL_FACTORY_REQUEST_STATUS_INVALID_HANDLE, + TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR, + TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE, + TP_CHANNEL_FACTORY_REQUEST_STATUS_QUEUED +} TpChannelFactoryRequestStatus; + +struct _TpChannelFactoryIfaceClass { + GTypeInterface parent_class; + + void (*close_all) (TpChannelFactoryIface *); + void (*connecting) (TpChannelFactoryIface *); + void (*connected) (TpChannelFactoryIface *); + void (*disconnected) (TpChannelFactoryIface *); + void (*foreach) (TpChannelFactoryIface *, TpChannelFunc func, gpointer data); + TpChannelFactoryRequestStatus (*request) (TpChannelFactoryIface *, const gchar *chan_type, TpHandleType handle_type, guint handle, TpChannelIface **ret, GError **error); +}; + +GType tp_channel_factory_iface_get_type (void); + +void tp_channel_factory_iface_close_all (TpChannelFactoryIface *); +void tp_channel_factory_iface_connecting (TpChannelFactoryIface *); +void tp_channel_factory_iface_connected (TpChannelFactoryIface *); +void tp_channel_factory_iface_disconnected (TpChannelFactoryIface *); +void tp_channel_factory_iface_foreach (TpChannelFactoryIface *, TpChannelFunc func, gpointer data); +TpChannelFactoryRequestStatus tp_channel_factory_iface_request (TpChannelFactoryIface *, const gchar *chan_type, TpHandleType handle_type, guint handle, TpChannelIface **ret, GError **error); + +G_END_DECLS + +#endif /* __TP_CHANNEL_FACTORY_IFACE_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/tp-channel-iface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/tp-channel-iface.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,63 @@ +/* + * tp-channel-iface.h - Headers for Telepathy Channel interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TP_CHANNEL_IFACE_H__ +#define __TP_CHANNEL_IFACE_H__ + +#include + +G_BEGIN_DECLS + +#define TP_TYPE_CHANNEL_IFACE tp_channel_iface_get_type() + +#define TP_CHANNEL_IFACE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + TP_TYPE_CHANNEL_IFACE, TpChannelIface)) + +#define TP_CHANNEL_IFACE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + TP_TYPE_CHANNEL_IFACE, TpChannelIfaceClass)) + +#define TP_IS_CHANNEL_IFACE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + TP_TYPE_CHANNEL_IFACE)) + +#define TP_IS_CHANNEL_IFACE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + TP_TYPE_CHANNEL_IFACE)) + +#define TP_CHANNEL_IFACE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_INTERFACE ((obj), \ + TP_TYPE_CHANNEL_IFACE, TpChannelIfaceClass)) + +typedef struct _TpChannelIface TpChannelIface; +typedef struct _TpChannelIfaceClass TpChannelIfaceClass; +typedef void (* TpChannelFunc) (TpChannelIface *, gpointer); + +struct _TpChannelIfaceClass { + GTypeInterface parent_class; +}; + +GType tp_channel_iface_get_type (void); + +G_END_DECLS + +#endif /* __TP_CHANNEL_IFACE_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/util.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/util.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,43 @@ +/* + * util.h - Headers for Gabble utility functions + * Copyright (C) 2006 Collabora Ltd. + * @author Robert McQueen + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" + +#ifndef __GABBLE_UTIL_H__ +#define __GABBLE_UTIL_H__ + +gchar * +sha1_hex (const gchar *bytes, guint len); +gboolean g_strdiff (const gchar *left, const gchar *right); +void lm_message_node_add_own_nick (LmMessageNode *node, GabbleConnection *conn); +void lm_message_node_steal_children (LmMessageNode *snatcher, LmMessageNode *mum); +gboolean lm_message_node_has_namespace (LmMessageNode *node, const gchar *ns, const gchar *tag); +LmMessageNode *lm_message_node_get_child_with_namespace (LmMessageNode *node, const gchar *name, const gchar *ns); + +/* format: a@b/c */ +void gabble_decode_jid (const gchar *jid, gchar **a, gchar **b, gchar **c); + +gpointer gabble_mixin_offset_cast (gpointer instance, guint offset); + +#endif /* __GABBLE_UTIL_H__ */ diff -r 000000000000 -r d0f3a028347a telepathygabble/inc/vcard-manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/inc/vcard-manager.h Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,122 @@ +/* + * vcard-manager.h - vCard lookup helper for Gabble connections + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GABBLE_VCARD_MANAGER_H__ +#define __GABBLE_VCARD_MANAGER_H__ + +#include +#include "loudmouth/loudmouth.h" + +#include "gabble-types.h" + +G_BEGIN_DECLS + +typedef struct _GabbleVCardManagerClass GabbleVCardManagerClass; +typedef struct _GabbleVCardManagerRequest GabbleVCardManagerRequest; + +/** + * GabbleVCardManagerError: + * @GABBLE_VCARD_MANAGER_ERROR_CANCELLED: The vCard request was cancelled + * @GABBLE_VCARD_MANAGER_ERROR_TIMEOUT: The vCard request timed out + * @GABBLE_VCARD_MANAGER_ERROR_UNKNOWN: An unknown error occured + */ +typedef enum +{ + GABBLE_VCARD_MANAGER_ERROR_CANCELLED, + GABBLE_VCARD_MANAGER_ERROR_TIMEOUT, + GABBLE_VCARD_MANAGER_ERROR_UNKNOWN +} GabbleVCardManagerError; + +GQuark gabble_vcard_manager_error_quark (void); +#define GABBLE_VCARD_MANAGER_ERROR gabble_vcard_manager_error_quark () + +IMPORT_C GType gabble_vcard_manager_get_type(void); + +/* TYPE MACROS */ +#define GABBLE_TYPE_VCARD_MANAGER \ + (gabble_vcard_manager_get_type()) +#define GABBLE_VCARD_MANAGER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GABBLE_TYPE_VCARD_MANAGER, GabbleVCardManager)) +#define GABBLE_VCARD_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GABBLE_TYPE_VCARD_MANAGER, GabbleVCardManagerClass)) +#define GABBLE_IS_VCARD_MANAGER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GABBLE_TYPE_VCARD_MANAGER)) +#define GABBLE_IS_VCARD_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GABBLE_TYPE_VCARD_MANAGER)) +#define GABBLE_VCARD_MANAGER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_VCARD_MANAGER, GabbleVCardManagerClass)) + +struct _GabbleVCardManagerClass { + GObjectClass parent_class; +}; + +struct _GabbleVCardManager { + GObject parent; + gpointer priv; +}; + +typedef void (*GabbleVCardManagerCb)(GabbleVCardManager *self, + GabbleVCardManagerRequest *request, + GabbleHandle handle, + LmMessageNode *vcard, + GError *error, + gpointer user_data); + +GabbleVCardManager *gabble_vcard_manager_new (GabbleConnection *); + +GQuark gabble_vcard_manager_cache_quark (void); + +GabbleVCardManagerRequest *gabble_vcard_manager_request (GabbleVCardManager *, + GabbleHandle, + guint timeout, + GabbleVCardManagerCb, + gpointer user_data, + GObject *object, + GError **error); + +GabbleVCardManagerRequest *gabble_vcard_manager_replace (GabbleVCardManager *, + LmMessageNode *, + guint timeout, + GabbleVCardManagerCb, + gpointer user_data, + GObject *object, + GError **error); + +GabbleVCardManagerRequest *gabble_vcard_manager_edit (GabbleVCardManager *, + guint timeout, + GabbleVCardManagerCb, + gpointer user_data, + GObject *object, + GError **error, + ...) + G_GNUC_NULL_TERMINATED; + +void gabble_vcard_manager_cancel_request (GabbleVCardManager *manager, + GabbleVCardManagerRequest *request); + +const gchar *gabble_vcard_manager_get_cached_alias (GabbleVCardManager *, + GabbleHandle); +gboolean gabble_vcard_manager_has_cached_alias (GabbleVCardManager *manager, + GabbleHandle handle); + +G_END_DECLS + +#endif diff -r 000000000000 -r d0f3a028347a telepathygabble/rom/telepathygabble.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/rom/telepathygabble.iby Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,35 @@ +/* + * telepathygabble.iby - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef __GABBLE_IBY__ +#define __GABBLE_IBY__ + + +//Telepathy-gabble DLLs +file=ABI_DIR\BUILD_DIR\libgabble-convenience.dll SHARED_LIB_DIR\libgabble-convenience.dll +file=ABI_DIR\BUILD_DIR\tg.exe PROGRAMS_DIR\tg.exe + +data=\epoc32\winscw\c\data\dbus\dbus1\services\jabber.service_hw data\dbus\dbus1\services\jabber.service + + +#endif + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/Makefile.am Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,197 @@ +BUILT_SOURCES = \ + gabble-connection-manager-glue.h \ + gabble-connection-manager-signals-marshal.h \ + gabble-connection-manager-signals-marshal.c \ + gabble-connection-glue.h \ + gabble-connection-signals-marshal.h \ + gabble-connection-signals-marshal.c \ + gabble-register-signals-marshal.h \ + gabble-register-signals-marshal.c \ + gabble-im-channel-glue.h \ + gabble-im-channel-signals-marshal.h \ + gabble-im-channel-signals-marshal.c \ + gabble-muc-channel-glue.h \ + gabble-muc-channel-signals-marshal.h \ + gabble-muc-channel-signals-marshal.c \ + gabble-media-channel-glue.h \ + gabble-media-channel-signals-marshal.h \ + gabble-media-channel-signals-marshal.c \ + gabble-media-session-glue.h \ + gabble-media-session-signals-marshal.h \ + gabble-media-session-signals-marshal.c \ + gabble-media-session-enumtypes.h \ + gabble-media-session-enumtypes.c \ + gabble-media-stream-glue.h \ + gabble-media-stream-signals-marshal.h \ + gabble-media-stream-signals-marshal.c \ + gabble-presence-cache-signals-marshal.h \ + gabble-presence-cache-signals-marshal.c \ + gabble-roster-channel-glue.h \ + gabble-roster-channel-signals-marshal.h \ + gabble-roster-channel-signals-marshal.c \ + gabble-roomlist-channel-glue.h \ + gabble-roomlist-channel-signals-marshal.h \ + gabble-roomlist-channel-signals-marshal.c \ + group-mixin-signals-marshal.h \ + group-mixin-signals-marshal.c \ + properties-mixin-signals-marshal.h \ + properties-mixin-signals-marshal.c \ + telepathy-errors-enumtypes.h \ + telepathy-errors-enumtypes.c \ + text-mixin-signals-marshal.h \ + text-mixin-signals-marshal.c \ + tp-channel-factory-iface-signals-marshal.h \ + tp-channel-factory-iface-signals-marshal.c + +# correctly clean the generated source files +CLEANFILES = $(BUILT_SOURCES) + +bin_PROGRAMS=telepathy-gabble +noinst_PROGRAMS = write-mgr-file + +CORE_SOURCES = \ + ansi.h \ + capabilities.h \ + capabilities.c \ + debug.h \ + debug.c \ + disco.h \ + disco.c \ + gabble-error.c \ + gabble-error.h \ + gabble-connection-manager.h \ + gabble-connection-manager.c \ + gabble-connection.h \ + gabble-connection.c \ + gabble-im-channel.h \ + gabble-im-channel.c \ + gabble-muc-channel.h \ + gabble-muc-channel.c \ + gabble-media-channel.h \ + gabble-media-channel.c \ + gabble-media-session.h \ + gabble-media-session.c \ + gabble-media-stream.h \ + gabble-media-stream.c \ + gabble-presence.h \ + gabble-presence.c \ + gabble-presence-cache.h \ + gabble-presence-cache.c \ + gabble-register.c \ + gabble-register.h \ + gabble-roster-channel.h \ + gabble-roster-channel.c \ + gabble-roomlist-channel.h \ + gabble-roomlist-channel.c \ + gabble-types.h \ + gheap.h \ + gheap.c \ + gintset.h \ + gintset.c \ + group-mixin.h \ + group-mixin.c \ + handles.h \ + handles.c \ + handle-set.h \ + handle-set.c \ + jingle-info.c \ + jingle-info.h \ + im-factory.h \ + im-factory.c \ + media-factory.h \ + media-factory.c \ + muc-factory.h \ + muc-factory.c \ + namespaces.h \ + properties-mixin.h \ + properties-mixin.c \ + roster.h \ + roster.c \ + telepathy-constants.h \ + telepathy-interfaces.h \ + telepathy-errors.h \ + telepathy-errors.c \ + telepathy-helpers.h \ + telepathy-helpers.c \ + text-mixin.h \ + text-mixin.c \ + tp-channel-iface.h \ + tp-channel-iface.c \ + tp-channel-factory-iface.h \ + tp-channel-factory-iface.c \ + util.h \ + util.c \ + vcard-manager.h \ + vcard-manager.c \ + $(BUILT_SOURCES) + +EXTRA_DIST = \ + gabble-connection-manager-signals-marshal.list \ + gabble-connection-signals-marshal.list \ + gabble-im-channel-signals-marshal.list \ + gabble-media-channel-signals-marshal.list \ + gabble-media-session-signals-marshal.list \ + gabble-media-stream-signals-marshal.list \ + gabble-muc-channel-signals-marshal.list \ + gabble-presence-cache-signals-marshal.list \ + gabble-register-signals-marshal.list \ + gabble-roomlist-channel-signals-marshal.list \ + gabble-roster-channel-signals-marshal.list \ + group-mixin-signals-marshal.list \ + properties-mixin-signals-marshal.list \ + text-mixin-signals-marshal.list \ + tp-channel-factory-iface-signals-marshal.list + +libgabble_convenience_la_SOURCES = \ + $(CORE_SOURCES) + +write_mgr_file_SOURCES = write-mgr-file.c + +write_mgr_file_LDADD = libgabble-convenience.la + +telepathy_gabble_SOURCES = \ + gabble.h \ + gabble.c + +telepathy_gabble_LDADD = libgabble-convenience.la + +noinst_LTLIBRARIES = libgabble-convenience.la + +AM_CFLAGS = $(ERROR_CFLAGS) @DBUS_CFLAGS@ @GLIB_CFLAGS@ @LOUDMOUTH_CFLAGS@ @HANDLE_LEAK_DEBUG_CFLAGS@ +AM_LDFLAGS = @DBUS_LIBS@ @GLIB_LIBS@ @LOUDMOUTH_LIBS@ + + +# rule to generate the binding headers +%-glue.h: ../generate/xml-modified/%.xml + dbus-binding-tool --mode=glib-server --output=$@ --prefix=$(subst -,_,$*) $< + +%-signals-marshal.h: %-signals-marshal.list + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-signals-marshal.h + +%-signals-marshal.c: %-signals-marshal.list + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-signals-marshal.c + +%-marshal.h: %-marshal.list + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.h + +%-marshal.c: %-marshal.list + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.c + + +# rules for making the glib enum objects +%-enumtypes.h: %.h Makefile.in + glib-mkenums \ + --fhead "#ifndef __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n#define __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define $(shell echo $* | tr [:lower:]- [:upper:]_ | sed 's/_.*//')_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__ */" \ + $< > $@ + +%-enumtypes.c: %.h Makefile.in + glib-mkenums \ + --fhead "#include <$*.h>" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@VALUENAME@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ + $< > $@ diff -r 000000000000 -r d0f3a028347a telepathygabble/src/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/Makefile.in Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,774 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = telepathy-gabble$(EXEEXT) +noinst_PROGRAMS = write-mgr-file$(EXEEXT) +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/as-compiler-flag.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libgabble_convenience_la_LIBADD = +am__objects_1 = gabble-connection-manager-signals-marshal.lo \ + gabble-connection-signals-marshal.lo \ + gabble-register-signals-marshal.lo \ + gabble-im-channel-signals-marshal.lo \ + gabble-muc-channel-signals-marshal.lo \ + gabble-media-channel-signals-marshal.lo \ + gabble-media-session-signals-marshal.lo \ + gabble-media-session-enumtypes.lo \ + gabble-media-stream-signals-marshal.lo \ + gabble-presence-cache-signals-marshal.lo \ + gabble-roster-channel-signals-marshal.lo \ + gabble-roomlist-channel-signals-marshal.lo \ + group-mixin-signals-marshal.lo \ + properties-mixin-signals-marshal.lo \ + telepathy-errors-enumtypes.lo text-mixin-signals-marshal.lo \ + tp-channel-factory-iface-signals-marshal.lo +am__objects_2 = capabilities.lo debug.lo disco.lo gabble-error.lo \ + gabble-connection-manager.lo gabble-connection.lo \ + gabble-im-channel.lo gabble-muc-channel.lo \ + gabble-media-channel.lo gabble-media-session.lo \ + gabble-media-stream.lo gabble-presence.lo \ + gabble-presence-cache.lo gabble-register.lo \ + gabble-roster-channel.lo gabble-roomlist-channel.lo gheap.lo \ + gintset.lo group-mixin.lo handles.lo handle-set.lo \ + jingle-info.lo im-factory.lo media-factory.lo muc-factory.lo \ + properties-mixin.lo roster.lo telepathy-errors.lo \ + telepathy-helpers.lo text-mixin.lo tp-channel-iface.lo \ + tp-channel-factory-iface.lo util.lo vcard-manager.lo \ + $(am__objects_1) +am_libgabble_convenience_la_OBJECTS = $(am__objects_2) +libgabble_convenience_la_OBJECTS = \ + $(am_libgabble_convenience_la_OBJECTS) +am__installdirs = "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_telepathy_gabble_OBJECTS = gabble.$(OBJEXT) +telepathy_gabble_OBJECTS = $(am_telepathy_gabble_OBJECTS) +telepathy_gabble_DEPENDENCIES = libgabble-convenience.la +am_write_mgr_file_OBJECTS = write-mgr-file.$(OBJEXT) +write_mgr_file_OBJECTS = $(am_write_mgr_file_OBJECTS) +write_mgr_file_DEPENDENCIES = libgabble-convenience.la +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libgabble_convenience_la_SOURCES) \ + $(telepathy_gabble_SOURCES) $(write_mgr_file_SOURCES) +DIST_SOURCES = $(libgabble_convenience_la_SOURCES) \ + $(telepathy_gabble_SOURCES) $(write_mgr_file_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIR = @DATADIR@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_GTK_DOC_FALSE = @ENABLE_GTK_DOC_FALSE@ +ENABLE_GTK_DOC_TRUE = @ENABLE_GTK_DOC_TRUE@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GREP = @GREP@ +GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE_LIBTOOL_FALSE@ +GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@ +HANDLE_LEAK_DEBUG_CFLAGS = @HANDLE_LEAK_DEBUG_CFLAGS@ +HTML_DIR = @HTML_DIR@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LOUDMOUTH_CFLAGS = @LOUDMOUTH_CFLAGS@ +LOUDMOUTH_LIBS = @LOUDMOUTH_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +BUILT_SOURCES = \ + gabble-connection-manager-glue.h \ + gabble-connection-manager-signals-marshal.h \ + gabble-connection-manager-signals-marshal.c \ + gabble-connection-glue.h \ + gabble-connection-signals-marshal.h \ + gabble-connection-signals-marshal.c \ + gabble-register-signals-marshal.h \ + gabble-register-signals-marshal.c \ + gabble-im-channel-glue.h \ + gabble-im-channel-signals-marshal.h \ + gabble-im-channel-signals-marshal.c \ + gabble-muc-channel-glue.h \ + gabble-muc-channel-signals-marshal.h \ + gabble-muc-channel-signals-marshal.c \ + gabble-media-channel-glue.h \ + gabble-media-channel-signals-marshal.h \ + gabble-media-channel-signals-marshal.c \ + gabble-media-session-glue.h \ + gabble-media-session-signals-marshal.h \ + gabble-media-session-signals-marshal.c \ + gabble-media-session-enumtypes.h \ + gabble-media-session-enumtypes.c \ + gabble-media-stream-glue.h \ + gabble-media-stream-signals-marshal.h \ + gabble-media-stream-signals-marshal.c \ + gabble-presence-cache-signals-marshal.h \ + gabble-presence-cache-signals-marshal.c \ + gabble-roster-channel-glue.h \ + gabble-roster-channel-signals-marshal.h \ + gabble-roster-channel-signals-marshal.c \ + gabble-roomlist-channel-glue.h \ + gabble-roomlist-channel-signals-marshal.h \ + gabble-roomlist-channel-signals-marshal.c \ + group-mixin-signals-marshal.h \ + group-mixin-signals-marshal.c \ + properties-mixin-signals-marshal.h \ + properties-mixin-signals-marshal.c \ + telepathy-errors-enumtypes.h \ + telepathy-errors-enumtypes.c \ + text-mixin-signals-marshal.h \ + text-mixin-signals-marshal.c \ + tp-channel-factory-iface-signals-marshal.h \ + tp-channel-factory-iface-signals-marshal.c + + +# correctly clean the generated source files +CLEANFILES = $(BUILT_SOURCES) +CORE_SOURCES = \ + ansi.h \ + capabilities.h \ + capabilities.c \ + debug.h \ + debug.c \ + disco.h \ + disco.c \ + gabble-error.c \ + gabble-error.h \ + gabble-connection-manager.h \ + gabble-connection-manager.c \ + gabble-connection.h \ + gabble-connection.c \ + gabble-im-channel.h \ + gabble-im-channel.c \ + gabble-muc-channel.h \ + gabble-muc-channel.c \ + gabble-media-channel.h \ + gabble-media-channel.c \ + gabble-media-session.h \ + gabble-media-session.c \ + gabble-media-stream.h \ + gabble-media-stream.c \ + gabble-presence.h \ + gabble-presence.c \ + gabble-presence-cache.h \ + gabble-presence-cache.c \ + gabble-register.c \ + gabble-register.h \ + gabble-roster-channel.h \ + gabble-roster-channel.c \ + gabble-roomlist-channel.h \ + gabble-roomlist-channel.c \ + gabble-types.h \ + gheap.h \ + gheap.c \ + gintset.h \ + gintset.c \ + group-mixin.h \ + group-mixin.c \ + handles.h \ + handles.c \ + handle-set.h \ + handle-set.c \ + jingle-info.c \ + jingle-info.h \ + im-factory.h \ + im-factory.c \ + media-factory.h \ + media-factory.c \ + muc-factory.h \ + muc-factory.c \ + namespaces.h \ + properties-mixin.h \ + properties-mixin.c \ + roster.h \ + roster.c \ + telepathy-constants.h \ + telepathy-interfaces.h \ + telepathy-errors.h \ + telepathy-errors.c \ + telepathy-helpers.h \ + telepathy-helpers.c \ + text-mixin.h \ + text-mixin.c \ + tp-channel-iface.h \ + tp-channel-iface.c \ + tp-channel-factory-iface.h \ + tp-channel-factory-iface.c \ + util.h \ + util.c \ + vcard-manager.h \ + vcard-manager.c \ + $(BUILT_SOURCES) + +EXTRA_DIST = \ + gabble-connection-manager-signals-marshal.list \ + gabble-connection-signals-marshal.list \ + gabble-im-channel-signals-marshal.list \ + gabble-media-channel-signals-marshal.list \ + gabble-media-session-signals-marshal.list \ + gabble-media-stream-signals-marshal.list \ + gabble-muc-channel-signals-marshal.list \ + gabble-presence-cache-signals-marshal.list \ + gabble-register-signals-marshal.list \ + gabble-roomlist-channel-signals-marshal.list \ + gabble-roster-channel-signals-marshal.list \ + group-mixin-signals-marshal.list \ + properties-mixin-signals-marshal.list \ + text-mixin-signals-marshal.list \ + tp-channel-factory-iface-signals-marshal.list + +libgabble_convenience_la_SOURCES = \ + $(CORE_SOURCES) + +write_mgr_file_SOURCES = write-mgr-file.c +write_mgr_file_LDADD = libgabble-convenience.la +telepathy_gabble_SOURCES = \ + gabble.h \ + gabble.c + +telepathy_gabble_LDADD = libgabble-convenience.la +noinst_LTLIBRARIES = libgabble-convenience.la +AM_CFLAGS = $(ERROR_CFLAGS) @DBUS_CFLAGS@ @GLIB_CFLAGS@ @LOUDMOUTH_CFLAGS@ @HANDLE_LEAK_DEBUG_CFLAGS@ +AM_LDFLAGS = @DBUS_LIBS@ @GLIB_LIBS@ @LOUDMOUTH_LIBS@ +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgabble-convenience.la: $(libgabble_convenience_la_OBJECTS) $(libgabble_convenience_la_DEPENDENCIES) + $(LINK) $(libgabble_convenience_la_LDFLAGS) $(libgabble_convenience_la_OBJECTS) $(libgabble_convenience_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +telepathy-gabble$(EXEEXT): $(telepathy_gabble_OBJECTS) $(telepathy_gabble_DEPENDENCIES) + @rm -f telepathy-gabble$(EXEEXT) + $(LINK) $(telepathy_gabble_LDFLAGS) $(telepathy_gabble_OBJECTS) $(telepathy_gabble_LDADD) $(LIBS) +write-mgr-file$(EXEEXT): $(write_mgr_file_OBJECTS) $(write_mgr_file_DEPENDENCIES) + @rm -f write-mgr-file$(EXEEXT) + $(LINK) $(write_mgr_file_LDFLAGS) $(write_mgr_file_OBJECTS) $(write_mgr_file_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capabilities.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disco.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-connection-manager-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-connection-manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-connection-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-connection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-error.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-im-channel-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-im-channel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-channel-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-channel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-session-enumtypes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-session-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-session.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-stream-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-media-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-muc-channel-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-muc-channel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-presence-cache-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-presence-cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-presence.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-register-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-register.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-roomlist-channel-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-roomlist-channel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-roster-channel-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble-roster-channel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gabble.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gheap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gintset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/group-mixin-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/group-mixin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle-set.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handles.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/im-factory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jingle-info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/media-factory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muc-factory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/properties-mixin-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/properties-mixin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/roster.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telepathy-errors-enumtypes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telepathy-errors.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telepathy-helpers.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-mixin-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-mixin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tp-channel-factory-iface-signals-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tp-channel-factory-iface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tp-channel-iface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcard-manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write-mgr-file.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool clean-noinstLTLIBRARIES \ + clean-noinstPROGRAMS ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-info-am + + +# rule to generate the binding headers +%-glue.h: ../generate/xml-modified/%.xml + dbus-binding-tool --mode=glib-server --output=$@ --prefix=$(subst -,_,$*) $< + +%-signals-marshal.h: %-signals-marshal.list + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-signals-marshal.h + +%-signals-marshal.c: %-signals-marshal.list + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-signals-marshal.c + +%-marshal.h: %-marshal.list + glib-genmarshal --header --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.h + +%-marshal.c: %-marshal.list + glib-genmarshal --body --prefix=$(subst -,_,$*)_marshal $< > $*-marshal.c + +# rules for making the glib enum objects +%-enumtypes.h: %.h Makefile.in + glib-mkenums \ + --fhead "#ifndef __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n#define __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define $(shell echo $* | tr [:lower:]- [:upper:]_ | sed 's/_.*//')_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__ */" \ + $< > $@ + +%-enumtypes.c: %.h Makefile.in + glib-mkenums \ + --fhead "#include <$*.h>" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@VALUENAME@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ + $< > $@ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff -r 000000000000 -r d0f3a028347a telepathygabble/src/base64.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/base64.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,196 @@ +/* + * base64.c - Base 64 encoding/decoding implementation + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "base64.h" + +#define DEBUG_FLAG GABBLE_DEBUG_VCARD +#include "debug.h" + +#include +#include + +#include + +/* +|AAAA AABB|BBBB CCCC|CCDD DDDD| + +0xFC = 1111 1100 +0x03 = 0000 0011 +0xF0 = 1111 0000 +0x0F = 0000 1111 +0xC0 = 1100 0000 +0x3F = 0011 1111 + +3 input bytes = 4 output bytes; +2 input bytes = 2 output bytes; +1 input byte = 1 output byte. +*/ + +static const gchar *encoding = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static const guint decoding[256] = +{ + /* ... */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + /* + */ + 62, + /* ... */ + 0, 0, 0, + /* / , 0-9 */ + 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + /* ... */ + 0, 0, 0, 0, 0, 0, 0, + /* A */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + /* ... */ + 0, 0, 0, 0, 0, 0, + /* a */ + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 +}; + +#define GET_6_BITS_0(s) (((s)[0] & 0xFC) >> 2) +#define GET_6_BITS_1(s) (((s)[0] & 0x03) << 4) | \ + (((s)[1] & 0xF0) >> 4) +#define GET_6_BITS_2(s) (((s)[1] & 0x0F) << 2) | \ + (((s)[2] & 0xC0) >> 6) +#define GET_6_BITS_3(s) (((s)[2] & 0x3F) << 0) + +#define GET_BYTE_0(s) (((decoding[(guchar)(s)[0]] & 0x3F) << 2) | \ + ((decoding[(guchar)(s)[1]] & 0x30) >> 4)) +#define GET_BYTE_1(s) (((decoding[(guchar)(s)[1]] & 0x0F) << 4) | \ + ((decoding[(guchar)(s)[2]] & 0x3C) >> 2)) +#define GET_BYTE_2(s) (((decoding[(guchar)(s)[2]] & 0x03) << 6) | \ + ((decoding[(guchar)(s)[3]] & 0xFF) << 0)) + +gchar *base64_encode (guint len, const gchar *str) +{ + guint i; + GString *tmp; + + /* TODO: calculate requisite output string length and allocate that big a + * GString */ + tmp = g_string_new (""); + + for (i = 0; i < len; i += 3) + { + guint c1, c2, c3, c4; + + if (i > 0 && (i * 4) % 76 == 0) + g_string_append_c (tmp, '\n'); + + switch (i + 3 - len) + { + case 1: + c1 = encoding[GET_6_BITS_0 (str + i)]; + c2 = encoding[GET_6_BITS_1 (str + i)]; + /* can't use GET_6_BITS_2 because str[i+2] is out of range */ + c3 = encoding[(str[i + 1] & 0x0f) << 2]; + c4 = '='; + break; + case 2: + c1 = encoding[GET_6_BITS_0 (str + i)]; + /* can't use GET_6_BITS_1 because str[i+1] is out of range */ + c2 = encoding[(str[i] & 0x03) << 4]; + c3 = '='; + c4 = '='; + break; + default: + c1 = encoding[GET_6_BITS_0 (str + i)]; + c2 = encoding[GET_6_BITS_1 (str + i)]; + c3 = encoding[GET_6_BITS_2 (str + i)]; + c4 = encoding[GET_6_BITS_3 (str + i)]; + } + + g_string_append_printf (tmp, "%c%c%c%c", c1, c2, c3, c4); + } + + return g_string_free (tmp, FALSE); +} + +GString *base64_decode (const gchar *str) +{ + guint i; + GString *tmp; + char group[4]; + guint filled = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] != 'A' && + str[i] != '=' && + !isspace (str[i]) && + decoding[(guchar) str[i]] == 0) + { + gabble_debug (DEBUG_FLAG, "bad character %x at byte %u", (guchar)str[i], i); + return NULL; + } + } + + tmp = g_string_new (""); + + for (i = 0; str[i]; i++) + { + if (isspace (str[i])) + continue; + + group[filled++] = str[i]; + + if (filled == 4) + { + if (group[3] == '=') + { + if (group[2] == '=') + { + g_string_append_c (tmp, GET_BYTE_0(group)); + } + else + { + g_string_append_c (tmp, GET_BYTE_0(group)); + g_string_append_c (tmp, GET_BYTE_1(group)); + } + } + else + { + g_string_append_c (tmp, GET_BYTE_0(group)); + g_string_append_c (tmp, GET_BYTE_1(group)); + g_string_append_c (tmp, GET_BYTE_2(group)); + } + filled = 0; + } + } + + if (filled) + { + gabble_debug (DEBUG_FLAG, "insufficient padding at end of base64 string:\n%s", str); + g_string_free (tmp, TRUE); + return NULL; + } + + return tmp; +} + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/capabilities.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/capabilities.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,97 @@ +/* + * capabilities.c - Connection.Interface.Capabilities constants and utilities + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "capabilities.h" + +#include "namespaces.h" +#include "config.h" +#include "gabble-presence-cache.h" +#include "telepathy-interfaces.h" +#include "gabble-media-channel.h" + +static const Feature self_advertised_features[] = +{ + { VERSION, NS_GOOGLE_FEAT_SESSION, 0}, + { VERSION, NS_GOOGLE_TRANSPORT_P2P, PRESENCE_CAP_GOOGLE_TRANSPORT_P2P}, + { VERSION, NS_JINGLE, PRESENCE_CAP_JINGLE}, + + { BUNDLE_VOICE_V1, NS_GOOGLE_FEAT_VOICE, PRESENCE_CAP_GOOGLE_VOICE}, + { BUNDLE_JINGLE_AUDIO, NS_JINGLE_DESCRIPTION_AUDIO, PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO}, + { BUNDLE_JINGLE_VIDEO, NS_JINGLE_DESCRIPTION_VIDEO, PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO}, + { NULL, NULL, 0} +}; + + + + +GSList * +capabilities_get_features (GabblePresenceCapabilities caps) +{ + GSList *features = NULL; + const Feature *i; + + for (i = self_advertised_features; NULL != i->ns; i++) + if ((i->caps & caps) == i->caps) + features = g_slist_append (features, (gpointer) i); + + return features; +} + +void +capabilities_fill_cache (GabblePresenceCache *cache) +{ + const Feature *feat; + for (feat = self_advertised_features; NULL != feat->ns; feat++) + { + gchar *node = g_strconcat (NS_GABBLE_CAPS "#", feat->bundle, NULL); + gabble_presence_cache_add_bundle_caps (cache, + node, feat->caps); + g_free (node); + } + + gabble_presence_cache_add_bundle_caps (cache, + "http://www.google.com/xmpp/client/caps#voice-v1", + PRESENCE_CAP_GOOGLE_VOICE); +} + +GabblePresenceCapabilities +capabilities_get_initial_caps () +{ + GabblePresenceCapabilities ret = 0; + const Feature *feat; + + for (feat = self_advertised_features; NULL != feat->ns; feat++) + { + if (g_str_equal (feat->bundle, VERSION)) + /* VERSION == bundle means a fixed feature, which we always advertise */ + ret |= feat->caps; + } + + return ret; +} + +const CapabilityConversionData capabilities_conversions[] = +{ + { TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, + _gabble_media_channel_typeflags_to_caps_tmp, /*_gabble_media_channel_typeflags_to_caps,*/ + _gabble_media_channel_caps_to_typeflags_tmp /*_gabble_media_channel_caps_to_typeflags*/ }, + { NULL, NULL, NULL} +}; + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/debug.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/debug.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,130 @@ +/* + * debug.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include // bsr +#include + +#include "debug.h" + +/*#ifdef ENABLE_DEBUG*/ + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(flags,gabble_debug,GabbleDebugFlags) + #define flags (*GET_WSD_VAR_NAME(flags,gabble_debug,s)()) + + GET_STATIC_VAR_FROM_TLS(log_handler,gabble_debug,guint) + #define log_handler (*GET_WSD_VAR_NAME(log_handler,gabble_debug,s)()) + + GET_STATIC_ARRAY_FROM_TLS(keys,gabble_debug,GDebugKey) + #define keys (GET_WSD_VAR_NAME(keys,gabble_debug, s)()) + + +#else + static GabbleDebugFlags flags = 0; + static guint log_handler; // bsr + GDebugKey keys[] = { + { "presence", GABBLE_DEBUG_PRESENCE }, + { "groups", GABBLE_DEBUG_GROUPS }, + { "roster", GABBLE_DEBUG_ROSTER }, + { "disco", GABBLE_DEBUG_DISCO }, + { "properties", GABBLE_DEBUG_PROPERTIES }, + { "roomlist", GABBLE_DEBUG_ROOMLIST }, + { "media-channel", GABBLE_DEBUG_MEDIA }, + { "muc", GABBLE_DEBUG_MUC }, + { "connection", GABBLE_DEBUG_CONNECTION }, + { "persist", GABBLE_DEBUG_PERSIST }, + { "vcard", GABBLE_DEBUG_VCARD }, + { 0, }, +}; + + +#endif + +/* bsr added new */ +static void +debug_log_handler1 (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + #ifdef _DEBUG + + FILE* fp; + + fp = fopen("c:\\gabblelogs.txt","a"); + if(fp) + { + fprintf(fp,message); + fprintf(fp,"\n"); + fclose(fp); + } + #endif //_DEBUG +} + +#ifdef SYMBIAN +EXPORT_C +#endif +void gabble_debug_set_flags_from_env () +{ + guint nkeys; + const gchar *flags_string; + + for (nkeys = 0; keys[nkeys].value; nkeys++); + + flags_string = g_getenv ("GABBLE_DEBUG"); + + if (flags_string) + gabble_debug_set_flags (g_parse_debug_string (flags_string, keys, nkeys)); + + // bsr + log_handler = g_log_set_handler (NULL, 0xFF, + debug_log_handler1, NULL); +} + +#ifdef SYMBIAN +EXPORT_C +#endif +void gabble_debug_set_flags (GabbleDebugFlags new_flags) +{ + flags |= new_flags; +} + + +gboolean gabble_debug_flag_is_set (GabbleDebugFlags flag) +{ + return flag & flags; +} + +void gabble_debug (GabbleDebugFlags flag, + const gchar *format, + ...) +{ + if (flag & flags) + { + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args); + va_end (args); + } +} + +/*#endif /* ENABLE_DEBUG */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/disco.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/disco.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,981 @@ +/* + * gabble-media-stream-glue.h + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + + */ + + + +#include +#include +#include +#include +#include "loudmouth/loudmouth.h" + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-error.h" +#include "namespaces.h" +#include "telepathy-helpers.h" +#include "util.h" +#include "search-keys-info.h" + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(quark,gabble_disco,GQuark) + #define quark (*GET_WSD_VAR_NAME(quark,gabble_disco,s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_disco_parent_class,gabble_disco,gpointer) + #define gabble_disco_parent_class (*GET_WSD_VAR_NAME(gabble_disco_parent_class,gabble_disco,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_disco,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_disco,s)()) + + + +static void gabble_disco_init (GabbleDisco *self); +static void gabble_disco_class_init (GabbleDiscoClass *klass); +static void gabble_disco_class_intern_init (gpointer klass) +{ +gabble_disco_parent_class = g_type_class_peek_parent (klass); +gabble_disco_class_init ((GabbleDiscoClass*) klass); +} +EXPORT_C GType gabble_disco_get_type (void) +{ + +if ((g_define_type_id == 0)) +{ +static const GTypeInfo g_define_type_info = + { sizeof (GabbleDiscoClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_disco_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleDisco), 0, (GInstanceInitFunc) gabble_disco_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleDisco"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } ; + + +#endif + + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_DISCO +#define DEFAULT_REQUEST_TIMEOUT 20000 +#define DISCO_PIPELINE_SIZE 10 + + +/* Properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleDisco, gabble_disco, G_TYPE_OBJECT); +#endif + +typedef struct _GabbleDiscoPrivate GabbleDiscoPrivate; +struct _GabbleDiscoPrivate +{ + GabbleConnection *connection; + GSList *service_cache; + GList *requests; + gboolean dispose_has_run; +}; + +struct _GabbleDiscoRequest +{ + GabbleDisco *disco; + guint timer_id; + + GabbleDiscoType type; + gchar *jid; + gchar *node; + GabbleDiscoCb callback; + gpointer user_data; + GObject *bound_object; +}; + +GQuark +gabble_disco_error_quark (void) +{ + +#ifndef EMULATOR + static GQuark quark = 0; +#endif + + if (!quark) + quark = g_quark_from_static_string ("gabble-disco-error"); + return quark; +} + +#define GABBLE_DISCO_GET_PRIVATE(o) ((GabbleDiscoPrivate*)((o)->priv)); + + + + + + +static void +gabble_disco_init (GabbleDisco *obj) +{ + GabbleDiscoPrivate *priv = + G_TYPE_INSTANCE_GET_PRIVATE (obj, GABBLE_TYPE_DISCO, GabbleDiscoPrivate); + obj->priv = priv; +} + + + + +static GObject *gabble_disco_constructor (GType type, guint n_props, + GObjectConstructParam *props); +static void gabble_disco_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec); +static void gabble_disco_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec); +static void gabble_disco_dispose (GObject *object); +static void gabble_disco_finalize (GObject *object); + +static void +gabble_disco_class_init (GabbleDiscoClass *gabble_disco_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_disco_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_disco_class, sizeof (GabbleDiscoPrivate)); + + object_class->constructor = gabble_disco_constructor; + + object_class->get_property = gabble_disco_get_property; + object_class->set_property = gabble_disco_set_property; + + object_class->dispose = gabble_disco_dispose; + object_class->finalize = gabble_disco_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "XMPP Discovery object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); +} + +static void +gabble_disco_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleDisco *chan = GABBLE_DISCO (object); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->connection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_disco_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleDisco *chan = GABBLE_DISCO (object); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + priv->connection = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_disco_conn_status_changed_cb (GabbleConnection *conn, + TpConnectionStatus status, TpConnectionStatusReason reason, gpointer data); + +static GObject * +gabble_disco_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleDisco *disco; + GabbleDiscoPrivate *priv; + + obj = G_OBJECT_CLASS (gabble_disco_parent_class)-> constructor (type, + n_props, props); + disco = GABBLE_DISCO (obj); + priv = GABBLE_DISCO_GET_PRIVATE (disco); + + g_signal_connect (priv->connection, "status-changed", + G_CALLBACK (gabble_disco_conn_status_changed_cb), disco); + + return obj; +} + +static void cancel_request (GabbleDiscoRequest *request); + +void +gabble_disco_dispose (GObject *object) +{ + GSList *l; + DBusGProxy *bus_proxy; + + GabbleDisco *self = GABBLE_DISCO (object); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (self); + bus_proxy = tp_get_bus_proxy (); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + gabble_debug (DEBUG_FLAG, "dispose called"); + + /* cancel request removes the element from the list after cancelling */ + while (priv->requests) + cancel_request (priv->requests->data); + + for (l = priv->service_cache; l; l = g_slist_next (l)) + { + GabbleDiscoItem *item = (GabbleDiscoItem *) l->data; + g_free ((char *) item->jid); + g_free ((char *) item->name); + g_free ((char *) item->type); + g_free ((char *) item->category); + g_hash_table_destroy (item->features); + g_free (item); + } + + g_slist_free (priv->service_cache); + priv->service_cache = NULL; + + if (G_OBJECT_CLASS (gabble_disco_parent_class)->dispose) + G_OBJECT_CLASS (gabble_disco_parent_class)->dispose (object); +} + +void +gabble_disco_finalize (GObject *object) +{ + gabble_debug (DEBUG_FLAG, "called with %p", object); + + G_OBJECT_CLASS (gabble_disco_parent_class)->finalize (object); +} + +/** + * gabble_disco_new: + * @conn: The #GabbleConnection to use for service discovery + * + * Creates an object to use for Jabber service discovery (DISCO) + * There should be one of these per connection + */ +GabbleDisco * +gabble_disco_new (GabbleConnection *conn) +{ + GabbleDisco *disco; + + g_return_val_if_fail (GABBLE_IS_CONNECTION (conn), NULL); + + disco = GABBLE_DISCO (g_object_new (GABBLE_TYPE_DISCO, + "connection", conn, + NULL)); + + return disco; +} + + +static void notify_delete_request (gpointer data, GObject *obj); + +static void +delete_request (GabbleDiscoRequest *request) +{ + GabbleDisco *disco = request->disco; + GabbleDiscoPrivate *priv; + + g_assert (NULL != request); + /* fix: Application Crashed: Main */ + if ( disco == NULL ) + { + g_debug ("%s: accesing after dereferenced connection", G_STRFUNC); + return; + } + g_assert (GABBLE_IS_DISCO (disco)); + + priv = GABBLE_DISCO_GET_PRIVATE (disco); + + g_assert (NULL != g_list_find (priv->requests, request)); + + priv->requests = g_list_remove (priv->requests, request); + + if (NULL != request->bound_object) + { + g_object_weak_unref (request->bound_object, notify_delete_request, request); + } + + if (0 != request->timer_id) + { + g_source_remove (request->timer_id); + } + + g_free (request->jid); + g_free (request); +} + +static gboolean +timeout_request (gpointer data) +{ + GabbleDiscoRequest *request = (GabbleDiscoRequest*) data; + GError *err; + g_return_val_if_fail (data != NULL, FALSE); + + err = g_error_new (GABBLE_DISCO_ERROR, GABBLE_DISCO_ERROR_TIMEOUT, + "Request for %s on %s timed out", + (request->type == GABBLE_DISCO_TYPE_INFO)?"info":"items", + request->jid); + (request->callback)(request->disco, request, request->jid, request->node, + NULL, err, request->user_data); + g_error_free (err); + + request->timer_id = 0; + delete_request (request); + return FALSE; +} + +static void +cancel_request (GabbleDiscoRequest *request) +{ + GError *err; + + g_assert (request != NULL); + + err = g_error_new (GABBLE_DISCO_ERROR, GABBLE_DISCO_ERROR_CANCELLED, + "Request for %s on %s cancelled", + (request->type == GABBLE_DISCO_TYPE_INFO)?"info":"items", + request->jid); + (request->callback)(request->disco, request, request->jid, request->node, + NULL, err, request->user_data); + g_error_free (err); + + delete_request (request); +} + +static LmHandlerResult +request_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, gpointer user_data) +{ + LmMessageNode *query_node; + GError *err = NULL; + + GabbleDiscoRequest *request = (GabbleDiscoRequest*) user_data; + GabbleDisco *disco = GABBLE_DISCO (object); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (disco); + + g_assert (request); + + if (!g_list_find (priv->requests, request)) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + query_node = lm_message_node_get_child (reply_msg->node, "query"); + + if (lm_message_get_sub_type (reply_msg) == LM_MESSAGE_SUB_TYPE_ERROR) + { + LmMessageNode *error_node; + + error_node = lm_message_node_get_child (reply_msg->node, "error"); + if (error_node) + { + err = gabble_xmpp_error_to_g_error ( + gabble_xmpp_error_from_node (error_node)); + } + + if (err == NULL) + { + err = g_error_new (GABBLE_DISCO_ERROR, + GABBLE_DISCO_ERROR_UNKNOWN, + "an unknown error occurred"); + } + } + else if (NULL == query_node) + { + err = g_error_new (GABBLE_DISCO_ERROR, GABBLE_DISCO_ERROR_UNKNOWN, + "disco response contained no node"); + } + + request->callback (request->disco, request, request->jid, request->node, + query_node, err, request->user_data); + delete_request (request); + + if (err) + g_error_free (err); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +notify_delete_request (gpointer data, GObject *obj) +{ + GabbleDiscoRequest *request = (GabbleDiscoRequest *) data; + request->bound_object = NULL; + delete_request (request); +} + +/** + * gabble_disco_request: + * @self: #GabbleDisco object to use for request + * @type: type of request + * @jid: Jabber ID to request on + * @node: node to request on @jid, or NULL + * @callback: #GabbleDiscoCb to call on request fullfilment + * @object: GObject to bind request to. the callback will not be + * called if this object has been unrefed. NULL if not needed + * @error: #GError to return a telepathy error in if unable to make + * request, NULL if unneeded. + * + * Make a disco request on the given jid with the default timeout. + */ +GabbleDiscoRequest * +gabble_disco_request (GabbleDisco *self, GabbleDiscoType type, + const gchar *jid, const char *node, + GabbleDiscoCb callback, gpointer user_data, + GObject *object, GError **error) +{ + return gabble_disco_request_with_timeout (self, type, jid, node, + DEFAULT_REQUEST_TIMEOUT, + callback, user_data, + object, error); +} + +/** + * gabble_disco_request_with_timeout: + * @self: #GabbleDisco object to use for request + * @type: type of request + * @jid: Jabber ID to request on + * @node: node to request on @jid, or NULL + * @timeout: the time until the request fails, in milliseconds (1/1000ths of a second) + * @callback: #GabbleDiscoCb to call on request fullfilment + * @object: GObject to bind request to. the callback will not be + * called if this object has been unrefed. NULL if not needed + * @error: #GError to return a telepathy error in if unable to make + * request, NULL if unneeded. + * + * Make a disco request on the given jid, which will fail unless a reply + * is received within the given timeout interval. + */ +GabbleDiscoRequest * +gabble_disco_request_with_timeout (GabbleDisco *self, GabbleDiscoType type, + const gchar *jid, const char *node, + guint timeout, GabbleDiscoCb callback, + gpointer user_data, GObject *object, + GError **error) +{ + const gchar *xmlns; + + LmMessage *msg; + LmMessageNode *lm_node; + GabbleDiscoRequest *request; + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (self); + + + request = g_new0 (GabbleDiscoRequest, 1); + request->disco = self; + request->type = type; + request->jid = g_strdup (jid); + if (node) + request->node = g_strdup (node); + request->callback = callback; + request->user_data = user_data; + request->bound_object = object; + + if (NULL != object) + g_object_weak_ref (object, notify_delete_request, request); + + gabble_debug (DEBUG_FLAG, "Creating disco request %p for %s", + request, request->jid); + + priv->requests = g_list_prepend (priv->requests, request); + msg = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + lm_node = lm_message_node_add_child (msg->node, "query", NULL); + + switch (type) { + case GABBLE_DISCO_TYPE_INFO: + xmlns = NS_DISCO_INFO; + break; + case GABBLE_DISCO_TYPE_ITEMS: + xmlns = NS_DISCO_ITEMS; + break; + default: + g_assert_not_reached (); + return NULL; + } + + lm_message_node_set_attribute (lm_node, "xmlns", xmlns); + + if (node) + { + lm_message_node_set_attribute (lm_node, "node", node); + } + + if (! _gabble_connection_send_with_reply (priv->connection, msg, + request_reply_cb, G_OBJECT(self), request, error)) + { + delete_request (request); + lm_message_unref (msg); + return NULL; + } + else + { + request->timer_id = + g_timeout_add (timeout, timeout_request, request); + lm_message_unref (msg); + return request; + } +} + +void +gabble_disco_cancel_request (GabbleDisco *disco, GabbleDiscoRequest *request) +{ + GabbleDiscoPrivate *priv; + + g_return_if_fail (GABBLE_IS_DISCO (disco)); + g_return_if_fail (NULL != request); + + priv = GABBLE_DISCO_GET_PRIVATE (disco); + + g_return_if_fail (NULL != g_list_find (priv->requests, request)); + + cancel_request (request); +} + +/* Disco pipeline */ + + +typedef struct _GabbleDiscoPipeline GabbleDiscoPipeline; +struct _GabbleDiscoPipeline { + GabbleDisco *disco; + gpointer user_data; + GabbleDiscoPipelineCb callback; + GabbleDiscoEndCb end_callback; + GPtrArray *disco_pipeline; + GHashTable *remaining_items; + GabbleDiscoRequest *list_request; + gboolean running; +}; + +static void +gabble_disco_fill_pipeline (GabbleDisco *disco, GabbleDiscoPipeline *pipeline); + +static void +item_info_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *result, + GError *error, + gpointer user_data) +{ + LmMessageNode *identity, *feature, *field, *value_node; + const char *category, *type, *var, *name, *value; + GHashTable *keys; + GabbleDiscoItem item; + + GabbleDiscoPipeline *pipeline = (GabbleDiscoPipeline *) user_data; + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (disco); + + g_ptr_array_remove_fast (pipeline->disco_pipeline, request); + + if (error) + { + gabble_debug (DEBUG_FLAG, "got error %s", error->message); + goto done; + } + + identity = lm_message_node_get_child (result, "identity"); + if (NULL == identity) + goto done; + + name = lm_message_node_get_attribute (identity, "name"); + if (NULL == name) + goto done; + + category = lm_message_node_get_attribute (identity, "category"); + if (NULL == category) + goto done; + + type = lm_message_node_get_attribute (identity, "type"); + if (NULL == type) + goto done; + + gabble_debug (DEBUG_FLAG, "got item identity, jid=%s, name=%s, category=%s, type=%s", + jid, name, category, type); + + keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + for (feature = result->children; feature; feature = feature->next) + { + if (0 == strcmp (feature->name, "feature")) + { + var = lm_message_node_get_attribute (feature, "var"); + if (0 == strcmp (var, NS_SEARCH)) + { + priv->connection->features |= GABBLE_CONNECTION_FEATURES_SEARCH; + get_search_keys_info(priv->connection,jid); + } + if (var) + g_hash_table_insert (keys, g_strdup (var), NULL); + } + else if (0 == strcmp (feature->name, "x")) + { + if (lm_message_node_has_namespace (feature, NS_X_DATA, NULL)) + { + for (field = feature->children; + field; field = field->next) + { + if (0 != strcmp (field->name, "field")) + continue; + + var = lm_message_node_get_attribute (field, "var"); + if (NULL == var) + continue; + + value_node = lm_message_node_get_child (field, "value"); + if (NULL == value_node) + continue; + + value = lm_message_node_get_value (value_node); + if (NULL == value) + continue; + + g_hash_table_insert (keys, g_strdup (var), g_strdup (value)); + } + } + } + } + + item.jid = jid; + item.name = name; + item.category = category; + item.type = type; + item.features = keys; + + pipeline->callback (pipeline, &item, pipeline->user_data); + g_hash_table_destroy (keys); + +done: + gabble_disco_fill_pipeline (disco, pipeline); + + return; +} + + +static gboolean +return_true (gpointer key, gpointer value, gpointer data) +{ + return TRUE; +} + +static void +gabble_disco_fill_pipeline (GabbleDisco *disco, GabbleDiscoPipeline *pipeline) +{ + if (!pipeline->running) + { + gabble_debug (DEBUG_FLAG, "pipeline not running, not refilling"); + } + else + { + /* send disco requests for the JIDs in the remaining_items hash table + * until there are DISCO_PIPELINE_SIZE requests in progress */ + while (pipeline->disco_pipeline->len < DISCO_PIPELINE_SIZE) + { + gchar *jid; + GabbleDiscoRequest *request; + + jid = (gchar *) g_hash_table_find (pipeline->remaining_items, + return_true, NULL); + if (NULL == jid) + break; + + request = gabble_disco_request (disco, + GABBLE_DISCO_TYPE_INFO, jid, NULL, item_info_cb, pipeline, + G_OBJECT(disco), NULL); + + g_ptr_array_add (pipeline->disco_pipeline, request); + + /* frees jid */ + g_hash_table_remove (pipeline->remaining_items, jid); + } + + if (0 == pipeline->disco_pipeline->len) + { + /* signal that the pipeline has finished */ + pipeline->running = FALSE; + pipeline->end_callback (pipeline, pipeline->user_data); + } + } +} + + +static void +disco_items_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *result, + GError *error, + gpointer user_data) +{ + LmMessageNode *iter; + const char *item_jid; + gpointer key, value; + GabbleDiscoPipeline *pipeline = (GabbleDiscoPipeline *) user_data; + + pipeline->list_request = NULL; + + if (error) + { + gabble_debug (DEBUG_FLAG, "Got error on items request: %s", error->message); + goto out; + } + + iter = result->children; + + for (; iter; iter = iter->next) + { + if (0 != strcmp (iter->name, "item")) + continue; + + item_jid = lm_message_node_get_attribute (iter, "jid"); + + if (NULL != item_jid && + !g_hash_table_lookup_extended (pipeline->remaining_items, item_jid, &key, &value)) + { + gchar *tmp = g_strdup (item_jid); + gabble_debug (DEBUG_FLAG, "discovered service item: %s", tmp); + g_hash_table_insert (pipeline->remaining_items, tmp, tmp); + } + } + +out: + gabble_disco_fill_pipeline (disco, pipeline); +} + +/** + * gabble_disco_pipeline_init: + * @disco: disco object to use in the pipeline + * @callback: GFunc to call on request fullfilment + * @user_data: the usual + * + * Prepares the pipeline for making the ITEM request on the server and + * subsequent INFO elements on returned items. + * + * GabbleDiscoPipeline is opaque structure for the user. + */ +gpointer gabble_disco_pipeline_init (GabbleDisco *disco, + GabbleDiscoPipelineCb callback, + GabbleDiscoEndCb end_callback, + gpointer user_data) +{ + GabbleDiscoPipeline *pipeline = g_new (GabbleDiscoPipeline, 1); + pipeline->user_data = user_data; + pipeline->callback = callback; + pipeline->end_callback = end_callback; + pipeline->disco_pipeline = g_ptr_array_sized_new (DISCO_PIPELINE_SIZE); + pipeline->remaining_items = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + pipeline->running = TRUE; + pipeline->disco = disco; + + return pipeline; +} + +/** + * gabble_disco_pipeline_run: + * @self: reference to the pipeline structure + * @server: server to query + * + * Makes ITEMS request on the server, and afterwards queries for INFO + * on each item. INFO queries are pipelined. The item properties are stored + * in hash table parameter to the callback function. The user is responsible + * for destroying the hash table after it's done with. + * + * Upon returning all the results, the end_callback is called with + * reference to the pipeline. + */ +void +gabble_disco_pipeline_run (gpointer self, const char *server) +{ + GabbleDiscoPipeline *pipeline = (GabbleDiscoPipeline *) self; + + pipeline->running = TRUE; + + pipeline->list_request = gabble_disco_request (pipeline->disco, + GABBLE_DISCO_TYPE_ITEMS, server, NULL, disco_items_cb, pipeline, + G_OBJECT (pipeline->disco), NULL); +} + + +/** + * gabble_disco_pipeline_cancel: + * @pipeline: pipeline to cancel + * + * Flushes the pipeline (cancels all pending disco requests) and + * destroys it. + */ +void +gabble_disco_pipeline_destroy (gpointer self) +{ + GabbleDiscoPipeline *pipeline = (GabbleDiscoPipeline *) self; + + pipeline->running = FALSE; + + if (pipeline->list_request != NULL) + { + gabble_disco_cancel_request (pipeline->disco, pipeline->list_request); + pipeline->list_request = NULL; + } + + /* iterate using a while loop otherwise we're modifying + * the array as we iterate it, and miss things! */ + while (pipeline->disco_pipeline->len > 0) + { + GabbleDiscoRequest *request = + g_ptr_array_index (pipeline->disco_pipeline, 0); + gabble_disco_cancel_request (pipeline->disco, request); + } + + g_hash_table_destroy (pipeline->remaining_items); + g_ptr_array_free (pipeline->disco_pipeline, TRUE); + g_free (pipeline); +} + + +static void +service_feature_copy_one (gpointer k, gpointer v, gpointer user_data) +{ + char *key = (char *) k; + char *value = (char *) v; + + GHashTable *target = (GHashTable *) user_data; + g_hash_table_insert (target, g_strdup (key), g_strdup (value)); +} + +/* Service discovery */ +static void +services_cb (gpointer pipeline, GabbleDiscoItem *item, gpointer user_data) +{ + GabbleDiscoItem *my_item = g_new0 (GabbleDiscoItem, 1); + + GabbleDisco *disco = GABBLE_DISCO (user_data); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (disco); + + my_item->jid = g_strdup (item->jid); + my_item->name = g_strdup (item->name); + my_item->type = g_strdup (item->type); + my_item->category = g_strdup (item->category); + + my_item->features = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_hash_table_foreach (item->features, service_feature_copy_one, my_item->features); + + priv->service_cache = g_slist_prepend (priv->service_cache, my_item); +} + +static void +end_cb (gpointer pipeline, gpointer user_data) +{ + GabbleDisco *disco = GABBLE_DISCO (user_data); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (disco); + + gabble_disco_pipeline_destroy (pipeline); + priv->service_cache = g_slist_reverse (priv->service_cache); + + /* FIXME - service discovery done - signal that somehow */ +} + +static void +gabble_disco_conn_status_changed_cb (GabbleConnection *conn, + TpConnectionStatus status, + TpConnectionStatusReason reason, + gpointer data) +{ + GabbleDisco *disco = GABBLE_DISCO (data); + GabbleDiscoPrivate *priv = GABBLE_DISCO_GET_PRIVATE (disco); + + if (status == TP_CONN_STATUS_CONNECTED) + { + char *server; + gpointer pipeline = gabble_disco_pipeline_init (disco, services_cb, + end_cb, disco); + + g_object_get (priv->connection, "stream-server", &server, NULL); + + g_assert (server != NULL); + + gabble_debug (DEBUG_FLAG, "connected, initiating service discovery on %s", server); + gabble_disco_pipeline_run (pipeline, server); + + g_free (server); + } +} + +const GabbleDiscoItem * +gabble_disco_service_find (GabbleDisco *disco, + const char *type, + const char *category, + const char *feature) +{ + GabbleDiscoPrivate *priv; + GSList *l; + + g_assert (GABBLE_IS_DISCO (disco)); + priv = GABBLE_DISCO_GET_PRIVATE (disco); + + for (l = priv->service_cache; l; l = g_slist_next (l)) + { + GabbleDiscoItem *item = (GabbleDiscoItem *) l->data; + gboolean selected = TRUE; + + if (type != NULL && g_strdiff (type, item->type)) + selected = FALSE; + + if (category != NULL && g_strdiff (category, item->category)) + selected = FALSE; + + if (feature != NULL) + { + gpointer k, v; + if (!g_hash_table_lookup_extended (item->features, feature, &k, &v)) + selected = FALSE; + } + + if (selected) + return item; + } + + return NULL; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/exegabble.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/exegabble.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,210 @@ +/* + * gabble.h - entry point and utility functions for telepathy-gabble + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#ifdef HAVE_EXECINFO_H +#include +#endif /* HAVE_EXECINFO_H */ + +#ifdef HAVE_SIGNAL_H +#include +#endif /* HAVE_SIGNAL_H */ + +#include "debug.h" +#include "gabble-connection-manager.h" +#include "telepathy-errors.h" +#include "telepathy-errors-enumtypes.h" + +GSource *timeout = NULL; +GMainLoop *mainloop = NULL; +GabbleConnectionManager *manager = NULL; +gboolean connections_exist = FALSE; +guint timeout_id; + +#define DIE_TIME 5000 + +static gboolean +kill_connection_manager (gpointer data) +{ +#ifdef ENABLE_DEBUG + if (!gabble_debug_flag_is_set (GABBLE_DEBUG_PERSIST) && !connections_exist) +#else + if (!connections_exist) +#endif + { + g_debug ("no connections, and timed out"); + g_object_unref (manager); + g_main_loop_quit (mainloop); + } + + timeout_id = 0; + return FALSE; +} + +static void +new_connection (GabbleConnectionManager *conn, + gchar *bus_name, + gchar *object_path, + gchar *proto) +{ + connections_exist = TRUE; + + if (0 != timeout_id) + { + g_source_remove (timeout_id); + } +} + +static void +no_more_connections (GabbleConnectionManager *conn) +{ + connections_exist = FALSE; + + if (0 != timeout_id) + { + g_source_remove (timeout_id); + } + + timeout_id = g_timeout_add (DIE_TIME, kill_connection_manager, NULL); +} + +#ifdef ENABLE_BACKTRACE +static void +print_backtrace (void) +{ +#if defined (HAVE_BACKTRACE) && defined (HAVE_BACKTRACE_SYMBOLS_FD) + void *array[20]; + size_t size; + +#define MSG "\n########## Backtrace (version " VERSION ") ##########\n" + write (STDERR_FILENO, MSG, strlen (MSG)); +#undef MSG + + size = backtrace (array, 20); + backtrace_symbols_fd (array, size, STDERR_FILENO); +#endif /* HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS_FD */ +} + +static void +critical_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_log_default_handler (log_domain, log_level, message, user_data); + print_backtrace (); +} + +#ifdef HAVE_SIGNAL +static void +segv_handler (int sig) +{ +#define MSG "caught SIGSEGV\n" + write (STDERR_FILENO, MSG, strlen (MSG)); +#undef MSG + + print_backtrace (); + abort (); +} +#endif /* HAVE_SIGNAL */ + +#endif /* ENABLE_BACKTRACE */ + +static void +add_signal_handlers (void) +{ +#if defined(HAVE_SIGNAL) && defined(ENABLE_BACKTRACE) + signal (SIGSEGV, segv_handler); +#endif /* HAVE_SIGNAL && ENABLE_BACKTRACE */ +} + +int +main (int argc, + char **argv) +{ + add_signal_handlers (); + + g_type_init(); + + g_set_prgname("telepathy-gabble"); + +/* bsr #ifdef ENABLE_DEBUG*/ + gabble_debug_set_flags_from_env (); + + if (g_getenv ("GABBLE_PERSIST")) + gabble_debug_set_flags (0xffff); +/*#endif bsr */ + + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + +#ifdef ENABLE_BACKTRACE + g_log_set_handler ("GLib-GObject", + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); + g_log_set_handler ("GLib", + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); + g_log_set_handler (NULL, + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); +#endif /* ENABLE_BACKTRACE */ + } + + g_message("before gabble mainloop new \n"); + getchar(); + exit(1); + mainloop = g_main_loop_new (NULL, FALSE); + + dbus_g_error_domain_register (TELEPATHY_ERRORS, + "org.freedesktop.Telepathy.Error", TELEPATHY_TYPE_ERRORS); + + manager = g_object_new (GABBLE_TYPE_CONNECTION_MANAGER, NULL); + + g_signal_connect (manager, "new-connection", + (GCallback) new_connection, NULL); + + g_signal_connect (manager, "no-more-connections", + (GCallback) no_more_connections, NULL); + + g_message("calling gabble_connection_manager_register \n"); + _gabble_connection_manager_register (manager); + + g_message("started version " VERSION); + + //timeout_id = g_timeout_add (DIE_TIME, kill_connection_manager, NULL); + + g_main_loop_run (mainloop); + + return 0; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-connection-manager-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-connection-manager-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,107 @@ +/* + * gabble-connection-manager-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:STRING,STRING,STRING (gabble-connection-manager-signals-marshal.list:1) */ +void +gabble_connection_manager_marshal_VOID__STRING_STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_STRING_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer data2); + + register GMarshalFunc_VOID__STRING_STRING_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-connection-manager.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-connection-manager.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,705 @@ +/* + * gabble-connection-manager.c - Source for GabbleConnectionManager + * Copyright (C) 2005 Collabora Ltd. + * and/or its subsidiary/subsidiaries. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include "gabble-connection.h" +#include "telepathy-constants.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" + +#include "gabble-connection-manager.h" +#include "gabble-connection-manager-glue.h" +#include "gabble-connection-manager-signals-marshal.h" + +#include "gabble_enums.h" + +#define TP_TYPE_PARAM (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_STRING, \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_VALUE, \ + G_TYPE_INVALID)) + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleConnectionManager, gabble_connection_manager, G_TYPE_OBJECT) +#endif + + +/* signal enum */ +enum +{ + NEW_CONNECTION, + NO_MORE_CONNECTIONS, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_CON_MGR +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_conmgr,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_conmgr, s)()) + + GET_STATIC_VAR_FROM_TLS(ssl,gabble_conmgr,gboolean) + #define ssl (*GET_WSD_VAR_NAME(ssl,gabble_conmgr,s)()) + + GET_STATIC_VAR_FROM_TLS(httpport,gabble_conmgr,guint) + #define httpport (*GET_WSD_VAR_NAME(httpport,gabble_conmgr,s)()) + + GET_STATIC_VAR_FROM_TLS(httpproxyport,gabble_conmgr,guint) + #define httpproxyport (*GET_WSD_VAR_NAME(httpproxyport,gabble_conmgr,s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_connection_manager_parent_class,gabble_conmgr,gpointer) + #define gabble_connection_manager_parent_class (*GET_WSD_VAR_NAME(gabble_connection_manager_parent_class,gabble_conmgr,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_conmgr,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_conmgr,s)()) + + +static void gabble_connection_manager_init (GabbleConnectionManager *self); +static void gabble_connection_manager_class_init (GabbleConnectionManagerClass *klass); +static void gabble_connection_manager_class_intern_init (gpointer klass) +{ +gabble_connection_manager_parent_class = g_type_class_peek_parent (klass); +gabble_connection_manager_class_init ((GabbleConnectionManagerClass*) klass); +} +EXPORT_C GType gabble_connection_manager_get_type (void) +{ + +if ((g_define_type_id == 0)) +{ +static const GTypeInfo g_define_type_info = + { sizeof (GabbleConnectionManagerClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_connection_manager_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleConnectionManager), 0, (GInstanceInitFunc) gabble_connection_manager_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleConnectionManager"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } ; + + +#else + +static guint signals[LAST_SIGNAL] = {0}; + +static gboolean ssl = TRUE; +static guint httpport = 8080; +static guint httpproxyport = 443; + +#endif + +/* private structure */ +typedef struct _GabbleConnectionManagerPrivate GabbleConnectionManagerPrivate; + +struct _GabbleConnectionManagerPrivate +{ + gboolean dispose_has_run; + GHashTable *connections; +}; + +#define GABBLE_CONNECTION_MANAGER_GET_PRIVATE(obj) \ + ((GabbleConnectionManagerPrivate *)obj->priv) + +/* type definition stuff */ + +static void +gabble_connection_manager_init (GabbleConnectionManager *self) +{ + GabbleConnectionManagerPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_CONNECTION_MANAGER, GabbleConnectionManagerPrivate); + + self->priv = priv; + + priv->connections = g_hash_table_new (g_direct_hash, g_direct_equal); +} + +static void gabble_connection_manager_dispose (GObject *object); +static void gabble_connection_manager_finalize (GObject *object); + +static void +gabble_connection_manager_class_init (GabbleConnectionManagerClass *gabble_connection_manager_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_connection_manager_class); + + g_type_class_add_private (gabble_connection_manager_class, sizeof (GabbleConnectionManagerPrivate)); + + g_message("**NEW LOGS** inside gabble_connection_manager_class_init \n"); + + object_class->dispose = gabble_connection_manager_dispose; + object_class->finalize = gabble_connection_manager_finalize; + + signals [NEW_CONNECTION] = + g_signal_new ("new-connection", + G_OBJECT_CLASS_TYPE (gabble_connection_manager_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_connection_manager_marshal_VOID__STRING_STRING_STRING, + G_TYPE_NONE, 3, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING); + + signals [NO_MORE_CONNECTIONS] = + g_signal_new ("no-more-connections", + G_OBJECT_CLASS_TYPE (gabble_connection_manager_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_connection_manager_class), &dbus_glib_gabble_connection_manager_object_info); +} + +void +gabble_connection_manager_dispose (GObject *object) +{ + GabbleConnectionManager *self = GABBLE_CONNECTION_MANAGER (object); + GabbleConnectionManagerPrivate *priv = GABBLE_CONNECTION_MANAGER_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + /* release any references held by the object here */ + + if (G_OBJECT_CLASS (gabble_connection_manager_parent_class)->dispose) + G_OBJECT_CLASS (gabble_connection_manager_parent_class)->dispose (object); +} + +void +gabble_connection_manager_finalize (GObject *object) +{ + GabbleConnectionManager *self = GABBLE_CONNECTION_MANAGER (object); + GabbleConnectionManagerPrivate *priv = GABBLE_CONNECTION_MANAGER_GET_PRIVATE (self); + + g_hash_table_destroy(priv->connections); + + G_OBJECT_CLASS (gabble_connection_manager_parent_class)->finalize (object); +} + + +enum { + JABBER_PARAM_ACCOUNT = 0, + JABBER_PARAM_PASSWORD, + JABBER_PARAM_SERVER, + JABBER_PARAM_RESOURCE, + JABBER_PARAM_PRIORITY, + JABBER_PARAM_PORT, + JABBER_PARAM_OLD_SSL, + JABBER_PARAM_REGISTER, + JABBER_PARAM_LOW_BANDWIDTH, + JABBER_PARAM_HTTPS_PROXY_SERVER, + JABBER_PARAM_HTTPS_PROXY_PORT, + JABBER_PARAM_FALLBACK_CONFERENCE_SERVER, + JABBER_PARAM_STUN_SERVER, + JABBER_PARAM_STUN_PORT, + JABBER_PARAM_IGNORE_SSL_ERRORS, + JABBER_PARAM_ALIAS, + LAST_JABBER_PARAM +}; +/* private methods */ + +static gboolean +get_parameters (const char *proto, const GabbleParamSpec **params, GError **error) +{ + if (!strcmp (proto, "jabber")) + { + *params = jabber_params; + } + else + { + g_debug ("%s: unknown protocol %s", G_STRFUNC, proto); + + g_set_error (error, TELEPATHY_ERRORS, NotImplemented, + "unknown protocol %s", proto); + + return FALSE; + } + + return TRUE; +} + +static GValue *param_default_value (const GabbleParamSpec *params, int i) +{ + GValue *value; + + value = g_new0(GValue, 1); + g_value_init(value, params[i].gtype); + + /* TODO: this check could be stricter if we knew whether register + was true. In practice REQUIRED and REGISTER always go together in + the Gabble params, though */ + if (params[i].flags & TP_CONN_MGR_PARAM_FLAG_REQUIRED & TP_CONN_MGR_PARAM_FLAG_REGISTER) + { + g_assert(params[i].def == NULL); + goto OUT; + } + + switch (params[i].dtype[0]) + { + case DBUS_TYPE_STRING: + g_value_set_static_string (value, (const gchar*) params[i].def); + break; + case DBUS_TYPE_INT16: + g_value_set_int (value, GPOINTER_TO_INT (params[i].def)); + break; + case DBUS_TYPE_UINT16: + g_value_set_uint (value, GPOINTER_TO_INT (params[i].def)); + break; + case DBUS_TYPE_BOOLEAN: + g_value_set_boolean (value, GPOINTER_TO_INT (params[i].def)); + break; + default: + g_error("parameter_defaults: encountered unknown type %s on argument %s", + params[i].dtype, params[i].name); + } + +OUT: + return value; +} + +static gboolean +set_param_from_value (const GabbleParamSpec *paramspec, + GValue *value, + GabbleParams *params, + GError **error) +{ + if (G_VALUE_TYPE (value) != paramspec->gtype) + { + g_debug ("%s: expected type %s for parameter %s, got %s", + G_STRFUNC, + g_type_name (paramspec->gtype), paramspec->name, + G_VALUE_TYPE_NAME (value)); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "expected type %s for account parameter %s, got %s", + g_type_name (paramspec->gtype), paramspec->name, + G_VALUE_TYPE_NAME (value)); + return FALSE; + } + + switch (paramspec->dtype[0]) + { + case DBUS_TYPE_STRING: + { + const char *str = g_value_get_string (value); + if (!str || *str == '\0') + return FALSE; + else + *((char **) ((char *)params + paramspec->offset)) = g_value_dup_string (value); + } + break; + case DBUS_TYPE_INT16: + *((gint *) ((char *)params + paramspec->offset)) = g_value_get_int (value); + break; + case DBUS_TYPE_UINT16: + *((guint *) ((char *)params + paramspec->offset)) = g_value_get_uint (value); + break; + case DBUS_TYPE_BOOLEAN: + *((gboolean *) ((char *)params + paramspec->offset)) = g_value_get_boolean (value); + break; + default: + g_error ("set_param_from_value: encountered unknown type %s on argument %s", + paramspec->dtype, paramspec->name); + return FALSE; + } + + return TRUE; +} + +static gboolean +parse_parameters (const GabbleParamSpec *paramspec, + GHashTable *provided, + GabbleParams *params, + GError **error) +{ + int unhandled; + int i; + guint mandatory_flag = TP_CONN_MGR_PARAM_FLAG_REQUIRED; + GValue *value; + + unhandled = g_hash_table_size (provided); + + value = g_hash_table_lookup (provided, "register"); + if (value != NULL && G_VALUE_TYPE(value) == G_TYPE_BOOLEAN && + g_value_get_boolean(value)) + { + mandatory_flag = TP_CONN_MGR_PARAM_FLAG_REGISTER; + } + + for (i = 0; paramspec[i].name; i++) + { + value = g_hash_table_lookup (provided, paramspec[i].name); + + if (value == NULL) + { + if (paramspec[i].flags & mandatory_flag) + { + g_debug ("%s: missing mandatory param %s", + G_STRFUNC, paramspec[i].name); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "missing mandatory account parameter %s", paramspec[i].name); + return FALSE; + } + else + { + g_debug ("%s: using default value for param %s", + G_STRFUNC, paramspec[i].name); + } + } + else + { + if (!set_param_from_value (¶mspec[i], value, params, error)) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid value for parameter %s", paramspec[i].name); + return FALSE; + } + + params->set_mask |= 1 << i; + + unhandled--; + if (paramspec[i].gtype == G_TYPE_STRING) + { + if (0 == strcmp (paramspec[i].name, "password")) + { + g_debug ("%s: accepted value for param password", + G_STRFUNC); + } + else + { + g_debug ("%s: accepted value %s for param %s", + G_STRFUNC, + *((char **) ((char *)params + paramspec[i].offset)), + paramspec[i].name); + } + } + else + { + g_debug ("%s: accepted value %u for param %s", G_STRFUNC, + *((guint *) ((char *)params + paramspec[i].offset)), paramspec[i].name); + } + } + } + + if (unhandled) + { + g_debug ("%s: unknown argument name provided", G_STRFUNC); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "unknown argument name provided"); + return FALSE; + } + + return TRUE; +} + +static void +free_params (GabbleParams *params) +{ + g_free (params->account); + g_free (params->password); + g_free (params->server); + g_free (params->resource); + g_free (params->https_proxy_server); + g_free (params->fallback_conference_server); + g_free (params->stun_server); + g_free (params->alias); +} + +/** + * connection_disconnected_cb: + * @conn: #GabbleConnection + * @data: data passed in callback + * + * Signal handler called when a connection object disconnects. + * When they become disconnected, we can unref and discard + * them, and they will disappear from the bus. + */ +static void +connection_disconnected_cb (GabbleConnection *conn, + gpointer data) +{ + GabbleConnectionManager *self = GABBLE_CONNECTION_MANAGER (data); + GabbleConnectionManagerPrivate *priv = GABBLE_CONNECTION_MANAGER_GET_PRIVATE (self); + + g_assert (g_hash_table_lookup (priv->connections, conn)); + + /* fix: this check should only be done if priv->connections is not null, and conn is not null */ + + if( (priv->connections) && (conn)) + g_hash_table_remove (priv->connections, conn); + + /* end of fix */ + + g_object_unref (conn); + + g_debug ("%s: dereferenced connection", G_STRFUNC); + if(priv->connections) + if (g_hash_table_size (priv->connections) == 0) + { + g_signal_emit (self, signals [NO_MORE_CONNECTIONS], 0); + g_debug ("%s: emitting no more connections", G_STRFUNC); + } + + +} + +/* public methods */ + +#ifdef SYMBIAN +EXPORT_C +#endif +void +_gabble_connection_manager_register (GabbleConnectionManager *self) +{ + DBusGConnection *bus; + DBusGProxy *bus_proxy; + GError *error = NULL; + guint request_name_result; + + g_assert (GABBLE_IS_CONNECTION_MANAGER (self)); + + bus = tp_get_bus (); + bus_proxy = tp_get_bus_proxy (); + + if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error, + G_TYPE_STRING, GABBLE_CONN_MGR_BUS_NAME, + G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE, + G_TYPE_INVALID, + G_TYPE_UINT, &request_name_result, + G_TYPE_INVALID)) + g_error ("Failed to request bus name: %s", error->message); + + if (request_name_result == DBUS_REQUEST_NAME_REPLY_EXISTS) + { + g_warning ("Failed to acquire bus name, connection manager already running?"); + exit (1); + } + + dbus_g_connection_register_g_object (bus, GABBLE_CONN_MGR_OBJECT_PATH, G_OBJECT (self)); +} + +/* dbus-exported methods */ + +/** + * gabble_connection_manager_get_parameters + * + * Implements D-Bus method GetParameters + * on interface org.freedesktop.Telepathy.ConnectionManager + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_manager_get_parameters (GabbleConnectionManager *self, + const gchar *proto, + GPtrArray **ret, + GError **error) +{ + const GabbleParamSpec *params = NULL; + int i; + + if (!get_parameters (proto, ¶ms, error)) + return FALSE; + + *ret = g_ptr_array_new (); + + for (i = 0; params[i].name; i++) + { + GValue *def_value; + GValue param = { 0, }; + + g_value_init (¶m, TP_TYPE_PARAM); + g_value_set_static_boxed (¶m, + dbus_g_type_specialized_construct (TP_TYPE_PARAM)); + + def_value = param_default_value (params, i); + dbus_g_type_struct_set (¶m, + 0, params[i].name, + 1, params[i].flags, + 2, params[i].dtype, + 3, def_value, + G_MAXUINT); + g_value_unset(def_value); + g_free(def_value); + + g_ptr_array_add (*ret, g_value_get_boxed (¶m)); + } + + return TRUE; +} + + +/** + * gabble_connection_manager_list_protocols + * + * Implements D-Bus method ListProtocols + * on interface org.freedesktop.Telepathy.ConnectionManager + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_manager_list_protocols (GabbleConnectionManager *self, + gchar ***ret, + GError **error) +{ + const char *protocols[] = { "jabber", NULL }; + g_message("BINGO...gabble_connection_manager_list_protocols entered \n"); + + *ret = g_strdupv ((gchar **)protocols); + + g_message("BINGO...leaving gabble_connection_manager_list_protocols \n"); + + return TRUE; +} + + +#define SET_PROPERTY_IF_PARAM_SET(prop, param, member) \ + if ((params.set_mask & (1 << param)) != 0) \ + { \ + g_object_set (conn, prop, member, NULL); \ + } + + +/** + * gabble_connection_manager_request_connection + * + * Implements D-Bus method RequestConnection + * on interface org.freedesktop.Telepathy.ConnectionManager + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_manager_request_connection (GabbleConnectionManager *self, + const gchar *proto, + GHashTable *parameters, + gchar **bus_name, + gchar **object_path, + GError **error) +{ + GabbleConnectionManagerPrivate *priv; + GabbleConnection *conn; + const GabbleParamSpec *paramspec; + GabbleParams params = { 0, }; + + g_assert (GABBLE_IS_CONNECTION_MANAGER (self)); + + priv = GABBLE_CONNECTION_MANAGER_GET_PRIVATE (self); + + if (!get_parameters (proto, ¶mspec, error)) + return FALSE; + + + if (!parse_parameters (paramspec, parameters, ¶ms, error)) + { + free_params (¶ms); + return FALSE; + } + + conn = g_object_new (GABBLE_TYPE_CONNECTION, + "protocol", proto, + "password", params.password, + NULL); + + g_message("BINGO...after g_object_new \n"); + + SET_PROPERTY_IF_PARAM_SET ("connect-server", JABBER_PARAM_SERVER, + params.server); + SET_PROPERTY_IF_PARAM_SET ("resource", JABBER_PARAM_RESOURCE, + params.resource); + SET_PROPERTY_IF_PARAM_SET ("priority", JABBER_PARAM_PRIORITY, + CLAMP (params.priority, G_MININT8, G_MAXINT8)); + SET_PROPERTY_IF_PARAM_SET ("port", JABBER_PARAM_PORT, params.port); + SET_PROPERTY_IF_PARAM_SET ("old-ssl", JABBER_PARAM_OLD_SSL, params.old_ssl); + SET_PROPERTY_IF_PARAM_SET ("register", JABBER_PARAM_REGISTER, + params.do_register); + SET_PROPERTY_IF_PARAM_SET ("low-bandwidth", JABBER_PARAM_LOW_BANDWIDTH, + params.low_bandwidth); + SET_PROPERTY_IF_PARAM_SET ("https-proxy-server", + JABBER_PARAM_HTTPS_PROXY_SERVER, + params.https_proxy_server); + SET_PROPERTY_IF_PARAM_SET ("https-proxy-port", JABBER_PARAM_HTTPS_PROXY_PORT, + params.https_proxy_port); + SET_PROPERTY_IF_PARAM_SET ("fallback-conference-server", + JABBER_PARAM_FALLBACK_CONFERENCE_SERVER, + params.fallback_conference_server); + SET_PROPERTY_IF_PARAM_SET ("stun-server", JABBER_PARAM_STUN_SERVER, + params.stun_server); + SET_PROPERTY_IF_PARAM_SET ("stun-port", JABBER_PARAM_STUN_PORT, + params.stun_port); + SET_PROPERTY_IF_PARAM_SET ("ignore-ssl-errors", + JABBER_PARAM_IGNORE_SSL_ERRORS, + params.ignore_ssl_errors); + SET_PROPERTY_IF_PARAM_SET ("alias", JABBER_PARAM_ALIAS, params.alias); + + // split up account into username, stream-server and resource + if (!_gabble_connection_set_properties_from_account (conn, params.account, error)) + { + goto ERROR; + } + + // free memory allocated by param parser + free_params(¶ms); + +// with hash table usage - end + + + // register on bus and save bus name and object path + if (!_gabble_connection_register (conn, bus_name, object_path, error)) + { + g_debug ("%s failed: %s", G_STRFUNC, (*error)->message); + + goto ERROR; + } + + /* bind to status change signals from the connection object */ + g_signal_connect (conn, "disconnected", + G_CALLBACK (connection_disconnected_cb), + self); + + /* store the connection, using a hash table as a set */ + g_hash_table_insert (priv->connections, conn, GINT_TO_POINTER(TRUE)); + + /* emit the new connection signal */ + g_signal_emit (self, signals [NEW_CONNECTION], 0, *bus_name, *object_path, proto); + + return TRUE; + +ERROR: + if (conn) + g_object_unref (G_OBJECT (conn)); + + g_message("ERROR...returning FALSE\n"); + return FALSE; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-connection-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-connection-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,146 @@ +/* + * gabble-connection-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:STRING,STRING,UINT,UINT,BOOLEAN (gabble-connection-signals-marshal.list:1) */ +void +gabble_connection_marshal_VOID__STRING_STRING_UINT_UINT_BOOLEAN (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_STRING_UINT_UINT_BOOLEAN) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + guint arg_3, + guint arg_4, + gboolean arg_5, + gpointer data2); + register GMarshalFunc_VOID__STRING_STRING_UINT_UINT_BOOLEAN callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_STRING_UINT_UINT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_uint (param_values + 4), + g_marshal_value_peek_boolean (param_values + 5), + data2); +} + +/* VOID:UINT,UINT (gabble-connection-signals-marshal.list:2) */ +void +gabble_connection_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-connection.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-connection.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,5227 @@ +/* + * gabble-connection.c - Source for GabbleConnection + * Copyright (C) 2005 Collabora Ltd. + * and/or its subsidiary/subsidiaries. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include "loudmouth/loudmouth.h" +#include +#include +#include + + +#include "handles.h" +#include "handle-set.h" +#include "telepathy-constants.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "loudmouth/lm-connection.h" + +#include "tp-channel-iface.h" +#include "tp-channel-factory-iface.h" + +#include "gabble-connection.h" +#include "gabble-connection-glue.h" +#include "gabble-connection-signals-marshal.h" + + +#include "capabilities.h" +#include "debug.h" +#include "disco.h" +#include "gabble-presence-cache.h" +#include "gabble-presence.h" +#include "gabble-register.h" +#include "im-factory.h" +#include "search-factory.h" +#include "jingle-info.h" +#include "media-factory.h" +#include "muc-factory.h" +#include "namespaces.h" +#include "roster.h" +#include "util.h" +#include "vcard-manager.h" +#include "search-keys-info.h" + +#include "gabble-media-channel.h" +#include "gabble-roomlist-channel.h" + +#include "gabble_enums.h" +#include "sha1.h" +#include "base64.h" + +#define DEBUG_FLAG GABBLE_DEBUG_CONNECTION +#define DBUS_API_SUBJECT_TO_CHANGE +#define BUS_NAME "org.freedesktop.Telepathy.Connection.gabble" +#define OBJECT_PATH "/org/freedesktop/Telepathy/Connection/gabble" + +#define TP_ALIAS_PAIR_TYPE (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID)) +#define TP_CAPABILITY_PAIR_TYPE (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)) +#define TP_CAPABILITIES_CHANGED_MONSTER_TYPE (dbus_g_type_get_struct \ + ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, \ + G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)) +#define TP_GET_CAPABILITIES_MONSTER_TYPE (dbus_g_type_get_struct \ + ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, \ + G_TYPE_INVALID)) +#define TP_CHANNEL_LIST_ENTRY_TYPE (dbus_g_type_get_struct ("GValueArray", \ + DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, \ + G_TYPE_INVALID)) + +#define ERROR_IF_NOT_CONNECTED(CONN, ERROR) \ + if ((CONN)->status != TP_CONN_STATUS_CONNECTED) \ + { \ + gabble_debug (DEBUG_FLAG, "rejected request as disconnected"); \ + g_set_error (ERROR, TELEPATHY_ERRORS, NotAvailable, \ + "Connection is disconnected"); \ + return FALSE; \ + } + +#define ERROR_IF_NOT_CONNECTED_ASYNC(CONN, ERROR, CONTEXT) \ + if ((CONN)->status != TP_CONN_STATUS_CONNECTED) \ + { \ + gabble_debug (DEBUG_FLAG, "rejected request as disconnected"); \ + (ERROR) = g_error_new (TELEPATHY_ERRORS, NotAvailable, \ + "Connection is disconnected"); \ + dbus_g_method_return_error ((CONTEXT), (ERROR)); \ + g_error_free ((ERROR)); \ + return; \ + } + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleConnection, gabble_connection, G_TYPE_OBJECT) +#endif + +typedef struct _StatusInfo StatusInfo; + +struct _StatusInfo +{ + const gchar *name; + TpConnectionPresenceType presence_type; + const gboolean self; + const gboolean exclusive; +}; + +/* order must match PresenceId enum in gabble-connection.h */ +/* in increasing order of presence */ +static const StatusInfo gabble_statuses[LAST_GABBLE_PRESENCE] = { + { "offline", TP_CONN_PRESENCE_TYPE_OFFLINE, TRUE, TRUE }, + { "hidden", TP_CONN_PRESENCE_TYPE_HIDDEN, TRUE, TRUE }, + { "xa", TP_CONN_PRESENCE_TYPE_EXTENDED_AWAY, TRUE, TRUE }, + { "away", TP_CONN_PRESENCE_TYPE_AWAY, TRUE, TRUE }, + { "dnd", TP_CONN_PRESENCE_TYPE_AWAY, TRUE, TRUE }, + { "available", TP_CONN_PRESENCE_TYPE_AVAILABLE, TRUE, TRUE }, + { "chat", TP_CONN_PRESENCE_TYPE_AVAILABLE, TRUE, TRUE } +}; + +/* signal enum */ +enum +{ + ALIASES_CHANGED, + CAPABILITIES_CHANGED, + NEW_CHANNEL, + PRESENCE_UPDATE, + STATUS_CHANGED, + DISCONNECTED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_CON +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_con,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_con, s)()) + + + GET_STATIC_VAR_FROM_TLS(arguments,gabble_con,GHashTable*) + #define arguments (*GET_WSD_VAR_NAME(arguments,gabble_con, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_connection_parent_class,gabble_con,gpointer) + #define gabble_connection_parent_class (*GET_WSD_VAR_NAME(gabble_connection_parent_class,gabble_con,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_con,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_con,s)()) + + //GET_STATIC_ARRAY_FROM_TLS(assumed_caps,gabble_con,gchar*) + /*gchar** _s_gabble_con_assumed_caps() { return (gchar**)((libgabble_ImpurePtr()->_s_gabble_con_assumed_caps)); } + + #define assumed_caps (GET_WSD_VAR_NAME(assumed_caps,gabble_con, s)()) */ + + + +static void gabble_connection_init (GabbleConnection *self); +static void gabble_connection_class_init (GabbleConnectionClass *klass); +static void gabble_connection_class_intern_init (gpointer klass) +{ +gabble_connection_parent_class = g_type_class_peek_parent (klass); +gabble_connection_class_init ((GabbleConnectionClass*) klass); +} +EXPORT_C GType gabble_connection_get_type (void) +{ + +if ((g_define_type_id == 0)) +{ +static const GTypeInfo g_define_type_info = + { sizeof (GabbleConnectionClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_connection_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleConnection), 0, (GInstanceInitFunc) gabble_connection_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleConnection"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } ; + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + +/* properties */ +enum +{ + PROP_PROTOCOL = 1, + PROP_CONNECT_SERVER, + PROP_PORT, + PROP_OLD_SSL, + PROP_REGISTER, + PROP_LOW_BANDWIDTH, + PROP_STREAM_SERVER, + PROP_USERNAME, + PROP_PASSWORD, + PROP_RESOURCE, + PROP_PRIORITY, + PROP_HTTPS_PROXY_SERVER, + PROP_HTTPS_PROXY_PORT, + PROP_FALLBACK_CONFERENCE_SERVER, + PROP_STUN_SERVER, + PROP_STUN_PORT, + PROP_STUN_RELAY_MAGIC_COOKIE, + PROP_STUN_RELAY_SERVER, + PROP_STUN_RELAY_UDP_PORT, + PROP_STUN_RELAY_TCP_PORT, + PROP_STUN_RELAY_SSLTCP_PORT, + PROP_STUN_RELAY_USERNAME, + PROP_STUN_RELAY_PASSWORD, + PROP_IGNORE_SSL_ERRORS, + PROP_ALIAS, + + LAST_PROPERTY +}; + +/* TP properties */ +enum +{ + CONN_PROP_STUN_SERVER = 0, + CONN_PROP_STUN_PORT, + CONN_PROP_STUN_RELAY_MAGIC_COOKIE, + CONN_PROP_STUN_RELAY_SERVER, + CONN_PROP_STUN_RELAY_UDP_PORT, + CONN_PROP_STUN_RELAY_TCP_PORT, + CONN_PROP_STUN_RELAY_SSLTCP_PORT, + CONN_PROP_STUN_RELAY_USERNAME, + CONN_PROP_STUN_RELAY_PASSWORD, + + NUM_CONN_PROPS, + + INVALID_CONN_PROP, +}; + +const GabblePropertySignature connection_property_signatures[NUM_CONN_PROPS] = { + { "stun-server", G_TYPE_STRING }, + { "stun-port", G_TYPE_UINT }, + { "stun-relay-magic-cookie", G_TYPE_STRING }, + { "stun-relay-server", G_TYPE_STRING }, + { "stun-relay-udp-port", G_TYPE_UINT }, + { "stun-relay-tcp-port", G_TYPE_UINT }, + { "stun-relay-ssltcp-port", G_TYPE_UINT }, + { "stun-relay-username", G_TYPE_STRING }, + { "stun-relay-password", G_TYPE_STRING }, +}; + +/* private structure */ +typedef struct _GabbleConnectionPrivate GabbleConnectionPrivate; + +struct _GabbleConnectionPrivate +{ + LmMessageHandler *iq_jingle_info_cb; + LmMessageHandler *iq_search_keys_cb; + LmMessageHandler *iq_disco_cb; + LmMessageHandler *iq_unknown_cb; + LmMessageHandler *stream_error_cb; + + /* telepathy properties */ + gchar *protocol; + + /* connection properties */ + gchar *connect_server; + guint port; + gboolean old_ssl; + + gboolean ignore_ssl_errors; + TpConnectionStatusReason ssl_error; + + gboolean do_register; + + gboolean low_bandwidth; + + gchar *https_proxy_server; + guint https_proxy_port; + + gchar *fallback_conference_server; + + /* authentication properties */ + gchar *stream_server; + gchar *username; + gchar *password; + gchar *resource; + gint8 priority; + gchar *alias; + + /* reference to conference server name */ + const gchar *conference_server; + + /* channel factories */ + GPtrArray *channel_factories; + GPtrArray *channel_requests; + gboolean suppress_next_handler; + + /* serial number of current advertised caps */ + guint caps_serial; + + /* gobject housekeeping */ + gboolean dispose_has_run; +}; + +#define GABBLE_CONNECTION_GET_PRIVATE(obj) \ + ((GabbleConnectionPrivate *)obj->priv) + +typedef struct _ChannelRequest ChannelRequest; + +struct _ChannelRequest +{ + DBusGMethodInvocation *context; + gchar *channel_type; + guint handle_type; + guint handle; + gboolean suppress_handler; +}; + +static void connection_new_channel_cb (TpChannelFactoryIface *, GObject *, gpointer); +static void connection_channel_error_cb (TpChannelFactoryIface *, GObject *, GError *, gpointer); +static void connection_nickname_update_cb (GObject *, GabbleHandle, gpointer); +static void connection_presence_update_cb (GabblePresenceCache *, GabbleHandle, gpointer); +static void connection_capabilities_update_cb (GabblePresenceCache *, GabbleHandle, GabblePresenceCapabilities, GabblePresenceCapabilities, gpointer); + +static void +gabble_connection_init (GabbleConnection *self) +{ + GabbleConnectionPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_CONNECTION, GabbleConnectionPrivate); + guint i; + GValue val = { 0, }; + + self->priv = priv; + self->lmconn = lm_connection_new (NULL); + self->status = TP_CONN_STATUS_NEW; + self->handles = gabble_handle_repo_new (); + self->disco = gabble_disco_new (self); + self->vcard_manager = gabble_vcard_manager_new (self); + self->search_instr = NULL; + self->search_key_names = NULL; + self->search_reported_fields = NULL; + self->search_form = FALSE; + self->search_service_jid = NULL; + self->self_avatar_sha1 = NULL; + self->self_handle = 0; + g_signal_connect (self->vcard_manager, "nickname-update", G_CALLBACK + (connection_nickname_update_cb), self); + + self->presence_cache = gabble_presence_cache_new (self); + g_signal_connect (self->presence_cache, "nickname-update", G_CALLBACK + (connection_nickname_update_cb), self); + g_signal_connect (self->presence_cache, "presence-update", G_CALLBACK + (connection_presence_update_cb), self); + g_signal_connect (self->presence_cache, "capabilities-update", G_CALLBACK + (connection_capabilities_update_cb), self); + + capabilities_fill_cache (self->presence_cache); + + self->roster = gabble_roster_new (self); + g_signal_connect (self->roster, "nickname-update", G_CALLBACK + (connection_nickname_update_cb), self); + + priv->channel_factories = g_ptr_array_sized_new (1); + + g_ptr_array_add (priv->channel_factories, self->roster); + + g_ptr_array_add (priv->channel_factories, + g_object_new (GABBLE_TYPE_MUC_FACTORY, + "connection", self, + NULL)); + + g_ptr_array_add (priv->channel_factories, + g_object_new (GABBLE_TYPE_MEDIA_FACTORY, + "connection", self, + NULL)); + + g_ptr_array_add (priv->channel_factories, + g_object_new (GABBLE_TYPE_IM_FACTORY, + "connection", self, + NULL)); + + //add for search here + g_ptr_array_add (priv->channel_factories, + g_object_new (GABBLE_TYPE_SEARCH_FACTORY, + "connection", self, + NULL)); + + for (i = 0; i < priv->channel_factories->len; i++) + { + GObject *factory = g_ptr_array_index (priv->channel_factories, i); + g_signal_connect (factory, "new-channel", G_CALLBACK + (connection_new_channel_cb), self); + g_signal_connect (factory, "channel-error", G_CALLBACK + (connection_channel_error_cb), self); + } + + priv->channel_requests = g_ptr_array_new (); + + /* Set default parameters for optional parameters */ + priv->resource = g_strdup (GABBLE_PARAMS_DEFAULT_RESOURCE); + priv->port = GABBLE_PARAMS_DEFAULT_PORT; + priv->https_proxy_port = GABBLE_PARAMS_DEFAULT_HTTPS_PROXY_PORT; + + /* initialize properties mixin */ + gabble_properties_mixin_init (G_OBJECT (self), G_STRUCT_OFFSET ( + GabbleConnection, properties)); + + g_value_init (&val, G_TYPE_UINT); + g_value_set_uint (&val, GABBLE_PARAMS_DEFAULT_STUN_PORT); + + gabble_properties_mixin_change_value (G_OBJECT (self), CONN_PROP_STUN_PORT, + &val, NULL); + gabble_properties_mixin_change_flags (G_OBJECT (self), CONN_PROP_STUN_PORT, + TP_PROPERTY_FLAG_READ, 0, NULL); + + g_value_unset (&val); + + priv->caps_serial = 1; +} + +static void +gabble_connection_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleConnection *self = (GabbleConnection *) object; + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + const gchar *param_name; + guint tp_property_id; + + switch (property_id) { + case PROP_PROTOCOL: + g_value_set_string (value, priv->protocol); + break; + case PROP_CONNECT_SERVER: + g_value_set_string (value, priv->connect_server); + break; + case PROP_STREAM_SERVER: + g_value_set_string (value, priv->stream_server); + break; + case PROP_PORT: + g_value_set_uint (value, priv->port); + break; + case PROP_OLD_SSL: + g_value_set_boolean (value, priv->old_ssl); + break; + case PROP_REGISTER: + g_value_set_boolean (value, priv->do_register); + break; + case PROP_LOW_BANDWIDTH: + g_value_set_boolean (value, priv->low_bandwidth); + break; + case PROP_USERNAME: + g_value_set_string (value, priv->username); + break; + case PROP_PASSWORD: + g_value_set_string (value, priv->password); + break; + case PROP_RESOURCE: + g_value_set_string (value, priv->resource); + break; + case PROP_PRIORITY: + g_value_set_int (value, priv->priority); + break; + case PROP_HTTPS_PROXY_SERVER: + g_value_set_string (value, priv->https_proxy_server); + break; + case PROP_HTTPS_PROXY_PORT: + g_value_set_uint (value, priv->https_proxy_port); + break; + case PROP_FALLBACK_CONFERENCE_SERVER: + g_value_set_string (value, priv->fallback_conference_server); + break; + case PROP_IGNORE_SSL_ERRORS: + g_value_set_boolean (value, priv->ignore_ssl_errors); + break; + case PROP_ALIAS: + g_value_set_string (value, priv->alias); + break; + default: + param_name = g_param_spec_get_name (pspec); + + if (gabble_properties_mixin_has_property (object, param_name, + &tp_property_id)) + { + GValue *tp_property_value = + self->properties.properties[tp_property_id].value; + + if (tp_property_value) + { + g_value_copy (tp_property_value, value); + return; + } + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_connection_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleConnection *self = (GabbleConnection *) object; + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + const gchar *param_name; + guint tp_property_id; + + switch (property_id) { + case PROP_PROTOCOL: + g_free (priv->protocol); + priv->protocol = g_value_dup_string (value); + break; + case PROP_CONNECT_SERVER: + g_free (priv->connect_server); + priv->connect_server = g_value_dup_string (value); + break; + case PROP_PORT: + priv->port = g_value_get_uint (value); + break; + case PROP_OLD_SSL: + priv->old_ssl = g_value_get_boolean (value); + break; + case PROP_REGISTER: + priv->do_register = g_value_get_boolean (value); + break; + case PROP_LOW_BANDWIDTH: + priv->low_bandwidth = g_value_get_boolean (value); + break; + case PROP_STREAM_SERVER: + g_free (priv->stream_server); + priv->stream_server = g_value_dup_string (value); + break; + case PROP_USERNAME: + g_free (priv->username); + priv->username = g_value_dup_string (value); + break; + case PROP_PASSWORD: + g_free (priv->password); + priv->password = g_value_dup_string (value); + break; + case PROP_RESOURCE: + g_free (priv->resource); + priv->resource = g_value_dup_string (value); + break; + case PROP_PRIORITY: + priv->priority = CLAMP (g_value_get_int (value), G_MININT8, G_MAXINT8); + break; + case PROP_HTTPS_PROXY_SERVER: + g_free (priv->https_proxy_server); + priv->https_proxy_server = g_value_dup_string (value); + break; + case PROP_HTTPS_PROXY_PORT: + priv->https_proxy_port = g_value_get_uint (value); + break; + case PROP_FALLBACK_CONFERENCE_SERVER: + g_free (priv->fallback_conference_server); + priv->fallback_conference_server = g_value_dup_string (value); + break; + case PROP_IGNORE_SSL_ERRORS: + priv->ignore_ssl_errors = g_value_get_boolean (value); + break; + case PROP_ALIAS: + g_free (priv->alias); + priv->alias = g_value_dup_string (value); + break; + default: + param_name = g_param_spec_get_name (pspec); + + if (gabble_properties_mixin_has_property (object, param_name, + &tp_property_id)) + { + gabble_properties_mixin_change_value (object, tp_property_id, value, + NULL); + gabble_properties_mixin_change_flags (object, tp_property_id, + TP_PROPERTY_FLAG_READ, + 0, NULL); + + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_connection_dispose (GObject *object); +static void gabble_connection_finalize (GObject *object); + +static void +gabble_connection_class_init (GabbleConnectionClass *gabble_connection_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_connection_class); + GParamSpec *param_spec; + + object_class->get_property = gabble_connection_get_property; + object_class->set_property = gabble_connection_set_property; + + g_type_class_add_private (gabble_connection_class, sizeof (GabbleConnectionPrivate)); + + object_class->dispose = gabble_connection_dispose; + object_class->finalize = gabble_connection_finalize; + + param_spec = g_param_spec_string ("protocol", "Telepathy identifier for protocol", + "Identifier string used when the protocol " + "name is required. Unused internally.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PROTOCOL, param_spec); + + param_spec = g_param_spec_string ("connect-server", "Hostname or IP of Jabber server", + "The server used when establishing a connection.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECT_SERVER, param_spec); + + param_spec = g_param_spec_uint ("port", "Jabber server port", + "The port used when establishing a connection.", + 0, G_MAXUINT16, GABBLE_PARAMS_DEFAULT_PORT, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PORT, param_spec); + + param_spec = g_param_spec_boolean ("old-ssl", "Old-style SSL tunneled connection", + "Establish the entire connection to the server " + "within an SSL-encrypted tunnel. Note that this " + "is not the same as connecting with TLS, which " + "is not yet supported.", FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_OLD_SSL, param_spec); + + param_spec = g_param_spec_boolean ("register", "Register account on server", + "Register a new account on server.", FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_REGISTER, param_spec); + + param_spec = g_param_spec_boolean ("low-bandwidth", "Low bandwidth mode", + "Determines whether we are in low " + "bandwidth mode. This influences " + "polling behaviour.", FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_LOW_BANDWIDTH, param_spec); + + param_spec = g_param_spec_string ("stream-server", "The server name used to initialise the stream.", + "The server name used when initialising the stream, " + "which is usually the part after the @ in the user's JID.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STREAM_SERVER, param_spec); + + param_spec = g_param_spec_string ("username", "Jabber username", + "The username used when authenticating.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_USERNAME, param_spec); + + param_spec = g_param_spec_string ("password", "Jabber password", + "The password used when authenticating.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PASSWORD, param_spec); + + param_spec = g_param_spec_string ("resource", "Jabber resource", + "The Jabber resource used when authenticating.", + "Telepathy", + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_RESOURCE, param_spec); + + param_spec = g_param_spec_int ("priority", "Jabber presence priority", + "The default priority used when reporting our presence.", + G_MININT8, G_MAXINT8, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PRIORITY, param_spec); + + param_spec = g_param_spec_string ("https-proxy-server", "The server name " + "used as an HTTPS proxy server", + "The server name used as an HTTPS proxy " + "server.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_HTTPS_PROXY_SERVER, param_spec); + + param_spec = g_param_spec_uint ("https-proxy-port", "The HTTP proxy server " + "port", "The HTTP proxy server port.", + 0, G_MAXUINT16, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_HTTPS_PROXY_PORT, param_spec); + + param_spec = g_param_spec_string ("fallback-conference-server", + "The conference server used as fallback", + "The conference server used as fallback when " + "everything else fails.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_FALLBACK_CONFERENCE_SERVER, + param_spec); + + param_spec = g_param_spec_string ("stun-server", + "STUN server", + "STUN server.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_SERVER, param_spec); + + param_spec = g_param_spec_uint ("stun-port", + "STUN port", + "STUN port.", + 0, G_MAXUINT16, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_PORT, param_spec); + + param_spec = g_param_spec_string ("stun-relay-magic-cookie", + "STUN relay magic cookie", + "STUN relay magic cookie.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_MAGIC_COOKIE, + param_spec); + + param_spec = g_param_spec_string ("stun-relay-server", + "STUN relay server", + "STUN relay server.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_SERVER, + param_spec); + + param_spec = g_param_spec_uint ("stun-relay-udp-port", + "STUN relay UDP port", + "STUN relay UDP port.", + 0, G_MAXUINT16, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_UDP_PORT, + param_spec); + + param_spec = g_param_spec_uint ("stun-relay-tcp-port", + "STUN relay TCP port", + "STUN relay TCP port.", + 0, G_MAXUINT16, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_TCP_PORT, + param_spec); + + param_spec = g_param_spec_uint ("stun-relay-ssltcp-port", + "STUN relay SSL-TCP port", + "STUN relay SSL-TCP port.", + 0, G_MAXUINT16, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_SSLTCP_PORT, + param_spec); + + param_spec = g_param_spec_string ("stun-relay-username", + "STUN relay username", + "STUN relay username.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_USERNAME, + param_spec); + + param_spec = g_param_spec_string ("stun-relay-password", + "STUN relay password", + "STUN relay password.", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STUN_RELAY_PASSWORD, + param_spec); + + param_spec = g_param_spec_boolean ("ignore-ssl-errors", "Ignore SSL errors", + "Continue connecting even if the server's " + "SSL certificate is invalid or missing.", + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_IGNORE_SSL_ERRORS, param_spec); + + param_spec = g_param_spec_string ("alias", + "Alias/nick for local user", + "Alias/nick for local user", + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_ALIAS, param_spec); + + /* signal definitions */ + + signals[ALIASES_CHANGED] = + g_signal_new ("aliases-changed", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_collection ("GPtrArray", (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID))))); + + signals[CAPABILITIES_CHANGED] = + g_signal_new ("capabilities-changed", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_collection ("GPtrArray", (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID))))); + + signals[NEW_CHANNEL] = + g_signal_new ("new-channel", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_connection_marshal_VOID__STRING_STRING_UINT_UINT_BOOLEAN, + G_TYPE_NONE, 5, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_BOOLEAN); + + signals[PRESENCE_UPDATE] = + g_signal_new ("presence-update", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_map ("GHashTable", G_TYPE_UINT, (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)))), G_TYPE_INVALID))))); + + signals[STATUS_CHANGED] = + g_signal_new ("status-changed", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_connection_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + signals[DISCONNECTED] = + g_signal_new ("disconnected", + G_OBJECT_CLASS_TYPE (gabble_connection_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_connection_class), &dbus_glib_gabble_connection_object_info); + + gabble_properties_mixin_class_init (G_OBJECT_CLASS (gabble_connection_class), + G_STRUCT_OFFSET (GabbleConnectionClass, properties_class), + connection_property_signatures, NUM_CONN_PROPS, + NULL); +} + +static gboolean +_unref_lm_connection (gpointer data) +{ + LmConnection *conn = (LmConnection *) data; + + lm_connection_unref (conn); + return FALSE; +} + +void +gabble_connection_dispose (GObject *object) +{ + GabbleConnection *self = GABBLE_CONNECTION (object); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + DBusGProxy *bus_proxy; + guint i; + bus_proxy = tp_get_bus_proxy (); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + gabble_debug (DEBUG_FLAG, "called"); + + g_message("1 Inside gabble_connection_dispose() method"); + + // are these asserts a valid one ? + //As in case of lm_connection_open these will not be valid assertions ? + //to remove these? + g_assert ((self->status == TP_CONN_STATUS_DISCONNECTED) || + (self->status == TP_CONN_STATUS_NEW)); + //This is not a valid statement as the self_handle is set to a value in _gabble_connection_connect which wil call + //lm_connection_open(within do_connect). If the call fails then control comes here.. in which case self_handle can be other + //than 0) + //g_assert (self->self_handle == 0); + + g_message("after assert"); + if (priv->channel_requests) + { + g_assert (priv->channel_requests->len == 0); + g_ptr_array_free (priv->channel_requests, TRUE); + priv->channel_requests = NULL; + } + + g_ptr_array_foreach (priv->channel_factories, (GFunc) g_object_unref, NULL); + g_ptr_array_free (priv->channel_factories, TRUE); + priv->channel_factories = NULL; + g_message("unrefed channel factories"); + if(self->search_instr) + { + g_free( self->search_instr ); + self->search_instr = NULL; + } + + if(self->search_key_names) + { + for( i=0; self->search_key_names[i]; i++ ) + { + g_free( self->search_key_names[i] ); + self->search_key_names[i] = NULL; + } + g_free( self->search_key_names ); + self->search_key_names = NULL; + } + g_message("freed search keys"); + if ( self->self_avatar_sha1 ) + { + g_free ( self->self_avatar_sha1 ); + } + if(self->search_key_ht) + { + g_hash_table_destroy (self->search_key_ht); + self->search_key_ht = NULL; + } + if(self->search_service_jid) + { + g_free(self->search_service_jid); + self->search_service_jid = NULL; + } + /* unreffing channel factories frees the roster */ + self->roster = NULL; + + g_object_unref (self->disco); + self->disco = NULL; + + g_object_unref (self->vcard_manager); + self->vcard_manager = NULL; + + g_object_unref (self->presence_cache); + self->presence_cache = NULL; + + /* if this is not already the case, we'll crash anyway */ + g_assert (!lm_connection_is_open (self->lmconn)); + g_assert (priv->iq_search_keys_cb == NULL); + g_assert (priv->iq_jingle_info_cb == NULL); + g_assert (priv->iq_disco_cb == NULL); + g_assert (priv->iq_unknown_cb == NULL); + g_assert (priv->stream_error_cb == NULL); + + /* + * The Loudmouth connection can't be unref'd immediately because this + * function might (indirectly) return into Loudmouth code which expects the + * connection to always be there. + */ + g_idle_add (_unref_lm_connection, self->lmconn); + + if (NULL != self->bus_name) + { + dbus_g_proxy_call_no_reply (bus_proxy, "ReleaseName", + G_TYPE_STRING, self->bus_name, + G_TYPE_INVALID); + } + + if (G_OBJECT_CLASS (gabble_connection_parent_class)->dispose) + G_OBJECT_CLASS (gabble_connection_parent_class)->dispose (object); + + g_message("out of the method"); +} + +void +gabble_connection_finalize (GObject *object) +{ + GabbleConnection *self = GABBLE_CONNECTION (object); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + gabble_debug (DEBUG_FLAG, "called with %p", object); + + g_free (self->bus_name); + g_free (self->object_path); + + g_free (priv->protocol); + g_free (priv->connect_server); + g_free (priv->stream_server); + g_free (priv->username); + g_free (priv->password); + g_free (priv->resource); + + g_free (priv->https_proxy_server); + g_free (priv->fallback_conference_server); + + g_free (priv->alias); + + gabble_properties_mixin_finalize (object); + + gabble_handle_repo_destroy (self->handles); + + G_OBJECT_CLASS (gabble_connection_parent_class)->finalize (object); +} + +/** + * _gabble_connection_set_properties_from_account + * + * Parses an account string which may be one of the following forms: + * username + * username/resource + * username@server + * username@server/resource + * and sets the properties for username, stream server and resource + * appropriately. Also sets the connect server to the stream server if one has + * not yet been specified. + */ + +gboolean +_gabble_connection_set_properties_from_account (GabbleConnection *conn, + const gchar *account, + GError **error) +{ + GabbleConnectionPrivate *priv; + char *username, *server, *resource; + gboolean result; + + g_assert (GABBLE_IS_CONNECTION (conn)); + g_assert (account != NULL); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + username = server = resource = NULL; + result = TRUE; + + gabble_decode_jid (account, &username, &server, &resource); + + if (username == NULL || server == NULL || + *username == '\0' || *server == '\0') + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "unable to get username and server from account"); + result = FALSE; + goto OUT; + } + + g_object_set (G_OBJECT (conn), + "username", username, + "stream-server", server, + NULL); + + /* only override the default resource if we actually got one */ + if (resource) + g_object_set (G_OBJECT (conn), "resource", resource, NULL); + +OUT: + g_free (username); + g_free (server); + g_free (resource); + + return result; +} + +/** + * _gabble_connection_register + * + * Make the connection object appear on the bus, returning the bus + * name and object path used. + */ +gboolean +_gabble_connection_register (GabbleConnection *conn, + gchar **bus_name, + gchar **object_path, + GError **error) +{ + DBusGConnection *bus; + DBusGProxy *bus_proxy; + GabbleConnectionPrivate *priv; + const char *allowed_chars = "_1234567890" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char *safe_proto; + char *unique_name; + guint request_name_result; + GError *request_error; + + g_message("1 Inside _gabble_connection_register() method"); + g_assert (GABBLE_IS_CONNECTION (conn)); + + bus = tp_get_bus (); + bus_proxy = tp_get_bus_proxy (); + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + safe_proto = g_strdup (priv->protocol); + g_strcanon (safe_proto, allowed_chars, '_'); + + unique_name = g_strdup_printf ("_%s_%s_%s", + priv->username, + priv->stream_server, + priv->resource); + g_strcanon (unique_name, allowed_chars, '_'); + + conn->bus_name = g_strdup_printf (BUS_NAME ".%s.%s", + safe_proto, + unique_name); + conn->object_path = g_strdup_printf (OBJECT_PATH "/%s/%s", + safe_proto, + unique_name); + + g_free (safe_proto); + g_free (unique_name); + + if (!dbus_g_proxy_call (bus_proxy, "RequestName", &request_error, + G_TYPE_STRING, conn->bus_name, + G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE, + G_TYPE_INVALID, + G_TYPE_UINT, &request_name_result, + G_TYPE_INVALID)) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Error acquiring bus name %s: %s", conn->bus_name, + request_error->message); + + g_error_free (request_error); + + g_free (conn->bus_name); + conn->bus_name = NULL; + + return FALSE; + } + + if (request_name_result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + gchar *msg; + + switch (request_name_result) + { + case DBUS_REQUEST_NAME_REPLY_IN_QUEUE: + msg = "Request has been queued, though we request non-queueing."; + break; + case DBUS_REQUEST_NAME_REPLY_EXISTS: + msg = "A connection manger already has this busname."; + break; + case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER: + msg = "Connection manager already has a connection to this account."; + break; + default: + msg = "Unknown error return from ReleaseName"; + } + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Error acquiring bus name %s: %s", conn->bus_name, msg); + + g_free (conn->bus_name); + conn->bus_name = NULL; + + return FALSE; + } + + gabble_debug (DEBUG_FLAG, "bus name %s", conn->bus_name); + + dbus_g_connection_register_g_object (bus, conn->object_path, G_OBJECT (conn)); + + gabble_debug (DEBUG_FLAG, "object path %s", conn->object_path); + + *bus_name = g_strdup (conn->bus_name); + *object_path = g_strdup (conn->object_path); + + return TRUE; +} + + +/** + * _gabble_connection_send + * + * Send an LmMessage and trap network errors appropriately. + */ +gboolean +_gabble_connection_send (GabbleConnection *conn, LmMessage *msg, GError **error) +{ + GabbleConnectionPrivate *priv; + GError *lmerror = NULL; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + if (!lm_connection_send (conn->lmconn, msg, &lmerror)) + { + gabble_debug (DEBUG_FLAG, "failed: %s", lmerror->message); + + g_set_error (error, TELEPATHY_ERRORS, NetworkError, + "message send failed: %s", lmerror->message); + + g_error_free (lmerror); + + return FALSE; + } + + return TRUE; +} + +typedef struct { + GabbleConnectionMsgReplyFunc reply_func; + + GabbleConnection *conn; + LmMessage *sent_msg; + gpointer user_data; + + GObject *object; + gboolean object_alive; +} GabbleMsgHandlerData; + +static LmHandlerResult +message_send_reply_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *reply_msg, + gpointer user_data) +{ + GabbleMsgHandlerData *handler_data = user_data; + LmMessageSubType sub_type; + + sub_type = lm_message_get_sub_type (reply_msg); + + /* Is it a reply to this message? If we're talking to another loudmouth, + * they can send us messages which have the same ID as ones we send. :-O */ + if (sub_type != LM_MESSAGE_SUB_TYPE_RESULT && + sub_type != LM_MESSAGE_SUB_TYPE_ERROR) + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (handler_data->object_alive) + { + return handler_data->reply_func (handler_data->conn, + handler_data->sent_msg, + reply_msg, + handler_data->object, + handler_data->user_data); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +message_send_object_destroy_notify_cb (gpointer data, + GObject *where_the_object_was) +{ + GabbleMsgHandlerData *handler_data = data; + + handler_data->object = NULL; + handler_data->object_alive = FALSE; +} + +static void +message_send_handler_destroy_cb (gpointer data) +{ + GabbleMsgHandlerData *handler_data = data; + + lm_message_unref (handler_data->sent_msg); + + if (handler_data->object != NULL) + { + g_object_weak_unref (handler_data->object, + message_send_object_destroy_notify_cb, + handler_data); + } + + g_free (handler_data); +} + +/** + * _gabble_connection_send_with_reply + * + * Send a tracked LmMessage and trap network errors appropriately. + * + * If object is non-NULL the handler will follow the lifetime of that object, + * which means that if the object is destroyed the callback will not be invoked. + */ +gboolean +_gabble_connection_send_with_reply (GabbleConnection *conn, + LmMessage *msg, + GabbleConnectionMsgReplyFunc reply_func, + GObject *object, + gpointer user_data, + GError **error) +{ + GabbleConnectionPrivate *priv; + LmMessageHandler *handler; + GabbleMsgHandlerData *handler_data; + gboolean ret; + GError *lmerror = NULL; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + lm_message_ref (msg); + + handler_data = g_new (GabbleMsgHandlerData, 1); + handler_data->reply_func = reply_func; + handler_data->conn = conn; + handler_data->sent_msg = msg; + handler_data->user_data = user_data; + + handler_data->object = object; + handler_data->object_alive = TRUE; + + if (object != NULL) + { + g_object_weak_ref (object, message_send_object_destroy_notify_cb, + handler_data); + } + + handler = lm_message_handler_new (message_send_reply_cb, handler_data, + message_send_handler_destroy_cb); + + ret = lm_connection_send_with_reply (conn->lmconn, msg, handler, &lmerror); + if (!ret) + { + gabble_debug (DEBUG_FLAG, "failed: %s", lmerror->message); + + if (error) + { + g_set_error (error, TELEPATHY_ERRORS, NetworkError, + "message send failed: %s", lmerror->message); + } + + g_error_free (lmerror); + } + + lm_message_handler_unref (handler); + + return ret; +} + +static LmHandlerResult connection_iq_disco_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); +static LmHandlerResult connection_iq_unknown_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); +static LmHandlerResult connection_stream_error_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); +static LmSSLResponse connection_ssl_cb (LmSSL*, LmSSLStatus, gpointer); +static void connection_open_cb (LmConnection*, gboolean, gpointer); +static void connection_auth_cb (LmConnection*, gboolean, gpointer); +static void connection_disco_cb (GabbleDisco *, GabbleDiscoRequest *, const gchar *, const gchar *, LmMessageNode *, GError *, gpointer); +static void connection_disconnected_cb (LmConnection *, LmDisconnectReason, gpointer); +static void connection_status_change (GabbleConnection *, TpConnectionStatus, TpConnectionStatusReason); + +static void channel_request_cancel (gpointer data, gpointer user_data); + +static void emit_one_presence_update (GabbleConnection *self, GabbleHandle handle); + + +static gboolean +do_connect (GabbleConnection *conn, GError **error) +{ + GError *lmerror = NULL; + + gabble_debug (DEBUG_FLAG, "calling lm_connection_open"); + g_message("**gabble do_connect: before calling lm_connection_open\n"); + + if (!lm_connection_open (conn->lmconn, connection_open_cb, + conn, NULL, &lmerror)) + { + gabble_debug (DEBUG_FLAG, "lm_connection_open failed %s", lmerror->message); + + g_set_error (error, TELEPATHY_ERRORS, NetworkError, + "lm_connection_open failed: %s", lmerror->message); + + g_signal_emit (conn, signals[DISCONNECTED], 0); + g_error_free (lmerror); + + return FALSE; + } + + g_message("**gabble do_connect: after calling lm_connection_open and it passed\n"); + + return TRUE; +} + +static void +connect_callbacks (GabbleConnection *conn) +{ + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + g_message("inside connect_callbacks\n"); + g_assert (priv->iq_search_keys_cb == NULL); + g_assert (priv->iq_jingle_info_cb == NULL); + g_assert (priv->iq_disco_cb == NULL); + g_assert (priv->iq_unknown_cb == NULL); + g_assert (priv->stream_error_cb == NULL); + + + + priv->iq_search_keys_cb = lm_message_handler_new (search_keys_iq_cb, + conn, NULL); + lm_connection_register_message_handler (conn->lmconn, + priv->iq_search_keys_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); + + priv->iq_jingle_info_cb = lm_message_handler_new (jingle_info_iq_callback, + conn, NULL); + lm_connection_register_message_handler (conn->lmconn, + priv->iq_jingle_info_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); + + priv->iq_disco_cb = lm_message_handler_new (connection_iq_disco_cb, + conn, NULL); + lm_connection_register_message_handler (conn->lmconn, priv->iq_disco_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); + + priv->iq_unknown_cb = lm_message_handler_new (connection_iq_unknown_cb, + conn, NULL); + lm_connection_register_message_handler (conn->lmconn, priv->iq_unknown_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_LAST); + + priv->stream_error_cb = lm_message_handler_new (connection_stream_error_cb, + conn, NULL); + lm_connection_register_message_handler (conn->lmconn, priv->stream_error_cb, + LM_MESSAGE_TYPE_STREAM_ERROR, + LM_HANDLER_PRIORITY_LAST); + g_message("leaving connect_callbacks\n"); +} + +static void +disconnect_callbacks (GabbleConnection *conn) +{ + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + g_message("[disconnect_callbacks]"); + g_assert (priv->iq_search_keys_cb != NULL); + g_assert (priv->iq_jingle_info_cb != NULL); + g_assert (priv->iq_disco_cb != NULL); + g_assert (priv->iq_unknown_cb != NULL); + g_assert (priv->stream_error_cb != NULL); + + lm_connection_unregister_message_handler (conn->lmconn, priv->iq_search_keys_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->iq_search_keys_cb); + priv->iq_search_keys_cb = NULL; + + lm_connection_unregister_message_handler (conn->lmconn, priv->iq_jingle_info_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->iq_jingle_info_cb); + priv->iq_jingle_info_cb = NULL; + + lm_connection_unregister_message_handler (conn->lmconn, priv->iq_disco_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->iq_disco_cb); + priv->iq_disco_cb = NULL; + + lm_connection_unregister_message_handler (conn->lmconn, priv->iq_unknown_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->iq_unknown_cb); + priv->iq_unknown_cb = NULL; + + lm_connection_unregister_message_handler (conn->lmconn, priv->stream_error_cb, + LM_MESSAGE_TYPE_STREAM_ERROR); + lm_message_handler_unref (priv->stream_error_cb); + priv->stream_error_cb = NULL; +} + +/** + * _gabble_connection_connect + * + * Use the stored server & authentication details to commence + * the stages for connecting to the server and authenticating. Will + * re-use an existing LmConnection if it is present, or create it + * if necessary. + * + * Stage 1 is _gabble_connection_connect calling lm_connection_open + * Stage 2 is connection_open_cb calling lm_connection_authenticate + * Stage 3 is connection_auth_cb initiating service discovery + * Stage 4 is connection_disco_cb advertising initial presence, requesting + * the roster and setting the CONNECTED state + */ +static gboolean +_gabble_connection_connect (GabbleConnection *conn, + GError **error) +{ + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + char *jid; + GabblePresence *presence; + g_message("[_gabble_connection_connect]"); + g_assert (priv->port > 0 && priv->port <= G_MAXUINT16); + g_assert (priv->stream_server != NULL); + g_assert (priv->username != NULL); + g_assert (priv->password != NULL); + g_assert (priv->resource != NULL); + g_assert (lm_connection_is_open (conn->lmconn) == FALSE); + + g_message("In _gabble_connection_connect" ); + + jid = g_strdup_printf ("%s@%s", priv->username, priv->stream_server); + lm_connection_set_jid (conn->lmconn, jid); + + conn->self_handle = gabble_handle_for_contact (conn->handles, + jid, FALSE); + g_free (jid); + + if (conn->self_handle == 0) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "Invalid JID: %s@%s", priv->username, priv->stream_server); + return FALSE; + } + gabble_handle_ref (conn->handles, TP_HANDLE_TYPE_CONTACT, conn->self_handle); + + /* set initial presence */ + /* TODO: some way for the user to set this */ + gabble_presence_cache_update (conn->presence_cache, conn->self_handle, + priv->resource, GABBLE_PRESENCE_AVAILABLE, NULL, priv->priority); + emit_one_presence_update (conn, conn->self_handle); + + /* set initial capabilities */ + presence = gabble_presence_cache_get (conn->presence_cache, conn->self_handle); + + gabble_presence_set_capabilities (presence, priv->resource, + capabilities_get_initial_caps (), priv->caps_serial++); + + /* always override server and port if one was forced upon us */ + if (priv->connect_server != NULL) + { + lm_connection_set_server (conn->lmconn, priv->connect_server); + lm_connection_set_port (conn->lmconn, priv->port); + g_message("LM Server is %s \n",priv->connect_server ); + g_message("LM port is %ld \n",priv->port); + } + /* otherwise set the server & port to the stream server, + * if one didn't appear from a SRV lookup */ + else if (lm_connection_get_server (conn->lmconn) == NULL) + { + lm_connection_set_server (conn->lmconn, priv->stream_server); + lm_connection_set_port (conn->lmconn, priv->port); + } + + + if (priv->https_proxy_server) + { + LmProxy *proxy; + + proxy = lm_proxy_new_with_server (LM_PROXY_TYPE_HTTP, + priv->https_proxy_server, priv->https_proxy_port); + + lm_connection_set_proxy (conn->lmconn, proxy); + + lm_proxy_unref (proxy); + } + + if (priv->old_ssl) + { + LmSSL *ssl = lm_ssl_new (NULL, connection_ssl_cb, conn, NULL); + lm_connection_set_ssl (conn->lmconn, ssl); + lm_ssl_unref (ssl); + } + else //if we want to use tls (not old ssl?) then need to set tls flags. + { + LmSSL *ssl = lm_ssl_new (NULL, connection_ssl_cb, conn, NULL); + lm_connection_set_ssl (conn->lmconn, ssl); + + lm_ssl_use_starttls (ssl, TRUE, TRUE); + + lm_ssl_unref (ssl); + } + + /* send whitespace to the server every 30 seconds */ + //lm_connection_set_keep_alive_rate (conn->lmconn, 45); + + lm_connection_set_disconnect_function (conn->lmconn, + connection_disconnected_cb, + conn, + NULL); + + if (do_connect (conn, error)) + { + gboolean valid; + + connection_status_change (conn, + TP_CONN_STATUS_CONNECTING, + TP_CONN_STATUS_REASON_REQUESTED); + + valid = gabble_handle_ref (conn->handles, + TP_HANDLE_TYPE_CONTACT, + conn->self_handle); + g_message("before after valid assert" ); + g_assert (valid); + g_message("In after valid assert" ); + } + else + { + return FALSE; + } + g_message("Out _gabble_connection_connect" ); + return TRUE; +} + + + +static void +connection_disconnected_cb (LmConnection *lmconn, + LmDisconnectReason lm_reason, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + g_message("[connection_disconnected_cb]\n"); + g_assert (conn->lmconn == lmconn); + + gabble_debug (DEBUG_FLAG, "called with reason %u", lm_reason); + + /* if we were expecting this disconnection, we're done so can tell + * the connection manager to unref us. otherwise it's a network error + * or some other screw up we didn't expect, so we emit the status + * change */ + if (conn->status == TP_CONN_STATUS_DISCONNECTED) + { + g_message("[connection_disconnected_cb]expected; emitting DISCONNECTED"); + g_signal_emit (conn, signals[DISCONNECTED], 0); + } + else + { + g_message("[connection_disconnected_cb]unexpected; calling connection_status_change"); + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NETWORK_ERROR); + } +} + + +/** + * connection_status_change: + * @conn: a #GabbleConnection + * @status: new status to advertise + * @reason: reason for new status + * + * Compares status with current status. If different, emits a signal + * for the new status, and updates it in the #GabbleConnection. + */ +static void +connection_status_change (GabbleConnection *conn, + TpConnectionStatus status, + TpConnectionStatusReason reason) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + g_message ("[connection_status_change]status %u reason %u", status, reason); + + g_assert (status != TP_CONN_STATUS_NEW); + + if (conn->status != status) + { + if ((status == TP_CONN_STATUS_DISCONNECTED) && + (conn->status == TP_CONN_STATUS_NEW)) + { + g_message("[connection_status_change] line 1721"); + conn->status = status; + + /* unref our self handle if it's set */ + if (conn->self_handle != 0) + { + gabble_handle_unref (conn->handles, TP_HANDLE_TYPE_CONTACT, + conn->self_handle); + conn->self_handle = 0; + } + + g_message("[connection_status_change]new connection closed; emitting DISCONNECTED"); + g_signal_emit (conn, signals[DISCONNECTED], 0); + return; + } + + conn->status = status; + + if (status == TP_CONN_STATUS_DISCONNECTED) + { + /* remove the channels so we don't get any race conditions where + * method calls are delivered to a channel after we've started + * disconnecting */ + g_message("[connection_status_change] TP_CONN_STATUS_DISCONNECTED"); + + /* trigger close_all on all channel factories */ + g_ptr_array_foreach (priv->channel_factories, (GFunc) + tp_channel_factory_iface_close_all, NULL); + + /* cancel all queued channel requests */ + if (priv->channel_requests->len > 0) + { + g_ptr_array_foreach (priv->channel_requests, (GFunc) + channel_request_cancel, NULL); + g_ptr_array_remove_range (priv->channel_requests, 0, + priv->channel_requests->len); + } + + /* unref our self handle */ + gabble_handle_unref (conn->handles, TP_HANDLE_TYPE_CONTACT, + conn->self_handle); + conn->self_handle = 0; + } + + g_message("[connection_status_change]emitting status-changed with status %u reason %u", + status, reason); + + g_signal_emit (conn, signals[STATUS_CHANGED], 0, status, reason); + + if (status == TP_CONN_STATUS_CONNECTING) + { + /* add our callbacks */ + connect_callbacks (conn); + + /* trigger connecting on all channel factories */ + g_ptr_array_foreach (priv->channel_factories, (GFunc) + tp_channel_factory_iface_connecting, NULL); + } + else if (status == TP_CONN_STATUS_CONNECTED) + { + /* send whitespace to the server every 30 seconds resetting to 30*/ + lm_connection_set_keep_alive_rate (conn->lmconn, 10); + + /* trigger connected on all channel factories */ + g_ptr_array_foreach (priv->channel_factories, (GFunc) + tp_channel_factory_iface_connected, NULL); + } + else if (status == TP_CONN_STATUS_DISCONNECTED) + { + /* remove our callbacks */ + disconnect_callbacks (conn); + + /* trigger disconnected on all channel factories */ + g_ptr_array_foreach (priv->channel_factories, (GFunc) + tp_channel_factory_iface_disconnected, NULL); + + /* if the connection is open, this function will close it for you. + * if it's already closed (eg network error) then we're done, so + * can emit DISCONNECTED and have the connection manager unref us */ + if (lm_connection_is_open (conn->lmconn)) + { + g_message ("still open; calling lm_connection_close"); + lm_connection_close (conn->lmconn, NULL); + } + else + { + /* lm_connection_is_open() returns FALSE if LmConnection is in the + * middle of connecting, so call this just in case */ + lm_connection_cancel_open (conn->lmconn); + g_message ("closed; emitting DISCONNECTED"); + g_signal_emit (conn, signals[DISCONNECTED], 0); + } + } + } + else + { + g_warning ("%s: attempted to re-emit the current status %u reason %u", + G_STRFUNC, status, reason); + } + g_message("[connection_status_change]"); + g_message ("out connection status changed "); +} + +static ChannelRequest * +channel_request_new (DBusGMethodInvocation *context, + const char *channel_type, + guint handle_type, + guint handle, + gboolean suppress_handler) +{ + ChannelRequest *ret; + + g_assert (NULL != context); + g_assert (NULL != channel_type); + + ret = g_new0 (ChannelRequest, 1); + ret->context = context; + ret->channel_type = g_strdup (channel_type); + ret->handle_type = handle_type; + ret->handle = handle; + ret->suppress_handler = suppress_handler; + + return ret; +} + +static void +channel_request_free (ChannelRequest *request) +{ + g_assert (NULL == request->context); + g_free (request->channel_type); + g_free (request); +} + +static void +channel_request_cancel (gpointer data, gpointer user_data) +{ + ChannelRequest *request = (ChannelRequest *) data; + GError *error = NULL; + + gabble_debug (DEBUG_FLAG, "cancelling request for %s/%d/%d", request->channel_type, request->handle_type, request->handle); + + error = g_error_new (TELEPATHY_ERRORS, Disconnected, "unable to " + "service this channel request, we're disconnecting!"); + + dbus_g_method_return_error (request->context, error); + request->context = NULL; + + g_error_free (error); + channel_request_free (request); +} + +static GPtrArray * +find_matching_channel_requests (GabbleConnection *conn, + const gchar *channel_type, + guint handle_type, + guint handle, + gboolean *suppress_handler) +{ + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + GPtrArray *requests; + guint i; + + requests = g_ptr_array_sized_new (1); + + for (i = 0; i < priv->channel_requests->len; i++) + { + ChannelRequest *request = g_ptr_array_index (priv->channel_requests, i); + + if (0 != strcmp (request->channel_type, channel_type)) + continue; + + if (handle_type != request->handle_type) + continue; + + if (handle != request->handle) + continue; + + if (request->suppress_handler && suppress_handler) + *suppress_handler = TRUE; + + g_ptr_array_add (requests, request); + } + + return requests; +} + +static void +connection_new_channel_cb (TpChannelFactoryIface *factory, + GObject *chan, + gpointer data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (data); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + gchar *object_path = NULL, *channel_type = NULL; + guint handle_type = 0, handle = 0; + gboolean suppress_handler = priv->suppress_next_handler; + GPtrArray *tmp; + guint i; + + g_object_get (chan, + "object-path", &object_path, + "channel-type", &channel_type, + "handle-type", &handle_type, + "handle", &handle, + NULL); + + gabble_debug (DEBUG_FLAG, "called for %s", object_path); + + tmp = find_matching_channel_requests (conn, channel_type, handle_type, + handle, &suppress_handler); + + g_signal_emit (conn, signals[NEW_CHANNEL], 0, + object_path, channel_type, + handle_type, handle, + suppress_handler); + + for (i = 0; i < tmp->len; i++) + { + ChannelRequest *request = g_ptr_array_index (tmp, i); + + gabble_debug (DEBUG_FLAG, "completing queued request, channel_type=%s, handle_type=%u, " + "handle=%u, suppress_handler=%u", request->channel_type, + request->handle_type, request->handle, request->suppress_handler); + + dbus_g_method_return (request->context, object_path); + request->context = NULL; + + g_ptr_array_remove (priv->channel_requests, request); + + channel_request_free (request); + } + + g_ptr_array_free (tmp, TRUE); + + g_free (object_path); + g_free (channel_type); +} + +static void +connection_channel_error_cb (TpChannelFactoryIface *factory, + GObject *chan, + GError *error, + gpointer data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (data); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + gchar *channel_type = NULL; + guint handle_type = 0, handle = 0; + GPtrArray *tmp; + guint i; + + gabble_debug (DEBUG_FLAG, "channel_type=%s, handle_type=%u, handle=%u, error_code=%u, " + "error_message=\"%s\"", channel_type, handle_type, handle, + error->code, error->message); + + g_object_get (chan, + "channel-type", &channel_type, + "handle-type", &handle_type, + "handle", &handle, + NULL); + + tmp = find_matching_channel_requests (conn, channel_type, handle_type, + handle, NULL); + + for (i = 0; i < tmp->len; i++) + { + ChannelRequest *request = g_ptr_array_index (tmp, i); + + gabble_debug (DEBUG_FLAG, "completing queued request %p, channel_type=%s, " + "handle_type=%u, handle=%u, suppress_handler=%u", + request, request->channel_type, + request->handle_type, request->handle, request->suppress_handler); + + dbus_g_method_return_error (request->context, error); + request->context = NULL; + + g_ptr_array_remove (priv->channel_requests, request); + + channel_request_free (request); + } + + g_ptr_array_free (tmp, TRUE); + g_free (channel_type); +} + +static void +connection_presence_update_cb (GabblePresenceCache *cache, GabbleHandle handle, gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + + emit_one_presence_update (conn, handle); +} + +GabbleConnectionAliasSource +_gabble_connection_get_cached_alias (GabbleConnection *conn, + GabbleHandle handle, + gchar **alias) +{ + GabbleConnectionPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (conn, + GABBLE_TYPE_CONNECTION, GabbleConnectionPrivate); + GabbleConnectionAliasSource ret = GABBLE_CONNECTION_ALIAS_NONE; + GabblePresence *pres; + const gchar *tmp; + gchar *user = NULL, *resource = NULL; + + g_return_val_if_fail (NULL != conn, GABBLE_CONNECTION_ALIAS_NONE); + g_return_val_if_fail (GABBLE_IS_CONNECTION (conn), GABBLE_CONNECTION_ALIAS_NONE); + g_return_val_if_fail (gabble_handle_is_valid (conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), GABBLE_CONNECTION_ALIAS_NONE); + + tmp = gabble_roster_handle_get_name (conn->roster, handle); + if (NULL != tmp) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_ROSTER; + + if (NULL != alias) + *alias = g_strdup (tmp); + + goto OUT; + } + + pres = gabble_presence_cache_get (conn->presence_cache, handle); + if (NULL != pres && NULL != pres->nickname) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_PRESENCE; + + if (NULL != alias) + *alias = g_strdup (pres->nickname); + + goto OUT; + } + + /* if it's our own handle, use alias passed to the connmgr, if any */ + if (handle == conn->self_handle && priv->alias != NULL) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_CONNMGR; + + if (NULL != alias) + *alias = g_strdup (priv->alias); + + goto OUT; + } + + /* if we've seen a nickname in their vCard, use that */ + tmp = gabble_vcard_manager_get_cached_alias (conn->vcard_manager, handle); + if (NULL != tmp) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_VCARD; + + if (NULL != alias) + *alias = g_strdup (tmp); + + goto OUT; + } + + /* fallback to JID */ + tmp = gabble_handle_inspect (conn->handles, TP_HANDLE_TYPE_CONTACT, handle); + g_assert (NULL != tmp); + + gabble_decode_jid (tmp, &user, NULL, &resource); + + /* MUC handles have the nickname in the resource */ + if (NULL != resource) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_JID; + + if (NULL != alias) + { + *alias = resource; + resource = NULL; + } + + goto OUT; + } + + /* otherwise just take their local part */ + if (NULL != user) + { + ret = GABBLE_CONNECTION_ALIAS_FROM_JID; + + if (NULL != alias) + { + *alias = user; + user = NULL; + } + + goto OUT; + } + +OUT: + g_free (user); + g_free (resource); + return ret; +} + +static void +connection_nickname_update_cb (GObject *object, + GabbleHandle handle, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + GabbleConnectionAliasSource signal_source, real_source; + gchar *alias = NULL; + GPtrArray *aliases; + GValue entry = { 0, }; + + if (object == G_OBJECT (conn->roster)) + { + signal_source = GABBLE_CONNECTION_ALIAS_FROM_ROSTER; + } + else if (object == G_OBJECT (conn->presence_cache)) + { + signal_source = GABBLE_CONNECTION_ALIAS_FROM_PRESENCE; + } + else if (object == G_OBJECT (conn->vcard_manager)) + { + signal_source = GABBLE_CONNECTION_ALIAS_FROM_VCARD; + } + else + { + g_assert_not_reached (); + return; + } + + real_source = _gabble_connection_get_cached_alias (conn, handle, &alias); + + g_assert (real_source != GABBLE_CONNECTION_ALIAS_NONE); + + /* if the active alias for this handle is already known and from + * a higher priority, this signal is not interesting so we do + * nothing */ + if (real_source > signal_source) + { + gabble_debug (DEBUG_FLAG, "ignoring boring alias change for handle %u, signal from %u " + "but source %u has alias \"%s\"", handle, signal_source, + real_source, alias); + goto OUT; + } + + g_value_init (&entry, TP_ALIAS_PAIR_TYPE); + g_value_take_boxed (&entry, dbus_g_type_specialized_construct + (TP_ALIAS_PAIR_TYPE)); + + dbus_g_type_struct_set (&entry, + 0, handle, + 1, alias, + G_MAXUINT); + + aliases = g_ptr_array_sized_new (1); + g_ptr_array_add (aliases, g_value_get_boxed (&entry)); + + g_signal_emit (conn, signals[ALIASES_CHANGED], 0, aliases); + + g_value_unset (&entry); + g_ptr_array_free (aliases, TRUE); + +OUT: + g_free (alias); +} + +/** + * status_is_available + * + * Returns a boolean to indicate whether the given gabble status is + * available on this connection. + */ +static gboolean +status_is_available (GabbleConnection *conn, int status) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (conn)); + g_assert (status < LAST_GABBLE_PRESENCE); + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + if (gabble_statuses[status].presence_type == TP_CONN_PRESENCE_TYPE_HIDDEN && + (conn->features & GABBLE_CONNECTION_FEATURES_PRESENCE_INVISIBLE) == 0) + return FALSE; + else + return TRUE; +} + +/** + * destroy_the_bastard: + * @data: a GValue to destroy + * + * destroys a GValue allocated on the heap + */ +static void +destroy_the_bastard (GValue *value) +{ + g_value_unset (value); + g_free (value); +} + +static GHashTable * +construct_presence_hash (GabbleConnection *self, + const GArray *contact_handles) +{ + guint i; + GabbleHandle handle; + GHashTable *presence_hash, *contact_status, *parameters; + GValueArray *vals; + GValue *message; + GabblePresence *presence; + GabblePresenceId status; + const gchar *status_message; + /* this is never set at the moment*/ + guint timestamp = 0; + + g_assert (gabble_handles_are_valid (self->handles, TP_HANDLE_TYPE_CONTACT, + contact_handles, FALSE, NULL)); + + presence_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, + (GDestroyNotify) g_value_array_free); + + for (i = 0; i < contact_handles->len; i++) + { + handle = g_array_index (contact_handles, GabbleHandle, i); + presence = gabble_presence_cache_get (self->presence_cache, handle); + + if (presence) + { + status = presence->status; + status_message = presence->status_message; + } + else + { + status = GABBLE_PRESENCE_OFFLINE; + status_message = NULL; + } + + message = g_new0 (GValue, 1); + g_value_init (message, G_TYPE_STRING); + g_value_set_static_string (message, status_message); + + parameters = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, + (GDestroyNotify) destroy_the_bastard); + + g_hash_table_insert (parameters, "message", message); + + contact_status = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, + (GDestroyNotify) g_hash_table_destroy); + g_hash_table_insert (contact_status, + (gchar *) gabble_statuses[status].name, parameters); + + vals = g_value_array_new (2); + + g_value_array_append (vals, NULL); + g_value_init (g_value_array_get_nth (vals, 0), G_TYPE_UINT); + g_value_set_uint (g_value_array_get_nth (vals, 0), timestamp); + + g_value_array_append (vals, NULL); + g_value_init (g_value_array_get_nth (vals, 1), + dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, + dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))); + g_value_take_boxed (g_value_array_get_nth (vals, 1), contact_status); + + g_hash_table_insert (presence_hash, GINT_TO_POINTER (handle), vals); + } + + return presence_hash; +} + +/** + * emit_presence_update: + * @self: A #GabbleConnection + * @contact_handles: A zero-terminated array of #GabbleHandle for + * the contacts to emit presence for + * + * Emits the Telepathy PresenceUpdate signal with the current + * stored presence information for the given contact. + */ +static void +emit_presence_update (GabbleConnection *self, + const GArray *contact_handles) +{ + GHashTable *presence_hash; + + presence_hash = construct_presence_hash (self, contact_handles); + g_signal_emit (self, signals[PRESENCE_UPDATE], 0, presence_hash); + g_hash_table_destroy (presence_hash); +} + +/** + * emit_one_presence_update: + * Convenience function for calling emit_presence_update with one handle. + */ + +static void +emit_one_presence_update (GabbleConnection *self, + GabbleHandle handle) +{ + GArray *handles = g_array_sized_new (FALSE, FALSE, sizeof (GabbleHandle), 1); + + g_array_insert_val (handles, 0, handle); + emit_presence_update (self, handles); + g_array_free (handles, TRUE); +} + +/** + * signal_own_presence: + * @self: A #GabbleConnection + * @error: pointer in which to return a GError in case of failure. + * + * Signal the user's stored presence to the jabber server + * + * Retuns: FALSE if an error occurred + */ +static gboolean +signal_own_presence (GabbleConnection *self, GError **error) +{ + + GabblePresence *presence; + LmMessage *message; + LmMessageNode *node; + gboolean ret; + gchar *ext_string = NULL; + GSList *features, *i; + GabbleConnectionPrivate *priv; + + if ( NULL == self ) + { + g_debug ("%s: accesing after dereferenced connection", G_STRFUNC); + return FALSE; + } + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + presence = gabble_presence_cache_get (self->presence_cache, self->self_handle); + message = gabble_presence_as_message (presence, priv->resource); + node = lm_message_get_node (message); + + if (presence->status == GABBLE_PRESENCE_HIDDEN) + { + if ((self->features & GABBLE_CONNECTION_FEATURES_PRESENCE_INVISIBLE) != 0) + lm_message_node_set_attribute (node, "type", "invisible"); + } + + features = capabilities_get_features (presence->caps); + + for (i = features; NULL != i; i = i->next) + { + const Feature *feat = (const Feature *) i->data; + + if ((NULL != feat->bundle) && g_strdiff (VERSION, feat->bundle)) + { + if (NULL != ext_string) + { + gchar *tmp = ext_string; + ext_string = g_strdup_printf ("%s %s", ext_string, feat->bundle); + g_free (tmp); + } + else + { + ext_string = g_strdup (feat->bundle); + } + } + } + + node = lm_message_node_add_child (node, "c", NULL); + lm_message_node_set_attributes ( + node, + "xmlns", NS_CAPS, + "node", NS_GABBLE_CAPS, + "ver", VERSION, + NULL); + + if (NULL != ext_string) + lm_message_node_set_attribute (node, "ext", ext_string); + + ret = _gabble_connection_send (self, message, error); + + lm_message_unref (message); + + g_free (ext_string); + g_slist_free (features); + + return ret; +} + +static LmMessage *_lm_iq_message_make_result (LmMessage *iq_message); + +/** + * _gabble_connection_send_iq_result + * + * Function used to acknowledge an IQ stanza. + */ +void +_gabble_connection_acknowledge_set_iq (GabbleConnection *conn, + LmMessage *iq) +{ + LmMessage *result; + + g_assert (LM_MESSAGE_TYPE_IQ == lm_message_get_type (iq)); + g_assert (LM_MESSAGE_SUB_TYPE_SET == lm_message_get_sub_type (iq)); + + result = _lm_iq_message_make_result (iq); + + if (NULL != result) + { + _gabble_connection_send (conn, result, NULL); + lm_message_unref (result); + } +} + + +/** + * _gabble_connection_send_iq_error + * + * Function used to acknowledge an IQ stanza with an error. + */ +void +_gabble_connection_send_iq_error (GabbleConnection *conn, + LmMessage *message, + GabbleXmppError error, + const gchar *errmsg) +{ + const gchar *to, *id; + LmMessage *msg; + LmMessageNode *iq_node; + + iq_node = lm_message_get_node (message); + to = lm_message_node_get_attribute (iq_node, "from"); + id = lm_message_node_get_attribute (iq_node, "id"); + + if (id == NULL) + { + NODE_DEBUG (iq_node, "can't acknowledge IQ with no id"); + return; + } + + msg = lm_message_new_with_sub_type (to, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_ERROR); + + lm_message_node_set_attribute (msg->node, "id", id); + + lm_message_node_steal_children (msg->node, iq_node); + + gabble_xmpp_error_to_node (error, msg->node, errmsg); + + _gabble_connection_send (conn, msg, NULL); + + lm_message_unref (msg); +} + +static LmMessage * +_lm_iq_message_make_result (LmMessage *iq_message) +{ + LmMessage *result; + LmMessageNode *iq, *result_iq; + const gchar *from_jid, *id; + + g_assert (lm_message_get_type (iq_message) == LM_MESSAGE_TYPE_IQ); + g_assert (lm_message_get_sub_type (iq_message) == LM_MESSAGE_SUB_TYPE_GET || + lm_message_get_sub_type (iq_message) == LM_MESSAGE_SUB_TYPE_SET); + + iq = lm_message_get_node (iq_message); + id = lm_message_node_get_attribute (iq, "id"); + + if (id == NULL) + { + NODE_DEBUG (iq, "can't acknowledge IQ with no id"); + return NULL; + } + + from_jid = lm_message_node_get_attribute (iq, "from"); + + result = lm_message_new_with_sub_type (from_jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_RESULT); + result_iq = lm_message_get_node (result); + lm_message_node_set_attribute (result_iq, "id", id); + + return result; +} + +/** + * connection_iq_disco_cb + * + * Called by loudmouth when we get an incoming . This handler handles + * disco-related IQs. + */ +static LmHandlerResult +connection_iq_disco_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + LmMessage *result; + LmMessageNode *iq, *result_iq, *query, *result_query; + const gchar *node, *suffix; + GSList *features; + GSList *i; + GabblePresence *pres; + + if ( NULL == conn ) + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (lm_message_get_sub_type (message) != LM_MESSAGE_SUB_TYPE_GET) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + iq = lm_message_get_node (message); + query = lm_message_node_get_child_with_namespace (iq, "query", + NS_DISCO_INFO); + + if (!query) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + node = lm_message_node_get_attribute (query, "node"); + + if (node && ( + 0 != strncmp (node, NS_GABBLE_CAPS "#", strlen (NS_GABBLE_CAPS) + 1) || + strlen(node) < strlen (NS_GABBLE_CAPS) + 2)) + { + NODE_DEBUG (iq, "got iq disco query with unexpected node attribute"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (node == NULL) + suffix = NULL; + else + suffix = node + strlen (NS_GABBLE_CAPS) + 1; + + result = _lm_iq_message_make_result (message); + result_iq = lm_message_get_node (result); + result_query = lm_message_node_add_child (result_iq, "query", NULL); + lm_message_node_set_attribute (result_query, "xmlns", NS_DISCO_INFO); + + pres = gabble_presence_cache_get (conn->presence_cache, conn->self_handle); + gabble_debug (DEBUG_FLAG, "got disco request for bundle %s, caps are %x", node, pres->caps); + features = capabilities_get_features (pres->caps); + + g_debug("%s: caps now %u", G_STRFUNC, pres->caps); + + for (i = features; NULL != i; i = i->next) + { + const Feature *feature = (const Feature *) i->data; + + if (NULL == node || !g_strdiff (suffix, feature->bundle)) + { + LmMessageNode *node = lm_message_node_add_child (result_query, + "feature", NULL); + lm_message_node_set_attribute (node, "var", feature->ns); + } + } + + NODE_DEBUG (result_iq, "sending disco response"); + + if (!lm_connection_send (conn->lmconn, result, NULL)) + gabble_debug (DEBUG_FLAG, "sending disco response failed"); + + g_slist_free (features); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +/** + * connection_iq_unknown_cb + * + * Called by loudmouth when we get an incoming . This handler is + * at a lower priority than the others, and should reply with an error + * about unsupported get/set attempts. + */ +static LmHandlerResult +connection_iq_unknown_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + + g_assert (connection == conn->lmconn); + + NODE_DEBUG (message->node, "got unknown iq"); + + switch (lm_message_get_sub_type (message)) + { + case LM_MESSAGE_SUB_TYPE_GET: + case LM_MESSAGE_SUB_TYPE_SET: + _gabble_connection_send_iq_error (conn, message, + XMPP_ERROR_SERVICE_UNAVAILABLE, NULL); + break; + default: + break; + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +/** + * connection_stream_error_cb + * + * Called by loudmouth when we get stream error, which means that + * we're about to close the connection. The message contains the reason + * for the connection hangup. + */ +static LmHandlerResult +connection_stream_error_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + LmMessageNode *conflict_node; + + g_assert (connection == conn->lmconn); + + NODE_DEBUG (message->node, "got stream error"); + + conflict_node = lm_message_node_get_child (message->node, "conflict"); + if (conflict_node) + { + gabble_debug (DEBUG_FLAG, "found conflict node, emiting status change"); + + /* Another client with the same resource just + * appeared, we're going down. */ + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NAME_IN_USE); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + + +/** + * connection_ssl_cb + * + * If we're doing old SSL, this function gets called if the certificate + * is dodgy. + */ +static LmSSLResponse +connection_ssl_cb (LmSSL *lmssl, + LmSSLStatus status, + gpointer data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (data); + + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + const char *reason; + TpConnectionStatusReason tp_reason; + + g_message("inside ssl_cb\n"); + switch (status) { + case LM_SSL_STATUS_NO_CERT_FOUND: + reason = "The server doesn't provide a certificate."; + tp_reason = TP_CONN_STATUS_REASON_CERT_NOT_PROVIDED; + break; + case LM_SSL_STATUS_UNTRUSTED_CERT: + reason = "The certificate can not be trusted."; + tp_reason = TP_CONN_STATUS_REASON_CERT_UNTRUSTED; + break; + case LM_SSL_STATUS_CERT_EXPIRED: + reason = "The certificate has expired."; + tp_reason = TP_CONN_STATUS_REASON_CERT_EXPIRED; + break; + case LM_SSL_STATUS_CERT_NOT_ACTIVATED: + reason = "The certificate has not been activated."; + tp_reason = TP_CONN_STATUS_REASON_CERT_NOT_ACTIVATED; + break; + case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH: + reason = "The server hostname doesn't match the one in the certificate."; + tp_reason = TP_CONN_STATUS_REASON_CERT_HOSTNAME_MISMATCH; + break; + case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: + reason = "The fingerprint doesn't match the expected value."; + tp_reason = TP_CONN_STATUS_REASON_CERT_FINGERPRINT_MISMATCH; + break; + case LM_SSL_STATUS_GENERIC_ERROR: + reason = "An unknown SSL error occurred."; + tp_reason = TP_CONN_STATUS_REASON_CERT_OTHER_ERROR; + break; + default: + g_assert_not_reached(); + reason = "Unknown SSL error code from Loudmouth."; + tp_reason = TP_CONN_STATUS_REASON_ENCRYPTION_ERROR; + break; + } + + gabble_debug (DEBUG_FLAG, "called: %s", reason); + + if (priv->ignore_ssl_errors) + { + return LM_SSL_RESPONSE_CONTINUE; + } + else + { + priv->ssl_error = tp_reason; + return LM_SSL_RESPONSE_STOP; + } +} + +static void +do_auth (GabbleConnection *conn) +{ + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + GError *error = NULL; + + gabble_debug (DEBUG_FLAG, "authenticating with username: %s, password: , resource: %s", + priv->username, priv->resource); + + if (!lm_connection_authenticate (conn->lmconn, priv->username, priv->password, + priv->resource, connection_auth_cb, + conn, NULL, &error)) + { + gabble_debug (DEBUG_FLAG, "failed: %s", error->message); + g_error_free (error); + + /* the reason this function can fail is through network errors, + * authentication failures are reported to our auth_cb */ + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NETWORK_ERROR); + } +} + +static void +registration_finished_cb (GabbleRegister *reg, + gboolean success, + gint err_code, + const gchar *err_msg, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + + g_message("registration_finished_cb\n"); + if (conn->status != TP_CONN_STATUS_CONNECTING) + { + g_assert (conn->status == TP_CONN_STATUS_DISCONNECTED); + return; + } + + gabble_debug (DEBUG_FLAG, "%s", (success) ? "succeeded" : "failed"); + + g_object_unref (reg); + + if (success) + { + do_auth (conn); + } + else + { + gabble_debug (DEBUG_FLAG, "err_code = %d, err_msg = '%s'", + err_code, err_msg); + + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + (err_code == InvalidArgument) ? TP_CONN_STATUS_REASON_NAME_IN_USE : + TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED); + } +} + +static void +do_register (GabbleConnection *conn) +{ + GabbleRegister *reg; + + reg = gabble_register_new (conn); + + g_signal_connect (reg, "finished", (GCallback) registration_finished_cb, + conn); + + gabble_register_start (reg); +} + +/** + * connection_open_cb + * + * Stage 2 of connecting, this function is called by loudmouth after the + * result of the non-blocking lm_connection_open call is known. It makes + * a request to authenticate the user with the server, or optionally + * registers user on the server first. + */ +static void +connection_open_cb (LmConnection *lmconn, + gboolean success, + gpointer data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (data); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + g_message("[connection_open_cb]"); + if ((conn->status != TP_CONN_STATUS_CONNECTING) && + (conn->status != TP_CONN_STATUS_NEW)) + { + g_assert (conn->status == TP_CONN_STATUS_DISCONNECTED); + return; + } + + g_assert (priv); + g_assert (lmconn == conn->lmconn); + + if (!success) + { + if (lm_connection_get_proxy (lmconn)) + { + g_message ("failed, retrying without proxy"); + + lm_connection_set_proxy (lmconn, NULL); + + if (do_connect (conn, NULL)) + { + return; + } + } + else + { + g_message ("failed"); + } + + if (priv->ssl_error) + { + g_message ("[connection_open_cb] priv->ssl_error"); + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + priv->ssl_error); + } + else + { + g_message ("[connection_open_cb] reached else"); + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NETWORK_ERROR); + } + + return; + } + + if (!priv->do_register) + do_auth (conn); + else + do_register (conn); +} + +/** + * connection_auth_cb + * + * Stage 3 of connecting, this function is called by loudmouth after the + * result of the non-blocking lm_connection_authenticate call is known. + * It sends a discovery request to find the server's features. + */ +static void +connection_auth_cb (LmConnection *lmconn, + gboolean success, + gpointer data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (data); + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + GError *error = NULL; + + g_message("In connection_auth_cb\n"); + + if (conn->status != TP_CONN_STATUS_CONNECTING) + { + g_assert (conn->status == TP_CONN_STATUS_DISCONNECTED); + return; + } + + g_assert (priv); + g_assert (lmconn == conn->lmconn); + + if (!success) + { + gabble_debug (DEBUG_FLAG, "failed"); + g_message("Inside !success\n"); + + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED); + + return; + } + + if (!gabble_disco_request_with_timeout (conn->disco, GABBLE_DISCO_TYPE_INFO, + priv->stream_server, NULL, 5000, + connection_disco_cb, conn, + G_OBJECT (conn), &error)) + { + gabble_debug (DEBUG_FLAG, "sending disco request failed: %s", + error->message); + g_message("sending disco request failed\n"); + + g_error_free (error); + + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NETWORK_ERROR); + } +} + +/** + * connection_disco_cb + * + * Stage 4 of connecting, this function is called by GabbleDisco after the + * result of the non-blocking server feature discovery call is known. It sends + * the user's initial presence to the server, marking them as available, + * and requests the roster. + */ +static void +connection_disco_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *result, + GError *disco_error, + gpointer user_data) +{ + GabbleConnection *conn = user_data; + GabbleConnectionPrivate *priv; + GError *error = NULL; + + g_message("Inside connection_disco_cb\n"); + + if ( NULL == conn ) + { + return; + } + if (conn->status != TP_CONN_STATUS_CONNECTING) + { + g_assert (conn->status == TP_CONN_STATUS_DISCONNECTED); + return; + } + + g_assert (GABBLE_IS_CONNECTION (conn)); + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + if (disco_error) + { + g_message("got disco error, setting no features\n"); + gabble_debug (DEBUG_FLAG, "got disco error, setting no features: %s", disco_error->message); + } + else + { + LmMessageNode *iter; + + NODE_DEBUG (result, "got"); + + for (iter = result->children; iter != NULL; iter = iter->next) + { + if (0 == strcmp (iter->name, "feature")) + { + const gchar *var = lm_message_node_get_attribute (iter, "var"); + + if (var == NULL) + continue; + + if (0 == strcmp (var, NS_GOOGLE_JINGLE_INFO)) + conn->features |= GABBLE_CONNECTION_FEATURES_GOOGLE_JINGLE_INFO; + else if (0 == strcmp (var, NS_GOOGLE_ROSTER)) + conn->features |= GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER; + else if (0 == strcmp (var, NS_PRESENCE_INVISIBLE)) + conn->features |= GABBLE_CONNECTION_FEATURES_PRESENCE_INVISIBLE; + else if (0 == strcmp (var, NS_PRIVACY)) + conn->features |= GABBLE_CONNECTION_FEATURES_PRIVACY; + else if (0 == strcmp (var, NS_SEARCH)) + conn->features |= GABBLE_CONNECTION_FEATURES_SEARCH; + } + } + + gabble_debug (DEBUG_FLAG, "set features flags to %d", conn->features); + } + + g_message("before signal_own_presence\n"); + + /* send presence to the server to indicate availability */ + if (!signal_own_presence (conn, &error)) + { + gabble_debug (DEBUG_FLAG, "sending initial presence failed: %s", error->message); + g_message("sending initial presence failed\n"); + goto ERROR; + } + + g_message("after signal_own_presence\n"); + + /* go go gadget on-line */ + connection_status_change (conn, TP_CONN_STATUS_CONNECTED, TP_CONN_STATUS_REASON_REQUESTED); + + if (conn->features & GABBLE_CONNECTION_FEATURES_GOOGLE_JINGLE_INFO) + { + jingle_info_discover_servers (conn); + } + + if(conn->features & GABBLE_CONNECTION_FEATURES_SEARCH) + { + get_search_keys_info(conn,jid); + } + + return; + +ERROR: + if (error) + g_error_free (error); + + connection_status_change (conn, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_NETWORK_ERROR); + + return; +} + + +static GHashTable * +get_statuses_arguments() +{ + +#ifndef EMULATOR + static GHashTable *arguments = NULL; +#endif + + + if (arguments == NULL) + { + arguments = g_hash_table_new (g_str_hash, g_str_equal); + + g_hash_table_insert (arguments, "message", "s"); + g_hash_table_insert (arguments, "priority", "n"); + } + + return arguments; +} + +/**************************************************************************** + * D-BUS EXPORTED METHODS * + ****************************************************************************/ + + +/** + * gabble_connection_add_status + * + * Implements D-Bus method AddStatus + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_add_status (GabbleConnection *self, + const gchar *status, + GHashTable *parms, + GError **error) +{ + g_assert (GABBLE_IS_CONNECTION (self)); + + ERROR_IF_NOT_CONNECTED (self, error); + + g_set_error (error, TELEPATHY_ERRORS, NotImplemented, + "Only one status is possible at a time with this protocol"); + + return FALSE; +} + +static void +_emit_capabilities_changed (GabbleConnection *conn, + GabbleHandle handle, + GabblePresenceCapabilities old_caps, + GabblePresenceCapabilities new_caps) +{ + GPtrArray *caps_arr; + const CapabilityConversionData *ccd; + guint i; + + if (old_caps == new_caps) + return; + + caps_arr = g_ptr_array_new (); + + for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++) + { + if (ccd->c2tf_fn (old_caps | new_caps)) + { + GValue caps_monster_struct = {0, }; + guint old_tpflags = ccd->c2tf_fn (old_caps); + guint old_caps = old_tpflags ? + TP_CONN_CAPABILITY_FLAG_CREATE | + TP_CONN_CAPABILITY_FLAG_INVITE : 0; + guint new_tpflags = ccd->c2tf_fn (new_caps); + guint new_caps = new_tpflags ? + TP_CONN_CAPABILITY_FLAG_CREATE | + TP_CONN_CAPABILITY_FLAG_INVITE : 0; + + if (0 == (old_tpflags ^ new_tpflags)) + continue; + + g_value_init (&caps_monster_struct, + TP_CAPABILITIES_CHANGED_MONSTER_TYPE); + g_value_take_boxed (&caps_monster_struct, + dbus_g_type_specialized_construct + (TP_CAPABILITIES_CHANGED_MONSTER_TYPE)); + + dbus_g_type_struct_set (&caps_monster_struct, + 0, handle, + 1, ccd->iface, + 2, old_caps, + 3, new_caps, + 4, old_tpflags, + 5, new_tpflags, + G_MAXUINT); + + g_ptr_array_add (caps_arr, g_value_get_boxed (&caps_monster_struct)); + } + } + + if (caps_arr->len) + g_signal_emit (conn, signals[CAPABILITIES_CHANGED], 0, caps_arr); + + for (i = 0; i < caps_arr->len; i++) + { + g_boxed_free (TP_CAPABILITIES_CHANGED_MONSTER_TYPE, + g_ptr_array_index (caps_arr, i)); + } + g_ptr_array_free (caps_arr, TRUE); +} + +static void +connection_capabilities_update_cb (GabblePresenceCache *cache, + GabbleHandle handle, + GabblePresenceCapabilities old_caps, + GabblePresenceCapabilities new_caps, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + + _emit_capabilities_changed (conn, handle, old_caps, new_caps); +} + +/** + * gabble_connection_advertise_capabilities + * + * Implements D-Bus method AdvertiseCapabilities + * on interface org.freedesktop.Telepathy.Connection.Interface.Capabilities + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_advertise_capabilities (GabbleConnection *self, + const GPtrArray *add, + const gchar **remove, + GPtrArray **ret, + GError **error) +{ + guint i; + GabblePresence *pres; + GabblePresenceCapabilities add_caps = 0, remove_caps = 0, caps, save_caps; + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + const CapabilityConversionData *ccd; + + ERROR_IF_NOT_CONNECTED (self, error); + + pres = gabble_presence_cache_get (self->presence_cache, self->self_handle); + gabble_debug (DEBUG_FLAG, "caps before: %x", pres->caps); + + for (i = 0; i < add->len; i++) + { + GValue iface_flags_pair = {0, }; + gchar *iface; + guint flags; + + g_value_init (&iface_flags_pair, TP_CAPABILITY_PAIR_TYPE); + g_value_set_static_boxed (&iface_flags_pair, g_ptr_array_index (add, i)); + + dbus_g_type_struct_get (&iface_flags_pair, + 0, &iface, + 1, &flags, + G_MAXUINT); + + for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++) + if (g_str_equal (iface, ccd->iface)) + add_caps |= ccd->tf2c_fn (flags); + } + + for (i = 0; NULL != remove[i]; i++) + { + for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++) + if (g_str_equal (remove[i], ccd->iface)) + remove_caps |= ccd->tf2c_fn (~0); + } + + pres = gabble_presence_cache_get (self->presence_cache, self->self_handle); + save_caps = caps = pres->caps; + + caps |= add_caps; + caps ^= (caps & remove_caps); + + gabble_debug (DEBUG_FLAG, "caps to add: %x", add_caps); + gabble_debug (DEBUG_FLAG, "caps to remove: %x", remove_caps); + gabble_debug (DEBUG_FLAG, "caps after: %x", caps); + + if (caps ^ save_caps) + { + gabble_debug (DEBUG_FLAG, "before != after, changing"); + gabble_presence_set_capabilities (pres, priv->resource, caps, priv->caps_serial++); + gabble_debug (DEBUG_FLAG, "set caps: %x", pres->caps); + } + + *ret = g_ptr_array_new (); + + for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++) + { + if (ccd->c2tf_fn (pres->caps)) + { + GValue iface_flags_pair = {0, }; + + g_value_init (&iface_flags_pair, TP_CAPABILITY_PAIR_TYPE); + g_value_take_boxed (&iface_flags_pair, + dbus_g_type_specialized_construct (TP_CAPABILITY_PAIR_TYPE)); + + dbus_g_type_struct_set (&iface_flags_pair, + 0, ccd->iface, + 1, ccd->c2tf_fn (pres->caps), + G_MAXUINT); + + g_ptr_array_add (*ret, g_value_get_boxed (&iface_flags_pair)); + } + } + + if (caps ^ save_caps) + { + if (!signal_own_presence (self, error)) + return FALSE; + + _emit_capabilities_changed (self, self->self_handle, save_caps, caps); + } + + return TRUE; +} + +/** + * gabble_connection_clear_status + * + * Implements D-Bus method ClearStatus + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_clear_status (GabbleConnection *self, + GError **error) +{ + GabbleConnectionPrivate *priv; + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error); + + gabble_presence_cache_update (self->presence_cache, self->self_handle, + priv->resource, GABBLE_PRESENCE_AVAILABLE, NULL, priv->priority); + emit_one_presence_update (self, self->self_handle); + return signal_own_presence (self, error); +} + + +/** + * gabble_connection_connect + * Implements D-Bus method Connect + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ + +gboolean +gabble_connection_connect (GabbleConnection *self, + GError **error) +{ + g_assert(GABBLE_IS_CONNECTION (self)); + + if (self->status == TP_CONN_STATUS_NEW) + return _gabble_connection_connect (self, error); + return TRUE; +} + + +/** + * gabble_connection_disconnect + * + * Implements D-Bus method Disconnect + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_disconnect (GabbleConnection *self, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + g_message("gabble_connection_disconnect: going to change status to TP_CONN_STATUS_DISCONNECTED ") ; + connection_status_change (self, + TP_CONN_STATUS_DISCONNECTED, + TP_CONN_STATUS_REASON_REQUESTED); + + return TRUE; +} + + +/** + * gabble_connection_get_alias_flags + * + * Implements D-Bus method GetAliasFlags + * on interface org.freedesktop.Telepathy.Connection.Interface.Aliasing + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_alias_flags (GabbleConnection *self, + guint *ret, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + *ret = TP_CONN_ALIAS_FLAG_USER_SET; + + return TRUE; +} + +//#ifndef EMULATOR +static const gchar *assumed_caps[] = +{ + TP_IFACE_CHANNEL_TYPE_TEXT, + TP_IFACE_CHANNEL_INTERFACE_GROUP, + NULL +}; +//#endif + + +/** + * gabble_connection_get_capabilities + * + * Implements D-Bus method GetCapabilities + * on interface org.freedesktop.Telepathy.Connection.Interface.Capabilities + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_capabilities (GabbleConnection *self, + const GArray *handles, + GPtrArray **ret, + GError **error) +{ + guint i; + + ERROR_IF_NOT_CONNECTED (self, error); + + if (!gabble_handles_are_valid (self->handles, + TP_HANDLE_TYPE_CONTACT, + handles, + TRUE, + error)) + { + return FALSE; + } + + *ret = g_ptr_array_new (); + + for (i = 0; i < handles->len; i++) + { + GabbleHandle handle = g_array_index (handles, guint, i); + GabblePresence *pres; + const CapabilityConversionData *ccd; + guint typeflags; + //#ifndef EMULATOR + const gchar **assumed; + //#else + //gchar **assumed; + //#endif + + if (0 == handle) + { + /* FIXME report the magical channel types available on the connection itself */ + continue; + } + + pres = gabble_presence_cache_get (self->presence_cache, handle); + + if (NULL != pres) + for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++) + { + typeflags = ccd->c2tf_fn (pres->caps); + + if (typeflags) + { + GValue monster = {0, }; + + g_value_init (&monster, TP_GET_CAPABILITIES_MONSTER_TYPE); + g_value_take_boxed (&monster, + dbus_g_type_specialized_construct ( + TP_GET_CAPABILITIES_MONSTER_TYPE)); + + dbus_g_type_struct_set (&monster, + 0, handle, + 1, ccd->iface, + 2, TP_CONN_CAPABILITY_FLAG_CREATE | + TP_CONN_CAPABILITY_FLAG_INVITE, + 3, typeflags, + G_MAXUINT); + + g_ptr_array_add (*ret, g_value_get_boxed (&monster)); + } + } + + for (assumed = assumed_caps; NULL != *assumed; assumed++) + { + GValue monster = {0, }; + + g_value_init (&monster, TP_GET_CAPABILITIES_MONSTER_TYPE); + g_value_take_boxed (&monster, + dbus_g_type_specialized_construct (TP_GET_CAPABILITIES_MONSTER_TYPE)); + + dbus_g_type_struct_set (&monster, + 0, handle, + 1, *assumed, + 2, TP_CONN_CAPABILITY_FLAG_CREATE | + TP_CONN_CAPABILITY_FLAG_INVITE, + 3, 0, + G_MAXUINT); + + g_ptr_array_add (*ret, g_value_get_boxed (&monster)); + } + } + + return TRUE; +} + + +/** + * gabble_connection_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_interfaces (GabbleConnection *self, + gchar ***ret, + GError **error) +{ + const char *interfaces[] = { + TP_IFACE_CONN_INTERFACE_ALIASING, + TP_IFACE_CONN_INTERFACE_CAPABILITIES, + TP_IFACE_CONN_INTERFACE_PRESENCE, + TP_IFACE_PROPERTIES, + TP_IFACE_CONN_INTERFACE_AVATAR, + NULL }; + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_connection_get_presence + * + * Implements D-Bus method GetPresence + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_get_presence (GabbleConnection *self, + const GArray *contacts, + DBusGMethodInvocation *context) +{ + GHashTable *presence_hash; + GError *error = NULL; + + if (!gabble_handles_are_valid (self->handles, TP_HANDLE_TYPE_CONTACT, + contacts, FALSE, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + } + + presence_hash = construct_presence_hash (self, contacts); + dbus_g_method_return (context, presence_hash); + g_hash_table_destroy (presence_hash); +} + + +/** + * gabble_connection_get_properties + * + * Implements D-Bus method GetProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_properties (GabbleConnection *self, + const GArray *properties, + GPtrArray **ret, + GError **error) +{ + return gabble_properties_mixin_get_properties (G_OBJECT (self), properties, + ret, error); +} + + +/** + * gabble_connection_get_protocol + * + * Implements D-Bus method GetProtocol + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_protocol (GabbleConnection *self, + gchar **ret, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + *ret = g_strdup (priv->protocol); + + return TRUE; +} + + +/** + * gabble_connection_get_self_handle + * + * Implements D-Bus method GetSelfHandle + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_self_handle (GabbleConnection *self, + guint *ret, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + *ret = self->self_handle; + + return TRUE; +} + + +/** + * gabble_connection_get_status + * + * Implements D-Bus method GetStatus + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_status (GabbleConnection *self, + guint *ret, + GError **error) +{ + g_assert (GABBLE_IS_CONNECTION (self)); + + if (self->status == TP_CONN_STATUS_NEW) + { + *ret = TP_CONN_STATUS_DISCONNECTED; + } + else + { + *ret = self->status; + } + + return TRUE; +} + + +/** + * gabble_connection_get_statuses + * + * Implements D-Bus method GetStatuses + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_get_statuses (GabbleConnection *self, + GHashTable **ret, + GError **error) +{ + GabbleConnectionPrivate *priv; + GValueArray *status; + int i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + gabble_debug (DEBUG_FLAG, "called."); + + *ret = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, (GDestroyNotify) g_value_array_free); + + for (i=0; i < LAST_GABBLE_PRESENCE; i++) + { + /* don't report the invisible presence if the server + * doesn't have the presence-invisible feature */ + if (!status_is_available (self, i)) + continue; + + status = g_value_array_new (5); + + g_value_array_append (status, NULL); + g_value_init (g_value_array_get_nth (status, 0), G_TYPE_UINT); + g_value_set_uint (g_value_array_get_nth (status, 0), + gabble_statuses[i].presence_type); + + g_value_array_append (status, NULL); + g_value_init (g_value_array_get_nth (status, 1), G_TYPE_BOOLEAN); + g_value_set_boolean (g_value_array_get_nth (status, 1), + gabble_statuses[i].self); + + g_value_array_append (status, NULL); + g_value_init (g_value_array_get_nth (status, 2), G_TYPE_BOOLEAN); + g_value_set_boolean (g_value_array_get_nth (status, 2), + gabble_statuses[i].exclusive); + + g_value_array_append (status, NULL); + g_value_init (g_value_array_get_nth (status, 3), + DBUS_TYPE_G_STRING_STRING_HASHTABLE); + g_value_set_static_boxed (g_value_array_get_nth (status, 3), + get_statuses_arguments()); + + g_hash_table_insert (*ret, (gchar*) gabble_statuses[i].name, status); + } + + return TRUE; +} + + +/** + * gabble_connection_hold_handles + * + * Implements D-Bus method HoldHandles + * on interface org.freedesktop.Telepathy.Connection + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_hold_handles (GabbleConnection *self, + guint handle_type, + const GArray *handles, + DBusGMethodInvocation *context) +{ + GabbleConnectionPrivate *priv; + GError *error = NULL; + gchar *sender; + guint i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context) + + if (!gabble_handles_are_valid (self->handles, + handle_type, + handles, + FALSE, + &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + sender = dbus_g_method_get_sender (context); + for (i = 0; i < handles->len; i++) + { + GabbleHandle handle = g_array_index (handles, GabbleHandle, i); + if (!gabble_handle_client_hold (self->handles, sender, handle, + handle_type, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + } + + dbus_g_method_return (context); +} + + +/** + * gabble_connection_inspect_handles + * + * Implements D-Bus method InspectHandles + * on interface org.freedesktop.Telepathy.Connection + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +void +gabble_connection_inspect_handles (GabbleConnection *self, + guint handle_type, + const GArray *handles, + DBusGMethodInvocation *context) +{ + GabbleConnectionPrivate *priv; + GError *error = NULL; + const gchar **ret; + guint i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context); + + if (!gabble_handles_are_valid (self->handles, + handle_type, + handles, + FALSE, + &error)) + { + dbus_g_method_return_error (context, error); + + g_error_free (error); + + return; + } + + ret = g_new (const gchar *, handles->len + 1); + + for (i = 0; i < handles->len; i++) + { + GabbleHandle handle; + const gchar *tmp; + + handle = g_array_index (handles, GabbleHandle, i); + tmp = gabble_handle_inspect (self->handles, handle_type, handle); + g_assert (tmp != NULL); + + ret[i] = tmp; + } + + ret[i] = NULL; + + dbus_g_method_return (context, ret); + + g_free (ret); +} + +/** + * list_channel_factory_foreach_one: + * @key: iterated key + * @value: iterated value + * @data: data attached to this key/value pair + * + * Called by the exported ListChannels function, this should iterate over + * the handle/channel pairs in a channel factory, and to the GPtrArray in + * the data pointer, add a GValueArray containing the following: + * a D-Bus object path for the channel object on this service + * a D-Bus interface name representing the channel type + * an integer representing the handle type this channel communicates with, or zero + * an integer handle representing the contact, room or list this channel communicates with, or zero + */ +static void +list_channel_factory_foreach_one (TpChannelIface *chan, + gpointer data) +{ + GObject *channel = G_OBJECT (chan); + GPtrArray *channels = (GPtrArray *) data; + gchar *path, *type; + guint handle_type, handle; + GValue entry = { 0, }; + + g_value_init (&entry, TP_CHANNEL_LIST_ENTRY_TYPE); + g_value_take_boxed (&entry, dbus_g_type_specialized_construct + (TP_CHANNEL_LIST_ENTRY_TYPE)); + + g_object_get (channel, + "object-path", &path, + "channel-type", &type, + "handle-type", &handle_type, + "handle", &handle, + NULL); + + dbus_g_type_struct_set (&entry, + 0, path, + 1, type, + 2, handle_type, + 3, handle, + G_MAXUINT); + + g_ptr_array_add (channels, g_value_get_boxed (&entry)); + + g_free (path); + g_free (type); +} + +/** + * gabble_connection_list_channels + * + * Implements D-Bus method ListChannels + * on interface org.freedesktop.Telepathy.Connection + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_list_channels (GabbleConnection *self, + GPtrArray **ret, + GError **error) +{ + GabbleConnectionPrivate *priv; + GPtrArray *channels; + guint i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + /* I think on average, each factory will have 2 channels :D */ + channels = g_ptr_array_sized_new (priv->channel_factories->len * 2); + + for (i = 0; i < priv->channel_factories->len; i++) + { + TpChannelFactoryIface *factory = g_ptr_array_index + (priv->channel_factories, i); + tp_channel_factory_iface_foreach (factory, + list_channel_factory_foreach_one, channels); + } + + *ret = channels; + + return TRUE; +} + + +/** + * gabble_connection_list_properties + * + * Implements D-Bus method ListProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_list_properties (GabbleConnection *self, + GPtrArray **ret, + GError **error) +{ + return gabble_properties_mixin_list_properties (G_OBJECT (self), ret, error); +} + + +/** + * gabble_connection_release_handles + * + * Implements D-Bus method ReleaseHandles + * on interface org.freedesktop.Telepathy.Connection + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_release_handles (GabbleConnection *self, + guint handle_type, + const GArray * handles, + DBusGMethodInvocation *context) +{ + GabbleConnectionPrivate *priv; + char *sender; + GError *error = NULL; + guint i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context) + + if (!gabble_handles_are_valid (self->handles, + handle_type, + handles, + FALSE, + &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + sender = dbus_g_method_get_sender (context); + for (i = 0; i < handles->len; i++) + { + GabbleHandle handle = g_array_index (handles, GabbleHandle, i); + if (!gabble_handle_client_release (self->handles, sender, handle, + handle_type, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + } + + dbus_g_method_return (context); +} + + +/** + * gabble_connection_remove_status + * + * Implements D-Bus method RemoveStatus + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_remove_status (GabbleConnection *self, + const gchar *status, + GError **error) +{ + GabblePresence *presence; + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + g_assert (GABBLE_IS_CONNECTION (self)); + + ERROR_IF_NOT_CONNECTED (self, error) + + presence = gabble_presence_cache_get (self->presence_cache, + self->self_handle); + + if (strcmp (status, gabble_statuses[presence->status].name) == 0) + { + gabble_presence_cache_update (self->presence_cache, self->self_handle, + priv->resource, GABBLE_PRESENCE_AVAILABLE, NULL, priv->priority); + emit_one_presence_update (self, self->self_handle); + return signal_own_presence (self, error); + } + else + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "Attempting to remove non-existent presence."); + return FALSE; + } +} + + +typedef struct _AliasesRequest AliasesRequest; + +struct _AliasesRequest +{ + GabbleConnection *conn; + DBusGMethodInvocation *request_call; + guint pending_vcard_requests; + GArray *contacts; + GabbleVCardManagerRequest **vcard_requests; + gchar **aliases; +}; + + +static AliasesRequest * +aliases_request_new (GabbleConnection *conn, + DBusGMethodInvocation *request_call, + const GArray *contacts) +{ + AliasesRequest *request; + + request = g_slice_new0 (AliasesRequest); + request->conn = conn; + request->request_call = request_call; + request->contacts = g_array_new (FALSE, FALSE, sizeof (GabbleHandle)); + g_array_insert_vals (request->contacts, 0, contacts->data, contacts->len); + request->vcard_requests = + g_new0 (GabbleVCardManagerRequest *, contacts->len); + request->aliases = g_new0 (gchar *, contacts->len + 1); + return request; +} + + +static void +aliases_request_free (AliasesRequest *request) +{ + guint i; + + for (i = 0; i < request->contacts->len; i++) + { + if (request->vcard_requests[i] != NULL) + gabble_vcard_manager_cancel_request (request->conn->vcard_manager, + request->vcard_requests[i]); + } + + g_array_free (request->contacts, TRUE); + g_free (request->vcard_requests); + g_strfreev (request->aliases); + g_slice_free (AliasesRequest, request); +} + + +static gboolean +aliases_request_try_return (AliasesRequest *request) +{ + if (request->pending_vcard_requests == 0) + { + dbus_g_method_return (request->request_call, request->aliases); + return TRUE; + } + + return FALSE; +} + + +static void +aliases_request_vcard_cb (GabbleVCardManager *manager, + GabbleVCardManagerRequest *request, + GabbleHandle handle, + LmMessageNode *vcard, + GError *error, + gpointer user_data) +{ + AliasesRequest *aliases_request = (AliasesRequest *) user_data; + GabbleConnectionAliasSource source; + guint i; + gboolean found = FALSE; + gchar *alias = NULL; + + g_assert (aliases_request->pending_vcard_requests > 0); + + /* The index of the vCard request in the vCard request array is the + * index of the contact/alias in their respective arrays. */ + + for (i = 0; i < aliases_request->contacts->len; i++) + if (aliases_request->vcard_requests[i] == request) + { + found = TRUE; + break; + } + + g_assert (found); + source = _gabble_connection_get_cached_alias (aliases_request->conn, + g_array_index (aliases_request->contacts, GabbleHandle, i), &alias); + g_assert (source != GABBLE_CONNECTION_ALIAS_NONE); + g_assert (NULL != alias); + + aliases_request->pending_vcard_requests--; + aliases_request->vcard_requests[i] = NULL; + aliases_request->aliases[i] = alias; + + if (aliases_request_try_return (aliases_request)) + aliases_request_free (aliases_request); +} + + +/** + * gabble_connection_request_aliases + * + * Implements D-Bus method RequestAliases + * on interface org.freedesktop.Telepathy.Connection.Interface.Aliasing + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_request_aliases (GabbleConnection *self, + const GArray *contacts, + DBusGMethodInvocation *context) +{ + guint i; + AliasesRequest *request; + GError *error = NULL; + + g_assert (GABBLE_IS_CONNECTION (self)); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context) + + if (!gabble_handles_are_valid (self->handles, TP_HANDLE_TYPE_CONTACT, + contacts, FALSE, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + request = aliases_request_new (self, context, contacts); + + for (i = 0; i < contacts->len; i++) + { + GabbleHandle handle = g_array_index (contacts, GabbleHandle, i); + GabbleConnectionAliasSource source; + GabbleVCardManagerRequest *vcard_request; + gchar *alias; + + source = _gabble_connection_get_cached_alias (self, handle, &alias); + g_assert (source != GABBLE_CONNECTION_ALIAS_NONE); + g_assert (NULL != alias); + + if (source >= GABBLE_CONNECTION_ALIAS_FROM_VCARD || + gabble_vcard_manager_has_cached_alias (self->vcard_manager, handle)) + { + /* Either the alias we got was from a vCard or better, or we already + * tried getting an alias from a vcard and failed, so there's no + * point trying again. */ + request->aliases[i] = alias; + } + else + { + gabble_debug (DEBUG_FLAG, "requesting vCard for alias of contact %s", + gabble_handle_inspect (self->handles, TP_HANDLE_TYPE_CONTACT, + handle)); + + g_free (alias); + vcard_request = gabble_vcard_manager_request (self->vcard_manager, + handle, 0, aliases_request_vcard_cb, request, G_OBJECT (self), + &error); + + if (NULL != error) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + aliases_request_free (request); + return; + } + + request->vcard_requests[i] = vcard_request; + request->pending_vcard_requests++; + } + } + + if (aliases_request_try_return (request)) + aliases_request_free (request); +} + + +/** + * gabble_connection_request_channel + * + * Implements D-Bus method RequestChannel + * on interface org.freedesktop.Telepathy.Connection + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_request_channel (GabbleConnection *self, + const gchar *type, + guint handle_type, + guint handle, + gboolean suppress_handler, + DBusGMethodInvocation *context) +{ + GabbleConnectionPrivate *priv; + TpChannelFactoryRequestStatus status = + TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + gchar *object_path = NULL; + GError *error = NULL; + guint i; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context); + + for (i = 0; i < priv->channel_factories->len; i++) + { + TpChannelFactoryIface *factory = g_ptr_array_index + (priv->channel_factories, i); + TpChannelFactoryRequestStatus cur_status; + TpChannelIface *chan = NULL; + ChannelRequest *request = NULL; + + priv->suppress_next_handler = suppress_handler; + + cur_status = tp_channel_factory_iface_request (factory, type, + (TpHandleType) handle_type, handle, &chan, &error); + + priv->suppress_next_handler = FALSE; + + switch (cur_status) + { + case TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE: + g_assert (NULL != chan); + g_object_get (chan, "object-path", &object_path, NULL); + goto OUT; + case TP_CHANNEL_FACTORY_REQUEST_STATUS_QUEUED: + gabble_debug (DEBUG_FLAG, "queueing request, channel_type=%s, handle_type=%u, " + "handle=%u, suppress_handler=%u", type, handle_type, + handle, suppress_handler); + request = channel_request_new (context, type, handle_type, handle, + suppress_handler); + g_ptr_array_add (priv->channel_requests, request); + return; + case TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR: + /* pass through error */ + goto OUT; + default: + /* always return the most specific error */ + if (cur_status > status) + status = cur_status; + } + } + + switch (status) + { + case TP_CHANNEL_FACTORY_REQUEST_STATUS_INVALID_HANDLE: + gabble_debug (DEBUG_FLAG, "invalid handle %u", handle); + + error = g_error_new (TELEPATHY_ERRORS, InvalidHandle, + "invalid handle %u", handle); + + break; + + case TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE: + gabble_debug (DEBUG_FLAG, "requested channel is unavailable with " + "handle type %u", handle_type); + + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "requested channel is not available with " + "handle type %u", handle_type); + + break; + + case TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED: + gabble_debug (DEBUG_FLAG, "unsupported channel type %s", type); + + error = g_error_new (TELEPATHY_ERRORS, NotImplemented, + "unsupported channel type %s", type); + + break; + + default: + g_assert_not_reached (); + } + +OUT: + if (NULL != error) + { + g_assert (NULL == object_path); + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + g_assert (NULL != object_path); + dbus_g_method_return (context, object_path); + g_free (object_path); +} + + +static void +hold_and_return_handles (DBusGMethodInvocation *context, + GabbleConnection *conn, + GArray *handles, + guint handle_type) +{ + GError *error = NULL; + gchar *sender = dbus_g_method_get_sender(context); + guint i; + + for (i = 0; i < handles->len; i++) + { + GabbleHandle handle = (GabbleHandle) g_array_index (handles, guint, i); + if (!gabble_handle_client_hold (conn->handles, sender, handle, handle_type, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + } + dbus_g_method_return (context, handles); +} + + +const char * +_gabble_connection_find_conference_server (GabbleConnection *conn) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + if (priv->conference_server == NULL) + { + /* Find first server that has NS_MUC feature */ + const GabbleDiscoItem *item = gabble_disco_service_find (conn->disco, + NULL, NULL, NS_MUC); + if (item != NULL) + priv->conference_server = item->jid; + } + + if (priv->conference_server == NULL) + priv->conference_server = priv->fallback_conference_server; + + return priv->conference_server; +} + + +static gchar * +_gabble_connection_get_canonical_room_name (GabbleConnection *conn, + const gchar *name) +{ + const gchar *server; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + if (index (name, '@')) + return g_strdup (name); + + server = _gabble_connection_find_conference_server (conn); + + if (server == NULL) + return NULL; + + return g_strdup_printf ("%s@%s", name, server); +} + + +typedef struct _RoomVerifyContext RoomVerifyContext; + +typedef struct { + GabbleConnection *conn; + DBusGMethodInvocation *invocation; + gboolean errored; + guint count; + GArray *handles; + RoomVerifyContext *contexts; +} RoomVerifyBatch; + +struct _RoomVerifyContext { + gchar *jid; + guint index; + RoomVerifyBatch *batch; + GabbleDiscoRequest *request; +}; + +static void +room_verify_batch_free (RoomVerifyBatch *batch) +{ + guint i; + + g_array_free (batch->handles, TRUE); + for (i = 0; i < batch->count; i++) + { + g_free(batch->contexts[i].jid); + } + g_free (batch->contexts); + g_free (batch); +} + +/* Frees the error and the batch. */ +static void +room_verify_batch_raise_error (RoomVerifyBatch *batch, + GError *error) +{ + guint i; + + dbus_g_method_return_error (batch->invocation, error); + g_error_free (error); + batch->errored = TRUE; + for (i = 0; i < batch->count; i++) + { + if (batch->contexts[i].request) + { + gabble_disco_cancel_request(batch->conn->disco, + batch->contexts[i].request); + } + } + room_verify_batch_free (batch); +} + +static RoomVerifyBatch * +room_verify_batch_new (GabbleConnection *conn, + DBusGMethodInvocation *invocation, + guint count, + const gchar **jids) +{ + RoomVerifyBatch *batch = g_new(RoomVerifyBatch, 1); + guint i; + + batch->errored = FALSE; + batch->conn = conn; + batch->invocation = invocation; + batch->count = count; + batch->handles = g_array_sized_new(FALSE, FALSE, sizeof(GabbleHandle), count); + batch->contexts = g_new0(RoomVerifyContext, count); + for (i = 0; i < count; i++) + { + const gchar *name = jids[i]; + gchar *qualified_name; + GabbleHandle handle; + + batch->contexts[i].index = i; + batch->contexts[i].batch = batch; + + qualified_name = _gabble_connection_get_canonical_room_name (conn, name); + + if (!qualified_name) + { + GError *error = NULL; + gabble_debug (DEBUG_FLAG, "requested handle %s contains no conference server", + name); + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, "requested " + "room handle %s does not specify a server, but we have not discovered " + "any local conference servers and no fallback was provided", name); + room_verify_batch_raise_error (batch, error); + return NULL; + } + + batch->contexts[i].jid = qualified_name; + + /* has the handle been verified before? */ + if (gabble_handle_for_room_exists (conn->handles, qualified_name, FALSE)) + { + handle = gabble_handle_for_room (conn->handles, qualified_name); + } + else + { + handle = 0; + } + g_array_append_val (batch->handles, handle); + } + + return batch; +} + +/* If all handles in the array have been disco'd or got from cache, +free the batch and return TRUE. Else return FALSE. */ +static gboolean +room_verify_batch_try_return (RoomVerifyBatch *batch) +{ + guint i; + + for (i = 0; i < batch->count; i++) + { + if (!g_array_index(batch->handles, GabbleHandle, i)) + { + /* we're not ready yet */ + return FALSE; + } + } + + hold_and_return_handles (batch->invocation, batch->conn, batch->handles, TP_HANDLE_TYPE_ROOM); + room_verify_batch_free (batch); + return TRUE; +} + +static void +room_jid_disco_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *query_result, + GError *error, + gpointer user_data) +{ + RoomVerifyContext *rvctx = user_data; + RoomVerifyBatch *batch = rvctx->batch; + LmMessageNode *lm_node; + gboolean found = FALSE; + GabbleHandle handle; + + /* stop the request getting cancelled after it's already finished */ + rvctx->request = NULL; + + /* if an error is being handled already, quietly go away */ + if (batch->errored) + { + return; + } + + if (error != NULL) + { + gabble_debug (DEBUG_FLAG, "disco reply error %s", error->message); + + /* disco will free the old error, _raise_error will free the new one */ + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "can't retrieve room info: %s", error->message); + + room_verify_batch_raise_error (batch, error); + + return; + } + + for (lm_node = query_result->children; lm_node; lm_node = lm_node->next) + { + const gchar *var; + + if (g_strdiff (lm_node->name, "feature")) + continue; + + var = lm_message_node_get_attribute (lm_node, "var"); + + /* for servers who consider schema compliance to be an optional bonus */ + if (var == NULL) + var = lm_message_node_get_attribute (lm_node, "type"); + + if (!g_strdiff (var, NS_MUC)) + { + found = TRUE; + break; + } + } + + if (!found) + { + gabble_debug (DEBUG_FLAG, "no MUC support for service name in jid %s", rvctx->jid); + + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, "specified server " + "doesn't support MUC"); + + room_verify_batch_raise_error (batch, error); + + return; + } + + handle = gabble_handle_for_room (batch->conn->handles, rvctx->jid); + g_assert (handle != 0); + + gabble_debug (DEBUG_FLAG, "disco reported MUC support for service name in jid %s", rvctx->jid); + g_array_index (batch->handles, GabbleHandle, rvctx->index) = handle; + + /* if this was the last callback to be run, send off the result */ + room_verify_batch_try_return (batch); +} + +/** + * room_jid_verify: + * + * Utility function that verifies that the service name of + * the specified jid exists and reports MUC support. + */ +static gboolean +room_jid_verify (RoomVerifyBatch *batch, + guint index, + DBusGMethodInvocation *context) +{ + gchar *room, *service; + gboolean ret; + GError *error = NULL; + + room = service = NULL; + gabble_decode_jid (batch->contexts[index].jid, &room, &service, NULL); + + g_assert (room && service); + + ret = (gabble_disco_request (batch->conn->disco, GABBLE_DISCO_TYPE_INFO, + service, NULL, room_jid_disco_cb, + batch->contexts + index, + G_OBJECT (batch->conn), &error) != NULL); + if (!ret) + { + room_verify_batch_raise_error (batch, error); + } + + g_free (room); + g_free (service); + + return ret; +} + + +/** + * gabble_connection_request_handles + * + * Implements D-Bus method RequestHandles + * on interface org.freedesktop.Telepathy.Connection + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_request_handles (GabbleConnection *self, + guint handle_type, + const gchar **names, + DBusGMethodInvocation *context) +{ + guint count = 0, i; + const gchar **cur_name; + GError *error = NULL; + GArray *handles = NULL; + RoomVerifyBatch *batch = NULL; + + for (cur_name = names; *cur_name != NULL; cur_name++) + { + count++; + } + + g_assert (GABBLE_IS_CONNECTION (self)); + + ERROR_IF_NOT_CONNECTED_ASYNC (self, error, context) + + if (!gabble_handle_type_is_valid (handle_type, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } + + switch (handle_type) + { + case TP_HANDLE_TYPE_CONTACT: + handles = g_array_sized_new(FALSE, FALSE, sizeof(GabbleHandle), count); + + for (i = 0; i < count; i++) + { + GabbleHandle handle; + const gchar *name = names[i]; + + if (!gabble_handle_jid_is_valid (handle_type, name, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + + g_array_free (handles, TRUE); + return; + } + + handle = gabble_handle_for_contact (self->handles, name, FALSE); + + if (handle == 0) + { + gabble_debug (DEBUG_FLAG, "requested handle %s was invalid", name); + + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "requested handle %s was invalid", name); + dbus_g_method_return_error (context, error); + g_error_free (error); + + g_array_free (handles, TRUE); + return; + } + + g_array_append_val(handles, handle); + } + hold_and_return_handles (context, self, handles, handle_type); + g_array_free(handles, TRUE); + break; + + case TP_HANDLE_TYPE_ROOM: + batch = room_verify_batch_new (self, context, count, names); + if (!batch) + { + /* an error occurred while setting up the batch, and we returned error + to dbus */ + return; + } + + /* have all the handles been verified already? If so, nothing to do */ + if (room_verify_batch_try_return (batch)) + { + return; + } + + for (i = 0; i < count; i++) + { + if (!room_jid_verify (batch, i, context)) + { + return; + } + } + + /* we've set the verification process going - the callback will handle + returning or raising error */ + break; + + case TP_HANDLE_TYPE_LIST: + handles = g_array_sized_new(FALSE, FALSE, sizeof(GabbleHandle), count); + + for (i = 0; i < count; i++) + { + GabbleHandle handle; + const gchar *name = names[i]; + + handle = gabble_handle_for_list (self->handles, name); + + if (handle == 0) + { + gabble_debug (DEBUG_FLAG, "requested list channel %s not available", name); + + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "requested list channel %s not available", + name); + dbus_g_method_return_error (context, error); + g_error_free (error); + + g_array_free (handles, TRUE); + return; + } + g_array_append_val(handles, handle); + } + hold_and_return_handles (context, self, handles, handle_type); + g_array_free(handles, TRUE); + break; + + default: + gabble_debug (DEBUG_FLAG, "unimplemented handle type %u", handle_type); + + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "unimplemented handle type %u", handle_type); + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + + +/** + * gabble_connection_request_presence + * + * Implements D-Bus method RequestPresence + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_request_presence (GabbleConnection *self, + const GArray *contacts, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + if (!gabble_handles_are_valid (self->handles, TP_HANDLE_TYPE_CONTACT, + contacts, FALSE, error)) + return FALSE; + + if (contacts->len) + emit_presence_update (self, contacts); + + return TRUE; +} + + +struct _i_hate_g_hash_table_foreach +{ + GabbleConnection *conn; + GError **error; + gboolean retval; +}; + +static void +setaliases_foreach (gpointer key, gpointer value, gpointer user_data) +{ + struct _i_hate_g_hash_table_foreach *data = + (struct _i_hate_g_hash_table_foreach *) user_data; + GabbleHandle handle = GPOINTER_TO_INT (key); + gchar *alias = (gchar *) value; + GError *error = NULL; + + if (!gabble_handle_is_valid (data->conn->handles, TP_HANDLE_TYPE_CONTACT, + handle, &error)) + { + data->retval = FALSE; + } + else if (data->conn->self_handle == handle) + { + /* only alter the roster if we're already there, e.g. because someone + * added us with another client + */ + if (gabble_roster_handle_has_entry (data->conn->roster, handle) + && !gabble_roster_handle_set_name (data->conn->roster, handle, + alias, data->error)) + { + data->retval = FALSE; + } + } + else if (!gabble_roster_handle_set_name (data->conn->roster, handle, alias, + data->error)) + { + data->retval = FALSE; + } + + if (data->conn->self_handle == handle) + { + /* User has done SetAliases on themselves - patch their vCard. + * FIXME: because SetAliases is currently synchronous, we ignore errors + * here, and just let the request happen in the background + */ + gabble_vcard_manager_edit (data->conn->vcard_manager, + 0, NULL, NULL, G_OBJECT(data->conn), NULL, + "NICKNAME", alias, NULL); + } + + if (NULL != error) + { + if (NULL == *(data->error)) + { + *(data->error) = error; + } + else + { + g_error_free (error); + } + } +} + +/** + * gabble_connection_set_aliases + * + * Implements D-Bus method SetAliases + * on interface org.freedesktop.Telepathy.Connection.Interface.Aliasing + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_set_aliases (GabbleConnection *self, + GHashTable *aliases, + GError **error) +{ + GabbleConnectionPrivate *priv; + struct _i_hate_g_hash_table_foreach data = { NULL, NULL, TRUE }; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + data.conn = self; + data.error = error; + + g_hash_table_foreach (aliases, setaliases_foreach, &data); + + return data.retval; +} + + +/** + * gabble_connection_set_last_activity_time + * + * Implements D-Bus method SetLastActivityTime + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_set_last_activity_time (GabbleConnection *self, + guint time, + GError **error) +{ + GabbleConnectionPrivate *priv; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + return TRUE; +} + + +static void +setstatuses_foreach (gpointer key, gpointer value, gpointer user_data) +{ + struct _i_hate_g_hash_table_foreach *data = + (struct _i_hate_g_hash_table_foreach*) user_data; + GabbleConnectionPrivate *priv = GABBLE_CONNECTION_GET_PRIVATE (data->conn); + + int i; + + for (i = 0; i < LAST_GABBLE_PRESENCE; i++) + { + if (0 == strcmp (gabble_statuses[i].name, (const gchar*) key)) + break; + } + + if (i < LAST_GABBLE_PRESENCE) + { + GHashTable *args = (GHashTable *)value; + GValue *message = g_hash_table_lookup (args, "message"); + GValue *priority = g_hash_table_lookup (args, "priority"); + const gchar *status = NULL; + gint8 prio = priv->priority; + + if (!status_is_available (data->conn, i)) + { + gabble_debug (DEBUG_FLAG, "requested status %s is not available", (const gchar *) key); + g_set_error (data->error, TELEPATHY_ERRORS, NotAvailable, + "requested status '%s' is not available on this connection", + (const gchar *) key); + data->retval = FALSE; + return; + } + + if (message) + { + if (!G_VALUE_HOLDS_STRING (message)) + { + gabble_debug (DEBUG_FLAG, "got a status message which was not a string"); + g_set_error (data->error, TELEPATHY_ERRORS, InvalidArgument, + "Status argument 'message' requires a string"); + data->retval = FALSE; + return; + } + status = g_value_get_string (message); + } + + if (priority) + { + if (!G_VALUE_HOLDS_INT (priority)) + { + gabble_debug (DEBUG_FLAG, "got a priority value which was not a signed integer"); + g_set_error (data->error, TELEPATHY_ERRORS, InvalidArgument, + "Status argument 'priority' requires a signed integer"); + data->retval = FALSE; + return; + } + prio = CLAMP (g_value_get_int (priority), G_MININT8, G_MAXINT8); + } + + gabble_presence_cache_update (data->conn->presence_cache, data->conn->self_handle, priv->resource, i, status, prio); + emit_one_presence_update (data->conn, data->conn->self_handle); + data->retval = signal_own_presence (data->conn, data->error); + } + else + { + gabble_debug (DEBUG_FLAG, "got unknown status identifier %s", (const gchar *) key); + g_set_error (data->error, TELEPATHY_ERRORS, InvalidArgument, + "unknown status identifier: %s", (const gchar *) key); + data->retval = FALSE; + } +} + +/** + * gabble_connection_set_properties + * + * Implements D-Bus method SetProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_connection_set_properties (GabbleConnection *self, + const GPtrArray *properties, + DBusGMethodInvocation *context) +{ + gabble_properties_mixin_set_properties (G_OBJECT (self), properties, context); +} + +/** + * gabble_connection_set_status + * + * Implements D-Bus method SetStatus + * on interface org.freedesktop.Telepathy.Connection.Interface.Presence + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_set_status (GabbleConnection *self, + GHashTable *statuses, + GError **error) +{ + GabbleConnectionPrivate *priv; + struct _i_hate_g_hash_table_foreach data = { NULL, NULL, TRUE }; + + g_assert (GABBLE_IS_CONNECTION (self)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (self); + + ERROR_IF_NOT_CONNECTED (self, error) + + if (g_hash_table_size (statuses) != 1) + { + gabble_debug (DEBUG_FLAG, "got more than one status"); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "Only one status may be set at a time in this protocol"); + return FALSE; + } + + data.conn = self; + data.error = error; + g_hash_table_foreach (statuses, setstatuses_foreach, &data); + + return data.retval; +} + +/** + * gabble_connection_build_avatar + * + * Implements D-Bus method SetAvatar + * on interface org.freedesktop.Telepathy.Connection.Avatar + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ + +LmMessage* gabble_connection_build_avatar(GabbleConnection *self, + const GArray* bin_image, gchar* mime ) + { + int i = 0; + LmMessage *message; + LmMessageNode *lm_node,*photo_node; + LmMessageHandler* handler = NULL; + char* base64 = NULL; + GError* error = NULL; + //NULL values to be checked ? never returns NULL? + if ( bin_image ) + { + if ( self->self_avatar_sha1 ) + { + free( self->self_avatar_sha1 ); + self->self_avatar_sha1 = NULL; + } + self->self_avatar_sha1 = sha1_hex( bin_image->data, bin_image->len ); + base64 = base64_encode ( bin_image->len, bin_image->data ); + } + + message = lm_message_new_with_sub_type ( NULL, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET ); + lm_node = lm_message_node_add_child (message->node, "vCard", NULL); + lm_message_node_set_attribute (lm_node, "xmlns", NS_VCARD_TEMP); + photo_node = lm_message_node_add_child (lm_node, "PHOTO", NULL); + lm_message_node_add_child (photo_node, "TYPE", mime); + lm_message_node_add_child (photo_node, "BINVAL", base64); + g_free(base64); + return message; + } + +/** + * gabble_connection_set_avatar + * + * Implements D-Bus method SetAvatar + * on interface org.freedesktop.Telepathy.Connection + * + */ +gboolean +gabble_connection_set_avatar( GabbleConnection *self, const GArray* bin_image, gchar* mime_type, gchar**avatar_sha1, + GError** err ) + { + + gboolean ret = FALSE; + LmMessage *message; + + + //There is no need to check bin_image and mime for NULL.. NULL is a valid value for those + message = gabble_connection_build_avatar( self, bin_image, mime_type ); + + ret = _gabble_connection_send ( self, message, err ); + + if ( *err ) + { + *avatar_sha1 = NULL; + //ret is already false.. so false returned + } + else { + if ( self->self_avatar_sha1 ) + { + *avatar_sha1 = g_strdup( self->self_avatar_sha1 ); + } + ret = TRUE; + } + + lm_message_unref( message ); + + return ret; + } + +/** + * gabble_connection_clear_avatar + * + * Implements D-Bus method ClearAvatar + * on interface org.freedesktop.Telepathy.Connection.Interface.Avatar + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_connection_clear_avatar( GabbleConnection *self, + GError **error) + { + LmMessage *message; + gboolean ret = TRUE; + + + //Build the avatar xml with NULL as image data and NULL as mimetype + message = gabble_connection_build_avatar( self, + NULL, NULL ); + + ret = _gabble_connection_send ( self, message, error ); + + if ( self->self_avatar_sha1 ) + { + free( self->self_avatar_sha1 ); + self->self_avatar_sha1 = NULL; + } + + lm_message_unref( message ); + + return ret; + } diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-error.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-error.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,437 @@ +/* + * gabble-error.c - Source for Gabble's error handling API + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "gabble-error.h" +#include "namespaces.h" + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(quark,gabble_error,GQuark) + #define quark (*GET_WSD_VAR_NAME(quark,gabble_error,s)()) + +#endif + +#define MAX_LEGACY_ERRORS 3 + +typedef struct { + const gchar *name; + const gchar *description; + const gchar *type; + guint specialises; + const gchar *namespace; + const guint16 legacy_errors[MAX_LEGACY_ERRORS]; +} XmppErrorSpec; + +static const XmppErrorSpec xmpp_errors[NUM_XMPP_ERRORS] = +{ + { + "redirect", + "the recipient or server is redirecting requests for this information " + "to another entity", + "modify", + 0, + NULL, + { 302, 0, }, + }, + + { + "gone", + "the recipient or server can no longer be contacted at this address", + "modify", + 0, + NULL, + { 302, 0, }, + }, + + { + "bad-request", + "the sender has sent XML that is malformed or that cannot be processed", + "modify", + 0, + NULL, + { 400, 0, }, + }, + { + "unexpected-request", + "the recipient or server understood the request but was not expecting " + "it at this time", + "wait", + 0, + NULL, + { 400, 0, }, + }, + { + "jid-malformed", + "the sending entity has provided or communicated an XMPP address or " + "aspect thereof (e.g., a resource identifier) that does not adhere " + "to the syntax defined in Addressing Scheme (Section 3)", + "modify", + 0, + NULL, + { 400, 0, }, + }, + + { + "not-authorized", + "the sender must provide proper credentials before being allowed to " + "perform the action, or has provided improper credentials", + "auth", + 0, + NULL, + { 401, 0, }, + }, + + { + "payment-required", + "the requesting entity is not authorized to access the requested " + "service because payment is required", + "auth", + 0, + NULL, + { 402, 0, }, + }, + + { + "forbidden", + "the requesting entity does not possess the required permissions to " + "perform the action", + "auth", + 0, + NULL, + { 403, 0, }, + }, + + { + "item-not-found", + "the addressed JID or item requested cannot be found", + "cancel", + 0, + NULL, + { 404, 0, }, + }, + { + "recipient-unavailable", + "the intended recipient is temporarily unavailable", + "wait", + 0, + NULL, + { 404, 0, }, + }, + { + "remote-server-not-found", + "a remote server or service specified as part or all of the JID of the " + "intended recipient (or required to fulfill a request) could not be " + "contacted within a reasonable amount of time", + "cancel", + 0, + NULL, + { 404, 0, }, + }, + + { + "not-allowed", + "the recipient or server does not allow any entity to perform the action", + "cancel", + 0, + NULL, + { 405, 0, }, + }, + + { + "not-acceptable", + "the recipient or server understands the request but is refusing to " + "process it because it does not meet criteria defined by the recipient " + "or server (e.g., a local policy regarding acceptable words in messages)", + "modify", + 0, + NULL, + { 406, 0, }, + }, + + { + "registration-required", + "the requesting entity is not authorized to access the requested service " + "because registration is required", + "auth", + 0, + NULL, + { 407, 0, }, + }, + { + "subscription-required", + "the requesting entity is not authorized to access the requested service " + "because a subscription is required", + "auth", + 0, + NULL, + { 407, 0, }, + }, + + { + "remote-server-timeout", + "a remote server or service specified as part or all of the JID of the " + "intended recipient (or required to fulfill a request) could not be " + "contacted within a reasonable amount of time", + "wait", + 0, + NULL, + { 408, 504, 0, }, + }, + + { + "conflict", + "access cannot be granted because an existing resource or session exists " + "with the same name or address", + "cancel", + 0, + NULL, + { 409, 0, }, + }, + + { + "internal-server-error", + "the server could not process the stanza because of a misconfiguration " + "or an otherwise-undefined internal server error", + "wait", + 0, + NULL, + { 500, 0, }, + }, + { + "undefined-condition", + "application-specific condition", + NULL, + 0, + NULL, + { 500, 0, }, + }, + { + "resource-constraint", + "the server or recipient lacks the system resources necessary to service " + "the request", + "wait", + 0, + NULL, + { 500, 0, }, + }, + + { + "feature-not-implemented", + "the feature requested is not implemented by the recipient or server and " + "therefore cannot be processed", + "cancel", + 0, + NULL, + { 501, 0, }, + }, + + { + "service-unavailable", + "the server or recipient does not currently provide the requested " + "service", + "cancel", + 0, + NULL, + { 502, 503, 510, }, + }, + + { + "out-of-order", + "the request cannot occur at this point in the state machine", + "cancel", + XMPP_ERROR_UNEXPECTED_REQUEST, + NS_JINGLE_ERRORS, + { 0, }, + }, + + { + "unknown-session", + "the 'sid' attribute specifies a session that is unknown to the " + "recipient", + "cancel", + XMPP_ERROR_BAD_REQUEST, + NS_JINGLE_ERRORS, + { 0, }, + }, + + { + "unsupported-transports", + "the recipient does not support any of the desired content transport " + "methods", + "cancel", + XMPP_ERROR_FEATURE_NOT_IMPLEMENTED, + NS_JINGLE_ERRORS, + { 0, }, + }, + + { + "unsupported-content", + "the recipient does not support any of the desired content description" + "formats", + "cancel", + XMPP_ERROR_FEATURE_NOT_IMPLEMENTED, + NS_JINGLE_ERRORS, + { 0, }, + }, +}; + +GQuark +gabble_xmpp_error_quark (void) +{ + +#ifndef EMULATOR + static GQuark quark = 0; +#endif + + if (!quark) + quark = g_quark_from_static_string ("gabble-xmpp-error"); + return quark; +} + +GabbleXmppError +gabble_xmpp_error_from_node (LmMessageNode *error_node) +{ + gint i, j; + const gchar *error_code_str; + + /* First, try to look it up the modern way */ + if (error_node->children) + { + for (i = 0; i < NUM_XMPP_ERRORS; i++) + { + if (lm_message_node_get_child (error_node, xmpp_errors[i].name)) + { + return i; + } + } + } + + /* Ok, do it the legacy way */ + error_code_str = lm_message_node_get_attribute (error_node, "code"); + if (error_code_str) + { + gint error_code; + + error_code = atoi (error_code_str); + + for (i = 0; i < NUM_XMPP_ERRORS; i++) + { + const XmppErrorSpec *spec = &xmpp_errors[i]; + + for (j = 0; j < MAX_LEGACY_ERRORS; j++) + { + gint cur_code = spec->legacy_errors[j]; + if (cur_code == 0) + break; + + if (cur_code == error_code) + return i; + } + } + } + + return INVALID_XMPP_ERROR; +} + +GError * +gabble_xmpp_error_to_g_error (GabbleXmppError error) +{ + if (error >= NUM_XMPP_ERRORS) + return NULL; + + return g_error_new (GABBLE_XMPP_ERROR, + error, + xmpp_errors[error].description); +} + +/* + * See RFC 3920: 4.7 Stream Errors, 9.3 Stanza Errors. + */ +LmMessageNode * +gabble_xmpp_error_to_node (GabbleXmppError error, + LmMessageNode *parent_node, + const gchar *errmsg) +{ + const XmppErrorSpec *spec, *extra; + LmMessageNode *error_node, *node; + gchar str[6]; + + if (error >= NUM_XMPP_ERRORS) + return NULL; + + if (xmpp_errors[error].specialises) + { + extra = &xmpp_errors[error]; + spec = &xmpp_errors[extra->specialises]; + } + else + { + extra = NULL; + spec = &xmpp_errors[error]; + } + + error_node = lm_message_node_add_child (parent_node, "error", NULL); + + sprintf (str, "%d", spec->legacy_errors[0]); + lm_message_node_set_attribute (error_node, "code", str); + + if (spec->type) + { + lm_message_node_set_attribute (error_node, "type", spec->type); + } + + node = lm_message_node_add_child (error_node, spec->name, NULL); + lm_message_node_set_attribute (node, "xmlns", NS_XMPP_STANZAS); + + if (extra != NULL) + { + node = lm_message_node_add_child (error_node, extra->name, NULL); + lm_message_node_set_attribute (node, "xmlns", extra->namespace); + } + + if (NULL != errmsg) + lm_message_node_add_child (error_node, "text", errmsg); + + return error_node; +} + +const gchar * +gabble_xmpp_error_string (GabbleXmppError error) +{ + if (error < NUM_XMPP_ERRORS) + return xmpp_errors[error].name; + else + return NULL; +} + +const gchar * +gabble_xmpp_error_description (GabbleXmppError error) +{ + if (error < NUM_XMPP_ERRORS) + return xmpp_errors[error].description; + else + return NULL; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-im-channel-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-im-channel-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,69 @@ +/* + * gabble-im-channel-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-im-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-im-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,573 @@ +/* + * gabble-im-channel.c - Source for GabbleIMChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "loudmouth/loudmouth.h" +#include +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_IM + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-presence.h" +#include "gabble-presence-cache.h" +#include "handles.h" +#include "roster.h" +#include "telepathy-constants.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "tp-channel-iface.h" + +#include "gabble-im-channel.h" +#include "gabble-im-channel-glue.h" +#include "gabble-im-channel-signals-marshal.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleIMChannel, gabble_im_channel, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); + +#endif + +/* signal enum */ +enum +{ + CLOSED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_IM +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_im,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_im, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_im_channel_parent_class,gabble_im,gpointer) + #define gabble_im_channel_parent_class (*GET_WSD_VAR_NAME(gabble_im_channel_parent_class,gabble_im,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_im,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_im,s)()) + + +static void gabble_im_channel_init (GabbleIMChannel *self); +static void gabble_im_channel_class_init (GabbleIMChannelClass *klass); +static void gabble_im_channel_class_intern_init (gpointer klass) +{ + gabble_im_channel_parent_class = g_type_class_peek_parent (klass); + gabble_im_channel_class_init ((GabbleIMChannelClass*) klass); + } + EXPORT_C GType gabble_im_channel_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = + { sizeof (GabbleIMChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_im_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleIMChannel), 0, (GInstanceInitFunc) gabble_im_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleIMChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; + }; + + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleIMChannelPrivate GabbleIMChannelPrivate; + +struct _GabbleIMChannelPrivate +{ + GabbleConnection *conn; + char *object_path; + GabbleHandle handle; + + gchar *peer_jid; + + gboolean closed; + gboolean dispose_has_run; +}; + +#define GABBLE_IM_CHANNEL_GET_PRIVATE(obj) \ + ((GabbleIMChannelPrivate *)obj->priv) + +static void +gabble_im_channel_init (GabbleIMChannel *self) +{ + GabbleIMChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_IM_CHANNEL, GabbleIMChannelPrivate); + + self->priv = priv; +} + +static GObject * +gabble_im_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleIMChannelPrivate *priv; + DBusGConnection *bus; + gboolean valid, send_nick; + + obj = G_OBJECT_CLASS (gabble_im_channel_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_IM_CHANNEL_GET_PRIVATE (GABBLE_IM_CHANNEL (obj)); + + valid = gabble_handle_ref (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, priv->handle); + g_assert (valid); + + priv->peer_jid = g_strdup (gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, priv->handle)); + + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + if (gabble_roster_handle_get_subscription (priv->conn->roster, priv->handle) + & GABBLE_ROSTER_SUBSCRIPTION_FROM) + send_nick = FALSE; + else + send_nick = TRUE; + + gabble_text_mixin_init (obj, G_STRUCT_OFFSET (GabbleIMChannel, text), + priv->conn->handles, send_nick); + + gabble_text_mixin_set_message_types (obj, + TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION, + TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE, + G_MAXUINT); + + return obj; +} + +static void +gabble_im_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleIMChannel *chan = GABBLE_IM_CHANNEL (object); + GabbleIMChannelPrivate *priv = GABBLE_IM_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_TEXT); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_CONTACT); + break; + case PROP_HANDLE: + g_value_set_uint (value, priv->handle); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_im_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleIMChannel *chan = GABBLE_IM_CHANNEL (object); + GabbleIMChannelPrivate *priv = GABBLE_IM_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + priv->handle = g_value_get_uint (value); + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_im_channel_dispose (GObject *object); +static void gabble_im_channel_finalize (GObject *object); + +static void +gabble_im_channel_class_init (GabbleIMChannelClass *gabble_im_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_im_channel_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_im_channel_class, sizeof (GabbleIMChannelPrivate)); + + object_class->constructor = gabble_im_channel_constructor; + + object_class->get_property = gabble_im_channel_get_property; + object_class->set_property = gabble_im_channel_set_property; + + object_class->dispose = gabble_im_channel_dispose; + object_class->finalize = gabble_im_channel_finalize; + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "IM channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_im_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gabble_text_mixin_class_init (object_class, G_STRUCT_OFFSET (GabbleIMChannelClass, text_class)); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_im_channel_class), &dbus_glib_gabble_im_channel_object_info); +} + +void +gabble_im_channel_dispose (GObject *object) +{ + GabbleIMChannel *self = GABBLE_IM_CHANNEL (object); + GabbleIMChannelPrivate *priv = GABBLE_IM_CHANNEL_GET_PRIVATE (self); + GabbleRosterSubscription subscription; + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + subscription = gabble_roster_handle_get_subscription (priv->conn->roster, + priv->handle); + + if ((GABBLE_ROSTER_SUBSCRIPTION_TO & subscription) == 0) + { + GabblePresence *presence; + + presence = gabble_presence_cache_get (priv->conn->presence_cache, + priv->handle); + + if (NULL != presence) + { + presence->keep_unavailable = FALSE; + gabble_presence_cache_maybe_remove (priv->conn->presence_cache, + priv->handle); + } + } + + if (!priv->closed) + g_signal_emit(self, signals[CLOSED], 0); + + if (G_OBJECT_CLASS (gabble_im_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_im_channel_parent_class)->dispose (object); +} + +void +gabble_im_channel_finalize (GObject *object) +{ + GabbleIMChannel *self = GABBLE_IM_CHANNEL (object); + GabbleIMChannelPrivate *priv = GABBLE_IM_CHANNEL_GET_PRIVATE (self); + + /* free any data held directly by the object here */ + + gabble_handle_unref (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, priv->handle); + + g_free (priv->object_path); + g_free (priv->peer_jid); + + gabble_text_mixin_finalize (object); + + G_OBJECT_CLASS (gabble_im_channel_parent_class)->finalize (object); +} + +/** + * _gabble_im_channel_receive + * + */ +gboolean _gabble_im_channel_receive (GabbleIMChannel *chan, + TpChannelTextMessageType type, + GabbleHandle sender, + const char *from, + time_t timestamp, + const char *text) +{ + GabbleIMChannelPrivate *priv; + + g_assert (GABBLE_IS_IM_CHANNEL (chan)); + priv = GABBLE_IM_CHANNEL_GET_PRIVATE (chan); + + /* update peer's full JID if it's changed */ + if (0 != strcmp (from, priv->peer_jid)) + { + g_free (priv->peer_jid); + priv->peer_jid = g_strdup (from); + } + + if (timestamp == 0) + timestamp = time (NULL); + + return gabble_text_mixin_receive (G_OBJECT (chan), type, sender, timestamp, text); +} + +/** + * gabble_im_channel_acknowledge_pending_messages + * + * Implements D-Bus method AcknowledgePendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_acknowledge_pending_messages (GabbleIMChannel *self, + const GArray *ids, + GError **error) +{ + g_assert (GABBLE_IS_IM_CHANNEL (self)); + + return gabble_text_mixin_acknowledge_pending_messages (G_OBJECT (self), ids, + error); +} + + +/** + * gabble_im_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_close (GabbleIMChannel *self, + GError **error) +{ + GabbleIMChannelPrivate *priv; + + g_assert (GABBLE_IS_IM_CHANNEL (self)); + + gabble_debug (DEBUG_FLAG, "called on %p", self); + + priv = GABBLE_IM_CHANNEL_GET_PRIVATE (self); + priv->closed = TRUE; + + g_signal_emit (self, signals[CLOSED], 0); + + return TRUE; +} + + +/** + * gabble_im_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_get_channel_type (GabbleIMChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_TEXT); + + return TRUE; +} + + +/** + * gabble_im_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_get_handle (GabbleIMChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + GabbleIMChannelPrivate *priv; + + g_assert (GABBLE_IS_IM_CHANNEL (self)); + + priv = GABBLE_IM_CHANNEL_GET_PRIVATE (self); + + *ret = TP_HANDLE_TYPE_CONTACT; + *ret1 = priv->handle; + + return TRUE; +} + + +/** + * gabble_im_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_get_interfaces (GabbleIMChannel *self, + gchar ***ret, + GError **error) +{ + const char *interfaces[] = { NULL }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_im_channel_get_message_types + * + * Implements D-Bus method GetMessageTypes + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_get_message_types (GabbleIMChannel *self, + GArray **ret, + GError **error) +{ + return gabble_text_mixin_get_message_types (G_OBJECT (self), ret, error); +} + + +/** + * gabble_im_channel_list_pending_messages + * + * Implements D-Bus method ListPendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_list_pending_messages (GabbleIMChannel *self, + gboolean clear, + GPtrArray **ret, + GError **error) +{ + g_assert (GABBLE_IS_IM_CHANNEL (self)); + + return gabble_text_mixin_list_pending_messages (G_OBJECT (self), clear, ret, + error); +} + + +/** + * gabble_im_channel_send + * + * Implements D-Bus method Send + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_im_channel_send (GabbleIMChannel *self, + guint type, + const gchar *text, + GError **error) +{ + GabbleIMChannelPrivate *priv; + + g_assert (GABBLE_IS_IM_CHANNEL (self)); + priv = GABBLE_IM_CHANNEL_GET_PRIVATE (self); + + return gabble_text_mixin_send (G_OBJECT (self), type, 0, priv->peer_jid, + text, priv->conn, TRUE /* emit_signal */, error); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-channel-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-channel-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,222 @@ +/* + * gabble-media-channel-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,UINT,STRING (gabble-media-channel-signals-marshal.list:1) */ +void +gabble_media_channel_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + +/* VOID:STRING,STRING (gabble-media-channel-signals-marshal.list:2) */ +void +gabble_media_channel_marshal_VOID__STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__STRING_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + data2); +} + +/* VOID:UINT,UINT (gabble-media-channel-signals-marshal.list:3) */ +void +gabble_media_channel_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + +/* VOID:UINT,UINT,UINT (gabble-media-channel-signals-marshal.list:4) */ +void +gabble_media_channel_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1622 @@ +/* + * gabble-media-channel.c - Source for GabbleMediaChannel + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + + +#include "ansi.h" +#include "debug.h" +#include "gabble-connection.h" +#include "gabble-media-session.h" +#include "gabble-presence.h" +#include "gabble-presence-cache.h" + +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "tp-channel-iface.h" + +#include "gabble-media-channel.h" +#include "gabble-media-channel-signals-marshal.h" +#include "gabble-media-channel-glue.h" + +#include "gabble-media-session.h" +#include "gabble-media-stream.h" + +#include "media-factory.h" + +#include "gabble_enums.h" + +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA + +#define TP_SESSION_HANDLER_SET_TYPE (dbus_g_type_get_struct ("GValueArray", \ + DBUS_TYPE_G_OBJECT_PATH, \ + G_TYPE_STRING, \ + G_TYPE_INVALID)) + +#define TP_CHANNEL_STREAM_TYPE (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_INVALID)) + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleMediaChannel, gabble_media_channel, + G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); +#endif + +/* signal enum */ +enum +{ + CLOSED, + NEW_SESSION_HANDLER, + STREAM_ADDED, + STREAM_DIRECTION_CHANGED, + STREAM_ERROR, + STREAM_REMOVED, + STREAM_STATE_CHANGED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_MED_CHANNEL +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_med_chnl,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_med_chnl, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_media_channel_parent_class,gabble_med_chnl,gpointer) + #define gabble_media_channel_parent_class (*GET_WSD_VAR_NAME(gabble_media_channel_parent_class,gabble_med_chnl,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_med_chnl,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_med_chnl,s)()) + +static void gabble_media_channel_init (GabbleMediaChannel *self); +static void gabble_media_channel_class_init (GabbleMediaChannelClass *klass); +static void gabble_media_channel_class_intern_init (gpointer klass) + { + gabble_media_channel_parent_class = g_type_class_peek_parent (klass); + gabble_media_channel_class_init ((GabbleMediaChannelClass*) klass); + } + EXPORT_C GType gabble_media_channel_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = { sizeof (GabbleMediaChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_media_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMediaChannel), 0, (GInstanceInitFunc) gabble_media_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMediaChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; + }; + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + PROP_CREATOR, + PROP_FACTORY, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleMediaChannelPrivate GabbleMediaChannelPrivate; + +struct _GabbleMediaChannelPrivate +{ + GabbleConnection *conn; + gchar *object_path; + GabbleHandle creator; + + GabbleMediaFactory *factory; + GabbleMediaSession *session; + GPtrArray *streams; + + guint next_stream_id; + + gboolean closed; + gboolean dispose_has_run; +}; + +#define GABBLE_MEDIA_CHANNEL_GET_PRIVATE(obj) \ + ((GabbleMediaChannelPrivate *)obj->priv) + +static void +gabble_media_channel_init (GabbleMediaChannel *self) +{ + GabbleMediaChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_MEDIA_CHANNEL, GabbleMediaChannelPrivate); + + self->priv = priv; + + priv->next_stream_id = 1; +} + +static GObject * +gabble_media_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleMediaChannelPrivate *priv; + DBusGConnection *bus; + GIntSet *set; + + obj = G_OBJECT_CLASS (gabble_media_channel_parent_class)-> + constructor (type, n_props, props); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (GABBLE_MEDIA_CHANNEL (obj)); + + /* register object on the bus */ + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + gabble_group_mixin_init (obj, G_STRUCT_OFFSET (GabbleMediaChannel, group), + priv->conn->handles, priv->conn->self_handle); + + /* automatically add creator to channel */ + set = g_intset_new (); + g_intset_add (set, priv->creator); + + gabble_group_mixin_change_members (obj, "", set, NULL, NULL, NULL, 0, 0); + + g_intset_destroy (set); + + /* allow member adding */ + gabble_group_mixin_change_flags (obj, TP_CHANNEL_GROUP_FLAG_CAN_ADD, 0); + + return obj; +} + +static void session_state_changed_cb (GabbleMediaSession *session, GParamSpec *arg1, GabbleMediaChannel *channel); +static void session_stream_added_cb (GabbleMediaSession *session, GabbleMediaStream *stream, GabbleMediaChannel *chan); +static void session_terminated_cb (GabbleMediaSession *session, guint terminator, guint reason, gpointer user_data); + +/** + * create_session + * + * Creates a GabbleMediaSession object for given peer. + * + * If sid is set to NULL a unique sid is generated and + * the "initiator" property of the newly created + * GabbleMediaSession is set to our own handle. + */ +static GabbleMediaSession* +create_session (GabbleMediaChannel *channel, + GabbleHandle peer, + const gchar *peer_resource, + const gchar *sid) +{ + GabbleMediaChannelPrivate *priv; + GabbleMediaSession *session; + gchar *object_path; + JingleInitiator initiator; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (channel)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (channel); + + g_assert (priv->session == NULL); + + object_path = g_strdup_printf ("%s/MediaSession%u", priv->object_path, peer); + + if (sid == NULL) + { + initiator = INITIATOR_LOCAL; + sid = _gabble_media_factory_allocate_sid (priv->factory, channel); + } + else + { + initiator = INITIATOR_REMOTE; + _gabble_media_factory_register_sid (priv->factory, sid, channel); + } + + session = g_object_new (GABBLE_TYPE_MEDIA_SESSION, + "connection", priv->conn, + "media-channel", channel, + "object-path", object_path, + "session-id", sid, + "initiator", initiator, + "peer", peer, + "peer-resource", peer_resource, + NULL); + + g_signal_connect (session, "notify::state", + (GCallback) session_state_changed_cb, channel); + g_signal_connect (session, "stream-added", + (GCallback) session_stream_added_cb, channel); + g_signal_connect (session, "terminated", + (GCallback) session_terminated_cb, channel); + + priv->session = session; + + priv->streams = g_ptr_array_sized_new (1); + + g_signal_emit (channel, signals[NEW_SESSION_HANDLER], 0, + object_path, "rtp"); + + g_free (object_path); + + return session; +} + +gboolean +_gabble_media_channel_dispatch_session_action (GabbleMediaChannel *chan, + GabbleHandle peer, + const gchar *peer_resource, + const gchar *sid, + LmMessage *message, + LmMessageNode *session_node, + const gchar *action, + GError **error) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + GabbleMediaSession *session = priv->session; + gboolean session_is_new = FALSE; + + if (session == NULL) + { + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (chan); + GIntSet *set; + + session = create_session (chan, peer, peer_resource, sid); + session_is_new = TRUE; + + /* make us local pending */ + set = g_intset_new (); + g_intset_add (set, mixin->self_handle); + + gabble_group_mixin_change_members (G_OBJECT (chan), "", NULL, NULL, set, + NULL, 0, 0); + + g_intset_destroy (set); + + /* and update flags accordingly */ + gabble_group_mixin_change_flags (G_OBJECT (chan), + TP_CHANNEL_GROUP_FLAG_CAN_ADD | + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE, + 0); + } + + g_object_ref (session); + + if (_gabble_media_session_handle_action (session, message, session_node, + action, error)) + { + g_object_unref (session); + return TRUE; + } + else + { + if (session_is_new) + _gabble_media_session_terminate (session, INITIATOR_LOCAL, + TP_CHANNEL_GROUP_CHANGE_REASON_ERROR); + + g_object_unref (session); + return FALSE; + } +} + +static void +gabble_media_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMediaChannel *chan = GABBLE_MEDIA_CHANNEL (object); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_NONE); + break; + case PROP_HANDLE: + g_value_set_uint (value, 0); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + case PROP_CREATOR: + g_value_set_uint (value, priv->creator); + break; + case PROP_FACTORY: + g_value_set_object (value, priv->factory); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_media_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMediaChannel *chan = GABBLE_MEDIA_CHANNEL (object); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + /* this property is writable in the interface, but not actually + * meaningfully changable on this channel, so we do nothing */ + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + case PROP_CREATOR: + priv->creator = g_value_get_uint (value); + break; + case PROP_FACTORY: + priv->factory = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_media_channel_dispose (GObject *object); +static void gabble_media_channel_finalize (GObject *object); +static gboolean gabble_media_channel_remove_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); + +static void +gabble_media_channel_class_init (GabbleMediaChannelClass *gabble_media_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_media_channel_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_media_channel_class, sizeof (GabbleMediaChannelPrivate)); + + object_class->constructor = gabble_media_channel_constructor; + + object_class->get_property = gabble_media_channel_get_property; + object_class->set_property = gabble_media_channel_set_property; + + object_class->dispose = gabble_media_channel_dispose; + object_class->finalize = gabble_media_channel_finalize; + + gabble_group_mixin_class_init (object_class, + G_STRUCT_OFFSET (GabbleMediaChannelClass, group_class), + _gabble_media_channel_add_member, + gabble_media_channel_remove_member); + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "media channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_uint ("creator", "Channel creator", + "The GabbleHandle representing the contact " + "who created the channel.", + 0, G_MAXUINT32, 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CREATOR, param_spec); + + param_spec = g_param_spec_object ("factory", "GabbleMediaFactory object", + "The factory that created this object.", + GABBLE_TYPE_MEDIA_FACTORY, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_FACTORY, param_spec); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[NEW_SESSION_HANDLER] = + g_signal_new ("new-session-handler", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_channel_marshal_VOID__STRING_STRING, + G_TYPE_NONE, 2, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING); + + signals[STREAM_ADDED] = + g_signal_new ("stream-added", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_channel_marshal_VOID__UINT_UINT_UINT, + G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); + + signals[STREAM_DIRECTION_CHANGED] = + g_signal_new ("stream-direction-changed", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_channel_marshal_VOID__UINT_UINT_UINT, + G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); + + signals[STREAM_ERROR] = + g_signal_new ("stream-error", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_channel_marshal_VOID__UINT_UINT_STRING, + G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING); + + signals[STREAM_REMOVED] = + g_signal_new ("stream-removed", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + signals[STREAM_STATE_CHANGED] = + g_signal_new ("stream-state-changed", + G_OBJECT_CLASS_TYPE (gabble_media_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_channel_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_media_channel_class), &dbus_glib_gabble_media_channel_object_info); +} + +void +gabble_media_channel_dispose (GObject *object) +{ + GabbleMediaChannel *self = GABBLE_MEDIA_CHANNEL (object); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + /** In this we set the state to ENDED, then the callback unrefs + * the session + */ + + if (!priv->closed) + gabble_media_channel_close (self, NULL); + + g_assert (priv->closed); + g_assert (priv->session == NULL); + g_assert (priv->streams == NULL); + + if (G_OBJECT_CLASS (gabble_media_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_media_channel_parent_class)->dispose (object); +} + +void +gabble_media_channel_finalize (GObject *object) +{ + GabbleMediaChannel *self = GABBLE_MEDIA_CHANNEL (object); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + g_free (priv->object_path); + + gabble_group_mixin_finalize (object); + + G_OBJECT_CLASS (gabble_media_channel_parent_class)->finalize (object); +} + + + +/** + * gabble_media_channel_add_members + * + * Implements D-Bus method AddMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_add_members (GabbleMediaChannel *self, + const GArray *contacts, + const gchar *message, + GError **error) +{ + return gabble_group_mixin_add_members (G_OBJECT (self), contacts, message, + error); +} + + +/** + * gabble_media_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_close (GabbleMediaChannel *self, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + + gabble_debug (DEBUG_FLAG, "called on %p", self); + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + if (priv->closed) + return TRUE; + + priv->closed = TRUE; + + if (priv->session) + { + _gabble_media_session_terminate (priv->session, INITIATOR_LOCAL, TP_CHANNEL_GROUP_CHANGE_REASON_NONE); + } + + g_signal_emit (self, signals[CLOSED], 0); + + return TRUE; +} + + +/** + * gabble_media_channel_get_all_members + * + * Implements D-Bus method GetAllMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_all_members (GabbleMediaChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error) +{ + return gabble_group_mixin_get_all_members (G_OBJECT (self), ret, ret1, ret2, + error); +} + + +/** + * gabble_media_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_channel_type (GabbleMediaChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA); + + return TRUE; +} + + +/** + * gabble_media_channel_get_group_flags + * + * Implements D-Bus method GetGroupFlags + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_group_flags (GabbleMediaChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_group_flags (G_OBJECT (self), ret, error); +} + + +/** + * gabble_media_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_handle (GabbleMediaChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + *ret = 0; + *ret1 = 0; + + return TRUE; +} + + +/** + * gabble_media_channel_get_handle_owners + * + * Implements D-Bus method GetHandleOwners + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_handle_owners (GabbleMediaChannel *self, + const GArray *handles, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_handle_owners (G_OBJECT (self), handles, ret, + error); +} + + +/** + * gabble_media_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_interfaces (GabbleMediaChannel *self, + gchar ***ret, + GError **error) +{ + const gchar *interfaces[] = { + TP_IFACE_CHANNEL_INTERFACE_GROUP, + TP_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING, + NULL + }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_media_channel_get_local_pending_members + * + * Implements D-Bus method GetLocalPendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_local_pending_members (GabbleMediaChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_local_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_media_channel_get_members + * + * Implements D-Bus method GetMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_members (GabbleMediaChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_members (G_OBJECT (self), ret, error); +} + + +/** + * gabble_media_channel_get_remote_pending_members + * + * Implements D-Bus method GetRemotePendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_remote_pending_members (GabbleMediaChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_remote_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_media_channel_get_self_handle + * + * Implements D-Bus method GetSelfHandle + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_self_handle (GabbleMediaChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_self_handle (G_OBJECT (self), ret, error); +} + + +/** + * gabble_media_channel_get_session_handlers + * + * Implements D-Bus method GetSessionHandlers + * on interface org.freedesktop.Telepathy.Channel.Interface.MediaSignalling + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_get_session_handlers (GabbleMediaChannel *self, + GPtrArray **ret, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + if (priv->session) + { + GValue handler = { 0, }; + GabbleHandle member; + gchar *path; + + g_value_init (&handler, TP_SESSION_HANDLER_SET_TYPE); + g_value_take_boxed (&handler, + dbus_g_type_specialized_construct (TP_SESSION_HANDLER_SET_TYPE)); + + g_object_get (priv->session, + "peer", &member, + "object-path", &path, + NULL); + + dbus_g_type_struct_set (&handler, + 0, path, + 1, "rtp", + G_MAXUINT); + + g_free (path); + + *ret = g_ptr_array_sized_new (1); + g_ptr_array_add (*ret, g_value_get_boxed (&handler)); + } + else + { + *ret = g_ptr_array_sized_new (0); + } + + return TRUE; +} + + +static GPtrArray * +make_stream_list (GabbleMediaChannel *self, + GPtrArray *streams) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + GPtrArray *ret; + guint i; + + ret = g_ptr_array_sized_new (streams->len); + + for (i = 0; i < streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (streams, i); + GValue entry = { 0, }; + guint id; + GabbleHandle peer; + TpCodecMediaType type; + TpMediaStreamState connection_state; + CombinedStreamDirection combined_direction; + + g_object_get (stream, + "id", &id, + "media-type", &type, + "connection-state", &connection_state, + "combined-direction", &combined_direction, + NULL); + + g_object_get (priv->session, "peer", &peer, NULL); + + g_value_init (&entry, TP_CHANNEL_STREAM_TYPE); + g_value_take_boxed (&entry, + dbus_g_type_specialized_construct (TP_CHANNEL_STREAM_TYPE)); + + dbus_g_type_struct_set (&entry, + 0, id, + 1, peer, + 2, type, + 3, connection_state, + 4, COMBINED_DIRECTION_GET_DIRECTION (combined_direction), + 5, COMBINED_DIRECTION_GET_PENDING_SEND (combined_direction), + G_MAXUINT); + + g_ptr_array_add (ret, g_value_get_boxed (&entry)); + } + + return ret; +} + +/** + * gabble_media_channel_list_streams + * + * Implements D-Bus method ListStreams + * on interface org.freedesktop.Telepathy.Channel.Type.StreamedMedia + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_list_streams (GabbleMediaChannel *self, + GPtrArray **ret, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + /* no session yet? return an empty array */ + if (priv->session == NULL) + { + *ret = g_ptr_array_new (); + + return TRUE; + } + + *ret = make_stream_list (self, priv->streams); + + return TRUE; +} + + +/** + * gabble_media_channel_remove_members + * + * Implements D-Bus method RemoveMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_remove_members (GabbleMediaChannel *self, + const GArray *contacts, + const gchar *message, + GError **error) +{ + return gabble_group_mixin_remove_members (G_OBJECT (self), contacts, message, + error); +} + + +static GabbleMediaStream * +_find_stream_by_id (GabbleMediaChannel *chan, guint stream_id) +{ + GabbleMediaChannelPrivate *priv; + guint i; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (chan)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + guint id; + + g_object_get (stream, "id", &id, NULL); + if (id == stream_id) + return stream; + } + + return NULL; +} + +/** + * gabble_media_channel_remove_streams + * + * Implements DBus method RemoveStreams + * on interface org.freedesktop.Telepathy.Channel.Type.StreamedMedia + * + * @error: Used to return a pointer to a GError detailing any error + * that occured, DBus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_media_channel_remove_streams (GabbleMediaChannel *obj, const GArray * streams, GError **error) +{ + GabbleMediaChannelPrivate *priv; + GPtrArray *stream_objs; + guint i; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (obj)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (obj); + + *error = NULL; + + stream_objs = g_ptr_array_sized_new (streams->len); + + /* check that all stream ids are valid and at the same time build an array + * of stream objects so we don't have to look them up again after verifying + * all stream identifiers. */ + for (i = 0; i < streams->len; i++) + { + guint id = g_array_index (streams, guint, i); + GabbleMediaStream *stream; + guint j; + + stream = _find_stream_by_id (obj, id); + if (stream == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "given stream id %u does not exist", id); + goto OUT; + } + + /* make sure we don't allow the client to repeatedly remove the same stream */ + for (j = 0; j < stream_objs->len; j++) + { + GabbleMediaStream *tmp = g_ptr_array_index (stream_objs, j); + + if (tmp == stream) + { + stream = NULL; + break; + } + } + + if (stream != NULL) + g_ptr_array_add (stream_objs, stream); + } + + /* groovy, it's all good dude, let's remove them */ + if (stream_objs->len > 0) + _gabble_media_session_remove_streams (priv->session, (GabbleMediaStream **) + stream_objs->pdata, stream_objs->len); + +OUT: + g_ptr_array_free (stream_objs, TRUE); + + return (*error == NULL); +} + + +/** + * gabble_media_channel_request_stream_direction + * + * Implements D-Bus method RequestStreamDirection + * on interface org.freedesktop.Telepathy.Channel.Type.StreamedMedia + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_request_stream_direction (GabbleMediaChannel *self, + guint stream_id, + guint stream_direction, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + GabbleMediaStream *stream; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + if (stream_direction > TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "given stream direction %u is not valid", stream_direction); + return FALSE; + } + + stream = _find_stream_by_id (self, stream_id); + if (stream == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "given stream id %u does not exist", stream_id); + return FALSE; + } + + /* streams with no session? I think not... */ + g_assert (priv->session != NULL); + + return _gabble_media_session_request_stream_direction (priv->session, stream, + stream_direction, error); +} + + +/** + * gabble_media_channel_request_streams + * + * Implements D-Bus method RequestStreams + * on interface org.freedesktop.Telepathy.Channel.Type.StreamedMedia + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_channel_request_streams (GabbleMediaChannel *self, + guint contact_handle, + const GArray *types, + GPtrArray **ret, + GError **error) +{ + GabbleMediaChannelPrivate *priv; + GPtrArray *streams; + + g_assert (GABBLE_IS_MEDIA_CHANNEL (self)); + + priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (self); + + if (!gabble_handle_is_valid (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, + contact_handle, error)) + return FALSE; + + if (!handle_set_is_member (self->group.members, contact_handle) && + !handle_set_is_member (self->group.remote_pending, contact_handle)) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "given handle %u is not a member of the channel", contact_handle); + return FALSE; + } + + /* if the person is a channel member, we should have a session */ + g_assert (priv->session != NULL); + + if (!_gabble_media_session_request_streams (priv->session, types, &streams, + error)) + return FALSE; + + *ret = make_stream_list (self, streams); + + g_ptr_array_free (streams, TRUE); + + return TRUE; +} + + +gboolean +_gabble_media_channel_add_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error) +{ + GabbleMediaChannel *chan = GABBLE_MEDIA_CHANNEL (obj); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + /* did we create this channel? */ + if (priv->creator == mixin->self_handle) + { + GabblePresence *presence; + GIntSet *set; + + /* yes: check the peer's capabilities */ + + presence = gabble_presence_cache_get (priv->conn->presence_cache, handle); + + if (presence == NULL || + !(presence->caps & PRESENCE_CAP_GOOGLE_VOICE || + presence->caps & PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO || + presence->caps & PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO)) + { + if (presence == NULL) + gabble_debug (DEBUG_FLAG, "failed to add contact %d (%s) to media channel: " + "no presence available", handle, + gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle)); + else + gabble_debug (DEBUG_FLAG, "failed to add contact %d (%s) to media channel: " + "caps %x aren't sufficient", handle, + gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle), + presence->caps); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "handle %u has no media capabilities", handle); + return FALSE; + } + + /* yes: invite the peer */ + + + /* create a new session */ + create_session (chan, handle, NULL, NULL); + + /* make the peer remote pending */ + set = g_intset_new (); + g_intset_add (set, handle); + + gabble_group_mixin_change_members (obj, "", NULL, NULL, NULL, set, 0, 0); + + g_intset_destroy (set); + + /* and update flags accordingly */ + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_CAN_RESCIND, + TP_CHANNEL_GROUP_FLAG_CAN_ADD); + + return TRUE; + } + else + { + /* no: has a session been created, is the handle being added ours, + * and are we in local pending? */ + + if (priv->session && + handle == mixin->self_handle && + handle_set_is_member (mixin->local_pending, handle)) + { + /* yes: accept the request */ + + GIntSet *set; + + /* make us a member */ + set = g_intset_new (); + g_intset_add (set, handle); + + gabble_group_mixin_change_members (obj, "", set, NULL, NULL, NULL, 0, 0); + + g_intset_destroy (set); + + /* update flags */ + gabble_group_mixin_change_flags (obj, 0, TP_CHANNEL_GROUP_FLAG_CAN_ADD); + + /* signal acceptance */ + _gabble_media_session_accept (priv->session); + + return TRUE; + } + } + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "handle %u cannot be added in the current state", handle); + return FALSE; +} + +static gboolean +gabble_media_channel_remove_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error) +{ + GabbleMediaChannel *chan = GABBLE_MEDIA_CHANNEL (obj); + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GIntSet *set; + + if (priv->session == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "handle %u cannot be removed in the current state", handle); + + return FALSE; + } + + if (priv->creator != mixin->self_handle && + handle != mixin->self_handle) + { + g_set_error (error, TELEPATHY_ERRORS, PermissionDenied, + "handle %u cannot be removed because you are not the creator of the" + " channel", handle); + + return FALSE; + } + + _gabble_media_session_terminate (priv->session, INITIATOR_LOCAL, TP_CHANNEL_GROUP_CHANGE_REASON_NONE); + + /* remove the member */ + set = g_intset_new (); + g_intset_add (set, handle); + + gabble_group_mixin_change_members (obj, "", NULL, set, NULL, NULL, 0, 0); + + g_intset_destroy (set); + + /* and update flags accordingly */ + gabble_group_mixin_change_flags (obj, TP_CHANNEL_GROUP_FLAG_CAN_ADD, + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_CAN_RESCIND); + + return TRUE; +} + +static void +session_terminated_cb (GabbleMediaSession *session, + guint terminator, + guint reason, + gpointer user_data) +{ + GabbleMediaChannel *channel = (GabbleMediaChannel *) user_data; + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (channel); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (channel); + GError *error = NULL; + gchar *sid; + JingleSessionState state; + GabbleHandle peer; + GIntSet *set; + + g_object_get (session, + "state", &state, + "peer", &peer, + NULL); + + set = g_intset_new (); + + /* remove us and the peer from the member list */ + g_intset_add (set, mixin->self_handle); + g_intset_add (set, peer); + + gabble_group_mixin_change_members (G_OBJECT (channel), "", NULL, set, NULL, NULL, terminator, reason); + + /* update flags accordingly -- allow adding, deny removal */ + gabble_group_mixin_change_flags (G_OBJECT (channel), TP_CHANNEL_GROUP_FLAG_CAN_ADD, + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE); + + /* free the session ID */ + g_object_get (priv->session, "session-id", &sid, NULL); + _gabble_media_factory_free_sid (priv->factory, sid); + g_free (sid); + + /* unref streams */ + if (priv->streams != NULL) + { + GPtrArray *tmp = priv->streams; + + /* move priv->streams aside so that the stream_close_cb + * doesn't double unref */ + priv->streams = NULL; + g_ptr_array_foreach (tmp, (GFunc) g_object_unref, NULL); + g_ptr_array_free (tmp, TRUE); + } + + /* remove the session */ + g_object_unref (priv->session); + priv->session = NULL; + + /* close the channel */ + if (!gabble_media_channel_close (channel, &error)) + { + g_warning ("%s: failed to close media channel: %s", G_STRFUNC, + error->message); + } +} + + +static void +session_state_changed_cb (GabbleMediaSession *session, + GParamSpec *arg1, + GabbleMediaChannel *channel) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (channel); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (channel); + JingleSessionState state; + GabbleHandle peer; + GIntSet *set; + + g_object_get (session, + "state", &state, + "peer", &peer, + NULL); + + if (state != JS_STATE_ACTIVE) + return; + + if (priv->creator != mixin->self_handle) + return; + + set = g_intset_new (); + + /* add the peer to the member list */ + g_intset_add (set, peer); + + gabble_group_mixin_change_members (G_OBJECT (channel), "", set, NULL, NULL, NULL, 0, 0); + + /* update flags accordingly -- allow removal, deny adding and rescinding */ + gabble_group_mixin_change_flags (G_OBJECT (channel), + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE, + TP_CHANNEL_GROUP_FLAG_CAN_ADD | + TP_CHANNEL_GROUP_FLAG_CAN_RESCIND); + + g_intset_destroy (set); +} + +static void +stream_close_cb (GabbleMediaStream *stream, + GabbleMediaChannel *chan) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + guint id; + + g_object_get (stream, "id", &id, NULL); + + g_signal_emit (chan, signals[STREAM_REMOVED], 0, id); + + if (priv->streams != NULL) + { + g_ptr_array_remove (priv->streams, stream); + g_object_unref (stream); + } +} + +static void +stream_error_cb (GabbleMediaStream *stream, + TpMediaStreamError errno, + const gchar *message, + GabbleMediaChannel *chan) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + guint id; + + /* emit signal */ + g_object_get (stream, "id", &id, NULL); + g_signal_emit (chan, signals[STREAM_ERROR], 0, id, errno, message); + + /* remove stream from session */ + _gabble_media_session_remove_streams (priv->session, &stream, 1); +} + +static void +stream_state_changed_cb (GabbleMediaStream *stream, + GParamSpec *pspec, + GabbleMediaChannel *chan) +{ + guint id; + TpMediaStreamState connection_state; + + g_object_get (stream, "id", &id, "connection-state", &connection_state, NULL); + + g_signal_emit (chan, signals[STREAM_STATE_CHANGED], 0, id, connection_state); +} + +static void +stream_direction_changed_cb (GabbleMediaStream *stream, + GParamSpec *pspec, + GabbleMediaChannel *chan) +{ + guint id; + CombinedStreamDirection combined; + TpMediaStreamDirection direction; + TpMediaStreamPendingSend pending_send; + + g_object_get (stream, + "id", &id, + "combined-direction", &combined, + NULL); + + direction = COMBINED_DIRECTION_GET_DIRECTION (combined); + pending_send = COMBINED_DIRECTION_GET_PENDING_SEND (combined); + + g_signal_emit (chan, signals[STREAM_DIRECTION_CHANGED], 0, id, direction, + pending_send); +} + +static void +session_stream_added_cb (GabbleMediaSession *session, + GabbleMediaStream *stream, + GabbleMediaChannel *chan) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + + guint id, handle, type; + + /* keep track of the stream */ + g_object_ref (stream); + g_ptr_array_add (priv->streams, stream); + + g_signal_connect (stream, "close", + (GCallback) stream_close_cb, chan); + g_signal_connect (stream, "error", + (GCallback) stream_error_cb, chan); + g_signal_connect (stream, "notify::connection-state", + (GCallback) stream_state_changed_cb, chan); + g_signal_connect (stream, "notify::combined-direction", + (GCallback) stream_direction_changed_cb, chan); + + /* emit StreamAdded */ + g_object_get (session, "peer", &handle, NULL); + g_object_get (stream, "id", &id, "media-type", &type, NULL); + + g_signal_emit (chan, signals[STREAM_ADDED], 0, id, handle, type); +} + +guint +_gabble_media_channel_get_stream_id (GabbleMediaChannel *chan) +{ + GabbleMediaChannelPrivate *priv = GABBLE_MEDIA_CHANNEL_GET_PRIVATE (chan); + + return priv->next_stream_id++; +} + +#define AUDIO_CAPS \ + ( PRESENCE_CAP_GOOGLE_VOICE | PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO ) + +#define VIDEO_CAPS \ + ( PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO ) + +GabblePresenceCapabilities +_gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags) +{ + GabblePresenceCapabilities caps = 0; + + if (flags & TP_CHANNEL_MEDIA_CAPABILITY_AUDIO) + caps |= AUDIO_CAPS; + + if (flags & TP_CHANNEL_MEDIA_CAPABILITY_VIDEO) + caps |= VIDEO_CAPS; + + return caps; +} + +TpChannelMediaCapabilities +_gabble_media_channel_caps_to_typeflags (GabblePresenceCapabilities caps) +{ + TpChannelMediaCapabilities typeflags = 0; + + if (caps & AUDIO_CAPS) + typeflags |= TP_CHANNEL_MEDIA_CAPABILITY_AUDIO; + + if (caps & VIDEO_CAPS) + typeflags |= TP_CHANNEL_MEDIA_CAPABILITY_VIDEO; + + return typeflags; +} + +//Added to avoid type casting error in winscw +GabblePresenceCapabilities +_gabble_media_channel_typeflags_to_caps_tmp (guint flags) +{ +return _gabble_media_channel_typeflags_to_caps( (TpChannelMediaCapabilities) flags); +} + +//Added to avoid type casting error in winscw +guint +_gabble_media_channel_caps_to_typeflags_tmp (GabblePresenceCapabilities caps) +{ +return (guint) _gabble_media_channel_caps_to_typeflags(caps); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-session-enumtypes.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-session-enumtypes.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,104 @@ +/* + * gabble-media-session-enumtypes.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ +/* Generated data (by glib-mkenums) */ +//vinod: changed system path to local +#include "gabble-media-session.h" + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(etype,gabble_media_session_enum_types,GType) + #define etype (*GET_WSD_VAR_NAME(etype,gabble_media_session_enum_types,s)()) + + GET_STATIC_VAR_FROM_TLS(etype1,gabble_media_session_enum_types,GType) + #define etype1 (*GET_WSD_VAR_NAME(etype1,gabble_media_session_enum_types,s)()) + + GET_STATIC_VAR_FROM_TLS(etype2,gabble_media_session_enum_types,GType) + #define etype2 (*GET_WSD_VAR_NAME(etype2,gabble_media_session_enum_types,s)()) + +#endif + + +/* enumerations from "gabble-media-session.h" */ +GType +gabble_media_session_mode_get_type (void) +{ +#ifndef EMULATOR + static GType etype = 0; +#endif + + if (etype == 0) { + static const GEnumValue values[] = { + { MODE_GOOGLE, "MODE_GOOGLE", "MODE_GOOGLE" }, + { MODE_JINGLE, "MODE_JINGLE", "MODE_JINGLE" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static ("GabbleMediaSessionMode", values); + } + return etype; +} +GType +jingle_session_state_get_type (void) +{ +#ifndef EMULATOR + static GType etype1 = 0; +#endif + + if (etype1 == 0) { + static const GEnumValue values[] = { + { JS_STATE_INVALID, "JS_STATE_INVALID", "JS_STATE_INVALID" }, + { JS_STATE_PENDING_CREATED, "JS_STATE_PENDING_CREATED", "JS_STATE_PENDING_CREATED" }, + { JS_STATE_PENDING_INITIATE_SENT, "JS_STATE_PENDING_INITIATE_SENT", "JS_STATE_PENDING_INITIATE_SENT" }, + { JS_STATE_PENDING_INITIATED, "JS_STATE_PENDING_INITIATED", "JS_STATE_PENDING_INITIATED" }, + { JS_STATE_PENDING_ACCEPT_SENT, "JS_STATE_PENDING_ACCEPT_SENT", "JS_STATE_PENDING_ACCEPT_SENT" }, + { JS_STATE_ACTIVE, "JS_STATE_ACTIVE", "JS_STATE_ACTIVE" }, + { JS_STATE_ENDED, "JS_STATE_ENDED", "JS_STATE_ENDED" }, + { 0, NULL, NULL } + }; + etype1 = g_enum_register_static ("JingleSessionState", values); + } + return etype1; +} +GType +debug_message_type_get_type (void) +{ +#ifndef EMULATOR + static GType etype2 = 0; +#endif + + if (etype2 == 0) { + static const GEnumValue values[] = { + { DEBUG_MSG_INFO, "DEBUG_MSG_INFO", "DEBUG_MSG_INFO" }, + { DEBUG_MSG_DUMP, "DEBUG_MSG_DUMP", "DEBUG_MSG_DUMP" }, + { DEBUG_MSG_WARNING, "DEBUG_MSG_WARNING", "DEBUG_MSG_WARNING" }, + { DEBUG_MSG_ERROR, "DEBUG_MSG_ERROR", "DEBUG_MSG_ERROR" }, + { DEBUG_MSG_EVENT, "DEBUG_MSG_EVENT", "DEBUG_MSG_EVENT" }, + { 0, NULL, NULL } + }; + etype2 = g_enum_register_static ("DebugMessageType", values); + } + return etype2; +} + +/* Generated data ends here */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-session-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-session-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,148 @@ +/* + * gabble-media-session-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:STRING,UINT,UINT,UINT (gabble-media-session-signals-marshal.list:1) */ +void +gabble_media_session_marshal_VOID__STRING_UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_UINT_UINT_UINT) (gpointer data1, + gpointer arg_1, + guint arg_2, + guint arg_3, + guint arg_4, + gpointer data2); + register GMarshalFunc_VOID__STRING_UINT_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_uint (param_values + 4), + data2); +} + +/* VOID:UINT,UINT (gabble-media-session-signals-marshal.list:2) */ +void +gabble_media_session_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-session.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-session.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3026 @@ +/* + * gabble-media-session.c - Source for GabbleMediaSession + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include "debug.h" +#include "ansi.h" +#include "handles.h" +#include "namespaces.h" +#include "util.h" + +#include "telepathy-errors.h" +#include "telepathy-helpers.h" + +#include "gabble-connection.h" +#include "gabble-media-channel.h" +#include "gabble-media-stream.h" +#include "gabble-presence-cache.h" +#include "gabble-presence.h" + +#include "gabble-media-session.h" +#include "gabble-media-session-signals-marshal.h" +#include "gabble-media-session-glue.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleMediaSession, gabble_media_session, G_TYPE_OBJECT) +#endif + + +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA +//vinod +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +//#define NODE_DEBUG(n, s); +#endif /* DEBUG_FLAG */ + +#define DEFAULT_SESSION_TIMEOUT 50000 + +#define GTALK_STREAM_NAME "gtalk" + +/* 99 streams gives us a max name length of 8 (videoXX\0 or audioXX\0) */ +#define MAX_STREAMS 99 + +#ifndef EMULATOR +#define MAX_STREAM_NAME_LEN 8 +#endif + +//#define DEBUGGING 0 + +/* signal enum */ +enum +{ + NEW_STREAM_HANDLER, + STREAM_ADDED, + TERMINATED, + LAST_SIGNAL +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_med_sess,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_med_sess, s)()) + + + GET_STATIC_VAR_FROM_TLS(google_audio_caps,gabble_med_sess,GabblePresenceCapabilities) + #define google_audio_caps (*GET_WSD_VAR_NAME(google_audio_caps,gabble_med_sess, s)()) + + GET_STATIC_VAR_FROM_TLS(jingle_audio_caps,gabble_med_sess,GabblePresenceCapabilities) + #define jingle_audio_caps (*GET_WSD_VAR_NAME(jingle_audio_caps,gabble_med_sess, s)()) + + GET_STATIC_VAR_FROM_TLS(jingle_video_caps,gabble_med_sess,GabblePresenceCapabilities) + #define jingle_video_caps (*GET_WSD_VAR_NAME(jingle_video_caps,gabble_med_sess, s)()) + + GET_STATIC_ARRAY_FROM_TLS(ret_sess,gabble_med_sess,gchar) + #define ret_sess (GET_WSD_VAR_NAME(ret_sess,gabble_med_sess, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_media_session_parent_class,gabble_med_sess,gpointer) + #define gabble_media_session_parent_class (*GET_WSD_VAR_NAME(gabble_media_session_parent_class,gabble_med_sess,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_med_sess,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_med_sess,s)()) + + + static void gabble_media_session_init (GabbleMediaSession *self); + static void gabble_media_session_class_init (GabbleMediaSessionClass *klass); + static void gabble_media_session_class_intern_init (gpointer klass) + { + gabble_media_session_parent_class = g_type_class_peek_parent (klass); + gabble_media_session_class_init ((GabbleMediaSessionClass*) klass); } + + EXPORT_C GType gabble_media_session_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleMediaSessionClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_media_session_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMediaSession), 0, (GInstanceInitFunc) gabble_media_session_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMediaSession"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } + + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + PROP_MEDIA_CHANNEL, + PROP_OBJECT_PATH, + PROP_SESSION_ID, + PROP_INITIATOR, + PROP_PEER, + PROP_PEER_RESOURCE, + PROP_STATE, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleMediaSessionPrivate GabbleMediaSessionPrivate; + +struct _GabbleMediaSessionPrivate +{ + GabbleConnection *conn; + GabbleMediaChannel *channel; + GabbleMediaSessionMode mode; + gchar *object_path; + + GPtrArray *streams; + GPtrArray *remove_requests; + + gchar *id; + GabbleHandle peer; + gchar *peer_resource; + + JingleSessionState state; + gboolean ready; + gboolean locally_accepted; + gboolean terminated; + + guint timer_id; + + gboolean dispose_has_run; +}; + +#define GABBLE_MEDIA_SESSION_GET_PRIVATE(obj) \ + ((GabbleMediaSessionPrivate *)obj->priv) + +typedef struct { + gchar *name; + gchar *attributes; +} SessionStateDescription; + +static const SessionStateDescription session_states[] = +{ + { "JS_STATE_PENDING_CREATED", ANSI_BOLD_ON ANSI_FG_BLACK ANSI_BG_WHITE }, + { "JS_STATE_PENDING_INITIATE_SENT", ANSI_BOLD_ON ANSI_BG_CYAN }, + { "JS_STATE_PENDING_INITIATED", ANSI_BOLD_ON ANSI_BG_MAGENTA }, + { "JS_STATE_PENDING_ACCEPT_SENT", ANSI_BOLD_ON ANSI_BG_CYAN }, + { "JS_STATE_ACTIVE", ANSI_BOLD_ON ANSI_BG_BLUE }, + { "JS_STATE_ENDED", ANSI_BG_RED } +}; + +static void +gabble_media_session_init (GabbleMediaSession *self) +{ + GabbleMediaSessionPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_MEDIA_SESSION, GabbleMediaSessionPrivate); + + self->priv = priv; + + priv->mode = MODE_JINGLE; + priv->state = JS_STATE_PENDING_CREATED; + priv->streams = g_ptr_array_new (); + priv->remove_requests = g_ptr_array_new (); +} + +static void stream_connection_state_changed_cb (GabbleMediaStream *stream, + GParamSpec *param, + GabbleMediaSession *session); +static void stream_got_local_codecs_changed_cb (GabbleMediaStream *stream, + GParamSpec *param, + GabbleMediaSession *session); + +static void +_emit_new_stream (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + gchar *object_path; + guint id, media_type; + + g_object_get (stream, + "object-path", &object_path, + "id", &id, + "media-type", &media_type, + NULL); + + /* all of the streams are bidirectional from farsight's point of view, it's + * just in the signalling they change */ + g_signal_emit (session, signals[NEW_STREAM_HANDLER], 0, object_path, id, + media_type, TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL); + + g_free (object_path); +} + + +static GabbleMediaStream * +_lookup_stream_by_name_and_initiator (GabbleMediaSession *session, + const gchar *stream_name, + JingleInitiator stream_initiator) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (g_strdiff (stream->name, stream_name)) + continue; + + if (stream_initiator != INITIATOR_INVALID && + stream_initiator != stream->initiator) + continue; + + return stream; + } + + return NULL; +} + + +static GabbleMediaStream * +create_media_stream (GabbleMediaSession *session, + const gchar *name, + JingleInitiator initiator, + guint media_type) +{ + GabbleMediaSessionPrivate *priv; + gchar *object_path; + GabbleMediaStream *stream; + guint id; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + g_assert (name != NULL); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + /* assert that if we're in google mode: + * - we only try to make one stream + * - it's an audio stream + * - it's called GTALK_STREAM_NAME */ + if (priv->mode == MODE_GOOGLE) + { + g_assert (priv->streams->len == 0); + g_assert (media_type == TP_MEDIA_STREAM_TYPE_AUDIO); + g_assert (!g_strdiff (name, GTALK_STREAM_NAME)); + } + + g_assert (priv->streams->len < MAX_STREAMS); + g_assert (_lookup_stream_by_name_and_initiator (session, name, initiator) == + NULL); + + id = _gabble_media_channel_get_stream_id (priv->channel); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "creating new %s %s stream called \"%s\" with id %u", + priv->mode == MODE_GOOGLE ? "google" : "jingle", + media_type == TP_MEDIA_STREAM_TYPE_AUDIO ? "audio" : "video", + name, id); + + object_path = g_strdup_printf ("%s/MediaStream%u", priv->object_path, id); + + stream = g_object_new (GABBLE_TYPE_MEDIA_STREAM, + "connection", priv->conn, + "media-session", session, + "object-path", object_path, + "mode", priv->mode, + "name", name, + "id", id, + "initiator", initiator, + "media-type", media_type, + NULL); + + g_signal_connect (stream, "notify::connection-state", + (GCallback) stream_connection_state_changed_cb, + session); + g_signal_connect (stream, "notify::got-local-codecs", + (GCallback) stream_got_local_codecs_changed_cb, + session); + + g_ptr_array_add (priv->streams, stream); + + g_free (object_path); + + if (priv->ready) + _emit_new_stream (session, stream); + + g_signal_emit (session, signals[STREAM_ADDED], 0, stream); + + return stream; +} + +static void +destroy_media_stream (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + _gabble_media_stream_close (stream); + g_ptr_array_remove_fast (priv->streams, stream); + g_object_unref (stream); +} + +static GObject * +gabble_media_session_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleMediaSessionPrivate *priv; + DBusGConnection *bus; + + obj = G_OBJECT_CLASS (gabble_media_session_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (GABBLE_MEDIA_SESSION (obj)); + + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + return obj; +} + +static void +gabble_media_session_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + case PROP_MEDIA_CHANNEL: + g_value_set_object (value, priv->channel); + break; + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_SESSION_ID: + g_value_set_string (value, priv->id); + break; + case PROP_INITIATOR: + g_value_set_uint (value, session->initiator); + break; + case PROP_PEER: + g_value_set_uint (value, priv->peer); + break; + case PROP_PEER_RESOURCE: + g_value_set_string (value, priv->peer_resource); + break; + case PROP_STATE: + g_value_set_uint (value, priv->state); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void session_state_changed (GabbleMediaSession *session, + JingleSessionState prev_state, + JingleSessionState new_state); + +static void +gabble_media_session_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + JingleSessionState prev_state; + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + case PROP_MEDIA_CHANNEL: + priv->channel = g_value_get_object (value); + break; + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_SESSION_ID: + g_free (priv->id); + priv->id = g_value_dup_string (value); + break; + case PROP_INITIATOR: + session->initiator = g_value_get_uint (value); + break; + case PROP_PEER: + priv->peer = g_value_get_uint (value); + break; + case PROP_PEER_RESOURCE: + g_free (priv->peer_resource); + priv->peer_resource = g_value_dup_string (value); + break; + case PROP_STATE: + prev_state = priv->state; + priv->state = g_value_get_uint (value); + + if (priv->state == JS_STATE_ENDED) + g_assert (priv->terminated); + + if (priv->state != prev_state) + session_state_changed (session, prev_state, priv->state); + + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_media_session_dispose (GObject *object); +static void gabble_media_session_finalize (GObject *object); + +static void +gabble_media_session_class_init (GabbleMediaSessionClass *gabble_media_session_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_media_session_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_media_session_class, sizeof (GabbleMediaSessionPrivate)); + + object_class->constructor = gabble_media_session_constructor; + + object_class->get_property = gabble_media_session_get_property; + object_class->set_property = gabble_media_session_set_property; + + object_class->dispose = gabble_media_session_dispose; + object_class->finalize = gabble_media_session_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "media session's channel.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_object ("media-channel", "GabbleMediaChannel object", + "Gabble media channel object that owns this " + "media session object.", + GABBLE_TYPE_MEDIA_CHANNEL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_MEDIA_CHANNEL, param_spec); + + param_spec = g_param_spec_string ("object-path", "D-Bus object path", + "The D-Bus object path used for this " + "object on the bus.", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_OBJECT_PATH, param_spec); + + param_spec = g_param_spec_string ("session-id", "Session ID", + "A unique session identifier used " + "throughout all communication.", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_SESSION_ID, param_spec); + + param_spec = g_param_spec_uint ("initiator", "Session initiator", + "An enum signifying which end initiated " + "the session.", + INITIATOR_LOCAL, + INITIATOR_REMOTE, + INITIATOR_LOCAL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_INITIATOR, param_spec); + + param_spec = g_param_spec_uint ("peer", "Session peer", + "The GabbleHandle representing the contact " + "with whom this session communicates.", + 0, G_MAXUINT32, 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PEER, param_spec); + + param_spec = g_param_spec_string ("peer-resource", + "Session peer's resource", + "The resource of the contact " + "with whom this session communicates, " + "if applicable", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PEER_RESOURCE, + param_spec); + + param_spec = g_param_spec_uint ("state", "Session state", + "The current state that the session is in.", + 0, G_MAXUINT32, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STATE, param_spec); + + signals[NEW_STREAM_HANDLER] = + g_signal_new ("new-stream-handler", + G_OBJECT_CLASS_TYPE (gabble_media_session_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_session_marshal_VOID__STRING_UINT_UINT_UINT, + G_TYPE_NONE, 4, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); + + signals[STREAM_ADDED] = + g_signal_new ("stream-added", + G_OBJECT_CLASS_TYPE (gabble_media_session_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + signals[TERMINATED] = + g_signal_new ("terminated", + G_OBJECT_CLASS_TYPE (gabble_media_session_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_session_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_media_session_class), &dbus_glib_gabble_media_session_object_info); +} + +static void +gabble_media_session_dispose (GObject *object) +{ + GabbleMediaSession *self = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (self); + guint i; + + gabble_debug (DEBUG_FLAG, "called"); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + _gabble_media_session_terminate (self, INITIATOR_LOCAL, + TP_CHANNEL_GROUP_CHANGE_REASON_NONE); + + if (priv->timer_id != 0) + g_source_remove (priv->timer_id); + + if (priv->streams != NULL) + { + for (i = 0; i < priv->streams->len; i++) + g_object_unref (g_ptr_array_index (priv->streams, i)); + g_ptr_array_free (priv->streams, TRUE); + priv->streams = NULL; + } + + for (i = 0; i < priv->remove_requests->len; i++) + g_ptr_array_free (g_ptr_array_index (priv->remove_requests, i), TRUE); + g_ptr_array_free (priv->remove_requests, TRUE); + priv->remove_requests = NULL; + + if (G_OBJECT_CLASS (gabble_media_session_parent_class)->dispose) + G_OBJECT_CLASS (gabble_media_session_parent_class)->dispose (object); +} + +static void +gabble_media_session_finalize (GObject *object) +{ + GabbleMediaSession *self = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (self); + + g_free (priv->id); + g_free (priv->object_path); + g_free (priv->peer_resource); + G_OBJECT_CLASS (gabble_media_session_parent_class)->finalize (object); +} + + +/** + * gabble_media_session_error + * + * Implements D-Bus method Error + * on interface org.freedesktop.Telepathy.Media.SessionHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_session_error (GabbleMediaSession *self, + guint errno, + const gchar *message, + GError **error) +{ + GabbleMediaSessionPrivate *priv; + GPtrArray *tmp; + guint i; + + g_assert (GABBLE_IS_MEDIA_SESSION (self)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (self); + + _gabble_media_session_debug (self, DEBUG_MSG_INFO, "Media.SessionHandler::Error called, error %u (%s) -- " + "emitting error on each stream", errno, message); + + if (priv->state == JS_STATE_ENDED) + { + return TRUE; + } + else if (priv->state == JS_STATE_PENDING_CREATED) + { + /* shortcut to prevent sending remove actions if we haven't sent an + * initiate yet */ + g_object_set (self, "state", JS_STATE_ENDED, NULL); + return TRUE; + } + + g_assert (priv->streams != NULL); + + tmp = priv->streams; + priv->streams = NULL; + + for (i = 0; i < tmp->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + //FIXME: Temporary fix to comment "errno" to resolve the mecevo integration build break, fix me when this method is being used. + gabble_media_stream_error (stream, /*errno*/0, message, NULL); + } + + g_ptr_array_free (tmp, TRUE); + + return TRUE; +} + + +/** + * gabble_media_session_ready + * + * Implements D-Bus method Ready + * on interface org.freedesktop.Telepathy.Media.SessionHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_session_ready (GabbleMediaSession *self, + GError **error) +{ + GabbleMediaSessionPrivate *priv; + guint i; + + g_assert (GABBLE_IS_MEDIA_SESSION (self)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (self); + + priv->ready = TRUE; + + for (i = 0; i < priv->streams->len; i++) + _emit_new_stream (self, g_ptr_array_index (priv->streams, i)); + + return TRUE; +} + + +static gboolean +_handle_create (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + GabbleMediaSessionMode session_mode; + TpMediaStreamType stream_type; + gboolean override_existing = FALSE; + + if ((priv->state == JS_STATE_PENDING_CREATED) && + (session->initiator == INITIATOR_LOCAL)) + { + gabble_debug (DEBUG_FLAG, "we're trying to call ourselves, rejecting with busy"); + _gabble_media_session_terminate (session, INITIATOR_REMOTE, + TP_CHANNEL_GROUP_CHANGE_REASON_BUSY); + return FALSE; + } + + + if (stream != NULL) + { + /* streams added by the session initiator may replace similarly-named + * streams which we are trying to add (but havn't had acknowledged) */ + if (stream->signalling_state < STREAM_SIG_STATE_ACKNOWLEDGED) + { + if (session->initiator == INITIATOR_REMOTE) + { + override_existing = TRUE; + } + else + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_CONFLICT, + "session initiator is creating a stream named \"%s\" already", + stream_name); + return FALSE; + } + } + else + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_CONFLICT, + "can't create new stream called \"%s\", it already exists, " + "rejecting", stream_name); + return FALSE; + } + } + + if (desc_node == NULL) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unable to create stream without a content description"); + return FALSE; + } + + if (lm_message_node_has_namespace (desc_node, + NS_GOOGLE_SESSION_PHONE, NULL)) + { + session_mode = MODE_GOOGLE; + stream_type = TP_MEDIA_STREAM_TYPE_AUDIO; + } + else if (lm_message_node_has_namespace (desc_node, + NS_JINGLE_DESCRIPTION_AUDIO, NULL)) + { + session_mode = MODE_JINGLE; + stream_type = TP_MEDIA_STREAM_TYPE_AUDIO; + } + else if (lm_message_node_has_namespace (desc_node, + NS_JINGLE_DESCRIPTION_VIDEO, NULL)) + { + session_mode = MODE_JINGLE; + stream_type = TP_MEDIA_STREAM_TYPE_VIDEO; + } + else + { + g_set_error (error, GABBLE_XMPP_ERROR, + XMPP_ERROR_JINGLE_UNSUPPORTED_CONTENT, + "refusing to create stream for unsupported content description"); + return FALSE; + } + + /* MODE_GOOGLE is allowed to have a null transport node */ + if (session_mode == MODE_JINGLE && trans_node == NULL) + { + g_set_error (error, GABBLE_XMPP_ERROR, + XMPP_ERROR_JINGLE_UNSUPPORTED_TRANSPORT, + "refusing to create stream for unsupported transport"); + return FALSE; + } + + if (session_mode != priv->mode) + { + if (priv->streams->len > 0) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_UNEXPECTED_REQUEST, + "refusing to change mode because streams already exist"); + return FALSE; + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "setting session mode to %s", + session_mode == MODE_GOOGLE ? "google" : "jingle"); + priv->mode = session_mode; + } + } + + if (override_existing) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "removing our unacknowledged stream \"%s\" " + "in favour of the session initiator's", stream_name); + + /* disappear this stream */ + destroy_media_stream (session, stream); + + stream = NULL; + } + + if (priv->streams->len == MAX_STREAMS) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_RESOURCE_CONSTRAINT, + "refusing to create more than " G_STRINGIFY (MAX_STREAMS) + " streams"); + return FALSE; + } + + stream = create_media_stream (session, stream_name, INITIATOR_REMOTE, + stream_type); + + /* set the signalling state to ACKNOWLEDGED */ + g_object_set (stream, + "signalling-state", STREAM_SIG_STATE_ACKNOWLEDGED, + NULL); + + /* for jingle streams, set the direction to none, so that the + * direction handler adds the right flags */ + if (priv->mode == MODE_JINGLE) + g_object_set (stream, + "combined-direction", TP_MEDIA_STREAM_DIRECTION_NONE, + NULL); + + return TRUE; +} + + +static TpMediaStreamDirection +_senders_to_direction (GabbleMediaSession *session, + const gchar *senders) +{ + TpMediaStreamDirection ret = TP_MEDIA_STREAM_DIRECTION_NONE; + + if (!g_strdiff (senders, "initiator")) + { + if (session->initiator == INITIATOR_LOCAL) + ret = TP_MEDIA_STREAM_DIRECTION_SEND; + else + ret = TP_MEDIA_STREAM_DIRECTION_RECEIVE; + } + else if (!g_strdiff (senders, "responder")) + { + if (session->initiator == INITIATOR_REMOTE) + ret = TP_MEDIA_STREAM_DIRECTION_SEND; + else + ret = TP_MEDIA_STREAM_DIRECTION_RECEIVE; + } + else if (!g_strdiff (senders, "both")) + { + ret = TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL; + } + + return ret; +} + +static gboolean +_handle_direction (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + const gchar *senders; + CombinedStreamDirection new_combined_dir; + TpMediaStreamDirection requested_dir, current_dir; + TpMediaStreamPendingSend pending_send; + + if (priv->mode == MODE_GOOGLE) + return TRUE; + + requested_dir = TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL; + + senders = lm_message_node_get_attribute (content_node, "senders"); + if (senders != NULL) + requested_dir = _senders_to_direction (session, senders); + + if (requested_dir == TP_MEDIA_STREAM_DIRECTION_NONE) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "received invalid content senders value \"%s\" on stream \"%s\"; " + "rejecting", senders, stream_name); + return FALSE; + } + + current_dir = COMBINED_DIRECTION_GET_DIRECTION (stream->combined_direction); + pending_send = COMBINED_DIRECTION_GET_PENDING_SEND + (stream->combined_direction); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "received request for senders \"%s\" on stream " + "\"%s\"", senders, stream_name); + + /* if local sending has been added, remove it, + * and set the pending local send flag */ + if (((current_dir & TP_MEDIA_STREAM_DIRECTION_SEND) == 0) && + ((requested_dir & TP_MEDIA_STREAM_DIRECTION_SEND) != 0)) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "setting pending local send flag"); + requested_dir &= ~TP_MEDIA_STREAM_DIRECTION_SEND; + pending_send |= TP_MEDIA_STREAM_PENDING_LOCAL_SEND; + } + +#if 0 + /* clear any pending remote send */ + if ((pending_send & TP_MEDIA_STREAM_PENDING_REMOTE_SEND) != 0) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "setting pending local send flag"); + pending_send &= ~TP_MEDIA_STREAM_PENDING_REMOTE_SEND; + } +#endif + + /* make any necessary changes */ + new_combined_dir = MAKE_COMBINED_DIRECTION (requested_dir, pending_send); + if (new_combined_dir != stream->combined_direction) + { + g_object_set (stream, "combined-direction", new_combined_dir, NULL); + _gabble_media_stream_update_sending (stream, FALSE); + } + + return TRUE; +} + + +static gboolean +_handle_accept (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + g_object_set (stream, "playing", TRUE, NULL); + + _gabble_media_stream_update_sending (stream, TRUE); + + return TRUE; +} + + +static gboolean +_handle_codecs (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + if (desc_node == NULL) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unable to handle codecs without a content description node"); + return FALSE; + } + + if (!_gabble_media_stream_post_remote_codecs (stream, message, desc_node, + error)) + return FALSE; + + return TRUE; +} + + +static gboolean +_handle_candidates (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + if (trans_node == NULL) + { + if (priv->mode == MODE_GOOGLE) + { + trans_node = content_node; + } + else + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unable to handle candidates without a transport node"); + return FALSE; + } + } + + if (!_gabble_media_stream_post_remote_candidates (stream, message, + trans_node, error)) + return FALSE; + + return TRUE; +} + +static guint +_count_non_removing_streams (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i, ret = 0; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->signalling_state < STREAM_SIG_STATE_REMOVING) + ret++; + } + + return ret; +} + +static gboolean +_handle_remove (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + /* reducing a session to contain 0 streams is invalid; instead the peer + * should terminate the session. I guess we'll do it for them... */ + if (_count_non_removing_streams (session) == 1) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unable to remove the last stream in a Jingle call"); + return FALSE; + } + + /* close the stream */ + destroy_media_stream (session, stream); + + return TRUE; +} + + +static gboolean +_handle_terminate (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error) +{ + gabble_debug (DEBUG_FLAG, "called for %s", stream_name); + + _gabble_media_session_terminate (session, INITIATOR_REMOTE, + TP_CHANNEL_GROUP_CHANGE_REASON_NONE); + + return TRUE; +} + + +#ifndef EMULATOR + +typedef gboolean (*StreamHandlerFunc)(GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + GabbleMediaStream *stream, + LmMessageNode *desc_node, + LmMessageNode *trans_node, + GError **error); + +typedef struct _Handler Handler; + +struct _Handler { + const gchar *actions[3]; + JingleSessionState min_allowed_state; + JingleSessionState max_allowed_state; + StreamHandlerFunc stream_handlers[4]; + JingleSessionState new_state; +}; + +static Handler handlers[] = { + { + { "initiate", "session-initiate", NULL }, + JS_STATE_PENDING_CREATED, + JS_STATE_PENDING_CREATED, + { _handle_create, _handle_direction, _handle_codecs, NULL }, + JS_STATE_PENDING_INITIATED + }, + { + { "accept", "session-accept", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_PENDING_INITIATED, + { _handle_direction, _handle_codecs, _handle_accept, NULL }, + JS_STATE_ACTIVE + }, + { + { "reject", NULL }, + JS_STATE_PENDING_INITIATE_SENT, + JS_STATE_PENDING_INITIATED, + { _handle_terminate, NULL }, + JS_STATE_INVALID + }, + { + { "terminate", "session-terminate", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ENDED, + { _handle_terminate, NULL }, + JS_STATE_INVALID + }, + { + { "candidates", "transport-info", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { _handle_candidates, NULL }, + JS_STATE_INVALID + }, + { + { "content-add", NULL }, + JS_STATE_ACTIVE, + JS_STATE_ACTIVE, + { _handle_create, _handle_direction, _handle_codecs, NULL }, + JS_STATE_INVALID, + }, + { + { "content-modify", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { _handle_direction, NULL }, + JS_STATE_INVALID + }, + { + { "content-accept", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { _handle_direction, _handle_codecs, _handle_accept, NULL }, + JS_STATE_INVALID + }, + { + { "content-remove", "content-decline", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { _handle_remove, NULL }, + JS_STATE_INVALID + }, + { + { NULL }, + JS_STATE_INVALID, + JS_STATE_INVALID, + { NULL }, + JS_STATE_INVALID + } +}; +#else + +Handler *_s_gabble_med_sess_handlers() + { + Handler* handler = libgabble_ImpurePtr()->_s_gabble_med_sess_handlers; + handler[0].stream_handlers[0] = _handle_create; + handler[0].stream_handlers[1] = _handle_direction; + handler[0].stream_handlers[2] = _handle_codecs; + + handler[1].stream_handlers[0] = _handle_direction; + handler[1].stream_handlers[1] = _handle_codecs; + handler[1].stream_handlers[2] = _handle_accept; + + handler[2].stream_handlers[0] = _handle_terminate; + + handler[3].stream_handlers[0] = _handle_terminate; + + handler[4].stream_handlers[0] = _handle_candidates; + + handler[5].stream_handlers[0] = _handle_create; + handler[5].stream_handlers[0] = _handle_direction; + handler[5].stream_handlers[0] = _handle_codecs; + + handler[6].stream_handlers[0] = _handle_direction; + + handler[7].stream_handlers[0] = _handle_direction; + handler[7].stream_handlers[2] = _handle_codecs; + handler[7].stream_handlers[3] = _handle_accept; + + handler[8].stream_handlers[0] = _handle_remove; + + + return handler; + + + + + } + #define handlers (GET_WSD_VAR_NAME(handlers,gabble_med_sess, s)()) + + + +#endif + + +static gboolean +_call_handlers_on_stream (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *content_node, + const gchar *stream_name, + JingleInitiator stream_creator, + StreamHandlerFunc *func, + GError **error) +{ + GabbleMediaStream *stream = NULL; + LmMessageNode *desc_node = NULL, *trans_node = NULL; + StreamHandlerFunc *tmp; + gboolean stream_created = FALSE; + + if (content_node != NULL) + { + desc_node = lm_message_node_get_child (content_node, "description"); + + trans_node = lm_message_node_get_child_with_namespace (content_node, + "transport", NS_GOOGLE_TRANSPORT_P2P); + } + + for (tmp = func; *tmp != NULL; tmp++) + { + /* handlers may create the stream */ + if (stream == NULL && stream_name != NULL) + stream = _lookup_stream_by_name_and_initiator (session, stream_name, + stream_creator); + + /* the create handler is able to check whether or not the stream + * exists, and act accordingly (sometimes it will replace an existing + * stream, sometimes it will reject). the termination handler + * also requires no stream to do it's job. */ + if (*tmp != _handle_create && *tmp != _handle_terminate) + { + /* all other handlers require the stream to exist */ + if (stream == NULL) + { + const gchar *created = ""; + + if (stream_creator == INITIATOR_LOCAL) + created = "locally-created "; + else if (stream_creator == INITIATOR_REMOTE) + created = "remotely-created "; + + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, + "unable to handle action for unknown %sstream \"%s\" ", + created, stream_name); + + return FALSE; + } + else + { + /* don't do anything with actions on streams which have not been + * acknowledged, or that we're trying to remove, to deal with + * adding/removing race conditions (actions sent by the other end + * before they're aware that we've added or removed a stream) */ + if (stream->signalling_state != STREAM_SIG_STATE_ACKNOWLEDGED) + { + _gabble_media_session_debug (session, DEBUG_MSG_WARNING, "ignoring action because stream " + "%s is in state %d, not ACKNOWLEDGED", stream->name, + stream->signalling_state); + return TRUE; + } + } + } + + if (!(*tmp) (session, message, content_node, stream_name, stream, + desc_node, trans_node, error)) + { + /* if we successfully created the stream but failed to do something + * with it later, remove it */ + if (stream_created) + destroy_media_stream (session, stream); + + return FALSE; + } + + if (*tmp == _handle_create) + { + stream_created = TRUE; + /* force a stream lookup after the create handler, even if we + * already had one (it has replacement semantics in certain + * situations) */ + stream = NULL; + } + } + + return TRUE; +} + + +static JingleInitiator +_creator_to_initiator (GabbleMediaSession *session, const gchar *creator) +{ + if (!g_strdiff (creator, "initiator")) + { + if (session->initiator == INITIATOR_LOCAL) + return INITIATOR_LOCAL; + else + return INITIATOR_REMOTE; + } + else if (!g_strdiff (creator, "responder")) + { + if (session->initiator == INITIATOR_LOCAL) + return INITIATOR_REMOTE; + else + return INITIATOR_LOCAL; + } + else + return INITIATOR_INVALID; +} + + +static gboolean +_call_handlers_on_streams (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *session_node, + StreamHandlerFunc *func, + GError **error) +{ + LmMessageNode *content_node; + + if (lm_message_node_has_namespace (session_node, NS_GOOGLE_SESSION, NULL)) + return _call_handlers_on_stream (session, message, session_node, + GTALK_STREAM_NAME, INITIATOR_INVALID, func, error); + + if (session_node->children == NULL) + return _call_handlers_on_stream (session, message, NULL, NULL, + INITIATOR_INVALID, func, error); + + for (content_node = session_node->children; + NULL != content_node; + content_node = content_node->next) + { + const gchar *stream_name, *stream_creator; + JingleInitiator stream_initiator; + + if (g_strdiff (content_node->name, "content")) + continue; + + stream_name = lm_message_node_get_attribute (content_node, "name"); + + if (stream_name == NULL) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "rejecting content node with no name"); + return FALSE; + } + + stream_creator = lm_message_node_get_attribute (content_node, "creator"); + stream_initiator = _creator_to_initiator (session, stream_creator); + + /* we allow NULL creator to mean INITIATOR_INVALID for backwards + * compatibility with clients that don't put a creator attribute in */ + if (stream_creator != NULL && stream_initiator == INITIATOR_INVALID) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "rejecting content node with invalid creators value"); + return FALSE; + } + + if (!_call_handlers_on_stream (session, message, content_node, + stream_name, stream_initiator, func, error)) + return FALSE; + } + + return TRUE; +} + + +gboolean +_gabble_media_session_handle_action (GabbleMediaSession *session, + LmMessage *message, + LmMessageNode *session_node, + const gchar *action, + GError **error) +{ + GabbleMediaSessionPrivate *priv; + StreamHandlerFunc *funcs = NULL; + JingleSessionState new_state = JS_STATE_INVALID; + Handler *i; + +#ifdef EMULATOR + gchar **tmp; +#else + const gchar **tmp; +#endif + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "got jingle session action \"%s\" from peer", + action); + + /* do the state machine dance */ + + /* search the table of handlers for the action */ + for (i = handlers; NULL != i->actions[0]; i++) + { + for (tmp = (char**)i->actions; NULL != *tmp; tmp++) + if (0 == strcmp (*tmp, action)) + break; + + if (NULL == *tmp) + continue; + + /* if we're outside the allowable states for this action, return an error + * immediately */ + if (priv->state < i->min_allowed_state || + priv->state > i->max_allowed_state) + { + g_set_error (error, GABBLE_XMPP_ERROR, + XMPP_ERROR_JINGLE_OUT_OF_ORDER, + "action \"%s\" not allowed in current state", action); + goto ERROR; + } + + funcs = i->stream_handlers; + new_state = i->new_state; + + break; + } + + /* pointer is not NULL if we found a matching action */ + if (NULL == funcs) + { + g_set_error (error, GABBLE_XMPP_ERROR, + XMPP_ERROR_FEATURE_NOT_IMPLEMENTED, "action \"%s\" not implemented", + action); + goto ERROR; + } + + /* call handlers if there are any (NULL-terminated array) */ + if (NULL != *funcs) + { + if (!_call_handlers_on_streams (session, message, session_node, funcs, + error)) + { + if (*error == NULL) + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unknown error encountered with action \"%s\"", + action); + + goto ERROR; + } + } + + /* acknowledge the IQ before changing the state because the new state + * could perform some actions which the other end will only accept + * if this action has been acknowledged */ + _gabble_connection_acknowledge_set_iq (priv->conn, message); + + /* if the action specified a new state to go to, set it */ + if (JS_STATE_INVALID != new_state) + g_object_set (session, "state", new_state, NULL); + + return TRUE; + +ERROR: + g_assert (error != NULL); + _gabble_media_session_debug (session, DEBUG_MSG_ERROR, (*error)->message); + return FALSE; +} + +static gboolean +timeout_session (gpointer data) +{ + GabbleMediaSession *session = data; + + gabble_debug (DEBUG_FLAG, "session timed out"); + + _gabble_media_session_terminate (session, INITIATOR_LOCAL, + TP_CHANNEL_GROUP_CHANGE_REASON_ERROR); + + return FALSE; +} + +static void do_content_add (GabbleMediaSession *, GabbleMediaStream *); + +void +_add_ready_new_streams (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + _gabble_media_session_debug (session, DEBUG_MSG_DUMP, "pondering accept-time add for stream: %s, got " + "local codecs: %s, initiator: %s, signalling state: %d", stream->name, + stream->got_local_codecs ? "true" : "false", + stream->initiator == INITIATOR_LOCAL ? "local" : "remote", + stream->signalling_state); + + if (stream->got_local_codecs == FALSE) + continue; + + if (stream->initiator == INITIATOR_REMOTE) + continue; + + if (stream->signalling_state > STREAM_SIG_STATE_NEW) + continue; + + do_content_add (session, stream); + } +} + +static void +session_state_changed (GabbleMediaSession *session, + JingleSessionState prev_state, + JingleSessionState new_state) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + _gabble_media_session_debug (session, DEBUG_MSG_EVENT, "state changed from %s to %s", + session_states[prev_state].name, + session_states[new_state].name); + + /* + * If the state goes from CREATED to INITIATED (which means the remote + * end initiated), set the timer. If, OTOH, we're the end which just sent an + * initiate, set the timer. + */ + if ((prev_state == JS_STATE_PENDING_CREATED && + new_state == JS_STATE_PENDING_INITIATED) || + (new_state == JS_STATE_PENDING_INITIATE_SENT)) + { + priv->timer_id = + g_timeout_add (DEFAULT_SESSION_TIMEOUT, timeout_session, session); + } + else if (new_state == JS_STATE_ACTIVE) + { + g_source_remove (priv->timer_id); + priv->timer_id = 0; + + /* signal any streams to the remote end which were added locally & became + * ready before the session was accepted, so haven't been mentioned yet */ + _add_ready_new_streams (session); + } +} + +static void +_mark_local_streams_sent (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->initiator == INITIATOR_REMOTE) + continue; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "marking local stream %s as signalled", stream->name); + + g_object_set (stream, "signalling-state", STREAM_SIG_STATE_SENT, NULL); + } +} + +static void +_mark_local_streams_acked (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->initiator == INITIATOR_REMOTE) + continue; + + if (stream->signalling_state != STREAM_SIG_STATE_SENT) + continue; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "marking local stream %s as acknowledged", stream->name); + + g_object_set (stream, + "signalling-state", STREAM_SIG_STATE_ACKNOWLEDGED, + NULL); + } +} + +static void +_set_remote_streams_playing (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->initiator == INITIATOR_LOCAL) + continue; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "setting remote stream %s as playing", stream->name); + + g_object_set (stream, "playing", TRUE, NULL); + } +} + +static const gchar *_direction_to_senders (GabbleMediaSession *, + TpMediaStreamDirection); + +static void +_add_content_descriptions_one (GabbleMediaSession *session, + GabbleMediaStream *stream, + LmMessageNode *session_node) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessageNode *content_node; + + if (priv->mode == MODE_GOOGLE) + { + content_node = session_node; + } + else + { + TpMediaStreamDirection direction; + TpMediaStreamPendingSend pending_send; + + content_node = _gabble_media_stream_add_content_node (stream, + session_node); + + direction = COMBINED_DIRECTION_GET_DIRECTION (stream->combined_direction); + pending_send = COMBINED_DIRECTION_GET_PENDING_SEND + (stream->combined_direction); + + /* if we have a pending local send flag set, the signalled (ie understood + * by both ends) direction of the stream is assuming that we are actually + * sending, so we should OR that into the direction before deciding what + * to signal the stream with. we don't need to consider pending remote + * send because it doesn't happen in Jingle */ + + if ((pending_send & TP_MEDIA_STREAM_PENDING_LOCAL_SEND) != 0) + direction |= TP_MEDIA_STREAM_DIRECTION_SEND; + + if (direction != TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL) + { + const gchar *senders; + senders = _direction_to_senders (session, direction); + lm_message_node_set_attribute (content_node, "senders", senders); + } + } + + _gabble_media_stream_content_node_add_description (stream, content_node); + + _gabble_media_stream_content_node_add_transport (stream, content_node); +} + +static void +_add_content_descriptions (GabbleMediaSession *session, + LmMessageNode *session_node, + JingleInitiator stream_initiator) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->initiator != stream_initiator) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "not adding content description for %s stream %s", + stream->initiator == INITIATOR_LOCAL ? "local" : "remote", + stream->name); + continue; + } + + _add_content_descriptions_one (session, stream, session_node); + } +} + +static LmHandlerResult +accept_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL (session, "accept failed"); + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (stream->initiator == INITIATOR_LOCAL) + continue; + + _gabble_media_stream_update_sending (stream, TRUE); + } + + g_object_set (session, "state", JS_STATE_ACTIVE, NULL); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static gboolean +_stream_not_ready_for_accept (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + /* locally initiated streams shouldn't delay acceptance */ + if (stream->initiator == INITIATOR_LOCAL) + return FALSE; + + if (!stream->got_local_codecs) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream %s does not yet have local codecs", + stream->name); + + return TRUE; + } + + if (stream->connection_state != TP_MEDIA_STREAM_STATE_CONNECTED) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream %s is not yet connected", stream->name); + + return TRUE; + } + + return FALSE; +} + +static void +try_session_accept (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessage *msg; + LmMessageNode *session_node; + const gchar *action; + guint i; + + if (priv->state < JS_STATE_ACTIVE && !priv->locally_accepted) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending accept yet, waiting for local " + "user to accept call"); + return; + } + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (_stream_not_ready_for_accept (session, stream)) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending accept yet, found a stream " + "which was not yet connected or was missing local codecs"); + return; + } + } + + if (priv->mode == MODE_GOOGLE) + action = "accept"; + else + action = "session-accept"; + + /* construct a session acceptance message */ + msg = _gabble_media_session_message_new (session, action, &session_node); + + /* only accept REMOTE streams; any LOCAL streams were added by the local + * user before accepting and should be signalled after the accept */ + _add_content_descriptions (session, session_node, INITIATOR_REMOTE); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action \"%s\" to peer", + action); + + /* send the final acceptance message */ + _gabble_connection_send_with_reply (priv->conn, msg, accept_msg_reply_cb, + G_OBJECT (session), NULL, NULL); + + lm_message_unref (msg); + + /* set remote streams playing */ + _set_remote_streams_playing (session); + + g_object_set (session, "state", JS_STATE_PENDING_ACCEPT_SENT, NULL); +} + +static LmHandlerResult +content_accept_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (user_data); + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + _gabble_media_session_debug (session, DEBUG_MSG_ERROR, "content-accept failed; removing stream"); + NODE_DEBUG (sent_msg->node, "message sent"); + NODE_DEBUG (reply_msg->node, "message reply"); + + _gabble_media_session_remove_streams (session, &stream, 1); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + _gabble_media_stream_update_sending (stream, TRUE); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +try_content_accept (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessage *msg; + LmMessageNode *session_node; + + g_assert (priv->state == JS_STATE_ACTIVE); + g_assert (priv->mode == MODE_JINGLE); + + if (_stream_not_ready_for_accept (session, stream)) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending content-accept yet, stream %s " + "is disconnected or missing local codecs", stream->name); + return; + } + + /* send a content acceptance message */ + msg = _gabble_media_session_message_new (session, "content-accept", + &session_node); + + _add_content_descriptions_one (session, stream, session_node); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action \"content-accept\" " + "to peer for stream %s", stream->name); + + _gabble_connection_send_with_reply (priv->conn, msg, + content_accept_msg_reply_cb, G_OBJECT (stream), session, NULL); + + lm_message_unref (msg); + + /* set stream playing */ + g_object_set (stream, "playing", TRUE, NULL); +} + +static LmHandlerResult +initiate_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (object); + + MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL (session, "initiate failed"); + + g_object_set (session, "state", JS_STATE_PENDING_INITIATED, NULL); + + /* mark all of the streams that we sent in the initiate as acknowledged */ + _mark_local_streams_acked (session); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static gboolean +_stream_not_ready_for_initiate (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + if (!stream->got_local_codecs) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream %s does not yet have local codecs", + stream->name); + + return TRUE; + } + + return FALSE; +} + +static void +try_session_initiate (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessage *msg; + LmMessageNode *session_node; + const gchar *action; + guint i; + + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + + if (_stream_not_ready_for_initiate (session, stream)) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending initiate yet, found a stream " + "which was missing local codecs"); + return; + } + } + + if (priv->mode == MODE_GOOGLE) + action = "initiate"; + else + action = "session-initiate"; + + msg = _gabble_media_session_message_new (session, action, &session_node); + + _add_content_descriptions (session, session_node, INITIATOR_LOCAL); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle action \"%s\" to peer", action); + + _gabble_connection_send_with_reply (priv->conn, msg, initiate_msg_reply_cb, + G_OBJECT (session), NULL, NULL); + + lm_message_unref (msg); + + /* mark local streams as sent (so that eg candidates will be sent) */ + _mark_local_streams_sent (session); + + g_object_set (session, "state", JS_STATE_PENDING_INITIATE_SENT, NULL); +} + +static LmHandlerResult +content_add_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (user_data); + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + if (session->initiator == INITIATOR_REMOTE && + stream->signalling_state == STREAM_SIG_STATE_ACKNOWLEDGED) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "ignoring content-add failure, stream has " + "been successfully created by the session initiator"); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_ERROR, "content-add failed; removing stream"); + NODE_DEBUG (sent_msg->node, "message sent"); + NODE_DEBUG (reply_msg->node, "message reply"); + + _gabble_media_stream_close (stream); + } + } + else + { + if (stream->signalling_state == STREAM_SIG_STATE_SENT) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "content-add succeeded, marking stream as " + "ACKNOWLEDGED"); + + g_object_set (stream, + "signalling-state", STREAM_SIG_STATE_ACKNOWLEDGED, + NULL); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "content-add succeeded, but not marking" + "stream as ACKNOWLEDGED, it's in state %d", + stream->signalling_state); + } + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +do_content_add (GabbleMediaSession *session, + GabbleMediaStream *stream) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessage *msg; + LmMessageNode *session_node; + + g_assert (priv->state == JS_STATE_ACTIVE); + g_assert (priv->mode == MODE_JINGLE); + + if (_stream_not_ready_for_initiate (session, stream)) + { + _gabble_media_session_debug (session, DEBUG_MSG_ERROR, "trying to send content-add for stream %s " + "but we have no local codecs. what?!", stream->name); + g_assert_not_reached (); + return; + } + + msg = _gabble_media_session_message_new (session, "content-add", + &session_node); + + _add_content_descriptions_one (session, stream, session_node); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle action \"content-add\" to peer for " + "stream %s", stream->name); + + _gabble_connection_send_with_reply (priv->conn, msg, + content_add_msg_reply_cb, G_OBJECT (stream), session, NULL); + + lm_message_unref (msg); + + /* mark stream as sent */ + g_object_set (stream, "signalling-state", STREAM_SIG_STATE_SENT, NULL); +} + +static void +stream_connection_state_changed_cb (GabbleMediaStream *stream, + GParamSpec *param, + GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + if (stream->connection_state != TP_MEDIA_STREAM_STATE_CONNECTED) + return; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream %s has gone connected", stream->name); + + if (stream->playing) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "doing nothing, stream is already playing"); + return; + } + + /* after session is active, we do things per-stream with content-* actions */ + if (priv->state < JS_STATE_ACTIVE) + { + /* send a session accept if the session was initiated by the peer */ + if (session->initiator == INITIATOR_REMOTE) + { + try_session_accept (session); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "session initiated by us, so we're not " + "going to consider sending an accept"); + } + } + else + { + /* send a content accept if the stream was added by the peer */ + if (stream->initiator == INITIATOR_REMOTE) + { + try_content_accept (session, stream); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream added by us, so we're not going " + "to send an accept"); + } + } +} + +static void +stream_got_local_codecs_changed_cb (GabbleMediaStream *stream, + GParamSpec *param, + GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + if (!stream->got_local_codecs) + return; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream %s has got local codecs", stream->name); + + if (stream->playing) + { + _gabble_media_session_debug (session, DEBUG_MSG_ERROR, "stream was already playing and we got local " + "codecs. what?!"); + g_assert_not_reached (); + return; + } + + /* after session is active, we do things per-stream with content-* actions */ + if (priv->state < JS_STATE_ACTIVE) + { + if (session->initiator == INITIATOR_REMOTE) + { + if (priv->state < JS_STATE_PENDING_ACCEPT_SENT) + { + try_session_accept (session); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream added after sending accept; " + "not doing content-add until remote end acknowledges"); + } + } + else + { + if (priv->state < JS_STATE_PENDING_INITIATE_SENT) + { + try_session_initiate (session); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "stream added after sending initiate; " + "not doing content-add until remote end accepts"); + } + } + } + else + { + if (stream->initiator == INITIATOR_REMOTE) + { + try_content_accept (session, stream); + } + else + { + do_content_add (session, stream); + } + } +} + +static gchar * +get_jid_for_contact (GabbleMediaSession *session, + GabbleHandle handle) +{ + GabbleMediaSessionPrivate *priv; + const gchar *base_jid; + GabbleHandle self; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + self = priv->conn->self_handle; + + base_jid = gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle); + g_assert (base_jid != NULL); + + if (handle == self) + { + gchar *resource, *ret; + g_object_get (priv->conn, "resource", &resource, NULL); + g_assert (resource != NULL); + ret = g_strdup_printf ("%s/%s", base_jid, resource); + g_free (resource); + return ret; + } + else + { + g_assert (priv->peer_resource != NULL); + return g_strdup_printf ("%s/%s", base_jid, priv->peer_resource); + } +} + +LmMessage * +_gabble_media_session_message_new (GabbleMediaSession *session, + const gchar *action, + LmMessageNode **session_node) +{ + GabbleMediaSessionPrivate *priv; + LmMessage *msg; + LmMessageNode *iq_node, *node; + gchar *peer_jid, *initiator_jid; + GabbleHandle initiator_handle; + const gchar *element, *xmlns; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + peer_jid = get_jid_for_contact (session, priv->peer); + + msg = lm_message_new_with_sub_type ( + peer_jid, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + g_free (peer_jid); + + iq_node = lm_message_get_node (msg); + + if (priv->mode == MODE_GOOGLE) + element = "session"; + else + element = "jingle"; + + if (session->initiator == INITIATOR_LOCAL) + initiator_handle = priv->conn->self_handle; + else + initiator_handle = priv->peer; + + node = lm_message_node_add_child (iq_node, element, NULL); + initiator_jid = get_jid_for_contact (session, initiator_handle); + + lm_message_node_set_attributes (node, + (priv->mode == MODE_GOOGLE) ? "id" : "sid", priv->id, + (priv->mode == MODE_GOOGLE) ? "type" : "action", action, + "initiator", initiator_jid, + NULL); + + if (priv->mode == MODE_GOOGLE) + xmlns = NS_GOOGLE_SESSION; + else + xmlns = NS_JINGLE; + + lm_message_node_set_attribute (node, "xmlns", xmlns); + g_free (initiator_jid); + + if (session_node) + *session_node = node; + + return msg; +} + +void +_gabble_media_session_accept (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + guint i; + + priv->locally_accepted = TRUE; + + /* accept any local pending sends */ + for (i = 0; i < priv->streams->len; i++) + { + GabbleMediaStream *stream = g_ptr_array_index (priv->streams, i); + CombinedStreamDirection combined_dir = stream->combined_direction; + TpMediaStreamDirection current_dir; + TpMediaStreamPendingSend pending_send; + + current_dir = COMBINED_DIRECTION_GET_DIRECTION (combined_dir); + pending_send = COMBINED_DIRECTION_GET_PENDING_SEND (combined_dir); + + if ((pending_send & TP_MEDIA_STREAM_PENDING_LOCAL_SEND) != 0) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "accepting pending local send on stream %s", + stream->name); + + current_dir |= TP_MEDIA_STREAM_DIRECTION_SEND; + pending_send &= ~TP_MEDIA_STREAM_PENDING_LOCAL_SEND; + combined_dir = MAKE_COMBINED_DIRECTION (current_dir, pending_send); + g_object_set (stream, "combined-direction", combined_dir, NULL); + _gabble_media_stream_update_sending (stream, FALSE); + } + } + + try_session_accept (session); +} + +static LmHandlerResult +content_remove_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (object); + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + GPtrArray *removing = (GPtrArray *) user_data; + guint i; + + MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL (session, "stream removal failed"); + + for (i = 0; i < removing->len; i++) + destroy_media_stream (session, + GABBLE_MEDIA_STREAM (g_ptr_array_index (removing, i))); + + g_ptr_array_remove_fast (priv->remove_requests, removing); + g_ptr_array_free (removing, TRUE); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +void +_gabble_media_session_remove_streams (GabbleMediaSession *session, + GabbleMediaStream **streams, + guint len) +{ + GabbleMediaSessionPrivate *priv; + LmMessage *msg = NULL; + LmMessageNode *session_node; + GPtrArray *removing = NULL; + guint i; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + /* end the session if there'd be no streams left after reducing it */ + if (_count_non_removing_streams (session) == len) + { + _gabble_media_session_terminate (session, INITIATOR_LOCAL, + TP_CHANNEL_GROUP_CHANGE_REASON_NONE); + return; + } + + /* construct a remove message if we're in a state greater than CREATED (ie + * something has been sent/received about this session) */ + if (priv->state > JS_STATE_PENDING_CREATED) + { + msg = _gabble_media_session_message_new (session, "content-remove", + &session_node); + removing = g_ptr_array_sized_new (len); + } + + /* right, remove them */ + for (i = 0; i < len; i++) + { + GabbleMediaStream *stream = streams[i]; + + switch (stream->signalling_state) + { + case STREAM_SIG_STATE_NEW: + destroy_media_stream (session, stream); + break; + case STREAM_SIG_STATE_SENT: + case STREAM_SIG_STATE_ACKNOWLEDGED: + { + LmMessageNode *content_node; + + g_assert (msg != NULL); + g_assert (removing != NULL); + + content_node = _gabble_media_stream_add_content_node (stream, + session_node); + + g_object_set (stream, + "playing", FALSE, + "signalling-state", STREAM_SIG_STATE_REMOVING, + NULL); + + /* close the stream now, but don't forget about it until the + * removal message is acknowledged, since we need to be able to + * detect content-remove cross-talk */ + _gabble_media_stream_close (stream); + g_ptr_array_add (removing, stream); + } + break; + case STREAM_SIG_STATE_REMOVING: + break; + } + } + + /* send the remove message if necessary */ + if (msg != NULL) + { + if (removing->len > 0) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action " + "\"content-remove\" to peer"); + + _gabble_connection_send_with_reply (priv->conn, msg, + content_remove_msg_reply_cb, G_OBJECT (session), removing, NULL); + + g_ptr_array_add (priv->remove_requests, removing); + } + else + { + g_ptr_array_free (removing, TRUE); + } + + lm_message_unref (msg); + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending jingle session action " + "\"content-remove\" to peer, no initiates or adds sent for " + "these streams"); + } +} + +/* for when you want the reply to be removed from + * the handler chain, but don't care what it is */ +static LmHandlerResult +ignore_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +send_reject_message (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + LmMessage *msg; + LmMessageNode *session_node; + + /* this should only happen in google mode, and we should only arrive in that + * mode when we've ended up talking to a resource that doesn't support + * jingle */ + g_assert (priv->mode == MODE_GOOGLE); + g_assert (priv->peer_resource != NULL); + + /* construct a session terminate message */ + msg = _gabble_media_session_message_new (session, "reject", &session_node); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action \"reject\" to peer"); + + /* send it */ + _gabble_connection_send_with_reply (priv->conn, msg, ignore_reply_cb, + G_OBJECT (session), NULL, NULL); + + lm_message_unref (msg); +} + +static void +send_terminate_message (GabbleMediaSession *session) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + const gchar *action; + LmMessage *msg; + LmMessageNode *session_node; + + /* construct a session terminate message */ + if (priv->mode == MODE_GOOGLE) + action = "terminate"; + else + action = "session-terminate"; + + msg = _gabble_media_session_message_new (session, action, &session_node); + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action \"%s\" to peer", + action); + + /* send it */ + _gabble_connection_send_with_reply (priv->conn, msg, ignore_reply_cb, + G_OBJECT (session), NULL, NULL); + + lm_message_unref (msg); +} + +void +_gabble_media_session_terminate (GabbleMediaSession *session, + JingleInitiator who, + TpChannelGroupChangeReason why) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + GabbleHandle actor; + + if (priv->state == JS_STATE_ENDED) + return; + + if (who == INITIATOR_REMOTE) + { + actor = priv->peer; + } + else + { + actor = priv->conn->self_handle; + + /* Need to tell them that it's all over. */ + + /* Jingle doesn't have a "reject" action; a termination before an + * acceptance indicates that the call has been declined */ + + if (session->initiator == INITIATOR_REMOTE && + priv->state == JS_STATE_PENDING_INITIATED && + priv->mode == MODE_GOOGLE) + { + send_reject_message (session); + } + + /* if we're still in CREATED, then we've not sent or received any + * messages about this session yet, so no terminate is necessary */ + else if (priv->state > JS_STATE_PENDING_CREATED) + { + send_terminate_message (session); + } + + while (priv->streams->len > 0) + destroy_media_stream (session, g_ptr_array_index (priv->streams, 0)); + } + + priv->terminated = TRUE; + g_object_set (session, "state", JS_STATE_ENDED, NULL); + g_signal_emit (session, signals[TERMINATED], 0, actor, why); +} + +#if _GMS_DEBUG_LEVEL +void +_gabble_media_session_debug (GabbleMediaSession *session, + DebugMessageType type, + const gchar *format, ...) +{ + if (DEBUGGING) + { + va_list list; + gchar buf[512]; + GabbleMediaSessionPrivate *priv; + time_t curtime; + struct tm *loctime; + gchar stamp[10]; + const gchar *type_str; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + curtime = time (NULL); + loctime = localtime (&curtime); + + strftime (stamp, sizeof (stamp), "%T", loctime); + + va_start (list, format); + + vsnprintf (buf, sizeof (buf), format, list); + + va_end (list); + + switch (type) { + case DEBUG_MSG_INFO: + type_str = ANSI_BOLD_ON ANSI_FG_WHITE; + break; + case DEBUG_MSG_DUMP: + type_str = ANSI_BOLD_ON ANSI_FG_GREEN; + break; + case DEBUG_MSG_WARNING: + type_str = ANSI_BOLD_ON ANSI_FG_YELLOW; + break; + case DEBUG_MSG_ERROR: + type_str = ANSI_BOLD_ON ANSI_FG_WHITE ANSI_BG_RED; + break; + case DEBUG_MSG_EVENT: + type_str = ANSI_BOLD_ON ANSI_FG_CYAN; + break; + default: + g_assert_not_reached (); + return; + } + + g_message ("[%s%s%s] %s%-26s%s %s%s%s\n", + ANSI_BOLD_ON ANSI_FG_WHITE, + stamp, + ANSI_RESET, + session_states[priv->state].attributes, + session_states[priv->state].name, + ANSI_RESET, + type_str, + buf, + ANSI_RESET); + + fflush (stdout); + } +} + +#endif /* _GMS_DEBUG_LEVEL */ + +static const gchar * +_name_stream (GabbleMediaSession *session, + TpMediaStreamType media_type) +{ + GabbleMediaSessionPrivate *priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + +#ifndef EMULATOR + static gchar ret_sess[MAX_STREAM_NAME_LEN] = GTALK_STREAM_NAME; +#endif + + if (priv->mode != MODE_GOOGLE) + { + guint i = 1; + + do { + g_snprintf (ret_sess, MAX_STREAM_NAME_LEN, "%s%u", + media_type == TP_MEDIA_STREAM_TYPE_AUDIO ? "audio" : "video", + i++); + + /* even though we now have seperate namespaces for local and remote, + * actually check in both so that we can still support clients which + * have 1 namespace (such as our older selves :D) */ + if (_lookup_stream_by_name_and_initiator (session, ret_sess, + INITIATOR_INVALID) != NULL) + { + ret_sess[0] = '\0'; + } + } while (ret_sess[0] == '\0'); + } + + return ret_sess; +} + + +gboolean +_gabble_media_session_request_streams (GabbleMediaSession *session, + const GArray *media_types, + GPtrArray **ret, + GError **error) +{ + +#ifndef EMULATOR + static GabblePresenceCapabilities google_audio_caps = + PRESENCE_CAP_GOOGLE_VOICE; + static GabblePresenceCapabilities jingle_audio_caps = + PRESENCE_CAP_JINGLE | PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO | + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P; + static GabblePresenceCapabilities jingle_video_caps = + PRESENCE_CAP_JINGLE | PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO | + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P; +#endif + + GabbleMediaSessionPrivate *priv; + GabblePresence *presence; + gboolean want_audio, want_video; + GabblePresenceCapabilities jingle_desired_caps; + guint idx; + gchar *dump; + + g_assert (GABBLE_IS_MEDIA_SESSION (session)); + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + presence = gabble_presence_cache_get (priv->conn->presence_cache, + priv->peer); + + if (presence == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "member has no audio/video capabilities"); + + return FALSE; + } + + dump = gabble_presence_dump (presence); + _gabble_media_session_debug (session, DEBUG_MSG_DUMP, "presence for peer %d:\n%s", priv->peer, dump); + g_free (dump); + + want_audio = want_video = FALSE; + + for (idx = 0; idx < media_types->len; idx++) + { + guint media_type = g_array_index (media_types, guint, idx); + + if (media_type == TP_MEDIA_STREAM_TYPE_AUDIO) + { + want_audio = TRUE; + } + else if (media_type == TP_MEDIA_STREAM_TYPE_VIDEO) + { + want_video = TRUE; + } + else + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "given media type %u is invalid", media_type); + return FALSE; + } + } + + /* work out what we'd need to do these streams with jingle */ + jingle_desired_caps = 0; + + if (want_audio) + jingle_desired_caps |= jingle_audio_caps; + + if (want_video) + jingle_desired_caps |= jingle_video_caps; + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "want audio: %s; want video: %s", + want_audio ? "yes" : "no", want_video ? "yes" : "no"); + + /* existing call; the recipient and the mode has already been decided */ + if (priv->peer_resource) + { + /* is a google call... we have no other option */ + if (priv->mode == MODE_GOOGLE) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "already in Google mode; can't add new " + "stream"); + + g_assert (priv->streams->len == 1); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Google Talk calls may only contain one stream"); + + return FALSE; + } + + if (!gabble_presence_resource_has_caps (presence, priv->peer_resource, + jingle_desired_caps)) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "in Jingle mode but have insufficient caps for requested streams"); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "existing call member doesn't support all requested media" + " types"); + + return FALSE; + } + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "in Jingle mode, and have necessary caps"); + } + + /* no existing call; we should choose a recipient and a mode */ + else + { + const gchar *resource; + + g_assert (priv->streams->len == 0); + + /* see if we have a fully-capable jingle resource; regardless of the + * desired media type it's best if we can add/remove the others later */ + resource = gabble_presence_pick_resource_by_caps (presence, + jingle_audio_caps | jingle_video_caps); + + if (resource == NULL) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "contact is not fully jingle-capable"); + + /* ok, no problem. see if we can do just what's wanted with jingle */ + resource = gabble_presence_pick_resource_by_caps (presence, + jingle_desired_caps); + + if (resource == NULL && want_audio && !want_video) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "contact doesn't have desired Jingle capabilities"); + + /* last ditch... if we want only audio and not video, we can make + * do with google talk */ + resource = gabble_presence_pick_resource_by_caps (presence, + google_audio_caps); + + if (resource != NULL) + { + /* only one stream possible with google */ + if (media_types->len == 1) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "contact has no Jingle capabilities; " + "falling back to Google audio call"); + priv->mode = MODE_GOOGLE; + } + else + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Google Talk calls may only contain one stream"); + + return FALSE; + } + } + else + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "contact doesn't have desired Google capabilities"); + } + } + } + + if (resource == NULL) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, + "contact doesn't have a resource with suitable capabilities"); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "member does not have the desired audio/video capabilities"); + + return FALSE; + } + + priv->peer_resource = g_strdup (resource); + } + + /* check it's not a ridiculous number of streams */ + if ((priv->streams->len + media_types->len) > MAX_STREAMS) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "I think that's quite enough streams already"); + return FALSE; + } + + /* if we've got here, we're good to make the streams */ + + *ret = g_ptr_array_sized_new (media_types->len); + + for (idx = 0; idx < media_types->len; idx++) + { + guint media_type = g_array_index (media_types, guint, idx); + GabbleMediaStream *stream; + const gchar *stream_name; + + if (priv->mode == MODE_GOOGLE) + stream_name = GTALK_STREAM_NAME; + else + stream_name = _name_stream (session, media_type); + + stream = create_media_stream (session, stream_name, INITIATOR_LOCAL, + media_type); + + g_ptr_array_add (*ret, stream); + } + + return TRUE; +} + +static const gchar * +_direction_to_senders (GabbleMediaSession *session, + TpMediaStreamDirection dir) +{ + const gchar *ret = NULL; + + switch (dir) + { + case TP_MEDIA_STREAM_DIRECTION_NONE: + g_assert_not_reached (); + break; + case TP_MEDIA_STREAM_DIRECTION_SEND: + if (session->initiator == INITIATOR_LOCAL) + ret = "initiator"; + else + ret = "responder"; + break; + case TP_MEDIA_STREAM_DIRECTION_RECEIVE: + if (session->initiator == INITIATOR_REMOTE) + ret = "initiator"; + else + ret = "responder"; + break; + case TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL: + ret = "both"; + break; + } + + g_assert (ret != NULL); + + return ret; +} + +static LmHandlerResult +direction_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaSession *session = GABBLE_MEDIA_SESSION (user_data); + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + + MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL (session, "direction change failed"); + + if (stream->playing) + { + _gabble_media_stream_update_sending (stream, TRUE); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static gboolean +send_direction_change (GabbleMediaSession *session, + GabbleMediaStream *stream, + TpMediaStreamDirection dir, + GError **error) +{ + GabbleMediaSessionPrivate *priv; + const gchar *senders; + LmMessage *msg; + LmMessageNode *session_node, *content_node; + gboolean ret; + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + senders = _direction_to_senders (session, dir); + + if (stream->signalling_state == STREAM_SIG_STATE_NEW || + stream->signalling_state == STREAM_SIG_STATE_REMOVING) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "not sending content-modify for %s stream %s", + stream->signalling_state == STREAM_SIG_STATE_NEW ? "new" : "removing", + stream->name); + return TRUE; + } + + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "sending jingle session action \"content-modify\" " + "to peer for stream %s (senders=%s)", stream->name, senders); + + msg = _gabble_media_session_message_new (session, "content-modify", + &session_node); + content_node = _gabble_media_stream_add_content_node (stream, session_node); + + lm_message_node_set_attribute (content_node, "senders", senders); + + ret = _gabble_connection_send_with_reply (priv->conn, msg, + direction_msg_reply_cb, G_OBJECT (stream), session, error); + + lm_message_unref (msg); + + return ret; +} + +gboolean +_gabble_media_session_request_stream_direction (GabbleMediaSession *session, + GabbleMediaStream *stream, + TpMediaStreamDirection requested_dir, + GError **error) +{ + GabbleMediaSessionPrivate *priv; + CombinedStreamDirection new_combined_dir; + TpMediaStreamDirection current_dir; //, new_dir; + TpMediaStreamPendingSend pending_send; + + priv = GABBLE_MEDIA_SESSION_GET_PRIVATE (session); + + current_dir = COMBINED_DIRECTION_GET_DIRECTION (stream->combined_direction); + pending_send = COMBINED_DIRECTION_GET_PENDING_SEND + (stream->combined_direction); + + if (priv->mode == MODE_GOOGLE) + { + g_assert (current_dir == TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL); + + if (requested_dir == TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL) + return TRUE; + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Google Talk calls can only be bi-directional"); + return FALSE; + } + + if (requested_dir == TP_MEDIA_STREAM_DIRECTION_NONE) + { + _gabble_media_session_debug (session, DEBUG_MSG_INFO, "request for NONE direction; removing stream"); + + _gabble_media_session_remove_streams (session, &stream, 1); + + return TRUE; + } + + /* if we're awaiting a local decision on sending... */ + if ((pending_send & TP_MEDIA_STREAM_PENDING_LOCAL_SEND) != 0) + { + /* clear the flag */ + pending_send &= ~TP_MEDIA_STREAM_PENDING_LOCAL_SEND; + + /* make our current_dir match what other end thinks (he thinks we're + * bidirectional) so that we send the correct transitions */ + current_dir ^= TP_MEDIA_STREAM_DIRECTION_SEND; + } + +#if 0 + /* if we're asking the remote end to start sending, set the pending flag and + * don't change our directionality just yet */ + new_dir = requested_dir; + if (((current_dir & TP_MEDIA_STREAM_DIRECTION_RECEIVE) == 0) && + ((new_dir & TP_MEDIA_STREAM_DIRECTION_RECEIVE) != 0)) + { + pending_send ^= TP_MEDIA_STREAM_PENDING_REMOTE_SEND; + new_dir &= ~TP_MEDIA_STREAM_DIRECTION_RECEIVE; + } +#endif + + /* make any necessary changes */ + new_combined_dir = MAKE_COMBINED_DIRECTION (requested_dir, pending_send); + if (new_combined_dir != stream->combined_direction) + { + g_object_set (stream, "combined-direction", new_combined_dir, NULL); + _gabble_media_stream_update_sending (stream, FALSE); + } + + /* short-circuit sending a request if we're not asking for anything new */ + if (current_dir == requested_dir) + return TRUE; + + /* send request */ + return send_direction_change (session, stream, requested_dir, error); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-stream-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-stream-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,180 @@ +/* + * gabble-media-stream-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:STRING,BOXED (gabble-media-stream-signals-marshal.list:1) */ +void +gabble_media_stream_marshal_VOID__STRING_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_BOXED) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__STRING_BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + data2); +} + +/* VOID:STRING,STRING (gabble-media-stream-signals-marshal.list:2) */ +void +gabble_media_stream_marshal_VOID__STRING_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_STRING) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__STRING_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + data2); +} + +/* VOID:UINT,STRING (gabble-media-stream-signals-marshal.list:3) */ +void +gabble_media_stream_marshal_VOID__UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_STRING) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_string (param_values + 2), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-media-stream.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-media-stream.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1836 @@ +/* + * gabble-media-stream.c - Source for GabbleMediaStream + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + + +#include "ansi.h" +#include "debug.h" +#include "handles.h" +#include "namespaces.h" + +#include "gabble-connection.h" +#include "gabble-media-channel.h" +#include "gabble-media-session.h" +#include "gabble-media-session-enumtypes.h" + +#include "telepathy-helpers.h" +#include "telepathy-constants.h" + +#include "gabble-media-stream.h" +#include "gabble-media-stream-signals-marshal.h" +#include "gabble-media-stream-glue.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleMediaStream, gabble_media_stream, G_TYPE_OBJECT) +#endif + +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +//#define NODE_DEBUG(n, s) ; +#endif /* DEBUG_FLAG */ + +/* signal enum */ +enum +{ + DESTROY, + + ADD_REMOTE_CANDIDATE, + CLOSE, + REMOVE_REMOTE_CANDIDATE, + SET_ACTIVE_CANDIDATE_PAIR, + SET_REMOTE_CANDIDATE_LIST, + SET_REMOTE_CODECS, + SET_STREAM_PLAYING, + SET_STREAM_SENDING, + + NEW_ACTIVE_CANDIDATE_PAIR, + NEW_NATIVE_CANDIDATE, + SUPPORTED_CODECS, + ERROR, + + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_MED_STREAM +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_med_stream,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_med_stream, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_media_stream_parent_class,gabble_med_stream,gpointer) + #define gabble_media_stream_parent_class (*GET_WSD_VAR_NAME(gabble_media_stream_parent_class,gabble_med_stream,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_med_stream,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_med_stream,s)()) + + /*gchar** _s_gabble_med_stream_video_codec_params() { return (gchar**)((libgabble_ImpurePtr()->_s_gabble_med_stream_video_codec_params)); } + + #define video_codec_params (GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream, s)())*/ + + +static void gabble_media_stream_init (GabbleMediaStream *self); +static void gabble_media_stream_class_init (GabbleMediaStreamClass *klass); +static void gabble_media_stream_class_intern_init (gpointer klass) +{ +gabble_media_stream_parent_class = g_type_class_peek_parent (klass); + gabble_media_stream_class_init ((GabbleMediaStreamClass*) klass); +} + EXPORT_C GType gabble_media_stream_get_type (void) + { + if ((g_define_type_id == 0)) + { + static const GTypeInfo g_define_type_info = { sizeof (GabbleMediaStreamClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_media_stream_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMediaStream), 0, (GInstanceInitFunc) gabble_media_stream_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMediaStream"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + }; + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + PROP_MEDIA_SESSION, + PROP_OBJECT_PATH, + PROP_MODE, + PROP_NAME, + PROP_ID, + PROP_INITIATOR, + PROP_MEDIA_TYPE, + PROP_CONNECTION_STATE, + PROP_READY, + PROP_GOT_LOCAL_CODECS, + PROP_SIGNALLING_STATE, + PROP_PLAYING, + PROP_COMBINED_DIRECTION, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleMediaStreamPrivate GabbleMediaStreamPrivate; + +struct _GabbleMediaStreamPrivate +{ + GabbleConnection *conn; + GabbleMediaSession *session; + GabbleMediaSessionMode mode; + gchar *object_path; + guint id; + guint media_type; + + gboolean ready; + gboolean sending; + + GValue native_codecs; /* intersected codec list */ + GValue native_candidates; + + GValue remote_codecs; + GValue remote_candidates; + + guint remote_candidate_count; + + gboolean closed; + gboolean dispose_has_run; +}; + +#define GABBLE_MEDIA_STREAM_GET_PRIVATE(obj) \ + ((GabbleMediaStreamPrivate *)obj->priv) +//Vinod: add below definition +#define ENABLE_DEBUG + +#ifdef ENABLE_DEBUG +#if _GMS_DEBUG_LEVEL > 1 +static const char *tp_protocols[] = { + "TP_MEDIA_STREAM_PROTO_UDP (0)", + "TP_MEDIA_STREAM_PROTO_TCP (1)" +}; + +static const char *tp_transports[] = { + "TP_MEDIA_STREAM_TRANSPORT_TYPE_LOCAL (0)", + "TP_MEDIA_STREAM_TRANSPORT_TYPE_DERIVED (1)", + "TP_MEDIA_STREAM_TRANSPORT_TYPE_RELAY (2)" +}; +#endif +#endif + +static void push_native_candidates (GabbleMediaStream *stream); +static void push_remote_codecs (GabbleMediaStream *stream); +static void push_remote_candidates (GabbleMediaStream *stream); +static void push_playing (GabbleMediaStream *stream); +static void push_sending (GabbleMediaStream *stream); + +static void +gabble_media_stream_init (GabbleMediaStream *self) +{ + GabbleMediaStreamPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_MEDIA_STREAM, GabbleMediaStreamPrivate); + + self->priv = priv; + + g_value_init (&priv->native_codecs, TP_TYPE_CODEC_LIST); + g_value_take_boxed (&priv->native_codecs, + dbus_g_type_specialized_construct (TP_TYPE_CODEC_LIST)); + + g_value_init (&priv->native_candidates, TP_TYPE_CANDIDATE_LIST); + g_value_take_boxed (&priv->native_candidates, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_LIST)); + + g_value_init (&priv->remote_codecs, TP_TYPE_CODEC_LIST); + g_value_take_boxed (&priv->remote_codecs, + dbus_g_type_specialized_construct (TP_TYPE_CODEC_LIST)); + + g_value_init (&priv->remote_candidates, TP_TYPE_CANDIDATE_LIST); + g_value_take_boxed (&priv->remote_candidates, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_LIST)); +} + +static GObject * +gabble_media_stream_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleMediaStreamPrivate *priv; + DBusGConnection *bus; + + /* call base class constructor */ + obj = G_OBJECT_CLASS (gabble_media_stream_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (GABBLE_MEDIA_STREAM (obj)); + + /* go for the bus */ + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + return obj; +} + +static void +gabble_media_stream_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + case PROP_MEDIA_SESSION: + g_value_set_object (value, priv->session); + break; + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_MODE: + g_value_set_enum (value, priv->mode); + break; + case PROP_NAME: + g_value_set_string (value, stream->name); + break; + case PROP_ID: + g_value_set_uint (value, priv->id); + break; + case PROP_INITIATOR: + g_value_set_uint (value, stream->initiator); + break; + case PROP_MEDIA_TYPE: + g_value_set_uint (value, priv->media_type); + break; + case PROP_CONNECTION_STATE: + g_value_set_uint (value, stream->connection_state); + break; + case PROP_READY: + g_value_set_boolean (value, priv->ready); + break; + case PROP_GOT_LOCAL_CODECS: + g_value_set_boolean (value, stream->got_local_codecs); + break; + case PROP_SIGNALLING_STATE: + g_value_set_uint (value, stream->signalling_state); + break; + case PROP_PLAYING: + g_value_set_boolean (value, stream->playing); + break; + case PROP_COMBINED_DIRECTION: + g_value_set_uint (value, stream->combined_direction); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_media_stream_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + case PROP_MEDIA_SESSION: + priv->session = g_value_get_object (value); + break; + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_MODE: + priv->mode = g_value_get_enum (value); + break; + case PROP_NAME: + g_free (stream->name); + stream->name = g_value_dup_string (value); + break; + case PROP_ID: + priv->id = g_value_get_uint (value); + break; + case PROP_INITIATOR: + stream->initiator = g_value_get_uint (value); + break; + case PROP_MEDIA_TYPE: + priv->media_type = g_value_get_uint (value); + break; + case PROP_CONNECTION_STATE: + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "stream %s connection state %d", + stream->name, stream->connection_state); + stream->connection_state = g_value_get_uint (value); + break; + case PROP_READY: + priv->ready = g_value_get_boolean (value); + break; + case PROP_GOT_LOCAL_CODECS: + stream->got_local_codecs = g_value_get_boolean (value); + break; + case PROP_SIGNALLING_STATE: + { + StreamSignallingState old = stream->signalling_state; + stream->signalling_state = g_value_get_uint (value); + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "stream %s sig_state %d->%d", + stream->name, old, stream->signalling_state); + if (stream->signalling_state != old) + push_native_candidates (stream); + } + break; + case PROP_PLAYING: + { + gboolean old = stream->playing; + stream->playing = g_value_get_boolean (value); + if (stream->playing != old) + push_playing (stream); + } + break; + case PROP_COMBINED_DIRECTION: + stream->combined_direction = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_media_stream_dispose (GObject *object); +static void gabble_media_stream_finalize (GObject *object); + +static void +gabble_media_stream_class_init (GabbleMediaStreamClass *gabble_media_stream_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_media_stream_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_media_stream_class, sizeof (GabbleMediaStreamPrivate)); + + object_class->constructor = gabble_media_stream_constructor; + + object_class->get_property = gabble_media_stream_get_property; + object_class->set_property = gabble_media_stream_set_property; + + object_class->dispose = gabble_media_stream_dispose; + object_class->finalize = gabble_media_stream_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "media stream's channel.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_object ("media-session", "GabbleMediaSession object", + "Gabble media session object that owns this " + "media stream object.", + GABBLE_TYPE_MEDIA_SESSION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_MEDIA_SESSION, param_spec); + + param_spec = g_param_spec_string ("object-path", "D-Bus object path", + "The D-Bus object path used for this " + "object on the bus.", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_OBJECT_PATH, param_spec); + + param_spec = g_param_spec_enum ("mode", "Signalling mode", + "Which signalling mode used to control the " + "stream.", + gabble_media_session_mode_get_type(), + MODE_JINGLE, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_MODE, param_spec); + + param_spec = g_param_spec_string ("name", "Stream name", + "An opaque name for the stream used in the " + "signalling.", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_NAME, param_spec); + + param_spec = g_param_spec_uint ("id", "Stream ID", + "A stream number for the stream used in the " + "D-Bus API.", + 0, G_MAXUINT, 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_ID, param_spec); + + param_spec = g_param_spec_uint ("initiator", "Stream initiator", + "An enum signifying which end initiated " + "the stream.", + INITIATOR_LOCAL, + INITIATOR_REMOTE, + INITIATOR_LOCAL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_INITIATOR, param_spec); + + param_spec = g_param_spec_uint ("media-type", "Stream media type", + "A constant indicating which media type the " + "stream carries.", + TP_MEDIA_STREAM_TYPE_AUDIO, + TP_MEDIA_STREAM_TYPE_VIDEO, + TP_MEDIA_STREAM_TYPE_AUDIO, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_MEDIA_TYPE, param_spec); + + param_spec = g_param_spec_uint ("connection-state", "Stream connection state", + "An integer indicating the state of the" + "stream's connection.", + TP_MEDIA_STREAM_STATE_DISCONNECTED, + TP_MEDIA_STREAM_STATE_CONNECTED, + TP_MEDIA_STREAM_STATE_DISCONNECTED, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION_STATE, param_spec); + + param_spec = g_param_spec_boolean ("ready", "Ready?", + "A boolean signifying whether the user " + "is ready to handle signals from this " + "object.", + FALSE, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_READY, param_spec); + + param_spec = g_param_spec_boolean ("got-local-codecs", "Got local codecs?", + "A boolean signifying whether we've got " + "the locally supported codecs from the user.", + FALSE, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_GOT_LOCAL_CODECS, param_spec); + + param_spec = g_param_spec_uint ("signalling-state", "Signalling state", + "Whether the stream is newly created, " + "sent to the peer, or acknowledged.", + STREAM_SIG_STATE_NEW, + STREAM_SIG_STATE_REMOVING, + STREAM_SIG_STATE_NEW, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_SIGNALLING_STATE, param_spec); + + param_spec = g_param_spec_boolean ("playing", "Set playing", + "A boolean signifying whether the stream " + "has been set playing yet.", + FALSE, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PLAYING, param_spec); + + param_spec = g_param_spec_uint ("combined-direction", + "Combined direction", + "An integer indicating the directions the stream currently sends in, " + "and the peers who have been asked to send.", + TP_MEDIA_STREAM_DIRECTION_NONE, + MAKE_COMBINED_DIRECTION (TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL, + TP_MEDIA_STREAM_PENDING_LOCAL_SEND | + TP_MEDIA_STREAM_PENDING_REMOTE_SEND), + TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_COMBINED_DIRECTION, + param_spec); + + /* signals exported by D-Bus interface */ + signals[DESTROY] = + g_signal_new ("destroy", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[ADD_REMOTE_CANDIDATE] = + g_signal_new ("add-remote-candidate", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_stream_marshal_VOID__STRING_BOXED, + G_TYPE_NONE, 2, G_TYPE_STRING, TP_TYPE_TRANSPORT_LIST); + + signals[CLOSE] = + g_signal_new ("close", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[REMOVE_REMOTE_CANDIDATE] = + g_signal_new ("remove-remote-candidate", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[SET_ACTIVE_CANDIDATE_PAIR] = + g_signal_new ("set-active-candidate-pair", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_stream_marshal_VOID__STRING_STRING, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + + signals[SET_REMOTE_CANDIDATE_LIST] = + g_signal_new ("set-remote-candidate-list", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, TP_TYPE_CANDIDATE_LIST); + + signals[SET_REMOTE_CODECS] = + g_signal_new ("set-remote-codecs", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, TP_TYPE_CODEC_LIST); + + /* signals not exported by D-Bus interface */ + signals[NEW_ACTIVE_CANDIDATE_PAIR] = + g_signal_new ("new-active-candidate-pair", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_stream_marshal_VOID__STRING_STRING, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + + signals[NEW_NATIVE_CANDIDATE] = + g_signal_new ("new-native-candidate", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_stream_marshal_VOID__STRING_BOXED, + G_TYPE_NONE, 2, G_TYPE_STRING, TP_TYPE_TRANSPORT_LIST); + + signals[SUPPORTED_CODECS] = + g_signal_new ("supported-codecs", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, TP_TYPE_CODEC_LIST); + + signals[SET_STREAM_PLAYING] = + g_signal_new ("set-stream-playing", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals[SET_STREAM_SENDING] = + g_signal_new ("set-stream-sending", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals[ERROR] = + g_signal_new ("error", + G_OBJECT_CLASS_TYPE (gabble_media_stream_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_media_stream_marshal_VOID__UINT_STRING, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_media_stream_class), &dbus_glib_gabble_media_stream_object_info); +} + +void +gabble_media_stream_dispose (GObject *object) +{ + GabbleMediaStream *self = GABBLE_MEDIA_STREAM (object); + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + _gabble_media_stream_close (self); + + g_signal_emit (self, signals[DESTROY], 0); + + priv->dispose_has_run = TRUE; + + if (G_OBJECT_CLASS (gabble_media_stream_parent_class)->dispose) + G_OBJECT_CLASS (gabble_media_stream_parent_class)->dispose (object); +} + +void +gabble_media_stream_finalize (GObject *object) +{ + GabbleMediaStream *self = GABBLE_MEDIA_STREAM (object); + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + g_free (priv->object_path); + + g_value_unset (&priv->native_codecs); + g_value_unset (&priv->native_candidates); + + g_value_unset (&priv->remote_codecs); + g_value_unset (&priv->remote_candidates); + + G_OBJECT_CLASS (gabble_media_stream_parent_class)->finalize (object); +} + +/** + * gabble_media_stream_codec_choice + * + * Implements D-Bus method CodecChoice + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_codec_choice (GabbleMediaStream *self, + guint codec_id, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + return TRUE; +} + + +/** + * gabble_media_stream_error + * + * Implements D-Bus method Error + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_error (GabbleMediaStream *self, + guint errno, + const gchar *message, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_WARNING, "Media.StreamHandler::Error called, error %u (%s) -- emitting signal", errno, message); + + g_signal_emit (self, signals[ERROR], 0, errno, message); + + return TRUE; +} + + +/** + * gabble_media_stream_native_candidates_prepared + * + * Implements D-Bus method NativeCandidatesPrepared + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_native_candidates_prepared (GabbleMediaStream *self, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + return TRUE; +} + + +/** + * gabble_media_stream_new_active_candidate_pair + * + * Implements D-Bus method NewActiveCandidatePair + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_new_active_candidate_pair (GabbleMediaStream *self, + const gchar *native_candidate_id, + const gchar *remote_candidate_id, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + g_signal_emit (self, signals[NEW_ACTIVE_CANDIDATE_PAIR], 0, + native_candidate_id, remote_candidate_id); + + return TRUE; +} + + +/** + * gabble_media_stream_new_native_candidate + * + * Implements D-Bus method NewNativeCandidate + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_new_native_candidate (GabbleMediaStream *self, + const gchar *candidate_id, + const GPtrArray *transports, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + JingleSessionState state; + GPtrArray *candidates; + GValue candidate = { 0, }; + GValueArray *transport; + const gchar *addr; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + g_object_get (priv->session, "state", &state, NULL); + + /* FIXME: maybe this should be an assertion in case the channel + * isn't closed early enough right now? */ + if (state > JS_STATE_ACTIVE) + { + gabble_debug (DEBUG_FLAG, "state > JS_STATE_ACTIVE, doing nothing"); + return TRUE; + } + + candidates = g_value_get_boxed (&priv->native_candidates); + + g_value_init (&candidate, TP_TYPE_CANDIDATE_STRUCT); + g_value_take_boxed (&candidate, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_STRUCT)); + + dbus_g_type_struct_set (&candidate, + 0, candidate_id, + 1, transports, + G_MAXUINT); + + transport = g_ptr_array_index (transports, 0); + addr = g_value_get_string (g_value_array_get_nth (transport, 1)); + if (!strcmp (addr, "127.0.0.1")) + { + _gabble_media_session_debug (priv->session, DEBUG_MSG_WARNING, "%s: ignoring native localhost candidate", + G_STRFUNC); + return TRUE; + } + + g_ptr_array_add (candidates, g_value_get_boxed (&candidate)); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "put 1 native candidate from stream-engine into cache"); + + push_native_candidates (self); + + g_signal_emit (self, signals[NEW_NATIVE_CANDIDATE], 0, + candidate_id, transports); + + return TRUE; +} + + +/** + * gabble_media_stream_ready + * + * Implements D-Bus method Ready + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_ready (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "ready called"); + + g_object_set (self, "ready", TRUE, NULL); + + push_remote_codecs (self); + push_remote_candidates (self); + push_playing (self); + push_sending (self); + + return gabble_media_stream_set_local_codecs (self, codecs, error); +} + + +/** + * gabble_media_stream_set_local_codecs + * + * Implements D-Bus method SetLocalCodecs + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_set_local_codecs (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "putting list of all %d locally supported " + "codecs from stream-engine into cache", codecs->len); + + g_value_set_boxed (&priv->native_codecs, codecs); + + g_object_set (self, "got-local-codecs", TRUE, NULL); + + return TRUE; +} + + +/** + * gabble_media_stream_stream_state + * + * Implements D-Bus method StreamState + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_stream_state (GabbleMediaStream *self, + guint connection_state, + GError **error) +{ + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + g_object_set (self, "connection-state", connection_state, NULL); + + return TRUE; +} + + +/** + * gabble_media_stream_supported_codecs + * + * Implements D-Bus method SupportedCodecs + * on interface org.freedesktop.Telepathy.Media.StreamHandler + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_media_stream_supported_codecs (GabbleMediaStream *self, + const GPtrArray *codecs, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (self)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (self); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "got codec intersection containing %d " + "codecs from stream-engine", codecs->len); + + /* store the intersection for later on */ + g_value_set_boxed (&priv->native_codecs, codecs); + + g_signal_emit (self, signals[SUPPORTED_CODECS], 0, codecs); + + return TRUE; +} + +static LmHandlerResult +candidates_msg_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleMediaStream *stream = GABBLE_MEDIA_STREAM (object); + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + MSG_REPLY_CB_END_SESSION_IF_NOT_SUCCESSFUL (priv->session, "candidates failed"); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +_add_rtp_candidate_node (GabbleMediaSession *session, LmMessageNode *parent, + GValueArray *candidate) +{ + gchar *addr; + gchar *user; + gchar *pass; + gchar *port_str; + gchar *pref_str; + gchar *xml; + const gchar *type_str; + const gchar *candidate_id; + guint port; + gdouble pref; + TpMediaStreamProto proto; + TpMediaStreamTransportType type; + const GPtrArray *transports; + GValue transport = { 0, }; + LmMessageNode *cand_node; + + candidate_id = g_value_get_string (g_value_array_get_nth (candidate, 0)); + transports = g_value_get_boxed (g_value_array_get_nth (candidate, 1)); + + /* jingle audio only supports the concept of one transport per candidate */ + g_assert (transports->len == 1); + + g_value_init (&transport, TP_TYPE_TRANSPORT_STRUCT); + g_value_set_static_boxed (&transport, g_ptr_array_index (transports, 0)); + + dbus_g_type_struct_get (&transport, + 1, &addr, + 2, &port, + 3, &proto, + 6, &pref, + 7, &type, + 8, &user, + 9, &pass, + G_MAXUINT); + + port_str = g_strdup_printf ("%d", port); + pref_str = g_strdup_printf ("%f", pref); + + switch (type) { + case TP_MEDIA_STREAM_TRANSPORT_TYPE_LOCAL: + type_str = "local"; + break; + case TP_MEDIA_STREAM_TRANSPORT_TYPE_DERIVED: + type_str = "stun"; + break; + case TP_MEDIA_STREAM_TRANSPORT_TYPE_RELAY: + type_str = "relay"; + break; + default: + g_error ("%s: TpMediaStreamTransportType has an invalid value", + G_STRFUNC); + return; + } + + cand_node = lm_message_node_add_child (parent, "candidate", NULL); + lm_message_node_set_attributes (cand_node, + "name", "rtp", + "address", addr, + "port", port_str, + "username", user, + "password", pass, + "preference", pref_str, + "protocol", (proto == TP_MEDIA_STREAM_PROTO_UDP) ? "udp" : "tcp", + "type", type_str, + "network", "0", + "generation", "0", + NULL); + + xml = lm_message_node_to_string (cand_node); + _gabble_media_session_debug (session, DEBUG_MSG_DUMP, + " from Telepathy D-Bus struct: [%s\"%s\", %s[%s1, \"%s\", %d, %s, " + "\"%s\", \"%s\", %f, %s, \"%s\", \"%s\"%s]]", + ANSI_BOLD_OFF, candidate_id, ANSI_BOLD_ON, ANSI_BOLD_OFF, addr, port, + tp_protocols[proto], "RTP", "AVP", pref, tp_transports[type], user, pass, + ANSI_BOLD_ON); + _gabble_media_session_debug (session, DEBUG_MSG_DUMP, + " to Jingle XML: [%s%s%s]", ANSI_BOLD_OFF, xml, ANSI_BOLD_ON); + g_free (xml); + + g_free (addr); + g_free (user); + g_free (pass); + g_free (port_str); + g_free (pref_str); +} + +static LmMessage * +_gabble_media_stream_message_new (GabbleMediaStream *stream, + const gchar *action, + LmMessageNode **content_node) +{ + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + LmMessage *msg; + LmMessageNode *session_node = NULL; + + /* construct a session message */ + msg = _gabble_media_session_message_new (priv->session, action, + &session_node); + + /* add our content node to it if necessary */ + *content_node = _gabble_media_stream_add_content_node (stream, session_node); + + return msg; +} + + +static void +push_candidate (GabbleMediaStream *stream, GValueArray *candidate) +{ + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + LmMessage *msg; + LmMessageNode *content_node, *transport_node; + const gchar *action; + + if (priv->mode == MODE_GOOGLE) + action = "candidates"; + else + action = "transport-info"; + + /* construct a base message */ + msg = _gabble_media_stream_message_new (stream, action, &content_node); + + /* for jingle, add a transport */ + transport_node = _gabble_media_stream_content_node_add_transport (stream, + content_node); + + /* add transport info to it */ + _add_rtp_candidate_node (priv->session, transport_node, candidate); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "sending jingle session action \"%s\" to " + "peer", action); + + /* send it */ + _gabble_connection_send_with_reply (priv->conn, msg, candidates_msg_reply_cb, + G_OBJECT (stream), NULL, NULL); + + /* clean up */ + lm_message_unref (msg); +} + +static void +push_native_candidates (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + GPtrArray *candidates; + guint i; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (stream->signalling_state == STREAM_SIG_STATE_NEW || + stream->signalling_state == STREAM_SIG_STATE_REMOVING) + return; + + candidates = g_value_get_boxed (&priv->native_candidates); + + for (i = 0; i < candidates->len; i++) + push_candidate (stream, g_ptr_array_index (candidates, i)); + + g_value_take_boxed (&priv->native_candidates, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_LIST)); +} + +void +_gabble_media_stream_close (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (!priv->closed) + { + priv->closed = TRUE; + g_signal_emit (stream, signals[CLOSE], 0); + } +} + +gboolean +_gabble_media_stream_post_remote_codecs (GabbleMediaStream *stream, + LmMessage *message, + LmMessageNode *desc_node, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + LmMessageNode *node; + GPtrArray *codecs; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + codecs = g_value_get_boxed (&priv->remote_codecs); + + g_assert (codecs->len == 0); + + for (node = desc_node->children; node; node = node->next) + { + guchar id; + const gchar *name, *str; + guint clockrate, channels; + GHashTable *params; + GValue codec = { 0, }; + + if (g_strdiff (node->name, "payload-type")) + continue; + + /* id of codec */ + str = lm_message_node_get_attribute (node, "id"); + if (str == NULL) + { + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "description has no ID"); + return FALSE; + } + + id = atoi(str); + + /* codec name */ + name = lm_message_node_get_attribute (node, "name"); + if (name == NULL) + { + name = ""; + } + + /* clock rate: jingle and newer GTalk */ + str = lm_message_node_get_attribute (node, "clockrate"); /* google */ + if (str == NULL) + str = lm_message_node_get_attribute (node, "rate"); /* jingle */ + + if (str != NULL) + { + clockrate = atoi (str); + } + else + { + clockrate = 0; + } + + /* number of channels: jingle only */ + str = lm_message_node_get_attribute (node, "channels"); + if (str != NULL) + { + channels = atoi (str); + } + else + { + channels = 1; + } + + params = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); + + /* bitrate: newer GTalk only */ + str = lm_message_node_get_attribute (node, "bitrate"); + if (str != NULL) + { + g_hash_table_insert (params, "bitrate", g_strdup (str)); + } + + g_value_init (&codec, TP_TYPE_CODEC_STRUCT); + g_value_take_boxed (&codec, + dbus_g_type_specialized_construct (TP_TYPE_CODEC_STRUCT)); + + dbus_g_type_struct_set (&codec, + 0, id, + 1, name, + 2, TP_CODEC_MEDIA_TYPE_AUDIO, + 3, clockrate, + 4, channels, + 5, params, + G_MAXUINT); + + g_ptr_array_add (codecs, g_value_get_boxed (&codec)); + } + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "put %d remote codecs from peer into cache", + codecs->len); + + push_remote_codecs (stream); + + return TRUE; +} + +static void +push_remote_codecs (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + GPtrArray *codecs; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (!priv->ready) + return; + + codecs = g_value_get_boxed (&priv->remote_codecs); + if (codecs->len == 0) + return; + + _gabble_media_session_debug (priv->session, DEBUG_MSG_EVENT, "passing %d remote codecs to stream-engine", + codecs->len); + + g_signal_emit (stream, signals[SET_REMOTE_CODECS], 0, codecs); + + g_value_take_boxed (&priv->remote_codecs, + dbus_g_type_specialized_construct (TP_TYPE_CODEC_LIST)); +} + +gboolean +_gabble_media_stream_post_remote_candidates (GabbleMediaStream *stream, + LmMessage *message, + LmMessageNode *transport_node, + GError **error) +{ + GabbleMediaStreamPrivate *priv; + LmMessageNode *node; + const gchar *str; + GPtrArray *candidates; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + candidates = g_value_get_boxed (&priv->remote_candidates); + + for (node = transport_node->children; node; node = node->next) + { + gchar *candidate_id; + const gchar *name, *addr; + guint16 port; + TpMediaStreamProto proto; + gdouble pref; + TpMediaStreamTransportType type; + const gchar *user, *pass; + guchar net, gen; + GValue candidate = { 0, }; + GPtrArray *transports; + GValue transport = { 0, }; + gchar *xml; + + if (g_strdiff (node->name, "candidate")) + continue; + + /* + * Candidate + */ + + /* stream name */ + name = lm_message_node_get_attribute (node, "name"); + if (name == NULL || strcmp (name, "rtp") != 0) + goto FAILURE; + + + /* + * Transport + */ + + /* ip address */ + addr = lm_message_node_get_attribute (node, "address"); + if (addr == NULL) + goto FAILURE; + + /* port */ + str = lm_message_node_get_attribute (node, "port"); + if (str == NULL) + goto FAILURE; + port = atoi (str); + + /* protocol */ + str = lm_message_node_get_attribute (node, "protocol"); + if (str == NULL) + goto FAILURE; + + if (strcmp (str, "udp") == 0) + { + proto = TP_MEDIA_STREAM_PROTO_UDP; + } + else if (strcmp (str, "tcp") == 0) + { + proto = TP_MEDIA_STREAM_PROTO_TCP; + } + else if (strcmp (str, "ssltcp") == 0) + { + _gabble_media_session_debug (priv->session, DEBUG_MSG_WARNING, "%s: ssltcp candidates " + "not yet supported", G_STRFUNC); + continue; + } + else + goto FAILURE; + + /* protocol profile: hardcoded to "AVP" for now */ + + /* preference */ + str = lm_message_node_get_attribute (node, "preference"); + if (str == NULL) + goto FAILURE; + pref = g_ascii_strtod (str, NULL); + + /* type */ + str = lm_message_node_get_attribute (node, "type"); + if (str == NULL) + goto FAILURE; + + if (strcmp (str, "local") == 0) + { + type = TP_MEDIA_STREAM_TRANSPORT_TYPE_LOCAL; + } + else if (strcmp (str, "stun") == 0) + { + type = TP_MEDIA_STREAM_TRANSPORT_TYPE_DERIVED; + } + else if (strcmp (str, "relay") == 0) + { + type = TP_MEDIA_STREAM_TRANSPORT_TYPE_RELAY; + } + else + goto FAILURE; + + /* username */ + user = lm_message_node_get_attribute (node, "username"); + if (user == NULL) + goto FAILURE; + + /* password */ + pass = lm_message_node_get_attribute (node, "password"); + if (pass == NULL) + goto FAILURE; + + /* unknown */ + str = lm_message_node_get_attribute (node, "network"); + if (str == NULL) + goto FAILURE; + net = atoi (str); + + /* unknown */ + str = lm_message_node_get_attribute (node, "generation"); + if (str == NULL) + goto FAILURE; + gen = atoi (str); + + + g_value_init (&transport, TP_TYPE_TRANSPORT_STRUCT); + g_value_take_boxed (&transport, + dbus_g_type_specialized_construct (TP_TYPE_TRANSPORT_STRUCT)); + + dbus_g_type_struct_set (&transport, + 0, 1, /* component number */ + 1, addr, + 2, port, + 3, proto, + 4, "RTP", + 5, "AVP", + 6, pref, + 7, type, + 8, user, + 9, pass, + G_MAXUINT); + + transports = g_ptr_array_sized_new (1); + g_ptr_array_add (transports, g_value_get_boxed (&transport)); + + + g_value_init (&candidate, TP_TYPE_CANDIDATE_STRUCT); + g_value_take_boxed (&candidate, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_STRUCT)); + + /* FIXME: is this naming scheme sensible? */ + candidate_id = g_strdup_printf ("R%d", ++priv->remote_candidate_count); + + dbus_g_type_struct_set (&candidate, + 0, candidate_id, + 1, transports, + G_MAXUINT); + + g_ptr_array_add (candidates, g_value_get_boxed (&candidate)); + + xml = lm_message_node_to_string (node); + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "put 1 remote candidate from peer into cache"); + _gabble_media_session_debug (priv->session, DEBUG_MSG_DUMP, " from Jingle XML: [%s%s%s]", + ANSI_BOLD_OFF, xml, ANSI_BOLD_ON); + _gabble_media_session_debug (priv->session, DEBUG_MSG_DUMP, " to Telepathy D-Bus struct: [%s\"%s\", %s[%s1, \"%s\", %d, %s, \"%s\", \"%s\", %f, %s, \"%s\", \"%s\"%s]]", + ANSI_BOLD_OFF, candidate_id, ANSI_BOLD_ON, + ANSI_BOLD_OFF, addr, port, tp_protocols[proto], "RTP", "AVP", pref, tp_transports[type], user, pass, ANSI_BOLD_ON); + g_free (xml); + + g_free (candidate_id); + } + +/*SUCCESS:*/ + push_remote_candidates (stream); + + return TRUE; + +FAILURE: + g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, + "unable to parse candidate"); + + return FALSE; +} + +static void +push_remote_candidates (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + GPtrArray *candidates; + guint i; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + candidates = g_value_get_boxed (&priv->remote_candidates); + + if (candidates->len == 0) + return; + + if (!priv->ready) + return; + + for (i = 0; i < candidates->len; i++) + { + GValueArray *candidate = g_ptr_array_index (candidates, i); + const gchar *candidate_id; + const GPtrArray *transports; + + candidate_id = g_value_get_string (g_value_array_get_nth (candidate, 0)); + transports = g_value_get_boxed (g_value_array_get_nth (candidate, 1)); + + _gabble_media_session_debug (priv->session, DEBUG_MSG_EVENT, "passing 1 remote candidate " + "to stream-engine"); + + g_signal_emit (stream, signals[ADD_REMOTE_CANDIDATE], 0, + candidate_id, transports); + } + + g_value_take_boxed (&priv->remote_candidates, + dbus_g_type_specialized_construct (TP_TYPE_CANDIDATE_LIST)); +} + +static void +push_playing (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (!priv->ready) + return; + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "stream %s emitting SetStreamPlaying(%s)", + stream->name, stream->playing ? "true" : "false"); + + g_signal_emit (stream, signals[SET_STREAM_PLAYING], 0, stream->playing); +} + +static void +push_sending (GabbleMediaStream *stream) +{ + GabbleMediaStreamPrivate *priv; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (!priv->ready) + return; + + _gabble_media_session_debug (priv->session, DEBUG_MSG_INFO, DEBUG_MSG_INFO, "stream %s emitting SetStreamSending(%s)", + stream->name, priv->sending ? "true" : "false"); + + g_signal_emit (stream, signals[SET_STREAM_SENDING], 0, priv->sending); +} + +/* + * oh sweet g_hash_table_foreach how beautiful thou be'st + * + * _\ / ^/ + * \/ \// 7_ __ + * ( 7 ) (__) (__) + * ^\\ |/__/___/ + * \\/_/ | <-- TP-cable kindly provided by Mika N. + * \ / O + * || /|\ + * || / \ + * || + * ____||_____________ + */ + +typedef struct { + GabbleMediaStreamPrivate *priv; + LmMessageNode *pt_node; +} CodecParamsFromTpContext; + +//#ifndef EMULATOR +static const gchar *video_codec_params[] = { + "x", "y", "width", "height", "layer", "transparent", +}; +//#endif + +static void +codec_params_from_tp_foreach (gpointer key, gpointer value, gpointer user_data) +{ + CodecParamsFromTpContext *ctx = user_data; + GabbleMediaStreamPrivate *priv = ctx->priv; + const gchar *pname = key, *pvalue = value; + + if (priv->media_type == TP_CODEC_MEDIA_TYPE_AUDIO) + { + if (priv->mode == MODE_GOOGLE && strcmp (pname, "bitrate") == 0) + { + lm_message_node_set_attribute (ctx->pt_node, pname, pvalue); + return; + } + } + else if (priv->mode == MODE_JINGLE) + { + gint i; + + for (i = 0; video_codec_params[i] != NULL; i++) + { + if (strcmp (pname, video_codec_params[i]) == 0) + { + lm_message_node_set_attribute (ctx->pt_node, pname, pvalue); + return; + } + } + } + + gabble_debug (DEBUG_FLAG, "ignoring %s=%s for %s %s stream", pname, pvalue, + (priv->mode == MODE_JINGLE) ? "jingle" : "google", + (priv->media_type == TP_CODEC_MEDIA_TYPE_AUDIO) ? "audio" : "video"); +} + +LmMessageNode * +_gabble_media_stream_add_content_node (GabbleMediaStream *stream, + LmMessageNode *session_node) +{ + GabbleMediaStreamPrivate *priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + LmMessageNode *node = session_node; + + /* add our content node to it if in jingle mode */ + if (priv->mode == MODE_JINGLE) + { + node = lm_message_node_add_child (session_node, "content", NULL); + lm_message_node_set_attribute (node, "name", stream->name); + + if (priv->session->initiator == stream->initiator) + lm_message_node_set_attribute (node, "creator", "initiator"); + else + lm_message_node_set_attribute (node, "creator", "responder"); + } + + return node; +} + +void +_gabble_media_stream_content_node_add_description (GabbleMediaStream *stream, + LmMessageNode *content_node) +{ + GabbleMediaStreamPrivate *priv; + const GPtrArray *codecs; + LmMessageNode *desc_node; + guint i; + const gchar *xmlns; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + codecs = g_value_get_boxed (&priv->native_codecs); + + desc_node = lm_message_node_add_child (content_node, "description", NULL); + + if (priv->mode == MODE_GOOGLE) + xmlns = NS_GOOGLE_SESSION_PHONE; + else if (priv->media_type == TP_CODEC_MEDIA_TYPE_VIDEO) + xmlns = NS_JINGLE_DESCRIPTION_VIDEO; + else + xmlns = NS_JINGLE_DESCRIPTION_AUDIO; + + lm_message_node_set_attribute (desc_node, "xmlns", xmlns); + + for (i = 0; i < codecs->len; i++) + { + GValue codec = { 0, }; + guint id, clock_rate, channels; + gchar *name, buf[16]; + GHashTable *params; + LmMessageNode *pt_node; + CodecParamsFromTpContext ctx; + + g_value_init (&codec, TP_TYPE_CODEC_STRUCT); + g_value_set_static_boxed (&codec, g_ptr_array_index (codecs, i)); + + dbus_g_type_struct_get (&codec, + 0, &id, + 1, &name, + 3, &clock_rate, + 4, &channels, + 5, ¶ms, + G_MAXUINT); + + /* create a sub-node called "payload-type" and fill it */ + pt_node = lm_message_node_add_child (desc_node, "payload-type", NULL); + + /* id: required */ + sprintf (buf, "%u", id); + lm_message_node_set_attribute (pt_node, "id", buf); + + /* name: optional */ + if (*name != '\0') + { + lm_message_node_set_attribute (pt_node, "name", name); + } + + /* clock rate: optional */ + if (clock_rate != 0) + { + sprintf (buf, "%u", clock_rate); + lm_message_node_set_attribute (pt_node, + (priv->mode == MODE_GOOGLE) ? "clockrate" : "rate", buf); + } + + /* number of channels: optional, jingle only */ + /* FIXME: is it? */ + if (channels != 0 && priv->mode == MODE_JINGLE) + { + sprintf (buf, "%u", channels); + lm_message_node_set_attribute (pt_node, "channels", buf); + } + + /* parse the optional params */ + ctx.priv = priv; + ctx.pt_node = pt_node; + g_hash_table_foreach (params, codec_params_from_tp_foreach, &ctx); + + /* clean up */ + g_free (name); + g_hash_table_destroy (params); + } +} + +LmMessageNode * +_gabble_media_stream_content_node_add_transport (GabbleMediaStream *stream, + LmMessageNode *content_node) +{ + GabbleMediaStreamPrivate *priv; + LmMessageNode *node; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + if (priv->mode != MODE_JINGLE) + return content_node; + + node = lm_message_node_add_child (content_node, "transport", NULL); + + lm_message_node_set_attribute (node, "xmlns", NS_GOOGLE_TRANSPORT_P2P); + + return node; +} + +void +_gabble_media_stream_update_sending (GabbleMediaStream *stream, + gboolean start_sending) +{ + GabbleMediaStreamPrivate *priv; + gboolean new_sending; + + g_assert (GABBLE_IS_MEDIA_STREAM (stream)); + + priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream); + + new_sending = + ((stream->combined_direction & TP_MEDIA_STREAM_DIRECTION_SEND) != 0); + + if (priv->sending == new_sending) + return; + + if (new_sending && !start_sending) + return; + + priv->sending = new_sending; + push_sending (stream); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-muc-channel-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-muc-channel-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,106 @@ +/* + * gabble-muc-channel-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,UINT (gabble-muc-channel-signals-marshal.list:1) */ +void +gabble_muc_channel_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-muc-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-muc-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,3061 @@ +/* + * gabble-muc-channel.c - Source for GabbleMucChannel + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + + +#include "ansi.h" +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-error.h" +#include "namespaces.h" +#include "util.h" + +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "tp-channel-iface.h" + +#include "gabble-muc-channel.h" +#include "gabble-muc-channel-signals-marshal.h" + +#include "gabble-muc-channel-glue.h" + +#include "gabble_enums.h" + +#define DEBUG_FLAG GABBLE_DEBUG_MUC +#define DEFAULT_JOIN_TIMEOUT (180 * 1000) +#define MAX_NICK_RETRIES 3 + +#define PROPS_POLL_INTERVAL_LOW (60 * 1000 * 5) +#define PROPS_POLL_INTERVAL_HIGH (60 * 1000) + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleMucChannel, gabble_muc_channel, + G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); +#endif +/* signal enum */ +enum +{ + READY, + JOIN_ERROR, + CLOSED, + PASSWORD_FLAGS_CHANGED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_MUC +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_muc,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_muc, s)()) + + + GET_STATIC_VAR_FROM_TLS(gabble_muc_channel_parent_class,gabble_muc,gpointer) + #define gabble_muc_channel_parent_class (*GET_WSD_VAR_NAME(gabble_muc_channel_parent_class,gabble_muc,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_muc,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_muc,s)()) + + + /*gchar** _s_gabble_muc_muc_roles() { return (gchar**)((libgabble_ImpurePtr()->_s_gabble_muc_muc_roles)); } + + #define muc_roles (GET_WSD_VAR_NAME(muc_roles,gabble_muc, s)()) + + + gchar** _s_gabble_muc_muc_affiliations() { return (gchar**)((libgabble_ImpurePtr()->_s_gabble_muc_muc_affiliations)); } + + #define muc_affiliations (GET_WSD_VAR_NAME(muc_affiliations,gabble_muc, s)())*/ + + +static void gabble_muc_channel_init (GabbleMucChannel *self); +static void gabble_muc_channel_class_init (GabbleMucChannelClass *klass); +static void gabble_muc_channel_class_intern_init (gpointer klass) +{ + gabble_muc_channel_parent_class = g_type_class_peek_parent (klass); + gabble_muc_channel_class_init ((GabbleMucChannelClass*) klass); +} +EXPORT_C GType gabble_muc_channel_get_type (void) + { + if ((g_define_type_id == 0)) + { + static const GTypeInfo g_define_type_info = { sizeof (GabbleMucChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_muc_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMucChannel), 0, (GInstanceInitFunc) gabble_muc_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMucChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; + }; + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + PROP_STATE, + PROP_INVITE_SELF, + LAST_PROPERTY +}; + +typedef enum { + MUC_STATE_CREATED = 0, + MUC_STATE_INITIATED, + MUC_STATE_AUTH, + MUC_STATE_JOINED, + MUC_STATE_ENDED, +} GabbleMucState; + +#define ENABLE_DEBUG +#ifdef ENABLE_DEBUG +static const gchar *muc_states[] = +{ + "MUC_STATE_CREATED", + "MUC_STATE_INITIATED", + "MUC_STATE_AUTH", + "MUC_STATE_JOINED", + "MUC_STATE_ENDED", +}; +#endif + +/* role and affiliation enums */ +typedef enum { + ROLE_NONE = 0, + ROLE_VISITOR, + ROLE_PARTICIPANT, + ROLE_MODERATOR, + + NUM_ROLES, + + INVALID_ROLE, +} GabbleMucRole; + +typedef enum { + AFFILIATION_NONE = 0, + AFFILIATION_MEMBER, + AFFILIATION_ADMIN, + AFFILIATION_OWNER, + + NUM_AFFILIATIONS, + + INVALID_AFFILIATION, +} GabbleMucAffiliation; + +//#ifndef EMULATOR + +static const gchar *muc_roles[NUM_ROLES] = +{ + "none", + "visitor", + "participant", + "moderator", +}; + +static const gchar *muc_affiliations[NUM_AFFILIATIONS] = +{ + "none", + "member", + "admin", + "owner", +}; + +//#endif + +/* room properties */ +enum +{ + ROOM_PROP_ANONYMOUS = 0, + ROOM_PROP_INVITE_ONLY, + ROOM_PROP_MODERATED, + ROOM_PROP_NAME, + ROOM_PROP_DESCRIPTION, + ROOM_PROP_PASSWORD, + ROOM_PROP_PASSWORD_REQUIRED, + ROOM_PROP_PERSISTENT, + ROOM_PROP_PRIVATE, + ROOM_PROP_SUBJECT, + ROOM_PROP_SUBJECT_CONTACT, + ROOM_PROP_SUBJECT_TIMESTAMP, + + NUM_ROOM_PROPS, + + INVALID_ROOM_PROP, +}; + +const GabblePropertySignature room_property_signatures[NUM_ROOM_PROPS] = { + { "anonymous", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "invite-only", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "moderated", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "name", G_TYPE_STRING }, /* impl: READ, WRITE */ + { "description", G_TYPE_STRING }, /* impl: READ, WRITE */ + { "password", G_TYPE_STRING }, /* impl: WRITE */ + { "password-required", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "persistent", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "private", G_TYPE_BOOLEAN }, /* impl: READ, WRITE */ + { "subject", G_TYPE_STRING }, /* impl: READ, WRITE */ + { "subject-contact", G_TYPE_UINT }, /* impl: READ */ + { "subject-timestamp", G_TYPE_UINT }, /* impl: READ */ +}; + +/* private structures */ + +typedef struct _GabbleMucChannelPrivate GabbleMucChannelPrivate; + +struct _GabbleMucChannelPrivate +{ + GabbleConnection *conn; + gchar *object_path; + + GabbleMucState state; + + guint join_timer_id; + guint poll_timer_id; + + TpChannelPasswordFlags password_flags; + DBusGMethodInvocation *password_ctx; + gchar *password; + + GabbleHandle handle; + const gchar *jid; + + guint nick_retry_count; + GString *self_jid; + GabbleMucRole self_role; + GabbleMucAffiliation self_affil; + + guint recv_id; + + GabblePropertiesContext *properties_ctx; + + gboolean ready_emitted; + + gboolean closed; + gboolean dispose_has_run; + + gboolean invite_self; +}; + +#define GABBLE_MUC_CHANNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_MUC_CHANNEL, GabbleMucChannelPrivate)) + +static void +gabble_muc_channel_init (GabbleMucChannel *obj) +{ + /* do nothing? */ +} + +static void contact_handle_to_room_identity (GabbleMucChannel *, GabbleHandle, GabbleHandle *, GString **); + +static GObject * +gabble_muc_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleMucChannelPrivate *priv; + DBusGConnection *bus; + GabbleHandleRepo *handles; + GabbleHandle self_handle; + gboolean valid; + + obj = G_OBJECT_CLASS (gabble_muc_channel_parent_class)-> + constructor (type, n_props, props); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (obj); + + handles = priv->conn->handles; + + /* ref our room handle */ + valid = gabble_handle_ref (handles, TP_HANDLE_TYPE_ROOM, priv->handle); + g_assert (valid); + + /* get the room's jid */ + priv->jid = gabble_handle_inspect (handles, TP_HANDLE_TYPE_ROOM, priv->handle); + + /* get our own identity in the room */ + contact_handle_to_room_identity (GABBLE_MUC_CHANNEL (obj), priv->conn->self_handle, + &self_handle, &priv->self_jid); + + valid = gabble_handle_ref (handles, TP_HANDLE_TYPE_CONTACT, self_handle); + g_assert (valid); + + /* initialize our own role and affiliation */ + priv->self_role = ROLE_NONE; + priv->self_affil = AFFILIATION_NONE; + + /* register object on the bus */ + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + /* initialize group mixin */ + gabble_group_mixin_init (obj, G_STRUCT_OFFSET (GabbleMucChannel, group), + handles, self_handle); + + /* set initial group flags */ + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES | + TP_CHANNEL_GROUP_FLAG_CAN_ADD, + 0); + + /* initialize properties mixin */ + gabble_properties_mixin_init (obj, G_STRUCT_OFFSET ( + GabbleMucChannel, properties)); + + /* initialize text mixin */ + gabble_text_mixin_init (obj, G_STRUCT_OFFSET (GabbleMucChannel, text), handles, FALSE); + + gabble_text_mixin_set_message_types (obj, + TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL, + TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION, + G_MAXUINT); + + /* add ourselves to group mixin if needed */ + if (priv->invite_self) + { + GError *error = NULL; + GArray *members = g_array_sized_new (FALSE, FALSE, sizeof (GabbleHandle), 1); + g_array_append_val (members, self_handle); + gabble_group_mixin_add_members (obj, members, "", &error); + g_assert (error == NULL); + g_array_free (members, TRUE); + } + return obj; +} + +static void +properties_disco_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *query_result, + GError *error, + gpointer user_data) +{ + GabbleMucChannel *chan = user_data; + GabbleMucChannelPrivate *priv; + GArray *changed_props_val, *changed_props_flags; + LmMessageNode *lm_node; + const gchar *str; + GValue val = { 0, }; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (error) + { + gabble_debug (DEBUG_FLAG, "got error %s", error->message); + return; + } + + NODE_DEBUG (query_result, "disco query result"); + + changed_props_val = changed_props_flags = NULL; + + + /* + * Update room definition. + */ + + /* ROOM_PROP_NAME */ + lm_node = lm_message_node_get_child (query_result, "identity"); + if (lm_node) + { + const gchar *type, *category, *name; + + type = lm_message_node_get_attribute (lm_node, "type"); + category = lm_message_node_get_attribute (lm_node, "category"); + name = lm_message_node_get_attribute (lm_node, "name"); + + if (NULL != type && 0 == strcmp (type, "text") && + NULL != category && 0 == strcmp (category, "conference") && + NULL != name) + { + g_value_init (&val, G_TYPE_STRING); + g_value_set_string (&val, name); + + gabble_properties_mixin_change_value (G_OBJECT (chan), ROOM_PROP_NAME, + &val, &changed_props_val); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), ROOM_PROP_NAME, + TP_PROPERTY_FLAG_READ, + 0, &changed_props_flags); + + g_value_unset (&val); + } + } + + for (lm_node = query_result->children; lm_node; lm_node = lm_node->next) + { + guint prop_id = INVALID_ROOM_PROP; + + if (strcmp (lm_node->name, "feature") == 0) + { + str = lm_message_node_get_attribute (lm_node, "var"); + if (str == NULL) + continue; + + /* ROOM_PROP_ANONYMOUS */ + if (strcmp (str, "muc_nonanonymous") == 0) + { + prop_id = ROOM_PROP_ANONYMOUS; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_semianonymous") == 0 || + strcmp (str, "muc_anonymous") == 0) + { + prop_id = ROOM_PROP_ANONYMOUS; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* ROOM_PROP_INVITE_ONLY */ + else if (strcmp (str, "muc_open") == 0) + { + prop_id = ROOM_PROP_INVITE_ONLY; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_membersonly") == 0) + { + prop_id = ROOM_PROP_INVITE_ONLY; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* ROOM_PROP_MODERATED */ + else if (strcmp (str, "muc_unmoderated") == 0) + { + prop_id = ROOM_PROP_MODERATED; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_moderated") == 0) + { + prop_id = ROOM_PROP_MODERATED; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* ROOM_PROP_PASSWORD_REQUIRED */ + else if (strcmp (str, "muc_unsecure") == 0 || + strcmp (str, "muc_unsecured") == 0) + { + prop_id = ROOM_PROP_PASSWORD_REQUIRED; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_passwordprotected") == 0) + { + prop_id = ROOM_PROP_PASSWORD_REQUIRED; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* ROOM_PROP_PERSISTENT */ + else if (strcmp (str, "muc_temporary") == 0) + { + prop_id = ROOM_PROP_PERSISTENT; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_persistent") == 0) + { + prop_id = ROOM_PROP_PERSISTENT; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* ROOM_PROP_PRIVATE */ + else if (strcmp (str, "muc_public") == 0) + { + prop_id = ROOM_PROP_PRIVATE; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, FALSE); + } + else if (strcmp (str, "muc_hidden") == 0) + { + prop_id = ROOM_PROP_PRIVATE; + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean (&val, TRUE); + } + + /* Ignored */ + else if (strcmp (str, NS_MUC) == 0) + { + } + + /* Unhandled */ + else + { + g_warning ("%s: unhandled feature '%s'", G_STRFUNC, str); + } + } + else if (strcmp (lm_node->name, "x") == 0) + { + if (lm_message_node_has_namespace (lm_node, NS_X_DATA, NULL)) + { + LmMessageNode *field, *value_node; + + for (field = lm_node->children; field; field = field->next) + { + if (strcmp (field->name, "field") != 0) + continue; + + str = lm_message_node_get_attribute (field, "var"); + if (str == NULL) + continue; + + if (strcmp (str, "muc#roominfo_description") != 0) + continue; + + value_node = lm_message_node_get_child (field, "value"); + if (value_node == NULL) + continue; + + str = lm_message_node_get_value (value_node); + if (str == NULL) + { + str = ""; + } + + prop_id = ROOM_PROP_DESCRIPTION; + g_value_init (&val, G_TYPE_STRING); + g_value_set_string (&val, str); + } + } + } + + if (prop_id != INVALID_ROOM_PROP) + { + gabble_properties_mixin_change_value (G_OBJECT (chan), prop_id, &val, + &changed_props_val); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), prop_id, + TP_PROPERTY_FLAG_READ, + 0, &changed_props_flags); + + g_value_unset (&val); + } + } + + /* + * Emit signals. + */ + gabble_properties_mixin_emit_changed (G_OBJECT (chan), &changed_props_val); + gabble_properties_mixin_emit_flags (G_OBJECT (chan), &changed_props_flags); +} + +static void +room_properties_update (GabbleMucChannel *chan) +{ + GabbleMucChannelPrivate *priv; + GError *error = NULL; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (gabble_disco_request (priv->conn->disco, GABBLE_DISCO_TYPE_INFO, + priv->jid, NULL, properties_disco_cb, chan, G_OBJECT (chan), + &error) == NULL) + { + g_warning ("%s: disco query failed: '%s'", G_STRFUNC, error->message); + g_error_free (error); + } +} + +static void +contact_handle_to_room_identity (GabbleMucChannel *chan, GabbleHandle main_handle, + GabbleHandle *room_handle, GString **room_jid) +{ + GabbleMucChannelPrivate *priv; + GabbleHandleRepo *handles; + const gchar *main_jid; + gchar *username, *server; + gchar *jid; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + handles = priv->conn->handles; + + main_jid = gabble_handle_inspect (handles, TP_HANDLE_TYPE_CONTACT, + main_handle); + + gabble_decode_jid (main_jid, &username, &server, NULL); + + jid = g_strdup_printf ("%s/%s", priv->jid, username); + + g_free (username); + g_free (server); + + if (room_handle) + { + *room_handle = gabble_handle_for_contact (handles, jid, TRUE); + } + + if (room_jid) + { + *room_jid = g_string_new (jid); + } + + g_free (jid); +} + +static gboolean +send_join_request (GabbleMucChannel *channel, + const gchar *password, + GError **error) +{ + GabbleMucChannelPrivate *priv; + LmMessage *msg; + LmMessageNode *x_node; + gboolean ret; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (channel); + + /* build the message */ + msg = lm_message_new (priv->self_jid->str, LM_MESSAGE_TYPE_PRESENCE); + + x_node = lm_message_node_add_child (msg->node, "x", NULL); + lm_message_node_set_attribute (x_node, "xmlns", NS_MUC); + + g_free (priv->password); + + if (password != NULL) + { + priv->password = g_strdup (password); + lm_message_node_add_child (x_node, "password", password); + } + + /* send it */ + ret = _gabble_connection_send (priv->conn, msg, error); + if (!ret) + { + g_warning ("%s: _gabble_connection_send_with_reply failed", G_STRFUNC); + } + else + { + gabble_debug (DEBUG_FLAG, "join request sent"); + } + + lm_message_unref (msg); + + return ret; +} + +static gboolean +send_leave_message (GabbleMucChannel *channel, + const gchar *reason) +{ + GabbleMucChannelPrivate *priv; + LmMessage *msg; + GError *error = NULL; + gboolean ret; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (channel); + + /* build the message */ + msg = lm_message_new_with_sub_type (priv->self_jid->str, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_UNAVAILABLE); + + if (reason != NULL) + { + lm_message_node_add_child (msg->node, "status", reason); + } + + /* send it */ + ret = _gabble_connection_send (priv->conn, msg, &error); + if (!ret) + { + g_warning ("%s: _gabble_connection_send_with_reply failed", G_STRFUNC); + g_error_free (error); + } + else + { + gabble_debug (DEBUG_FLAG, "leave message sent"); + } + + lm_message_unref (msg); + + return ret; +} + +static void +gabble_muc_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMucChannel *chan = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_TEXT); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_ROOM); + break; + case PROP_HANDLE: + g_value_set_uint (value, priv->handle); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + case PROP_STATE: + g_value_set_uint (value, priv->state); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void channel_state_changed (GabbleMucChannel *chan, + GabbleMucState prev_state, + GabbleMucState new_state); + +static void +gabble_muc_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMucChannel *chan = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + GabbleMucState prev_state; + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + priv->handle = g_value_get_uint (value); + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + case PROP_STATE: + prev_state = priv->state; + priv->state = g_value_get_uint (value); + + if (priv->state != prev_state) + channel_state_changed (chan, prev_state, priv->state); + + break; + case PROP_INVITE_SELF: + priv->invite_self = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_muc_channel_dispose (GObject *object); +static void gabble_muc_channel_finalize (GObject *object); +static gboolean gabble_muc_channel_add_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); +static gboolean gabble_muc_channel_remove_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); +static gboolean gabble_muc_channel_do_set_properties (GObject *obj, GabblePropertiesContext *ctx, GError **error); + +static void +gabble_muc_channel_class_init (GabbleMucChannelClass *gabble_muc_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_muc_channel_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_muc_channel_class, sizeof (GabbleMucChannelPrivate)); + + object_class->constructor = gabble_muc_channel_constructor; + + object_class->get_property = gabble_muc_channel_get_property; + object_class->set_property = gabble_muc_channel_set_property; + + object_class->dispose = gabble_muc_channel_dispose; + object_class->finalize = gabble_muc_channel_finalize; + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "MUC channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_uint ("state", "Channel state", + "The current state that the channel is in.", + 0, G_MAXUINT32, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_STATE, param_spec); + + param_spec = g_param_spec_boolean ("invite-self", "Invite self", + "Whether the user should be added to members list.", + FALSE, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_INVITE_SELF, param_spec); + + signals[READY] = + g_signal_new ("ready", + G_OBJECT_CLASS_TYPE (gabble_muc_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[JOIN_ERROR] = + g_signal_new ("join-error", + G_OBJECT_CLASS_TYPE (gabble_muc_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_muc_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[PASSWORD_FLAGS_CHANGED] = + g_signal_new ("password-flags-changed", + G_OBJECT_CLASS_TYPE (gabble_muc_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_muc_channel_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + gabble_group_mixin_class_init (object_class, + G_STRUCT_OFFSET (GabbleMucChannelClass, group_class), + gabble_muc_channel_add_member, + gabble_muc_channel_remove_member); + + gabble_properties_mixin_class_init (object_class, + G_STRUCT_OFFSET (GabbleMucChannelClass, properties_class), + room_property_signatures, NUM_ROOM_PROPS, + gabble_muc_channel_do_set_properties); + + gabble_text_mixin_class_init (object_class, G_STRUCT_OFFSET (GabbleMucChannelClass, text_class)); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_muc_channel_class), &dbus_glib_gabble_muc_channel_object_info); +} + +static void clear_join_timer (GabbleMucChannel *chan); +static void clear_poll_timer (GabbleMucChannel *chan); + +void +gabble_muc_channel_dispose (GObject *object) +{ + GabbleMucChannel *self = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "called"); + + priv->dispose_has_run = TRUE; + + clear_join_timer (self); + clear_poll_timer (self); + + if (G_OBJECT_CLASS (gabble_muc_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_muc_channel_parent_class)->dispose (object); +} + +void +gabble_muc_channel_finalize (GObject *object) +{ + GabbleMucChannel *self = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + GabbleHandleRepo *handles = priv->conn->handles; + + gabble_debug (DEBUG_FLAG, "called"); + + /* free any data held directly by the object here */ + gabble_handle_unref (handles, TP_HANDLE_TYPE_ROOM, priv->handle); + + g_free (priv->object_path); + + if (priv->self_jid) + { + g_string_free (priv->self_jid, TRUE); + } + + g_free (priv->password); + + gabble_properties_mixin_finalize (object); + + gabble_group_mixin_finalize (object); + + gabble_text_mixin_finalize (object); + + G_OBJECT_CLASS (gabble_muc_channel_parent_class)->finalize (object); +} + +static void clear_join_timer (GabbleMucChannel *chan) +{ + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (priv->join_timer_id != 0) + { + g_source_remove (priv->join_timer_id); + priv->join_timer_id = 0; + } +} + +static void clear_poll_timer (GabbleMucChannel *chan) +{ + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (priv->poll_timer_id != 0) + { + g_source_remove (priv->poll_timer_id); + priv->poll_timer_id = 0; + } +} + +static void +change_password_flags (GabbleMucChannel *chan, + TpChannelPasswordFlags add, + TpChannelPasswordFlags remove) +{ + GabbleMucChannelPrivate *priv; + TpChannelPasswordFlags added, removed; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + added = add & ~priv->password_flags; + priv->password_flags |= added; + + removed = remove & priv->password_flags; + priv->password_flags &= ~removed; + + if (add != 0 || remove != 0) + { + gabble_debug (DEBUG_FLAG, "emitting password flags changed, added 0x%X, removed 0x%X", + added, removed); + + g_signal_emit (chan, signals[PASSWORD_FLAGS_CHANGED], 0, added, removed); + } +} + +static void +provide_password_return_if_pending (GabbleMucChannel *chan, gboolean success) +{ + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (priv->password_ctx) + { + dbus_g_method_return (priv->password_ctx, success); + priv->password_ctx = NULL; + } + + if (success) + { + change_password_flags (chan, 0, TP_CHANNEL_PASSWORD_FLAG_PROVIDE); + } +} + +static void close_channel (GabbleMucChannel *chan, const gchar *reason, gboolean inform_muc, GabbleHandle actor, guint reason_code); + +static gboolean +timeout_join (gpointer data) +{ + GabbleMucChannel *chan = data; + + gabble_debug (DEBUG_FLAG, "join timed out, closing channel"); + + provide_password_return_if_pending (chan, FALSE); + + close_channel (chan, NULL, FALSE, 0, 0); + + return FALSE; +} + +static gboolean +timeout_poll (gpointer data) +{ + GabbleMucChannel *chan = data; + + gabble_debug (DEBUG_FLAG, "polling for room properties"); + + room_properties_update (chan); + + return TRUE; +} + +static void +channel_state_changed (GabbleMucChannel *chan, + GabbleMucState prev_state, + GabbleMucState new_state) +{ + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + gabble_debug (DEBUG_FLAG, "state changed from %s to %s", muc_states[prev_state], muc_states[new_state]); + + if (new_state == MUC_STATE_INITIATED) + { + priv->join_timer_id = + g_timeout_add (DEFAULT_JOIN_TIMEOUT, timeout_join, chan); + } + else if (new_state == MUC_STATE_JOINED) + { + gboolean low_bandwidth; + gint interval; + + provide_password_return_if_pending (chan, TRUE); + + clear_join_timer (chan); + + g_object_get (priv->conn, "low-bandwidth", &low_bandwidth, NULL); + + if (low_bandwidth) + interval = PROPS_POLL_INTERVAL_LOW; + else + interval = PROPS_POLL_INTERVAL_HIGH; + + priv->poll_timer_id = g_timeout_add (interval, timeout_poll, chan); + + /* no need to keep this around any longer, if it's set */ + g_free (priv->password); + priv->password = NULL; + } + else if (new_state == MUC_STATE_ENDED) + { + clear_poll_timer (chan); + } + + if (new_state == MUC_STATE_JOINED || new_state == MUC_STATE_AUTH) + { + if (!priv->ready_emitted) + { + g_signal_emit (chan, signals[READY], 0); + + priv->ready_emitted = TRUE; + } + } +} + + +static void +close_channel (GabbleMucChannel *chan, const gchar *reason, + gboolean inform_muc, GabbleHandle actor, guint reason_code) +{ + GabbleMucChannelPrivate *priv; + GIntSet *set; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (priv->closed) + return; + + priv->closed = TRUE; + + /* Remove us from member list */ + set = g_intset_new (); + g_intset_add (set, GABBLE_GROUP_MIXIN (chan)->self_handle); + + gabble_group_mixin_change_members (G_OBJECT (chan), + (reason != NULL) ? reason : "", + NULL, set, NULL, NULL, actor, + reason_code); + + g_intset_destroy (set); + + /* Inform the MUC if requested */ + if (inform_muc && priv->state >= MUC_STATE_INITIATED) + { + send_leave_message (chan, reason); + } + + /* Update state and emit Closed signal */ + g_object_set (chan, "state", MUC_STATE_ENDED, NULL); + + g_signal_emit (chan, signals[CLOSED], 0); +} + +gboolean +_gabble_muc_channel_is_ready (GabbleMucChannel *chan) +{ + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + return priv->ready_emitted; +} + +/** + * _gabble_muc_channel_presence_error + */ +void +_gabble_muc_channel_presence_error (GabbleMucChannel *chan, + const gchar *jid, + LmMessageNode *pres_node) +{ + GabbleMucChannelPrivate *priv; + LmMessageNode *error_node; + GabbleXmppError error; + GabbleHandle actor = 0; + guint reason_code = TP_CHANNEL_GROUP_CHANGE_REASON_NONE; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + if (strcmp (jid, priv->self_jid->str) != 0) + { + g_warning ("%s: presence error from other jids than self not handled", + G_STRFUNC); + return; + } + + error_node = lm_message_node_get_child (pres_node, "error"); + if (error_node == NULL) + { + g_warning ("%s: missing required node 'error'", G_STRFUNC); + return; + } + + error = gabble_xmpp_error_from_node (error_node); + + if (priv->state >= MUC_STATE_JOINED) + { + g_warning ("%s: presence error while already member of the channel -- NYI", + G_STRFUNC); + return; + } + + /* We're not a member, find out why the join request failed + * and act accordingly. */ + if (error == XMPP_ERROR_NOT_AUTHORIZED) + { + /* channel can sit requiring a password indefinitely */ + clear_join_timer (chan); + + /* Password already provided and incorrect? */ + if (priv->state == MUC_STATE_AUTH) + { + provide_password_return_if_pending (chan, FALSE); + + return; + } + + gabble_debug (DEBUG_FLAG, "password required to join, changing password flags"); + + change_password_flags (chan, TP_CHANNEL_PASSWORD_FLAG_PROVIDE, 0); + + g_object_set (chan, "state", MUC_STATE_AUTH, NULL); + } + else + { + GError *tp_error; + + switch (error) { + case XMPP_ERROR_FORBIDDEN: + tp_error = g_error_new (TELEPATHY_ERRORS, ChannelBanned, + "banned from room"); + reason_code = TP_CHANNEL_GROUP_CHANGE_REASON_BANNED; + break; + case XMPP_ERROR_SERVICE_UNAVAILABLE: + tp_error = g_error_new (TELEPATHY_ERRORS, ChannelFull, + "room is full"); + break; + case XMPP_ERROR_REGISTRATION_REQUIRED: + tp_error = g_error_new (TELEPATHY_ERRORS, ChannelInviteOnly, + "room is invite only"); + break; + case XMPP_ERROR_CONFLICT: + if (priv->nick_retry_count < MAX_NICK_RETRIES) + { + g_string_append_c (priv->self_jid, '_'); + + if (send_join_request (chan, priv->password, &tp_error)) + { + priv->nick_retry_count++; + return; + } + } + else + { + tp_error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "nickname already in use and retry count exceeded"); + } + break; + default: + if (error != INVALID_XMPP_ERROR) + { + tp_error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + gabble_xmpp_error_description (error)); + } + else + { + tp_error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "unknown error"); + } + break; + } + + g_signal_emit (chan, signals[JOIN_ERROR], 0, tp_error); + + close_channel (chan, tp_error->message, FALSE, actor, reason_code); + + g_error_free (tp_error); + } +} + +static GabbleMucRole +get_role_from_string (const gchar *role) +{ + guint i; + + if (role == NULL) + { + return ROLE_VISITOR; + } + + for (i = 0; i < NUM_ROLES; i++) + { + if (strcmp (role, muc_roles[i]) == 0) + { + return i; + } + } + + g_warning ("%s: unknown role '%s' -- defaulting to ROLE_VISITOR", + G_STRFUNC, role); + + return ROLE_VISITOR; +} + +static GabbleMucAffiliation +get_affiliation_from_string (const gchar *affil) +{ + guint i; + + if (affil == NULL) + { + return AFFILIATION_NONE; + } + + for (i = 0; i < NUM_AFFILIATIONS; i++) + { + if (strcmp (affil, muc_affiliations[i]) == 0) + { + return i; + } + } + + g_warning ("%s: unknown affiliation '%s' -- defaulting to " + "AFFILIATION_NONE", G_STRFUNC, affil); + + return AFFILIATION_NONE; +} + +static LmHandlerResult +room_created_submit_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, + gpointer user_data) +{ + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + g_warning ("%s: failed to submit room config", G_STRFUNC); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmMessageNode * +config_form_get_form_node (LmMessage *msg) +{ + LmMessageNode *node; + + /* find the query node */ + node = lm_message_node_get_child (msg->node, "query"); + if (node == NULL) + return NULL; + + /* then the form node */ + for (node = node->children; node; node = node->next) + { + if (strcmp (node->name, "x") == 0) + { + if (!lm_message_node_has_namespace (node, NS_X_DATA, NULL)) + { + continue; + } + + if (strcmp (lm_message_node_get_attribute (node, "type"), + "form") != 0) + { + continue; + } + + return node; + } + } + + return NULL; +} + +static LmHandlerResult +perms_config_form_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, + gpointer user_data) +{ + GabbleMucChannel *chan = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + LmMessageNode *form_node, *node; + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + g_warning ("%s: request for config form denied, property permissions " + "will be inaccurate", G_STRFUNC); + goto OUT; + } + + /* just in case our affiliation has changed in the meantime */ + if (priv->self_affil != AFFILIATION_OWNER) + goto OUT; + + form_node = config_form_get_form_node (reply_msg); + if (form_node == NULL) + { + g_warning ("%s: form node node found, property permissions will be " + "inaccurate", G_STRFUNC); + goto OUT; + } + + for (node = form_node->children; node; node = node->next) + { + const gchar *var; + + if (strcmp (node->name, "field") != 0) + continue; + + var = lm_message_node_get_attribute (node, "var"); + if (var == NULL) + continue; + + if (strcmp (var, "muc#roomconfig_roomdesc") == 0 || + strcmp (var, "muc#owner_roomdesc") == 0) + { + if (gabble_properties_mixin_is_readable (G_OBJECT (chan), + ROOM_PROP_DESCRIPTION)) + { + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_DESCRIPTION, TP_PROPERTY_FLAG_WRITE, 0, + NULL); + + goto OUT; + } + } + } + +OUT: + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static void +update_permissions (GabbleMucChannel *chan) +{ + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + TpChannelGroupFlags grp_flags_add, grp_flags_rem; + TpPropertyFlags prop_flags_add, prop_flags_rem; + GArray *changed_props_val, *changed_props_flags; + + /* + * Update group flags. + */ + grp_flags_add = TP_CHANNEL_GROUP_FLAG_CAN_ADD | + TP_CHANNEL_GROUP_FLAG_MESSAGE_ADD; + grp_flags_rem = 0; + + if (priv->self_role == ROLE_MODERATOR) + { + grp_flags_add |= TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE; + } + else + { + grp_flags_rem |= TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE; + } + + gabble_group_mixin_change_flags (G_OBJECT (chan), grp_flags_add, + grp_flags_rem); + + + /* + * Update write capabilities based on room configuration + * and own role and affiliation. + */ + + changed_props_val = changed_props_flags = NULL; + + /* + * Subject + * + * FIXME: this might be allowed for participants/moderators only, + * so for now just rely on the server making that call. + */ + + if (priv->self_role >= ROLE_VISITOR) + { + prop_flags_add = TP_PROPERTY_FLAG_WRITE; + prop_flags_rem = 0; + } + else + { + prop_flags_add = 0; + prop_flags_rem = TP_PROPERTY_FLAG_WRITE; + } + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_SUBJECT, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + /* Room definition */ + if (priv->self_affil == AFFILIATION_OWNER) + { + prop_flags_add = TP_PROPERTY_FLAG_WRITE; + prop_flags_rem = 0; + } + else + { + prop_flags_add = 0; + prop_flags_rem = TP_PROPERTY_FLAG_WRITE; + } + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_ANONYMOUS, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_INVITE_ONLY, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_MODERATED, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_NAME, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_PASSWORD, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_PASSWORD_REQUIRED, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_PERSISTENT, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_PRIVATE, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_SUBJECT, prop_flags_add, prop_flags_rem, + &changed_props_flags); + + if (priv->self_affil == AFFILIATION_OWNER) + { + /* request the configuration form purely to see if the description + * is writable by us in this room. sigh. GO MUC!!! */ + LmMessage *msg; + LmMessageNode *node; + GError *error = NULL; + gboolean success; + + msg = lm_message_new_with_sub_type (priv->jid, + LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET); + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_MUC_OWNER); + + success = _gabble_connection_send_with_reply (priv->conn, msg, + perms_config_form_reply_cb, G_OBJECT (chan), NULL, + &error); + + lm_message_unref (msg); + + if (!success) + { + g_warning ("%s: failed to request config form: %s", + G_STRFUNC, error->message); + g_error_free (error); + } + } + else + { + /* mark description unwritable if we're no longer an owner */ + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_DESCRIPTION, 0, TP_PROPERTY_FLAG_WRITE, + &changed_props_flags); + } + + /* + * Emit signals. + */ + gabble_properties_mixin_emit_changed (G_OBJECT (chan), &changed_props_val); + gabble_properties_mixin_emit_flags (G_OBJECT (chan), &changed_props_flags); +} + +/** + * _gabble_muc_channel_member_presence_updated + */ +void +_gabble_muc_channel_member_presence_updated (GabbleMucChannel *chan, + GabbleHandle handle, + LmMessage *message, + LmMessageNode *x_node) +{ + GabbleMucChannelPrivate *priv; + GIntSet *set; + GabbleGroupMixin *mixin; + LmMessageNode *item_node, *node; + const gchar *affil, *role, *owner_jid, *status_code; + GabbleHandle actor = 0; + guint reason_code = TP_CHANNEL_GROUP_CHANGE_REASON_NONE; + + gabble_debug (DEBUG_FLAG, "called"); + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + mixin = GABBLE_GROUP_MIXIN (chan); + + item_node = lm_message_node_get_child (x_node, "item"); + if (item_node == NULL) + { + g_warning ("%s: node missing 'item' child, ignoring", G_STRFUNC); + return; + } + + node = lm_message_node_get_child (x_node, "status"); + if (node) + { + status_code = lm_message_node_get_attribute (node, "code"); + } + else + { + status_code = NULL; + } + + role = lm_message_node_get_attribute (item_node, "role"); + affil = lm_message_node_get_attribute (item_node, "affiliation"); + owner_jid = lm_message_node_get_attribute (item_node, "jid"); + + /* update channel members according to presence */ + set = g_intset_new (); + g_intset_add (set, handle); + + if (lm_message_get_sub_type (message) != LM_MESSAGE_SUB_TYPE_UNAVAILABLE) + { + if (!handle_set_is_member (mixin->members, handle)) + { + gabble_group_mixin_change_members (G_OBJECT (chan), "", set, NULL, + NULL, NULL, 0, 0); + + if (owner_jid != NULL) + { + GabbleHandle owner_handle; + + owner_handle = gabble_handle_for_contact ( + chan->group.handle_repo, owner_jid, FALSE); + + gabble_group_mixin_add_handle_owner (G_OBJECT (chan), handle, + owner_handle); + } + + if (handle == mixin->self_handle) + { + g_object_set (chan, "state", MUC_STATE_JOINED, NULL); + } + } + + if (handle == mixin->self_handle) + { + GabbleMucRole new_role; + GabbleMucAffiliation new_affil; + + /* accept newly-created room settings before we send anything + * below which queryies them. */ + if (status_code && strcmp (status_code, "201") == 0) + { + LmMessage *msg; + GError *error = NULL; + + msg = lm_message_new_with_sub_type (priv->jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_MUC_OWNER); + + node = lm_message_node_add_child (node, "x", NULL); + lm_message_node_set_attributes (node, + "xmlns", NS_X_DATA, + "type", "submit", + NULL); + + if (!_gabble_connection_send_with_reply (priv->conn, msg, + room_created_submit_reply_cb, G_OBJECT (chan), NULL, &error)) + { + g_warning ("%s: failed to send submit message: %s", G_STRFUNC, + error->message); + g_error_free (error); + + close_channel (chan, NULL, TRUE, actor, reason_code); + + goto OUT; + } + } + + /* Update room properties */ + room_properties_update (chan); + + /* update permissions after requesting new properties so that if we + * become an owner, we get our configuration form reply after the + * discovery reply, so we know whether there is a description + * property before we try and decide whether we can write to it. */ + new_role = get_role_from_string (role); + new_affil = get_affiliation_from_string (affil); + + if (new_role != priv->self_role || new_affil != priv->self_affil) + { + priv->self_role = new_role; + priv->self_affil = new_affil; + + update_permissions (chan); + } + } + } + else + { + LmMessageNode *reason_node, *actor_node; + const gchar *reason = "", *actor_jid = ""; + + actor_node = lm_message_node_get_child (item_node, "actor"); + if (actor_node != NULL) + { + actor_jid = lm_message_node_get_attribute (actor_node, "jid"); + if (actor_jid != NULL) + { + actor = gabble_handle_for_contact(chan->group.handle_repo, actor_jid, FALSE); + } + } + + /* Possible reasons we could have been removed from the room: + * 301 banned + * 307 kicked + * 321 "because of an affiliation change" - no reason_code + * 322 room has become members-only and we're not a member - no reason_code + * 332 system (server) is being shut down - no reason code + */ + if (status_code) + { + if (strcmp (status_code, "301") == 0) + { + reason_code = TP_CHANNEL_GROUP_CHANGE_REASON_BANNED; + } + else if (strcmp (status_code, "307") == 0) + { + reason_code = TP_CHANNEL_GROUP_CHANGE_REASON_KICKED; + } + } + + reason_node = lm_message_node_get_child (item_node, "reason"); + if (reason_node != NULL) + { + reason = lm_message_node_get_value (reason_node); + } + + if (handle != mixin->self_handle) + { + gabble_group_mixin_change_members (G_OBJECT (chan), reason, + NULL, set, NULL, NULL, + actor, reason_code); + } + else + { + close_channel (chan, reason, FALSE, actor, reason_code); + } + } + +OUT: + g_intset_destroy (set); +} + + +/** + * _gabble_muc_channel_receive + */ +gboolean +_gabble_muc_channel_receive (GabbleMucChannel *chan, + TpChannelTextMessageType msg_type, + TpHandleType handle_type, + GabbleHandle sender, + time_t timestamp, + const gchar *text, + LmMessage *msg) +{ + gboolean error; + GabbleMucChannelPrivate *priv; + LmMessageNode *subj_node, *node; + GValue val = { 0, }; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + error = lm_message_get_sub_type (msg) == LM_MESSAGE_SUB_TYPE_ERROR; + + subj_node = lm_message_node_get_child (msg->node, "subject"); + + if (subj_node) + { + GArray *changed_values, *changed_flags; + + if (priv->properties_ctx) + { + gabble_properties_context_remove (priv->properties_ctx, + ROOM_PROP_SUBJECT); + } + + if (error) + { + GabbleXmppError xmpp_error = INVALID_XMPP_ERROR; + const gchar *err_desc = NULL; + + node = lm_message_node_get_child (msg->node, "error"); + if (node) + { + xmpp_error = gabble_xmpp_error_from_node (node); + } + + if (xmpp_error != INVALID_XMPP_ERROR) + { + err_desc = gabble_xmpp_error_description (xmpp_error); + } + + if (priv->properties_ctx) + { + GError *error = NULL; + + error = g_error_new (TELEPATHY_ERRORS, PermissionDenied, + (err_desc) ? err_desc : "failed to change subject"); + + gabble_properties_context_return (priv->properties_ctx, error); + priv->properties_ctx = NULL; + + /* Get the properties into a consistent state. */ + room_properties_update (chan); + } + + return TRUE; + } + + changed_values = changed_flags = NULL; + + /* ROOM_PROP_SUBJECT */ + g_value_init (&val, G_TYPE_STRING); + g_value_set_string (&val, lm_message_node_get_value (subj_node)); + + gabble_properties_mixin_change_value (G_OBJECT (chan), + ROOM_PROP_SUBJECT, &val, &changed_values); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_SUBJECT, TP_PROPERTY_FLAG_READ, 0, + &changed_flags); + + g_value_unset (&val); + + if (handle_type == TP_HANDLE_TYPE_CONTACT) + { + /* ROOM_PROP_SUBJECT_CONTACT */ + g_value_init (&val, G_TYPE_UINT); + g_value_set_uint (&val, sender); + + gabble_properties_mixin_change_value (G_OBJECT (chan), + ROOM_PROP_SUBJECT_CONTACT, &val, &changed_values); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_SUBJECT_CONTACT, TP_PROPERTY_FLAG_READ, 0, + &changed_flags); + + g_value_unset (&val); + } + + /* ROOM_PROP_SUBJECT_TIMESTAMP */ + g_value_init (&val, G_TYPE_UINT); + g_value_set_uint (&val, timestamp); + + gabble_properties_mixin_change_value (G_OBJECT (chan), + ROOM_PROP_SUBJECT_TIMESTAMP, &val, &changed_values); + + gabble_properties_mixin_change_flags (G_OBJECT (chan), + ROOM_PROP_SUBJECT_TIMESTAMP, TP_PROPERTY_FLAG_READ, 0, + &changed_flags); + + g_value_unset (&val); + + /* Emit signals */ + gabble_properties_mixin_emit_changed (G_OBJECT (chan), &changed_values); + gabble_properties_mixin_emit_flags (G_OBJECT (chan), &changed_flags); + + if (priv->properties_ctx) + { + if (gabble_properties_context_return_if_done (priv->properties_ctx)) + { + priv->properties_ctx = NULL; + } + } + + return TRUE; + } + else if (handle_type == TP_HANDLE_TYPE_ROOM) + { + NODE_DEBUG (msg->node, "ignoring message from channel"); + + return TRUE; + } + else if ((sender == chan->group.self_handle) && (timestamp == 0)) + { + /* If we sent the message and it's not delayed, just emit the sent signal */ + timestamp = time (NULL); + gabble_text_mixin_emit_sent (G_OBJECT (chan), timestamp, msg_type, text); + + return TRUE; + } + + /* Receive messages from other contacts and our own if they're delayed, and + * set the timestamp for non-delayed messages */ + if (timestamp == 0) + timestamp = time (NULL); + + return gabble_text_mixin_receive (G_OBJECT (chan), msg_type, sender, + timestamp, text); +} + +void +_gabble_muc_channel_handle_invited (GabbleMucChannel *chan, + GabbleHandle inviter, + const gchar *message) +{ + GabbleMucChannelPrivate *priv; + GabbleHandle self_handle; + GIntSet *set_members, *set_pending; + + g_assert (GABBLE_IS_MUC_CHANNEL (chan)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + + /* add ourself to local pending and the inviter to members */ + set_members = g_intset_new (); + set_pending = g_intset_new (); + + g_intset_add (set_members, inviter); + + /* get our own identity in the room */ + contact_handle_to_room_identity (chan, priv->conn->self_handle, + &self_handle, &priv->self_jid); + g_intset_add (set_pending, self_handle); + + gabble_group_mixin_change_members (G_OBJECT (chan), message, set_members, + NULL, set_pending, NULL, inviter, + TP_CHANNEL_GROUP_CHANGE_REASON_INVITED); + + g_intset_destroy (set_members); + g_intset_destroy (set_pending); + + /* queue the message */ + if (message && (message[0] != '\0')) + { + gabble_text_mixin_receive (G_OBJECT (chan), TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE, inviter, + time(NULL), message); + } + + /* emit READY signal so NewChannel is emitted */ + g_signal_emit (chan, signals[READY], 0); + priv->ready_emitted = TRUE; +} + + +/** + * gabble_muc_channel_acknowledge_pending_messages + * + * Implements D-Bus method AcknowledgePendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_acknowledge_pending_messages (GabbleMucChannel *self, + const GArray *ids, + GError **error) +{ + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + return gabble_text_mixin_acknowledge_pending_messages (G_OBJECT (self), ids, + error); +} + + +/** + * gabble_muc_channel_add_members + * + * Implements D-Bus method AddMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_add_members (GabbleMucChannel *self, + const GArray *contacts, + const gchar *message, + GError **error) +{ + return gabble_group_mixin_add_members (G_OBJECT (self), contacts, message, + error); +} + + +/** + * gabble_muc_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_close (GabbleMucChannel *self, + GError **error) +{ + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + gabble_debug (DEBUG_FLAG, "called on %p", self); + + if (priv->closed) + { + gabble_debug (DEBUG_FLAG, "channel already closed"); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Channel already closed"); + + return FALSE; + } + + close_channel (self, NULL, TRUE, 0, 0); + + return TRUE; +} + + +/** + * gabble_muc_channel_get_all_members + * + * Implements D-Bus method GetAllMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_all_members (GabbleMucChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error) +{ + return gabble_group_mixin_get_all_members (G_OBJECT (self), ret, ret1, ret2, + error); +} + + +/** + * gabble_muc_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_channel_type (GabbleMucChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_TEXT); + + return TRUE; +} + + +/** + * gabble_muc_channel_get_group_flags + * + * Implements D-Bus method GetGroupFlags + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_group_flags (GabbleMucChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_group_flags (G_OBJECT (self), ret, error); +} + + +/** + * gabble_muc_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_handle (GabbleMucChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + *ret = TP_HANDLE_TYPE_ROOM; + *ret1 = priv->handle; + + return TRUE; +} + + +/** + * gabble_muc_channel_get_handle_owners + * + * Implements D-Bus method GetHandleOwners + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_handle_owners (GabbleMucChannel *self, + const GArray *handles, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_handle_owners (G_OBJECT (self), handles, ret, + error); +} + + +/** + * gabble_muc_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_interfaces (GabbleMucChannel *self, + gchar ***ret, + GError **error) +{ + const gchar *interfaces[] = { + TP_IFACE_CHANNEL_INTERFACE_GROUP, + TP_IFACE_CHANNEL_INTERFACE_PASSWORD, + TP_IFACE_PROPERTIES, + NULL + }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_muc_channel_get_local_pending_members + * + * Implements D-Bus method GetLocalPendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_local_pending_members (GabbleMucChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_local_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_muc_channel_get_members + * + * Implements D-Bus method GetMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_members (GabbleMucChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_members (G_OBJECT (self), ret, error); +} + + + + +/** + * gabble_muc_channel_get_message_types + * + * Implements D-Bus method GetMessageTypes + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_message_types (GabbleMucChannel *self, + GArray **ret, + GError **error) +{ + return gabble_text_mixin_get_message_types (G_OBJECT (self), ret, error); +} + + +/** + * gabble_muc_channel_get_password_flags + * + * Implements D-Bus method GetPasswordFlags + * on interface org.freedesktop.Telepathy.Channel.Interface.Password + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_password_flags (GabbleMucChannel *self, + guint *ret, + GError **error) +{ + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + *ret = priv->password_flags; + + return TRUE; +} + + +/** + * gabble_muc_channel_get_remote_pending_members + * + * Implements D-Bus method GetRemotePendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_remote_pending_members (GabbleMucChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_remote_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_muc_channel_get_self_handle + * + * Implements D-Bus method GetSelfHandle + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_self_handle (GabbleMucChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_self_handle (G_OBJECT (self), ret, error); +} + + +/** + * gabble_muc_channel_list_pending_messages + * + * Implements D-Bus method ListPendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_list_pending_messages (GabbleMucChannel *self, + gboolean clear, + GPtrArray **ret, + GError **error) +{ + return gabble_text_mixin_list_pending_messages (G_OBJECT (self), clear, ret, + error); +} + + +/** + * gabble_muc_channel_provide_password + * + * Implements D-Bus method ProvidePassword + * on interface org.freedesktop.Telepathy.Channel.Interface.Password + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_muc_channel_provide_password (GabbleMucChannel *self, + const gchar *password, + DBusGMethodInvocation *context) +{ + GError *error = NULL; + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + if ((priv->password_flags & TP_CHANNEL_PASSWORD_FLAG_PROVIDE) == 0 || + priv->password_ctx != NULL) + { + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "password cannot be provided in the current state"); + dbus_g_method_return_error (context, error); + g_error_free (error); + + return; + } + + if (!send_join_request (self, password, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + + return; + } + + priv->password_ctx = context; +} + + +/** + * gabble_muc_channel_remove_members + * + * Implements D-Bus method RemoveMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_muc_channel_remove_members (GabbleMucChannel *obj, const GArray * contacts, const gchar * message, GError **error) +{ + return gabble_group_mixin_remove_members (G_OBJECT (obj), contacts, message, error); +} + +/** + * gabble_muc_channel_send + * + * Implements D-Bus method Send + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_send (GabbleMucChannel *self, + guint type, + const gchar *text, + GError **error) +{ + GabbleMucChannelPrivate *priv; + + g_assert (GABBLE_IS_MUC_CHANNEL (self)); + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (self); + + return gabble_text_mixin_send (G_OBJECT (self), type, + LM_MESSAGE_SUB_TYPE_GROUPCHAT, priv->jid, text, priv->conn, + FALSE /* emit_signal */, error); +} + + +static gboolean +gabble_muc_channel_add_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error) +{ + GabbleMucChannelPrivate *priv; + GabbleGroupMixin *mixin; + const gchar *jid; + LmMessage *msg; + LmMessageNode *x_node, *invite_node; + gboolean result; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (GABBLE_MUC_CHANNEL (obj)); + + mixin = GABBLE_GROUP_MIXIN (obj); + + if (handle == mixin->self_handle) + { + GIntSet *set_empty, *set_members, *set_pending; + GArray *arr_members; + + /* are we already a member or in remote pending? */ + if (handle_set_is_member (mixin->members, handle) || + handle_set_is_member (mixin->remote_pending, handle)) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "already a member or in remote pending"); + + return FALSE; + } + + /* add ourself to remote pending and remove the inviter's + * main jid from the member list */ + set_empty = g_intset_new (); + set_members = g_intset_new (); + set_pending = g_intset_new (); + + arr_members = handle_set_to_array (mixin->members); + if (arr_members->len > 0) + { + g_intset_add (set_members, g_array_index (arr_members, guint32, 0)); + } + g_array_free (arr_members, TRUE); + + g_intset_add (set_pending, handle); + + gabble_group_mixin_change_members (obj, "", set_empty, set_members, + set_empty, set_pending, 0, + TP_CHANNEL_GROUP_CHANGE_REASON_INVITED); + + g_intset_destroy (set_empty); + g_intset_destroy (set_members); + g_intset_destroy (set_pending); + + /* seek to enter the room */ + result = send_join_request (GABBLE_MUC_CHANNEL (obj), NULL, error); + + g_object_set (obj, "state", + (result) ? MUC_STATE_INITIATED : MUC_STATE_ENDED, + NULL); + + /* deny adding */ + gabble_group_mixin_change_flags (obj, 0, TP_CHANNEL_GROUP_FLAG_CAN_ADD); + + /* clear message queue (which might contain an invite reason) */ + gabble_text_mixin_clear (G_OBJECT (obj)); + + return result; + } + + /* check that we're indeed a member when attempting to invite others */ + if (priv->state < MUC_STATE_JOINED) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "channel membership is required for inviting others"); + + return FALSE; + } + + msg = lm_message_new (priv->jid, LM_MESSAGE_TYPE_MESSAGE); + + x_node = lm_message_node_add_child (msg->node, "x", NULL); + lm_message_node_set_attribute (x_node, "xmlns", NS_MUC_USER); + + invite_node = lm_message_node_add_child (x_node, "invite", NULL); + + jid = gabble_handle_inspect (GABBLE_GROUP_MIXIN (obj)->handle_repo, + TP_HANDLE_TYPE_CONTACT, handle); + + lm_message_node_set_attribute (invite_node, "to", jid); + + if (*message != '\0') + { + lm_message_node_add_child (invite_node, "reason", message); + } + + NODE_DEBUG (msg->node, "sending MUC invitation"); + + result = _gabble_connection_send (priv->conn, msg, error); + lm_message_unref (msg); + + return result; +} + +static LmHandlerResult +kick_request_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, + gpointer user_data) +{ + const gchar *jid = user_data; + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + g_warning ("%s: Failed to kick user %s from room", G_STRFUNC, jid); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static gboolean +gabble_muc_channel_remove_member (GObject *obj, GabbleHandle handle, const gchar *message, GError **error) +{ + GabbleMucChannelPrivate *priv; + LmMessage *msg; + LmMessageNode *query_node, *item_node; + const gchar *jid; + gchar *nick; + gboolean result; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (GABBLE_MUC_CHANNEL (obj)); + + msg = lm_message_new_with_sub_type (priv->jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + query_node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (query_node, "xmlns", NS_MUC_ADMIN); + + item_node = lm_message_node_add_child (query_node, "item", NULL); + + jid = gabble_handle_inspect (GABBLE_GROUP_MIXIN (obj)->handle_repo, + TP_HANDLE_TYPE_CONTACT, handle); + + gabble_decode_jid (jid, NULL, NULL, &nick); + + lm_message_node_set_attributes (item_node, + "nick", nick, + "role", "none", + NULL); + + g_free (nick); + + if (*message != '\0') + { + lm_message_node_add_child (item_node, "reason", message); + } + + NODE_DEBUG (msg->node, "sending MUC kick request"); + + result = _gabble_connection_send_with_reply (priv->conn, msg, + kick_request_reply_cb, + obj, (gpointer) jid, + error); + + lm_message_unref (msg); + + return result; +} + + +/** + * gabble_muc_channel_list_properties + * + * Implements D-Bus method ListProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_list_properties (GabbleMucChannel *self, + GPtrArray **ret, + GError **error) +{ + return gabble_properties_mixin_list_properties (G_OBJECT (self), ret, error); +} + + +/** + * gabble_muc_channel_get_properties + * + * Implements D-Bus method GetProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_muc_channel_get_properties (GabbleMucChannel *self, + const GArray *properties, + GPtrArray **ret, + GError **error) +{ + return gabble_properties_mixin_get_properties (G_OBJECT (self), properties, + ret, error); +} + +/** + * gabble_muc_channel_set_properties + * + * Implements D-Bus method SetProperties + * on interface org.freedesktop.Telepathy.Properties + * + * @context: The D-Bus invocation context to use to return values + * or throw an error. + */ +void +gabble_muc_channel_set_properties (GabbleMucChannel *self, + const GPtrArray *properties, + DBusGMethodInvocation *context) +{ + gabble_properties_mixin_set_properties (G_OBJECT (self), properties, + context); +} + +static LmHandlerResult request_config_form_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, LmMessage *reply_msg, GObject *object, gpointer user_data); + +static gboolean +gabble_muc_channel_do_set_properties (GObject *obj, GabblePropertiesContext *ctx, GError **error) +{ + GabbleMucChannelPrivate *priv; + LmMessage *msg; + LmMessageNode *node; + gboolean success; + + priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (GABBLE_MUC_CHANNEL (obj)); + + g_assert (priv->properties_ctx == NULL); + + /* Changing subject? */ + if (gabble_properties_context_has (ctx, ROOM_PROP_SUBJECT)) + { + const gchar *str; + + str = g_value_get_string (gabble_properties_context_get (ctx, ROOM_PROP_SUBJECT)); + + msg = lm_message_new_with_sub_type (priv->jid, + LM_MESSAGE_TYPE_MESSAGE, LM_MESSAGE_SUB_TYPE_GROUPCHAT); + lm_message_node_add_child (msg->node, "subject", str); + + success = _gabble_connection_send (priv->conn, msg, error); + + lm_message_unref (msg); + + if (!success) + return FALSE; + } + + /* Changing any other properties? */ + if (gabble_properties_context_has_other_than (ctx, ROOM_PROP_SUBJECT)) + { + msg = lm_message_new_with_sub_type (priv->jid, + LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET); + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_MUC_OWNER); + + success = _gabble_connection_send_with_reply (priv->conn, msg, + request_config_form_reply_cb, G_OBJECT (obj), NULL, + error); + + lm_message_unref (msg); + + if (!success) + return FALSE; + } + + priv->properties_ctx = ctx; + + return TRUE; +} + +static LmHandlerResult request_config_form_submit_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, LmMessage *reply_msg, GObject *object, gpointer user_data); + +static LmHandlerResult +request_config_form_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, + gpointer user_data) +{ + GabbleMucChannel *chan = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + GabblePropertiesContext *ctx = priv->properties_ctx; + GError *error = NULL; + LmMessage *msg = NULL; + LmMessageNode *submit_node, *form_node, *node, *query_node; + guint i, props_left; + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + error = g_error_new (TELEPATHY_ERRORS, PermissionDenied, + "request for configuration form denied"); + + goto OUT; + } + + form_node = config_form_get_form_node (reply_msg); + if (form_node == NULL) + goto PARSE_ERROR; + + /* initialize */ + msg = lm_message_new_with_sub_type (priv->jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_MUC_OWNER); + + submit_node = lm_message_node_add_child (node, "x", NULL); + lm_message_node_set_attributes (submit_node, + "xmlns", NS_X_DATA, + "type", "submit", + NULL); + + /* find the query node */ + query_node = lm_message_node_get_child (reply_msg->node, "query"); + if (query_node == NULL) + goto PARSE_ERROR; + + /* then the form node */ + form_node = NULL; + for (node = query_node->children; node; node = node->next) + { + if (strcmp (node->name, "x") == 0) + { + const gchar *type = lm_message_node_get_attribute (node, "type"); + + if (!lm_message_node_has_namespace (node, NS_X_DATA, NULL)) + continue; + + if (g_strdiff (type, "form")) + continue; + + form_node = node; + break; + } + } + + if (form_node == NULL) + goto PARSE_ERROR; + + props_left = 0; + for (i = 0; i < NUM_ROOM_PROPS; i++) + { + if (i == ROOM_PROP_SUBJECT) + continue; + + if (gabble_properties_context_has (ctx, i)) + props_left |= 1 << i; + } + + for (node = form_node->children; node; node = node->next) + { + const gchar *var, *prev_value; + LmMessageNode *field_node, *value_node; + guint id; + GType type; + gboolean invert; + gchar buf[16]; + const gchar *val_str; + gboolean val_bool; + + if (strcmp (node->name, "field") != 0) + { + gabble_debug (DEBUG_FLAG, "skipping node '%s'", node->name); + continue; + } + + var = lm_message_node_get_attribute (node, "var"); + if (var == NULL) { + gabble_debug (DEBUG_FLAG, "skipping node '%s' because of lacking var attribute", + node->name); + continue; + } + + value_node = lm_message_node_get_child (node, "value"); + if (value_node == NULL) + { + gabble_debug (DEBUG_FLAG, "skipping var '%s' because of lacking value attribute", + var); + continue; + } + + prev_value = lm_message_node_get_value (value_node); + + /* add the corresponding field node to the reply message */ + field_node = lm_message_node_add_child (submit_node, "field", NULL); + + lm_message_node_set_attribute (field_node, "var", var); + + val_str = lm_message_node_get_attribute (node, "type"); + if (val_str) + { + lm_message_node_set_attribute (field_node, "type", val_str); + } + + value_node = lm_message_node_add_child (field_node, "value", prev_value); + + id = INVALID_ROOM_PROP; + type = G_TYPE_BOOLEAN; + invert = FALSE; + val_str = NULL; + + if (strcmp (var, "anonymous") == 0) + { + id = ROOM_PROP_ANONYMOUS; + } + else if (strcmp (var, "muc#roomconfig_whois") == 0) + { + id = ROOM_PROP_ANONYMOUS; + + if (gabble_properties_context_has (ctx, id)) + { + val_bool = g_value_get_boolean ( + gabble_properties_context_get (ctx, id)); + val_str = (val_bool) ? "moderators" : "anyone"; + } + } + else if (strcmp (var, "muc#owner_whois") == 0) + { + id = ROOM_PROP_ANONYMOUS; + + if (gabble_properties_context_has (ctx, id)) + { + val_bool = g_value_get_boolean ( + gabble_properties_context_get (ctx, id)); + val_str = (val_bool) ? "admins" : "anyone"; + } + } + else if (strcmp (var, "members_only") == 0 || + strcmp (var, "muc#roomconfig_membersonly") == 0 || + strcmp (var, "muc#owner_inviteonly") == 0) + { + id = ROOM_PROP_INVITE_ONLY; + } + else if (strcmp (var, "moderated") == 0 || + strcmp (var, "muc#roomconfig_moderatedroom") == 0 || + strcmp (var, "muc#owner_moderatedroom") == 0) + { + id = ROOM_PROP_MODERATED; + } + else if (strcmp (var, "title") == 0 || + strcmp (var, "muc#roomconfig_roomname") == 0 || + strcmp (var, "muc#owner_roomname") == 0) + { + id = ROOM_PROP_NAME; + type = G_TYPE_STRING; + } + else if (strcmp (var, "muc#roomconfig_roomdesc") == 0 || + strcmp (var, "muc#owner_roomdesc") == 0) + { + id = ROOM_PROP_DESCRIPTION; + type = G_TYPE_STRING; + } + else if (strcmp (var, "password") == 0 || + strcmp (var, "muc#roomconfig_roomsecret") == 0 || + strcmp (var, "muc#owner_roomsecret") == 0) + { + id = ROOM_PROP_PASSWORD; + type = G_TYPE_STRING; + } + else if (strcmp (var, "password_protected") == 0 || + strcmp (var, "muc#roomconfig_passwordprotectedroom") == 0 || + strcmp (var, "muc#owner_passwordprotectedroom") == 0) + { + id = ROOM_PROP_PASSWORD_REQUIRED; + } + else if (strcmp (var, "persistent") == 0 || + strcmp (var, "muc#roomconfig_persistentroom") == 0 || + strcmp (var, "muc#owner_persistentroom") == 0) + { + id = ROOM_PROP_PERSISTENT; + } + else if (strcmp (var, "public") == 0 || + strcmp (var, "muc#roomconfig_publicroom") == 0 || + strcmp (var, "muc#owner_publicroom") == 0) + { + id = ROOM_PROP_PRIVATE; + invert = TRUE; + } + else + { + g_warning ("%s: ignoring field '%s'", G_STRFUNC, var); + continue; + } + + gabble_debug (DEBUG_FLAG, "looking up %s", room_property_signatures[id].name); + + if (!gabble_properties_context_has (ctx, id)) + continue; + + if (!val_str) + { + const GValue *provided_value; + + provided_value = gabble_properties_context_get (ctx, id); + + switch (type) { + case G_TYPE_BOOLEAN: + val_bool = g_value_get_boolean (provided_value); + sprintf (buf, "%d", (invert) ? !val_bool : val_bool); + val_str = buf; + break; + case G_TYPE_STRING: + val_str = g_value_get_string (provided_value); + break; + default: + g_assert_not_reached (); + } + } + + lm_message_node_set_value (value_node, val_str); + + props_left &= ~(1 << id); + } + + if (props_left != 0) + { + g_message (ANSI_BOLD_ON ANSI_FG_WHITE ANSI_BG_RED + "\n%s: the following properties were not substituted:\n", + G_STRFUNC); + + for (i = 0; i < NUM_ROOM_PROPS; i++) + { + if ((props_left & (1 << i)) != 0) + { + g_message (" %s\n", room_property_signatures[i].name); + } + } + + g_message ("\nthis is a MUC server compatibility bug in gabble, please " + "report it with a full debug log attached (running gabble " + "with LM_DEBUG=net)" ANSI_RESET "\n\n"); + fflush (stdout); + + error = g_error_new (TELEPATHY_ERRORS, InvalidArgument, + "not all properties were substituted"); + goto OUT; + } + + _gabble_connection_send_with_reply (priv->conn, msg, + request_config_form_submit_reply_cb, G_OBJECT (object), + NULL, &error); + + goto OUT; + +PARSE_ERROR: + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "error parsing reply from server"); + +OUT: + if (error) + { + gabble_properties_context_return (ctx, error); + priv->properties_ctx = NULL; + } + + if (msg) + lm_message_unref (msg); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmHandlerResult +request_config_form_submit_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, + gpointer user_data) +{ + GabbleMucChannel *chan = GABBLE_MUC_CHANNEL (object); + GabbleMucChannelPrivate *priv = GABBLE_MUC_CHANNEL_GET_PRIVATE (chan); + GabblePropertiesContext *ctx = priv->properties_ctx; + GError *error = NULL; + gboolean returned; + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + error = g_error_new (TELEPATHY_ERRORS, PermissionDenied, + "submitted configuration form was rejected"); + } + + if (!error) + { + guint i; + + for (i = 0; i < NUM_ROOM_PROPS; i++) + { + if (i != ROOM_PROP_SUBJECT) + gabble_properties_context_remove (ctx, i); + } + + returned = gabble_properties_context_return_if_done (ctx); + } + else + { + gabble_properties_context_return (ctx, error); + returned = TRUE; + + /* Get the properties into a consistent state. */ + room_properties_update (chan); + } + + if (returned) + priv->properties_ctx = NULL; + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-presence-cache-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-presence-cache-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,108 @@ +/* + * gabble-presence-cache-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,UINT,UINT (gabble-presence-cache-signals-marshal.list:1) */ +void +gabble_presence_cache_marshal_VOID__UINT_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-presence-cache.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-presence-cache.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1267 @@ +/* + * gabble-presence-cache.c - Gabble's contact presence cache + * Copyright (C) 2005 Collabora Ltd. + * and/or its subsidiaries. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "debug.h" +#include "disco.h" /* \o\ \o/ /o/ */ +#include "gabble-presence.h" +#include "namespaces.h" +#include "util.h" +#include "handle-set.h" +#include "gintset.h" + +#include "gabble-presence-cache.h" + +#include "gabble-presence-cache-signals-marshal.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE (GabblePresenceCache, gabble_presence_cache, G_TYPE_OBJECT); +#endif + +/* when five DIFFERENT guys report the same caps for a given bundle, it'll be enough */ +#define CAPABILITY_BUNDLE_ENOUGH_TRUST 5 +#define DEBUG_FLAG GABBLE_DEBUG_PRESENCE + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +/* signal enum */ +enum +{ + PRESENCE_UPDATE, + NICKNAME_UPDATE, + CAPABILITIES_UPDATE, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_PRE_CACHE +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_pre_cache,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_pre_cache, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_presence_cache_parent_class,gabble_pre_cache,gpointer) + #define gabble_presence_cache_parent_class (*GET_WSD_VAR_NAME(gabble_presence_cache_parent_class,gabble_pre_cache,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_pre_cache,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_pre_cache,s)()) + + +static void gabble_presence_cache_init (GabblePresenceCache *self); +static void gabble_presence_cache_class_init (GabblePresenceCacheClass *klass); +static void gabble_presence_cache_class_intern_init (gpointer klass) + { + gabble_presence_cache_parent_class = g_type_class_peek_parent (klass); + gabble_presence_cache_class_init ((GabblePresenceCacheClass*) klass); + } + EXPORT_C GType gabble_presence_cache_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = { sizeof (GabblePresenceCacheClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_presence_cache_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabblePresenceCache), 0, (GInstanceInitFunc) gabble_presence_cache_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabblePresenceCache"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + }; + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +#define GABBLE_PRESENCE_CACHE_PRIV(account) ((GabblePresenceCachePrivate *)account->priv) + +typedef struct _GabblePresenceCachePrivate GabblePresenceCachePrivate; + +struct _GabblePresenceCachePrivate +{ + GabbleConnection *conn; + + gulong status_changed_cb; + LmMessageHandler *lm_message_cb; + + GHashTable *presence; + GabbleHandleSet *presence_handles; + + GHashTable *capabilities; + GHashTable *disco_pending; + guint caps_serial; + + gboolean dispose_has_run; +}; + +typedef struct _DiscoWaiter DiscoWaiter; + +struct _DiscoWaiter +{ + GabbleHandleRepo *repo; + GabbleHandle handle; + gchar *resource; + guint serial; + gboolean disco_requested; +}; + +/** + * disco_waiter_new () + */ +static DiscoWaiter * +disco_waiter_new (GabbleHandleRepo *repo, GabbleHandle handle, const gchar *resource, guint serial) +{ + DiscoWaiter *waiter; + + g_assert (repo); + gabble_handle_ref (repo, TP_HANDLE_TYPE_CONTACT, handle); + + waiter = g_new0 (DiscoWaiter, 1); + waiter->repo = repo; + waiter->handle = handle; + waiter->resource = g_strdup (resource); + waiter->serial = serial; + + gabble_debug (DEBUG_FLAG, "created waiter %p for handle %u with serial %u", waiter, handle, serial); + + return waiter; +} + +static void +disco_waiter_free (DiscoWaiter *waiter) +{ + g_assert (NULL != waiter); + + gabble_debug (DEBUG_FLAG, "freeing waiter %p for handle %u with serial %u", waiter, waiter->handle, waiter->serial); + + gabble_handle_unref (waiter->repo, TP_HANDLE_TYPE_CONTACT, waiter->handle); + + g_free (waiter->resource); + g_free (waiter); +} + +static void +disco_waiter_list_free (GSList *list) +{ + GSList *i; + + gabble_debug (DEBUG_FLAG, "list %p", list); + + for (i = list; NULL != i; i = i->next) + disco_waiter_free ((DiscoWaiter *) i->data); + + g_slist_free (list); +} + +static guint +disco_waiter_list_get_request_count (GSList *list) +{ + guint c = 0; + GSList *i; + + for (i = list; i; i = i->next) + { + DiscoWaiter *waiter = (DiscoWaiter *) i->data; + + if (waiter->disco_requested) + c++; + } + + return c; +} + +typedef struct _CapabilityInfo CapabilityInfo; + +struct _CapabilityInfo +{ + GabblePresenceCapabilities caps; + GIntSet *guys; + guint trust; +}; + +static CapabilityInfo * +capability_info_get (GabblePresenceCache *cache, const gchar *node, + GabblePresenceCapabilities caps) +{ + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + CapabilityInfo *info = g_hash_table_lookup (priv->capabilities, node); + + if (NULL == info) + { + info = g_new0 (CapabilityInfo, 1); + info->caps = caps; + info->guys = g_intset_new (); + g_hash_table_insert (priv->capabilities, g_strdup (node), info); + } + + return info; +} + +static guint +capability_info_recvd (GabblePresenceCache *cache, const gchar *node, + GabbleHandle handle, GabblePresenceCapabilities caps) +{ + CapabilityInfo *info = capability_info_get (cache, node, caps); + + /* Detect inconsistency in reported caps */ + if (info->caps != caps) + { + g_intset_clear (info->guys); + info->caps = caps; + info->trust = 0; + } + + if (!g_intset_is_member (info->guys, handle)) + { + g_intset_add (info->guys, handle); + info->trust++; + } + + return info->trust; +} + +static void gabble_presence_cache_init (GabblePresenceCache *presence_cache); +static GObject * gabble_presence_cache_constructor (GType type, guint n_props, + GObjectConstructParam *props); +static void gabble_presence_cache_dispose (GObject *object); +static void gabble_presence_cache_finalize (GObject *object); +static void gabble_presence_cache_set_property (GObject *object, guint + property_id, const GValue *value, GParamSpec *pspec); +static void gabble_presence_cache_get_property (GObject *object, guint + property_id, GValue *value, GParamSpec *pspec); +static GabblePresence *_cache_insert (GabblePresenceCache *cache, + GabbleHandle handle); + +static void gabble_presence_cache_status_changed_cb (GabbleConnection *, + TpConnectionStatus, TpConnectionStatusReason, gpointer); +static LmHandlerResult gabble_presence_cache_lm_message_cb (LmMessageHandler*, + LmConnection*, LmMessage*, gpointer); + +static void +gabble_presence_cache_class_init (GabblePresenceCacheClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamSpec *param_spec; + + g_type_class_add_private (object_class, sizeof (GabblePresenceCachePrivate)); + + object_class->constructor = gabble_presence_cache_constructor; + + object_class->dispose = gabble_presence_cache_dispose; + object_class->finalize = gabble_presence_cache_finalize; + + object_class->get_property = gabble_presence_cache_get_property; + object_class->set_property = gabble_presence_cache_set_property; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "presence cache.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, + PROP_CONNECTION, + param_spec); + + signals[PRESENCE_UPDATE] = g_signal_new ( + "presence-update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + signals[NICKNAME_UPDATE] = g_signal_new ( + "nickname-update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + signals[CAPABILITIES_UPDATE] = g_signal_new ( + "capabilities-update", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + gabble_presence_cache_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); +} + +static void +gabble_presence_cache_init (GabblePresenceCache *cache) +{ + GabblePresenceCachePrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (cache, + GABBLE_TYPE_PRESENCE_CACHE, GabblePresenceCachePrivate); + + cache->priv = priv; + + priv->presence = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref); + priv->capabilities = g_hash_table_new (g_str_hash, g_str_equal); + priv->disco_pending = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) disco_waiter_list_free); + priv->caps_serial = 1; +} + +static GObject * +gabble_presence_cache_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabblePresenceCachePrivate *priv; + + obj = G_OBJECT_CLASS (gabble_presence_cache_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_PRESENCE_CACHE_PRIV (GABBLE_PRESENCE_CACHE (obj)); + + priv->status_changed_cb = g_signal_connect (priv->conn, "status-changed", + G_CALLBACK (gabble_presence_cache_status_changed_cb), obj); + + return obj; +} + +static void +gabble_presence_cache_dispose (GObject *object) +{ + GabblePresenceCache *self = GABBLE_PRESENCE_CACHE (object); + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (self); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + + priv->dispose_has_run = TRUE; + + g_assert (priv->lm_message_cb == NULL); + + g_signal_handler_disconnect (priv->conn, priv->status_changed_cb); + + g_hash_table_destroy (priv->presence); + priv->presence = NULL; + + handle_set_destroy (priv->presence_handles); + priv->presence_handles = NULL; + + if (G_OBJECT_CLASS (gabble_presence_cache_parent_class)->dispose) + G_OBJECT_CLASS (gabble_presence_cache_parent_class)->dispose (object); +} + +static void +gabble_presence_cache_finalize (GObject *object) +{ + gabble_debug (DEBUG_FLAG, "called with %p", object); + + G_OBJECT_CLASS (gabble_presence_cache_parent_class)->finalize (object); +} + +static void +gabble_presence_cache_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabblePresenceCache *cache = GABBLE_PRESENCE_CACHE (object); + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_presence_cache_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabblePresenceCache *cache = GABBLE_PRESENCE_CACHE (object); + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + GabbleHandleSet *new_presence_handles; + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + new_presence_handles = handle_set_new (priv->conn->handles, TP_HANDLE_TYPE_CONTACT); + + if (priv->presence_handles) + { + const GIntSet *add; + GIntSet *tmp; + add = handle_set_peek (priv->presence_handles); + tmp = handle_set_update (new_presence_handles, add); + handle_set_destroy (priv->presence_handles); + g_intset_destroy (tmp); + } + priv->presence_handles = new_presence_handles; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +#if 0 +static gboolean +_presence_node_has_google_voice (LmMessageNode *pres_node) +{ + LmMessageNode *node; + const gchar *cap_ext; + gchar **features, **tmp; + gboolean found = FALSE; + + node = lm_message_node_get_child_with_namespace (pres_node, "c", NS_CAPS); + + if (node == NULL); + return FALSE; + + cap_ext = lm_message_node_get_attribute (node, "ext"); + + if (cap_ext == NULL); + return FALSE; + + features = g_strsplit (cap_ext, " ", 0); + + for (tmp = features; *tmp; tmp++) + { + if (!g_strdiff (tmp, "voice-v1")) + { + found = TRUE; + break; + } + } + + g_strfreev (features); + + return found; +} +#endif + +static void +gabble_presence_cache_status_changed_cb (GabbleConnection *conn, + TpConnectionStatus status, + TpConnectionStatusReason reason, + gpointer data) +{ + GabblePresenceCache *cache = GABBLE_PRESENCE_CACHE (data); + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + + g_assert (conn == priv->conn); + + switch (status) + { + case TP_CONN_STATUS_CONNECTING: + g_assert (priv->lm_message_cb == NULL); + + priv->lm_message_cb = lm_message_handler_new (gabble_presence_cache_lm_message_cb, + cache, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, + priv->lm_message_cb, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_LAST); + lm_connection_register_message_handler (priv->conn->lmconn, + priv->lm_message_cb, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_FIRST); + break; + case TP_CONN_STATUS_CONNECTED: + /* TODO: emit self presence */ + break; + case TP_CONN_STATUS_DISCONNECTED: + g_assert (priv->lm_message_cb != NULL); + + lm_connection_unregister_message_handler (conn->lmconn, + priv->lm_message_cb, + LM_MESSAGE_TYPE_PRESENCE); + lm_connection_unregister_message_handler (conn->lmconn, + priv->lm_message_cb, + LM_MESSAGE_TYPE_MESSAGE); + lm_message_handler_unref (priv->lm_message_cb); + priv->lm_message_cb = NULL; + break; + default: + g_assert_not_reached (); + } +} + +static GabblePresenceId +_presence_node_get_status (LmMessageNode *pres_node) +{ + const gchar *presence_show; + LmMessageNode *child_node = lm_message_node_get_child (pres_node, "show"); + + if (!child_node) + { + /* + NODE_DEBUG (pres_node, + " without received from server, " + "setting presence to available"); + */ + return GABBLE_PRESENCE_AVAILABLE; + } + + presence_show = lm_message_node_get_value (child_node); + + if (!presence_show) + { + /* + NODE_DEBUG (pres_node, + "empty tag received from server, " + "setting presence to available"); + */ + return GABBLE_PRESENCE_AVAILABLE; + } + + if (0 == strcmp (presence_show, JABBER_PRESENCE_SHOW_AWAY)) + return GABBLE_PRESENCE_AWAY; + else if (0 == strcmp (presence_show, JABBER_PRESENCE_SHOW_CHAT)) + return GABBLE_PRESENCE_CHAT; + else if (0 == strcmp (presence_show, JABBER_PRESENCE_SHOW_DND)) + return GABBLE_PRESENCE_DND; + else if (0 == strcmp (presence_show, JABBER_PRESENCE_SHOW_XA)) + return GABBLE_PRESENCE_XA; + else + { + NODE_DEBUG (pres_node, + "unrecognised value received from server, " + "setting presence to available"); + return GABBLE_PRESENCE_AVAILABLE; + } +} + +static void +_grab_nickname (GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *from, + LmMessageNode *node) +{ + const gchar *nickname; + GabblePresence *presence; + + node = lm_message_node_get_child_with_namespace (node, "nick", NS_NICK); + + if (NULL == node) + return; + + presence = gabble_presence_cache_get (cache, handle); + + if (NULL == presence) + return; + + nickname = lm_message_node_get_value (node); + gabble_debug (DEBUG_FLAG, "got nickname \"%s\" for %s", nickname, from); + + if (g_strdiff (presence->nickname, nickname)) + { + if (NULL != presence->nickname) + g_free (presence->nickname); + + presence->nickname = g_strdup (nickname); + g_signal_emit (cache, signals[NICKNAME_UPDATE], 0, handle); + } +} + +static GSList * +_extract_cap_bundles (LmMessageNode *lm_node) +{ + const gchar *node, *ver, *ext; + GSList *uris = NULL; + LmMessageNode *cap_node; + + cap_node = lm_message_node_get_child_with_namespace (lm_node, "c", NS_CAPS); + + if (NULL == cap_node) + return NULL; + + node = lm_message_node_get_attribute (cap_node, "node"); + + if (NULL == node) + return NULL; + + ver = lm_message_node_get_attribute (cap_node, "ver"); + + if (NULL != ver) + uris = g_slist_prepend (uris, g_strdup_printf ("%s#%s", node, ver)); + + ext = lm_message_node_get_attribute (cap_node, "ext"); + + if (NULL != ext) + { + gchar **exts, **i; + + exts = g_strsplit (ext, " ", 0); + + for (i = exts; NULL != *i; i++) + uris = g_slist_prepend (uris, g_strdup_printf ("%s#%s", node, *i)); + + g_strfreev (exts); + } + + return uris; +} + +static void +_caps_disco_cb (GabbleDisco *disco, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *query_result, + GError *error, + gpointer user_data) +{ + GSList *waiters, *i; + LmMessageNode *child; + GabblePresenceCache *cache; + GabblePresenceCachePrivate *priv; + gchar *full_jid = NULL; + GabblePresenceCapabilities caps = 0; + guint trust; + GabbleHandle handle; + + cache = GABBLE_PRESENCE_CACHE (user_data); + priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + + if (NULL == node) + { + g_warning ("got disco response with NULL node, ignoring"); + return; + } + + waiters = g_hash_table_lookup (priv->disco_pending, node); + + if (NULL != error) + { + DiscoWaiter *waiter = NULL; + + gabble_debug (DEBUG_FLAG, "disco query failed: %s", error->message); + + for (i = waiters; NULL != i; i = i->next) + { + waiter = (DiscoWaiter *) i->data; + + if (!waiter->disco_requested) + { + const gchar *jid; + + jid = gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, + waiter->handle); + full_jid = g_strdup_printf ("%s/%s", jid, waiter->resource); + + gabble_disco_request (disco, GABBLE_DISCO_TYPE_INFO, full_jid, node, + _caps_disco_cb, cache, G_OBJECT(cache), NULL); + waiter->disco_requested = TRUE; + break; + } + } + + if (NULL != i) + { + gabble_debug (DEBUG_FLAG, "sent a retry disco request to %s for URI %s", full_jid, node); + } + else + { + gabble_debug (DEBUG_FLAG, "failed to find a suitable candidate to retry disco request for URI %s", node); + /* FIXME do something very clever here? */ + g_hash_table_remove (priv->disco_pending, node); + } + + goto OUT; + } + + for (child = query_result->children; NULL != child; child = child->next) + { + const gchar *var; + + if (0 != strcmp (child->name, "feature")) + continue; + + var = lm_message_node_get_attribute (child, "var"); + + if (NULL == var) + continue; + + /* TODO: use a table that equates disco features to caps */ + if (0 == strcmp (var, NS_GOOGLE_TRANSPORT_P2P)) + caps |= PRESENCE_CAP_GOOGLE_TRANSPORT_P2P; + else if (0 == strcmp (var, NS_GOOGLE_FEAT_VOICE)) + caps |= PRESENCE_CAP_GOOGLE_VOICE; + else if (0 == strcmp (var, NS_JINGLE)) + caps |= PRESENCE_CAP_JINGLE; + else if (0 == strcmp (var, NS_JINGLE_DESCRIPTION_AUDIO)) + caps |= PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO; + else if (0 == strcmp (var, NS_JINGLE_DESCRIPTION_VIDEO)) + caps |= PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO; + } + + handle = gabble_handle_for_contact (priv->conn->handles, jid, FALSE); + trust = capability_info_recvd (cache, node, handle, caps); + + for (i = waiters; NULL != i;) + { + DiscoWaiter *waiter; + GabblePresence *presence; + + waiter = (DiscoWaiter *) i->data; + + if (trust >= CAPABILITY_BUNDLE_ENOUGH_TRUST || waiter->handle == handle) + { + GSList *tmp; + /* trusted reply */ + presence = gabble_presence_cache_get (cache, waiter->handle); + + if (presence) + { + GabblePresenceCapabilities save_caps = presence->caps; + gabble_debug (DEBUG_FLAG, "setting caps for %d (%s) to %d", handle, jid, caps); + gabble_presence_set_capabilities (presence, waiter->resource,caps, + waiter->serial); + gabble_debug (DEBUG_FLAG, "caps for %d (%s) now %d", handle, jid, presence->caps); + g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0, + waiter->handle, save_caps, presence->caps); + } + + tmp = i; + i = i->next; + + waiters = g_slist_delete_link (waiters, tmp); + + g_hash_table_steal (priv->disco_pending, node); + g_hash_table_insert (priv->disco_pending, g_strdup (node), waiters); + + disco_waiter_free (waiter); + } + else if (trust + disco_waiter_list_get_request_count (waiters) - 1 + < CAPABILITY_BUNDLE_ENOUGH_TRUST) + { + /* if the possible trust, not counting this guy, is too low, + * we have been poisoned and reset our trust meters - disco + * anybody we still haven't to be able to get more trusted replies */ + + if (!waiter->disco_requested) + { + const gchar *jid; + + jid = gabble_handle_inspect (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, waiter->handle); + full_jid = g_strdup_printf ("%s/%s", jid, waiter->resource); + + gabble_disco_request (disco, GABBLE_DISCO_TYPE_INFO, full_jid, + node, _caps_disco_cb, cache, G_OBJECT(cache), NULL); + waiter->disco_requested = TRUE; + + g_free (full_jid); + full_jid = NULL; + } + + i = i->next; + } + else + { + /* trust level still uncertain, don't do nothing */ + i = i->next; + } + } + + if (trust >= CAPABILITY_BUNDLE_ENOUGH_TRUST) + g_hash_table_remove (priv->disco_pending, node); + +OUT: + + g_free (full_jid); +} + +static void +_process_caps_uri (GabblePresenceCache *cache, + const gchar *from, + const gchar *uri, + GabbleHandle handle, + const gchar *resource, + guint serial) +{ + CapabilityInfo *info; + gpointer value; + GabblePresenceCachePrivate *priv; + + priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + info = capability_info_get (cache, uri, 0); + + if (info->trust >= CAPABILITY_BUNDLE_ENOUGH_TRUST + || g_intset_is_member (info->guys, handle)) + { + /* we already have enough trust for this node; apply the cached value to + * the (handle, resource) */ + + GabblePresence *presence = gabble_presence_cache_get (cache, handle); + gabble_debug (DEBUG_FLAG, "enough trust for URI %s, setting caps for %u (%s) to %u", + uri, handle, from, info->caps); + + if (presence) + { + GabblePresenceCapabilities save_caps = presence->caps; + gabble_presence_set_capabilities (presence, resource, info->caps, serial); + g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0, + handle, save_caps, presence->caps); + gabble_debug (DEBUG_FLAG, "caps for %d (%s) now %d", handle, from, presence->caps); + } + else + { + gabble_debug (DEBUG_FLAG, "presence not found"); + } + } + else + { + /* Append the (handle, resource) pair to the list of such pairs + * waiting for capabilities for this uri, and send a disco request + * if we don't have enough possible trust yet */ + + GSList *waiters; + DiscoWaiter *waiter; + guint possible_trust; + + gabble_debug (DEBUG_FLAG, "not enough trust for URI %s", uri); + value = g_hash_table_lookup (priv->disco_pending, uri); + + if (value) + g_hash_table_steal (priv->disco_pending, uri); + + waiters = (GSList *) value; + waiter = disco_waiter_new (priv->conn->handles, handle, resource, serial); + waiters = g_slist_prepend (waiters, waiter); + g_hash_table_insert (priv->disco_pending, g_strdup (uri), waiters); + + possible_trust = disco_waiter_list_get_request_count (waiters); + + if (!value || info->trust + possible_trust < CAPABILITY_BUNDLE_ENOUGH_TRUST) + { + /* DISCO */ + gabble_debug (DEBUG_FLAG, "only %u trust out of %u possible thus far, sending disco for URI %s", + info->trust + possible_trust, CAPABILITY_BUNDLE_ENOUGH_TRUST, uri); + gabble_disco_request (priv->conn->disco, GABBLE_DISCO_TYPE_INFO, + from, uri, _caps_disco_cb, cache, G_OBJECT (cache), NULL); + /* enough DISCO for you, buddy */ + waiter->disco_requested = TRUE; + } + } +} + +static void +_process_caps (GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *from, + LmMessageNode *lm_node) +{ + gchar *resource; + GSList *uris, *i; + GabblePresenceCachePrivate *priv; + guint serial; + + priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + serial = priv->caps_serial++; + + gabble_decode_jid (from, NULL, NULL, &resource); + + if (NULL == resource) + return; + + uris = _extract_cap_bundles (lm_node); + + for (i = uris; NULL != i; i = i->next) + { + _process_caps_uri (cache, from, (gchar *) i->data, handle, resource, serial); + g_free (i->data); + } + + g_free (resource); + g_slist_free (uris); +} + +static void +_grab_avatar_sha1 (GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *from, + LmMessageNode *node) +{ + const gchar *sha1; + LmMessageNode *x_node, *photo_node; + GabblePresence *presence; + //LIB_TRACE( ELibTraceTypeInfo, "%s", "Out _grab_avatar_sha1" ); + presence = gabble_presence_cache_get (cache, handle); + + if (NULL == presence) + return; + + x_node = lm_message_node_get_child_with_namespace (node, "x", + NS_VCARD_TEMP_UPDATE); + + if (NULL == x_node) + { +#if 0 + if (handle == priv->conn->parent.self_handle) + { + /* One of my other resources does not support XEP-0153. As per that + * XEP, I MUST stop advertising the image hash, at least until all + * instances of non-conforming resources have gone offline. + * However, we're going to ignore this requirement and hope that + * non-conforming clients won't alter the , which should + * in practice be true. + */ + presence->avatar_sha1 = NULL; + } +#endif + return; + } + + photo_node = lm_message_node_get_child (x_node, "photo"); + + /* If there is no photo node, the resource supports XEP-0153, but has + * nothing in particular to say about the avatar. */ + if (NULL == photo_node) + return; + + sha1 = lm_message_node_get_value (photo_node); + + if (g_strdiff (presence->avatar_sha1, sha1)) + { + g_free (presence->avatar_sha1); + presence->avatar_sha1 = g_strdup (sha1); + +#if 0 + if (handle == priv->conn->parent.self_handle) + { + /* that would be us, then. According to XEP-0153, we MUST + * immediately send a presence update with an empty update child + * element (no photo node), then re-download our own vCard; + * when that arrives, we may start setting the photo node in our + * presence again. + * + * For the moment I'm going to ignore that requirement and + * trust that our other resource is getting its sha1 right! + */ + /* TODO: I don't trust anyone to get XMPP right, so let's do + * this. :D */ + } +#endif + //LIB_TRACE( ELibTraceTypeInfo, "%s", "AVATAR_UPDATE _grab_avatar_sha1" ); + //g_signal_emit (cache, signals[AVATAR_UPDATE], 0, handle); + } + //LIB_TRACE( ELibTraceTypeInfo, "%s", "Out _grab_avatar_sha1" ); +} + +static LmHandlerResult +_parse_presence_message (GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *from, + LmMessage *message) +{ + gint8 priority = 0; + gchar *resource = NULL; + const gchar *status_message = NULL; + LmMessageNode *presence_node, *child_node; + LmHandlerResult ret = LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + GabblePresenceId presence_id; + GabblePresence *presence; + + presence_node = message->node; + g_assert (0 == strcmp (presence_node->name, "presence")); + + gabble_decode_jid (from, NULL, NULL, &resource); + + presence = gabble_presence_cache_get (cache, handle); + + if (NULL != presence) + presence->keep_unavailable = FALSE; + + child_node = lm_message_node_get_child (presence_node, "status"); + + if (child_node) + status_message = lm_message_node_get_value (child_node); + + child_node = lm_message_node_get_child (presence_node, "priority"); + + if (child_node) + { + const gchar *prio = lm_message_node_get_value (child_node); + + if (prio != NULL) + priority = CLAMP (atoi (prio), G_MININT8, G_MAXINT8); + } + + switch (lm_message_get_sub_type (message)) + { + case LM_MESSAGE_SUB_TYPE_NOT_SET: + case LM_MESSAGE_SUB_TYPE_AVAILABLE: + presence_id = _presence_node_get_status (presence_node); + gabble_presence_cache_update (cache, handle, resource, presence_id, + status_message, priority); + +#if 0 + if (_presence_node_has_google_voice (presence_node)) + { + presence = gabble_presence_cache_get (cache, handle); + g_assert (NULL != presence); + gabble_debug (DEBUG_FLAG, "%s has voice-v1 support", from); + gabble_presence_set_capabilities (presence, resource, + PRESENCE_CAP_GOOGLE_VOICE); + } +#endif + + ret = LM_HANDLER_RESULT_REMOVE_MESSAGE; + break; + + case LM_MESSAGE_SUB_TYPE_ERROR: + NODE_DEBUG (presence_node, "setting contact offline due to error"); + /* fall through */ + + case LM_MESSAGE_SUB_TYPE_UNAVAILABLE: + gabble_presence_cache_update (cache, handle, resource, + GABBLE_PRESENCE_OFFLINE, status_message, priority); + + ret = LM_HANDLER_RESULT_REMOVE_MESSAGE; + break; + + default: + break; + } + + _grab_avatar_sha1 (cache, handle, from, presence_node); + _grab_nickname (cache, handle, from, presence_node); + _process_caps (cache, handle, from, presence_node); + + g_free (resource); + + return ret; +} + +static LmHandlerResult +_parse_message_message (GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *from, + LmMessage *message) +{ + LmMessageNode *node; + GabblePresence *presence; + + presence = gabble_presence_cache_get (cache, handle); + + if (NULL == presence) + { + presence = _cache_insert (cache, handle); + presence->keep_unavailable = TRUE; + } + + node = lm_message_get_node (message); + + _grab_nickname (cache, handle, from, node); + _process_caps (cache, handle, from, node); + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + + +/** + * gabble_presence_cache_lm_message_cb: + * @handler: #LmMessageHandler for this message + * @connection: #LmConnection that originated the message + * @message: the presence message + * @user_data: callback data + * + * Called by loudmouth when we get an incoming . + */ +static LmHandlerResult +gabble_presence_cache_lm_message_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabblePresenceCache *cache = GABBLE_PRESENCE_CACHE (user_data); + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + const char *from; + GabbleHandle handle; + + g_assert (lmconn == priv->conn->lmconn); + + from = lm_message_node_get_attribute (message->node, "from"); + + if (NULL == from) + { + NODE_DEBUG (message->node, "message without from attribute, ignoring"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + handle = gabble_handle_for_contact (priv->conn->handles, from, FALSE); + + if (0 == handle) + { + NODE_DEBUG (message->node, "ignoring message from malformed jid"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (handle == priv->conn->self_handle) + { + NODE_DEBUG (message->node, + "ignoring message from ourselves on another resource"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + switch (lm_message_get_type (message)) + { + case LM_MESSAGE_TYPE_PRESENCE: + return _parse_presence_message (cache, handle, from, message); + case LM_MESSAGE_TYPE_MESSAGE: + return _parse_message_message (cache, handle, from, message); + default: + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } +} + + +GabblePresenceCache * +gabble_presence_cache_new (GabbleConnection *conn) +{ + return g_object_new (GABBLE_TYPE_PRESENCE_CACHE, + "connection", conn, + NULL); +} + +GabblePresence * +gabble_presence_cache_get (GabblePresenceCache *cache, GabbleHandle handle) +{ + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + + +// g_assert (gabble_handle_is_valid (priv->conn->handles, +// TP_HANDLE_TYPE_CONTACT, handle, NULL)); + if(priv) + if(priv->conn) + if(priv->conn->handles){ + if ( gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL) ) + { + return g_hash_table_lookup (priv->presence, GINT_TO_POINTER (handle)); + } + else + { + return NULL; + } + } + return NULL; +} + +void +gabble_presence_cache_maybe_remove ( + GabblePresenceCache *cache, + GabbleHandle handle) +{ + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + GabblePresence *presence; + + presence = gabble_presence_cache_get (cache, handle); + + if (NULL == presence) + return; + + if (presence->status == GABBLE_PRESENCE_OFFLINE && + presence->status_message == NULL && + !presence->keep_unavailable) + { + const gchar *jid; + + jid = gabble_handle_inspect (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, + handle); + gabble_debug (DEBUG_FLAG, "discarding cached presence for unavailable jid %s", jid); + g_hash_table_remove (priv->presence, GINT_TO_POINTER (handle)); + handle_set_remove (priv->presence_handles, handle); + } +} + +static GabblePresence * +_cache_insert ( + GabblePresenceCache *cache, + GabbleHandle handle) +{ + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + GabblePresence *presence; + + presence = gabble_presence_new (); + g_hash_table_insert (priv->presence, GINT_TO_POINTER (handle), presence); + handle_set_add (priv->presence_handles, handle); + return presence; +} + +void +gabble_presence_cache_update ( + GabblePresenceCache *cache, + GabbleHandle handle, + const gchar *resource, + GabblePresenceId presence_id, + const gchar *status_message, + gint8 priority) +{ + GabblePresenceCachePrivate *priv = GABBLE_PRESENCE_CACHE_PRIV (cache); + const gchar *jid; + GabblePresence *presence; + + jid = gabble_handle_inspect (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, + handle); + gabble_debug (DEBUG_FLAG, "%s (%d) resource %s prio %d presence %d message \"%s\"", + jid, handle, resource, priority, presence_id, status_message); + + presence = gabble_presence_cache_get (cache, handle); + + if (presence == NULL) + presence = _cache_insert (cache, handle); + + if (gabble_presence_update (presence, resource, presence_id, status_message, + priority)) + g_signal_emit (cache, signals[PRESENCE_UPDATE], 0, handle); + + gabble_presence_cache_maybe_remove (cache, handle); +} + +void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache, + const gchar *node, GabblePresenceCapabilities new_caps) +{ + CapabilityInfo *info; + + info = capability_info_get (cache, node, 0); + info->trust = CAPABILITY_BUNDLE_ENOUGH_TRUST; + info->caps |= new_caps; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-presence.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-presence.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,448 @@ +/* + * gabble-presence.c - Gabble's per-contact presence structure + * Copyright (C) 2005 Collabora Ltd. + * and/or its subsidiaries. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "gabble-presence-cache.h" +#include "gabble-presence.h" +#include "util.h" + +#include "config.h" +#define DEBUG_FLAG GABBLE_DEBUG_PRESENCE +#include "debug.h" + +#ifndef EMULATOR +G_DEFINE_TYPE (GabblePresence, gabble_presence, G_TYPE_OBJECT); +#endif + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(gabble_presence_parent_class,gabble_presence,gpointer) + #define gabble_presence_parent_class (*GET_WSD_VAR_NAME(gabble_presence_parent_class,gabble_presence,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_presence,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_presence,s)()) + +static void gabble_presence_init (GabblePresence *self); +static void gabble_presence_class_init (GabblePresenceClass *klass); +static void gabble_presence_class_intern_init (gpointer klass) +{ +gabble_presence_parent_class = g_type_class_peek_parent (klass); +gabble_presence_class_init ((GabblePresenceClass*) klass); +} + EXPORT_C GType gabble_presence_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = + { sizeof (GabblePresenceClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_presence_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabblePresence), 0, (GInstanceInitFunc) gabble_presence_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabblePresence"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } ; + +#endif + +#define GABBLE_PRESENCE_PRIV(account) ((GabblePresencePrivate *)account->priv) + +typedef struct _Resource Resource; + +struct _Resource { + gchar *name; + GabblePresenceCapabilities caps; + guint caps_serial; + GabblePresenceId status; + gchar *status_message; + gint8 priority; +}; + +typedef struct _GabblePresencePrivate GabblePresencePrivate; + +struct _GabblePresencePrivate { + gchar *no_resource_status_message; + GSList *resources; +}; + +static Resource * +_resource_new (gchar *name) +{ + Resource *new = g_new (Resource, 1); + new->name = name; + new->caps = PRESENCE_CAP_NONE; + new->status = GABBLE_PRESENCE_OFFLINE; + new->status_message = NULL; + new->priority = 0; + new->caps_serial = 0; + return new; +} + +static void +_resource_free (Resource *resource) +{ + g_free (resource->status_message); + g_free (resource); +} + +static void +gabble_presence_finalize (GObject *object) +{ + GSList *i; + GabblePresence *presence = GABBLE_PRESENCE (object); + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + + for (i = priv->resources; NULL != i; i = i->next) + _resource_free (i->data); + + g_slist_free (priv->resources); + g_free (presence->nickname); + g_free (priv->no_resource_status_message); +} + +static void +gabble_presence_class_init (GabblePresenceClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + g_type_class_add_private (object_class, sizeof (GabblePresencePrivate)); + object_class->finalize = gabble_presence_finalize; +} + +static void +gabble_presence_init (GabblePresence *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_PRESENCE, GabblePresencePrivate); + ((GabblePresencePrivate *)self->priv)->resources = NULL; +} + + +GabblePresence* +gabble_presence_new (void) +{ + return g_object_new (GABBLE_TYPE_PRESENCE, NULL); +} + + +const gchar * +gabble_presence_pick_resource_by_caps ( + GabblePresence *presence, + GabblePresenceCapabilities caps) +{ + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + GSList *i; + Resource *chosen = NULL; + + for (i = priv->resources; NULL != i; i = i->next) + { + Resource *res = (Resource *) i->data; + + if ((res->priority >= 0) && + ((res->caps & caps) == caps) && + (NULL == chosen || res->priority > chosen->priority)) + chosen = res; + } + + if (chosen) + return chosen->name; + else + return NULL; +} + +gboolean +gabble_presence_resource_has_caps (GabblePresence *presence, + const gchar *resource, + GabblePresenceCapabilities caps) +{ + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + GSList *i; + + for (i = priv->resources; NULL != i; i = i->next) + { + Resource *res = (Resource *) i->data; + + if (!g_strdiff (res->name, resource) && (res->caps & caps)) + return TRUE; + } + + return FALSE; +} + + +void +gabble_presence_set_capabilities (GabblePresence *presence, + const gchar *resource, + GabblePresenceCapabilities caps, + guint serial) +{ + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + GSList *i; + g_message("[gabble_presence_set_capabilities]\n"); + presence->caps = 0; + + gabble_debug (DEBUG_FLAG, "about to add caps %u to resource %s with serial %u", caps, resource, + serial); + + for (i = priv->resources; NULL != i; i = i->next) + { + Resource *tmp = (Resource *) i->data; + + if (0 == strcmp (tmp->name, resource)) + { + gabble_debug (DEBUG_FLAG, "found resource %s", resource); + + if (serial > tmp->caps_serial) + { + gabble_debug (DEBUG_FLAG, "new serial %u, old %u, clearing caps", serial, + tmp->caps_serial); + tmp->caps = 0; + tmp->caps_serial = serial; + } + + if (serial >= tmp->caps_serial) + { + gabble_debug (DEBUG_FLAG, "adding caps %u to resource %s", caps, resource); + tmp->caps |= caps; + gabble_debug (DEBUG_FLAG, "resource %s caps now %u", resource, tmp->caps); + } + } + + presence->caps |= tmp->caps; + } + g_message("[leaving connect_callbacks\n]"); + gabble_debug (DEBUG_FLAG, "total caps now %u", presence->caps); +} + +static Resource * +_find_resource (GabblePresence *presence, const gchar *resource) +{ + GSList *i; + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + + for (i = priv->resources; NULL != i; i = i->next) + { + Resource *res = (Resource *) i->data; + + if (0 == strcmp (res->name, resource)) + return res; + } + + return NULL; +} + + +gboolean +gabble_presence_update (GabblePresence *presence, + const gchar *resource, + GabblePresenceId status, + const gchar *status_message, + gint8 priority) +{ + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + Resource *res; + GabblePresenceId old_status; + gchar *old_status_message; + GSList *i; + gint8 prio; + gboolean ret = FALSE; + + /* save our current state */ + old_status = presence->status; + old_status_message = g_strdup (presence->status_message); + + if (NULL == resource) + { + /* presence from a JID with no resource: free all resources and set + * presence directly */ + + for (i = priv->resources; i; i = i->next) + _resource_free (i->data); + + g_slist_free (priv->resources); + priv->resources = NULL; + + if (g_strdiff (priv->no_resource_status_message, status_message)) + { + g_free (priv->no_resource_status_message); + priv->no_resource_status_message = g_strdup (status_message); + } + + presence->status = status; + presence->status_message = priv->no_resource_status_message; + goto OUT; + } + + res = _find_resource (presence, resource); + + /* remove, create or update a Resource as appropriate */ + if (GABBLE_PRESENCE_OFFLINE == status && + NULL == status_message) + { + if (NULL != res) + { + priv->resources = g_slist_remove (priv->resources, res); + _resource_free (res); + res = NULL; + } + } + else + { + if (NULL == res) + { + res = _resource_new (g_strdup (resource)); + priv->resources = g_slist_append (priv->resources, res); + } + + res->status = status; + + if (g_strdiff (res->status_message, status_message)) + { + g_free (res->status_message); + res->status_message = g_strdup (status_message); + } + + res->priority = priority; + } + + /* select the most preferable Resource and update presence->* based on our + * choice */ + presence->caps = 0; + presence->status = GABBLE_PRESENCE_OFFLINE; + + /* use the status message from any offline Resource we're + * keeping around just because it has a message on it */ + presence->status_message = res ? res->status_message : NULL; + + prio = -128; + + for (i = priv->resources; NULL != i; i = i->next) + { + Resource *res = (Resource *) i->data; + + presence->caps |= res->caps; + + /* trump existing status & message if it's more present + * or has the same presence and a higher priority */ + if (res->status > presence->status || + (res->status == presence->status && res->priority > prio)) + { + presence->status = res->status; + presence->status_message = res->status_message; + prio = res->priority; + } + } + +OUT: + /* detect changes */ + if (presence->status != old_status || + g_strdiff (presence->status_message, old_status_message)) + ret = TRUE; + + g_free (old_status_message); + return ret; +} + +LmMessage * +gabble_presence_as_message (GabblePresence *presence, const gchar *resource) +{ + LmMessage *message; + LmMessageNode *node; + LmMessageSubType subtype; + Resource *res = _find_resource (presence, resource); + + g_assert (NULL != res); + + if (presence->status == GABBLE_PRESENCE_OFFLINE) + subtype = LM_MESSAGE_SUB_TYPE_UNAVAILABLE; + else + subtype = LM_MESSAGE_SUB_TYPE_AVAILABLE; + + message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_PRESENCE, + subtype); + node = lm_message_get_node (message); + + switch (presence->status) + { + case GABBLE_PRESENCE_AVAILABLE: + case GABBLE_PRESENCE_OFFLINE: + case GABBLE_PRESENCE_HIDDEN: + break; + case GABBLE_PRESENCE_AWAY: + lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_AWAY); + break; + case GABBLE_PRESENCE_CHAT: + lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_CHAT); + break; + case GABBLE_PRESENCE_DND: + lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_DND); + break; + case GABBLE_PRESENCE_XA: + lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_XA); + break; + default: + g_critical ("%s: Unexpected Telepathy presence type", G_STRFUNC); + break; + } + + if (presence->status_message) + lm_message_node_add_child (node, "status", presence->status_message); + + if (res->priority) + { + gchar *priority = g_strdup_printf ("%d", res->priority); + lm_message_node_add_child (node, "priority", priority); + g_free (priority); + } + + return message; +} + + +gchar * +gabble_presence_dump (GabblePresence *presence) +{ + GSList *i; + GString *ret = g_string_new (""); + GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence); + + g_string_append_printf (ret, + "nickname: %s\n" + "accumulated status: %d\n" + "accumulated status msg: %s\n" + "accumulated capabilities: %d\n" + "kept while unavailable: %d\n" + "resources:\n", presence->nickname, presence->status, + presence->status_message, presence->caps, + presence->keep_unavailable); + + for (i = priv->resources; i; i = i->next) + { + Resource *res = (Resource *) i->data; + + g_string_append_printf(ret, + " %s\n" + " capabilities: %d\n" + " status: %d\n" + " status msg: %s\n" + " priority: %d\n", res->name, res->caps, res->status, + res->status_message, res->priority); + } + + if (priv->resources == NULL) + g_string_append_printf(ret, " (none)\n"); + + return g_string_free (ret, FALSE); +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-register-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-register-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,108 @@ +/* + * gabble-register-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:BOOLEAN,INT,STRING (gabble-register-signals-marshal.list:1) */ +void +gabble_register_marshal_VOID__BOOLEAN_INT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__BOOLEAN_INT_STRING) (gpointer data1, + gboolean arg_1, + gint arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__BOOLEAN_INT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOOLEAN_INT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_boolean (param_values + 1), + g_marshal_value_peek_int (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-register.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-register.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,393 @@ +/* + * gabble-register.c - Source for Gabble account registration + * + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define DBUS_API_SUBJECT_TO_CHANGE + +#include +#include +#include +#include + +#include "telepathy-helpers.h" +#include "telepathy-errors.h" + +#include "gabble-connection.h" +#include "gabble-error.h" +#include "gabble-register.h" +#include "gabble-register-signals-marshal.h" +#include "namespaces.h" +#include "util.h" + + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleRegister, gabble_register, G_TYPE_OBJECT); +#endif + +/* signal enum */ +enum +{ + FINISHED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_REGISTER +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_register,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_register, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_register_parent_class,gabble_register,gpointer) + #define gabble_register_parent_class (*GET_WSD_VAR_NAME(gabble_register_parent_class,gabble_register,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_register,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_register,s)()) + + +static void gabble_register_init (GabbleRegister *self); +static void gabble_register_class_init (GabbleRegisterClass *klass); +static void gabble_register_class_intern_init (gpointer klass) +{ + gabble_register_parent_class = g_type_class_peek_parent (klass); + gabble_register_class_init ((GabbleRegisterClass*) klass); + } + EXPORT_C GType gabble_register_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = { sizeof (GabbleRegisterClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_register_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleRegister), 0, (GInstanceInitFunc) gabble_register_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleRegister"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; + } ; + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + + +/* private structure */ +typedef struct _GabbleRegisterPrivate GabbleRegisterPrivate; +struct _GabbleRegisterPrivate +{ + GabbleConnection *conn; + + gboolean dispose_has_run; +}; + +#define GABBLE_REGISTER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_REGISTER, GabbleRegisterPrivate)) + +static void +gabble_register_init (GabbleRegister *obj) +{ +} + +static void gabble_register_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec); +static void gabble_register_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec); +static void gabble_register_dispose (GObject *object); +static void gabble_register_finalize (GObject *object); + +static void +gabble_register_class_init (GabbleRegisterClass *gabble_register_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_register_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_register_class, sizeof (GabbleRegisterPrivate)); + + object_class->get_property = gabble_register_get_property; + object_class->set_property = gabble_register_set_property; + + object_class->dispose = gabble_register_dispose; + object_class->finalize = gabble_register_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "GabbleRegister object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + signals[FINISHED] = + g_signal_new ("finished", + G_OBJECT_CLASS_TYPE (gabble_register_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + gabble_register_marshal_VOID__BOOLEAN_INT_STRING, + G_TYPE_NONE, 3, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING); +} + +static void +gabble_register_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleRegister *chan = GABBLE_REGISTER (object); + GabbleRegisterPrivate *priv = GABBLE_REGISTER_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_register_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleRegister *chan = GABBLE_REGISTER (object); + GabbleRegisterPrivate *priv = GABBLE_REGISTER_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +void +gabble_register_dispose (GObject *object) +{ + GabbleRegister *self = GABBLE_REGISTER (object); + GabbleRegisterPrivate *priv = GABBLE_REGISTER_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + g_debug ("%s: dispose called", G_STRFUNC); + + if (G_OBJECT_CLASS (gabble_register_parent_class)->dispose) + G_OBJECT_CLASS (gabble_register_parent_class)->dispose (object); +} + +void +gabble_register_finalize (GObject *object) +{ + g_debug ("%s called with %p", G_STRFUNC, object); + + G_OBJECT_CLASS (gabble_register_parent_class)->finalize (object); +} + +/** + * gabble_register_new: + * + * Creates an object to use for account registration. + * + * @conn: The #GabbleConnection to register an account on + */ +GabbleRegister * +gabble_register_new (GabbleConnection *conn) +{ + g_return_val_if_fail (GABBLE_IS_CONNECTION (conn), NULL); + return GABBLE_REGISTER (g_object_new (GABBLE_TYPE_REGISTER, + "connection", conn, NULL)); +} + +static LmHandlerResult +set_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + LmMessageNode *node; + gint code = NotAvailable; + GString *msg; + + msg = g_string_sized_new (30); + g_string_append (msg, "Request failed"); + + node = lm_message_node_get_child (reply_msg->node, "error"); + if (node) + { + GabbleXmppError error; + + error = gabble_xmpp_error_from_node (node); + if (error == XMPP_ERROR_CONFLICT) + { + code = InvalidArgument; + } + + if (error != INVALID_XMPP_ERROR) + { + g_string_append_printf (msg, ": %s", + gabble_xmpp_error_string (error)); + } + } + + g_signal_emit (object, signals[FINISHED], 0, FALSE, code, msg->str); + g_string_free (msg, TRUE); + } + else + { + g_signal_emit (object, signals[FINISHED], 0, TRUE, -1, NULL); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmHandlerResult +get_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + GabbleRegister *reg = GABBLE_REGISTER (object); + GabbleRegisterPrivate *priv = GABBLE_REGISTER_GET_PRIVATE (reg); + GError *error = NULL; + gint err_code = -1; + const gchar *err_msg = NULL; + LmMessage *msg = NULL; + LmMessageNode *query_node; + gchar *username, *password; + + if (lm_message_get_sub_type (reply_msg) != LM_MESSAGE_SUB_TYPE_RESULT) + { + err_code = NotAvailable; + err_msg = "Server doesn't support " NS_REGISTER; + + goto OUT; + } + + /* sanity check the reply to some degree ... */ + query_node = lm_message_node_get_child_with_namespace (reply_msg->node, + "query", NS_REGISTER); + + if (query_node == NULL) + goto ERROR_MALFORMED_REPLY; + + if (!lm_message_node_get_child (query_node, "username")) + goto ERROR_MALFORMED_REPLY; + + if (!lm_message_node_get_child (query_node, "password")) + goto ERROR_MALFORMED_REPLY; + + /* craft a reply */ + msg = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + + query_node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (query_node, "xmlns", NS_REGISTER); + + g_object_get (priv->conn, + "username", &username, + "password", &password, + NULL); + + lm_message_node_add_child (query_node, "username", username); + lm_message_node_add_child (query_node, "password", password); + + g_free (username); + g_free (password); + + if (!_gabble_connection_send_with_reply (priv->conn, msg, set_reply_cb, + G_OBJECT (reg), NULL, &error)) + { + err_code = error->code; + err_msg = error->message; + } + + goto OUT; + +ERROR_MALFORMED_REPLY: + err_code = NotAvailable; + err_msg = "Malformed reply"; + +OUT: + if (err_code != -1) + { + g_signal_emit (reg, signals[FINISHED], 0, FALSE, err_code, err_msg); + } + + if (msg) + lm_message_unref (msg); + + if (error) + g_error_free (error); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +/** + * gabble_register_start: + * + * Start account registration. + * + * @reg: The #GabbleRegister object performing the registration + */ +void gabble_register_start (GabbleRegister *reg) +{ + GabbleRegisterPrivate *priv = GABBLE_REGISTER_GET_PRIVATE (reg); + LmMessage *msg; + LmMessageNode *node; + GError *error = NULL; + + msg = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_REGISTER); + + if (!_gabble_connection_send_with_reply (priv->conn, msg, get_reply_cb, + G_OBJECT (reg), NULL, &error)) + { + g_signal_emit (reg, signals[FINISHED], 0, FALSE, error->code, + error->message); + g_error_free (error); + } + + lm_message_unref (msg); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-roomlist-channel-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-roomlist-channel-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,70 @@ +/* + * gabble-roomlist-channel-signals-marshal.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-roomlist-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-roomlist-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,734 @@ +/* + * gabble-roomlist-channel.c - Source for GabbleRoomlistChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_ROOMLIST + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "handles.h" +#include "handle-set.h" +#include "telepathy-constants.h" +#include "telepathy-interfaces.h" +#include "telepathy-helpers.h" +#include "tp-channel-iface.h" +#include "namespaces.h" +#include "util.h" + +#include "gabble-roomlist-channel.h" +#include "gabble-roomlist-channel-glue.h" +#include "gabble-roomlist-channel-signals-marshal.h" + +#include "gabble_enums.h" + +#define TP_TYPE_ROOM_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), \ + G_TYPE_INVALID)) + +#define TP_TYPE_ROOM_LIST (dbus_g_type_get_collection ("GPtrArray", \ + TP_TYPE_ROOM_STRUCT)) + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleRoomlistChannel, gabble_roomlist_channel, + G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); +#endif + +/* signal enum */ +enum +{ + CLOSED, + GOT_ROOMS, + LISTING_ROOMS, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_ROOM_CHNL +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_room_chnl,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_room_chnl, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_roomlist_channel_parent_class,gabble_room_chnl,gpointer) + #define gabble_roomlist_channel_parent_class (*GET_WSD_VAR_NAME(gabble_roomlist_channel_parent_class,gabble_room_chnl,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_room_chnl,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_room_chnl,s)()) + + + static void gabble_roomlist_channel_init (GabbleRoomlistChannel *self); + static void gabble_roomlist_channel_class_init (GabbleRoomlistChannelClass *klass); + static void gabble_roomlist_channel_class_intern_init (gpointer klass) + { + gabble_roomlist_channel_parent_class = g_type_class_peek_parent (klass); + gabble_roomlist_channel_class_init ((GabbleRoomlistChannelClass*) klass); + } + EXPORT_C GType gabble_roomlist_channel_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleRoomlistChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_roomlist_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleRoomlistChannel), 0, (GInstanceInitFunc) gabble_roomlist_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleRoomlistChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + PROP_CONFERENCE_SERVER, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleRoomlistChannelPrivate GabbleRoomlistChannelPrivate; + +struct _GabbleRoomlistChannelPrivate +{ + GabbleConnection *conn; + gchar *object_path; + gchar *conference_server; + + gboolean closed; + gboolean listing; + + gpointer disco_pipeline; + GabbleHandleSet *signalled_rooms; + + GPtrArray *pending_room_signals; + guint timer_source_id; + + gboolean dispose_has_run; +}; + +#define GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE(obj) \ + ((GabbleRoomlistChannelPrivate *)obj->priv) + +#define ROOM_SIGNAL_INTERVAL 300 + +static gboolean emit_room_signal (gpointer data); + +static void +gabble_roomlist_channel_init (GabbleRoomlistChannel *self) +{ + GabbleRoomlistChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_ROOMLIST_CHANNEL, GabbleRoomlistChannelPrivate); + + self->priv = priv; + + priv->pending_room_signals = g_ptr_array_new (); +} + + +static GObject * +gabble_roomlist_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleRoomlistChannelPrivate *priv; + DBusGConnection *bus; + + obj = G_OBJECT_CLASS (gabble_roomlist_channel_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (GABBLE_ROOMLIST_CHANNEL (obj)); + + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + return obj; +} + +static void +gabble_roomlist_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleRoomlistChannel *chan = GABBLE_ROOMLIST_CHANNEL (object); + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_ROOM_LIST); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_NONE); + break; + case PROP_HANDLE: + g_value_set_uint (value, 0); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + case PROP_CONFERENCE_SERVER: + g_value_set_string (value, priv->conference_server); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_roomlist_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleRoomlistChannel *chan = GABBLE_ROOMLIST_CHANNEL (object); + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (chan); + GabbleHandleSet *new_signalled_rooms; + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + /* this property is writable in the interface, but not actually + * meaningfully changable on this channel, so we do nothing */ + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + new_signalled_rooms = handle_set_new (priv->conn->handles, TP_HANDLE_TYPE_ROOM); + if (priv->signalled_rooms != NULL) + { + const GIntSet *add; + GIntSet *tmp; + add = handle_set_peek (priv->signalled_rooms); + tmp = handle_set_update (new_signalled_rooms, add); + handle_set_destroy (priv->signalled_rooms); + g_intset_destroy (tmp); + } + priv->signalled_rooms = new_signalled_rooms; + break; + case PROP_CONFERENCE_SERVER: + g_free (priv->conference_server); + priv->conference_server = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_roomlist_channel_dispose (GObject *object); +static void gabble_roomlist_channel_finalize (GObject *object); + +static void +gabble_roomlist_channel_class_init (GabbleRoomlistChannelClass *gabble_roomlist_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_roomlist_channel_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_roomlist_channel_class, sizeof (GabbleRoomlistChannelPrivate)); + + object_class->constructor = gabble_roomlist_channel_constructor; + + object_class->get_property = gabble_roomlist_channel_get_property; + object_class->set_property = gabble_roomlist_channel_set_property; + + object_class->dispose = gabble_roomlist_channel_dispose; + object_class->finalize = gabble_roomlist_channel_finalize; + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "room list channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_string ("conference-server", + "Name of conference server to use", + "Name of the XMPP conference server " + "on which to list rooms", + "", + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONFERENCE_SERVER, + param_spec); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_roomlist_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[GOT_ROOMS] = + g_signal_new ("got-rooms", + G_OBJECT_CLASS_TYPE (gabble_roomlist_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_collection ("GPtrArray", (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING, (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)), G_TYPE_INVALID))))); + + signals[LISTING_ROOMS] = + g_signal_new ("listing-rooms", + G_OBJECT_CLASS_TYPE (gabble_roomlist_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_roomlist_channel_class), &dbus_glib_gabble_roomlist_channel_object_info); +} + +void +gabble_roomlist_channel_dispose (GObject *object) +{ + GabbleRoomlistChannel *self = GABBLE_ROOMLIST_CHANNEL (object); + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + if (priv->listing) + { + emit_room_signal (object); + g_signal_emit (object, signals [LISTING_ROOMS], 0, FALSE); + priv->listing = FALSE; + } + + if (!priv->closed) + { + g_signal_emit (object, signals[CLOSED], 0); + priv->closed = TRUE; + } + + if (priv->disco_pipeline != NULL) + { + gabble_disco_pipeline_destroy (priv->disco_pipeline); + priv->disco_pipeline = NULL; + } + + if (priv->timer_source_id) + { + g_source_remove (priv->timer_source_id); + priv->timer_source_id = 0; + } + + g_assert (priv->pending_room_signals != NULL); + g_assert (priv->pending_room_signals->len == 0); + g_ptr_array_free (priv->pending_room_signals, TRUE); + priv->pending_room_signals = NULL; + + if (G_OBJECT_CLASS (gabble_roomlist_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_roomlist_channel_parent_class)->dispose (object); +} + +void +gabble_roomlist_channel_finalize (GObject *object) +{ + GabbleRoomlistChannel *self = GABBLE_ROOMLIST_CHANNEL (object); + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (self); + + /* free any data held directly by the object here */ + + g_free (priv->object_path); + g_free (priv->conference_server); + + if (priv->signalled_rooms != NULL) + handle_set_destroy (priv->signalled_rooms); + + G_OBJECT_CLASS (gabble_roomlist_channel_parent_class)->finalize (object); +} + +GabbleRoomlistChannel * +_gabble_roomlist_channel_new (GabbleConnection *conn, + const gchar *object_path, + const gchar *conference_server) +{ + g_return_val_if_fail (GABBLE_IS_CONNECTION (conn), NULL); + g_return_val_if_fail (object_path != NULL, NULL); + g_return_val_if_fail (conference_server != NULL, NULL); + + return GABBLE_ROOMLIST_CHANNEL ( + g_object_new (GABBLE_TYPE_ROOMLIST_CHANNEL, + "connection", conn, + "object-path", object_path, + "conference-server", conference_server, NULL)); +} + +static gboolean +emit_room_signal (gpointer data) +{ + GabbleRoomlistChannel *chan = data; + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (chan); + + if (!priv->listing) + return FALSE; + + if (priv->pending_room_signals->len == 0) + return TRUE; + + g_signal_emit (chan, signals[GOT_ROOMS], 0, priv->pending_room_signals); + + while (priv->pending_room_signals->len != 0) + { + gpointer boxed = g_ptr_array_index (priv->pending_room_signals, 0); + g_boxed_free (TP_TYPE_ROOM_STRUCT, boxed); + g_ptr_array_remove_index_fast (priv->pending_room_signals, 0); + } + + return TRUE; +} + +/** + * destroy_value: + * @data: a GValue to destroy + * + * destroys a GValue allocated on the heap + */ +static void +destroy_value (GValue *value) +{ + g_value_unset (value); + g_free (value); +} + +static void +room_info_cb (gpointer pipeline, GabbleDiscoItem *item, gpointer user_data) +{ + GabbleRoomlistChannel *chan = user_data; + GabbleRoomlistChannelPrivate *priv; + const char *jid, *category, *type, *var, *name; + GabbleHandle handle; + GHashTable *keys; + GValue room = {0,}; + GValue *tmp; + gpointer k, v; + + #define INSERT_KEY(hash, name, type, type2, value) \ + do {\ + tmp = g_new0 (GValue, 1); \ + g_value_init (tmp, (type)); \ + g_value_set_##type2 (tmp, (value)); \ + g_hash_table_insert (hash, (name), tmp); \ + } while (0) + + g_assert (GABBLE_IS_ROOMLIST_CHANNEL (chan)); + priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (chan); + + jid = item->jid; + name = item->name; + category = item->category; + type = item->type; + + if (0 != strcmp (category, "conference") || + 0 != strcmp (type, "text")) + return; + + if (!g_hash_table_lookup_extended (item->features, "http://jabber.org/protocol/muc", &k, &v)) + { + /* not muc */ + return; + } + + gabble_debug (DEBUG_FLAG, "got room identity, name=%s, category=%s, type=%s", name, category, type); + + keys = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, + (GDestroyNotify) destroy_value); + + INSERT_KEY (keys, "name", G_TYPE_STRING, string, name); + + if (g_hash_table_lookup_extended (item->features, "muc_membersonly", &k, &v)) + INSERT_KEY (keys, "invite-only", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_open", &k, &v)) + INSERT_KEY (keys, "invite-only", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_passwordprotected", &k, &v)) + INSERT_KEY (keys, "password", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_unsecure", &k, &v)) + INSERT_KEY (keys, "password", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_unsecured", &k, &v)) + INSERT_KEY (keys, "password", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_hidden", &k, &v)) + INSERT_KEY (keys, "hidden", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_public", &k, &v)) + INSERT_KEY (keys, "hidden", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_membersonly", &k, &v)) + INSERT_KEY (keys, "members-only", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_open", &k, &v)) + INSERT_KEY (keys, "members-only", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_moderated", &k, &v)) + INSERT_KEY (keys, "moderated", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_unmoderated", &k, &v)) + INSERT_KEY (keys, "moderated", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_nonanonymous", &k, &v)) + INSERT_KEY (keys, "anonymous", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_anonymous", &k, &v)) + INSERT_KEY (keys, "anonymous", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_semianonymous", &k, &v)) + INSERT_KEY (keys, "anonymous", G_TYPE_BOOLEAN, boolean, FALSE); + if (g_hash_table_lookup_extended (item->features, "muc_persistent", &k, &v)) + INSERT_KEY (keys, "persistent", G_TYPE_BOOLEAN, boolean, TRUE); + if (g_hash_table_lookup_extended (item->features, "muc_temporary", &k, &v)) + INSERT_KEY (keys, "persistent", G_TYPE_BOOLEAN, boolean, FALSE); + + var = g_hash_table_lookup (item->features, "muc#roominfo_description"); + if (var != NULL) + INSERT_KEY (keys, "description", G_TYPE_STRING, string, var); + + var = g_hash_table_lookup (item->features, "muc#roominfo_occupants"); + if (var != NULL) + INSERT_KEY (keys, "members", G_TYPE_UINT, uint, + (guint) g_ascii_strtoull (var, NULL, 10)); + + var = g_hash_table_lookup (item->features, "muc#roominfo_lang"); + if (var != NULL) + INSERT_KEY (keys, "language", G_TYPE_STRING, string, var); + + handle = gabble_handle_for_room (priv->conn->handles, jid); + + handle_set_add (priv->signalled_rooms, handle); + + g_value_init (&room, TP_TYPE_ROOM_STRUCT); + g_value_take_boxed (&room, + dbus_g_type_specialized_construct (TP_TYPE_ROOM_STRUCT)); + + dbus_g_type_struct_set (&room, + 0, handle, + 1, "org.freedesktop.Telepathy.Channel.Type.Text", + 2, keys, + G_MAXUINT); + + gabble_debug (DEBUG_FLAG, "adding new room signal data to pending: %s", jid); + g_ptr_array_add (priv->pending_room_signals, g_value_get_boxed (&room)); + g_hash_table_destroy (keys); +} + +static void +rooms_end_cb (gpointer data, gpointer user_data) +{ + GabbleRoomlistChannel *chan = user_data; + GabbleRoomlistChannelPrivate *priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (chan); + + emit_room_signal (chan); + + priv->listing = FALSE; + g_signal_emit (chan, signals[LISTING_ROOMS], 0, FALSE); + + g_source_remove (priv->timer_source_id); + priv->timer_source_id = 0; +} + + +/************************* D-Bus Method definitions **************************/ + +/** + * gabble_roomlist_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_close (GabbleRoomlistChannel *self, + GError **error) +{ + g_assert (GABBLE_IS_ROOMLIST_CHANNEL (self)); + + gabble_debug (DEBUG_FLAG, "called on %p", self); + + g_object_run_dispose (G_OBJECT (self)); + + return TRUE; +} + + +/** + * gabble_roomlist_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_get_channel_type (GabbleRoomlistChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_ROOM_LIST); + return TRUE; +} + + +/** + * gabble_roomlist_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_get_handle (GabbleRoomlistChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + g_assert (GABBLE_IS_ROOMLIST_CHANNEL (self)); + + *ret = 0; + *ret1 = 0; + + return TRUE; +} + + +/** + * gabble_roomlist_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_get_interfaces (GabbleRoomlistChannel *self, + gchar ***ret, + GError **error) +{ + const char *interfaces[] = { NULL }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_roomlist_channel_get_listing_rooms + * + * Implements D-Bus method GetListingRooms + * on interface org.freedesktop.Telepathy.Channel.Type.RoomList + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_get_listing_rooms (GabbleRoomlistChannel *self, + gboolean *ret, + GError **error) +{ + GabbleRoomlistChannelPrivate *priv; + + g_assert (GABBLE_IS_ROOMLIST_CHANNEL (self)); + + priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (self); + *ret = priv->listing; + return TRUE; +} + + +/** + * gabble_roomlist_channel_list_rooms + * + * Implements D-Bus method ListRooms + * on interface org.freedesktop.Telepathy.Channel.Type.RoomList + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roomlist_channel_list_rooms (GabbleRoomlistChannel *self, + GError **error) +{ + GabbleRoomlistChannelPrivate *priv; + + g_assert (GABBLE_IS_ROOMLIST_CHANNEL (self)); + + priv = GABBLE_ROOMLIST_CHANNEL_GET_PRIVATE (self); + + priv->listing = TRUE; + g_signal_emit (self, signals[LISTING_ROOMS], 0, TRUE); + + if (priv->disco_pipeline == NULL) + priv->disco_pipeline = gabble_disco_pipeline_init (priv->conn->disco, + room_info_cb, rooms_end_cb, self); + + gabble_disco_pipeline_run (priv->disco_pipeline, priv->conference_server); + + priv->timer_source_id = g_timeout_add (ROOM_SIGNAL_INTERVAL, + emit_room_signal, self); + + return TRUE; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-roster-channel-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-roster-channel-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,66 @@ +/* + * gabble-roster-channel-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-roster-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-roster-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,812 @@ +/* + * gabble-roster-channel.c - Source for GabbleRosterChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_ROSTER + +#include "debug.h" +#include "gabble-connection.h" +#include "gintset.h" +#include "group-mixin.h" +#include "handle-set.h" +#include "roster.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "tp-channel-iface.h" +#include "util.h" + +#include "gabble-roster-channel.h" +#include "gabble-roster-channel-glue.h" +#include "gabble-roster-channel-signals-marshal.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleRosterChannel, gabble_roster_channel, + G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); +#endif + +/* signal enum */ +enum +{ + CLOSED, + GROUP_FLAGS_CHANGED, + MEMBERS_CHANGED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_ROS_CHNL +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_ros_chnl,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_ros_chnl, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_roster_channel_parent_class,gabble_ros_chnl,gpointer) + #define gabble_roster_channel_parent_class (*GET_WSD_VAR_NAME(gabble_roster_channel_parent_class,gabble_ros_chnl,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_ros_chnl,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_ros_chnl,s)()) + +static void gabble_roster_channel_init (GabbleRosterChannel *self); +static void gabble_roster_channel_class_init (GabbleRosterChannelClass *klass); +static void gabble_roster_channel_class_intern_init (gpointer klass) +{ + gabble_roster_channel_parent_class = g_type_class_peek_parent (klass); + gabble_roster_channel_class_init ((GabbleRosterChannelClass*) klass); + } + + EXPORT_C GType gabble_roster_channel_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleRosterChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_roster_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleRosterChannel), 0, (GInstanceInitFunc) gabble_roster_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleRosterChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleRosterChannelPrivate GabbleRosterChannelPrivate; + +struct _GabbleRosterChannelPrivate +{ + GabbleConnection *conn; + char *object_path; + GabbleHandle handle; + + gboolean dispose_has_run; +}; + +#define GABBLE_ROSTER_CHANNEL_GET_PRIVATE(obj) \ + ((GabbleRosterChannelPrivate *)obj->priv) + +static void +gabble_roster_channel_init (GabbleRosterChannel *self) +{ + GabbleRosterChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_ROSTER_CHANNEL, GabbleRosterChannelPrivate); + + self->priv = priv; + + /* allocate any data required by the object here */ +} + +static GObject * +gabble_roster_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleRosterChannelPrivate *priv; + DBusGConnection *bus; + GabbleHandleRepo *handles; + gboolean valid; + GabbleHandle self_handle; + + obj = G_OBJECT_CLASS (gabble_roster_channel_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (GABBLE_ROSTER_CHANNEL (obj)); + handles = priv->conn->handles; + self_handle = priv->conn->self_handle; + + /* register object on the bus */ + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + /* ref our list handle */ + valid = gabble_handle_ref (handles, TP_HANDLE_TYPE_LIST, priv->handle); + g_assert (valid); + + /* initialize group mixin */ + gabble_group_mixin_init (obj, G_STRUCT_OFFSET (GabbleRosterChannel, group), + handles, self_handle); + + if (GABBLE_LIST_HANDLE_PUBLISH == priv->handle) + { + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_MESSAGE_ACCEPT | + TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE, + 0); + } + else if (GABBLE_LIST_HANDLE_SUBSCRIBE == priv->handle) + { + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CAN_ADD | + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | + TP_CHANNEL_GROUP_FLAG_CAN_RESCIND | + TP_CHANNEL_GROUP_FLAG_MESSAGE_ADD | + TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE | + TP_CHANNEL_GROUP_FLAG_MESSAGE_RESCIND, + 0); + } + else if (GABBLE_LIST_HANDLE_KNOWN == priv->handle) + { + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE, + 0); + } + else if (GABBLE_LIST_HANDLE_DENY == priv->handle) + { + gabble_group_mixin_change_flags (obj, + TP_CHANNEL_GROUP_FLAG_CAN_ADD | + TP_CHANNEL_GROUP_FLAG_CAN_REMOVE, + 0); + } + else + { + g_assert_not_reached (); + } + + return obj; +} + +static void +gabble_roster_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleRosterChannel *chan = GABBLE_ROSTER_CHANNEL (object); + GabbleRosterChannelPrivate *priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_LIST); + break; + case PROP_HANDLE: + g_value_set_uint (value, priv->handle); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_roster_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleRosterChannel *chan = GABBLE_ROSTER_CHANNEL (object); + GabbleRosterChannelPrivate *priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + priv->handle = g_value_get_uint (value); + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_roster_channel_dispose (GObject *object); +static void gabble_roster_channel_finalize (GObject *object); + +static gboolean _gabble_roster_channel_add_member_cb (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); +static gboolean _gabble_roster_channel_remove_member_cb (GObject *obj, GabbleHandle handle, const gchar *message, GError **error); + +static void +gabble_roster_channel_class_init (GabbleRosterChannelClass *gabble_roster_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_roster_channel_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_roster_channel_class, sizeof (GabbleRosterChannelPrivate)); + + object_class->constructor = gabble_roster_channel_constructor; + + object_class->get_property = gabble_roster_channel_get_property; + object_class->set_property = gabble_roster_channel_set_property; + + object_class->dispose = gabble_roster_channel_dispose; + object_class->finalize = gabble_roster_channel_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "Roster channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_roster_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gabble_group_mixin_class_init (object_class, + G_STRUCT_OFFSET (GabbleRosterChannelClass, group_class), + _gabble_roster_channel_add_member_cb, + _gabble_roster_channel_remove_member_cb); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_roster_channel_class), &dbus_glib_gabble_roster_channel_object_info); +} + +void +gabble_roster_channel_dispose (GObject *object) +{ + GabbleRosterChannel *self = GABBLE_ROSTER_CHANNEL (object); + GabbleRosterChannelPrivate *priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + g_signal_emit(self, signals[CLOSED], 0); + + /* release any references held by the object here */ + + if (G_OBJECT_CLASS (gabble_roster_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_roster_channel_parent_class)->dispose (object); +} + +void +gabble_roster_channel_finalize (GObject *object) +{ + GabbleRosterChannel *self = GABBLE_ROSTER_CHANNEL (object); + GabbleRosterChannelPrivate *priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (self); + + /* free any data held directly by the object here */ + + g_free (priv->object_path); + + gabble_handle_unref (priv->conn->handles, TP_HANDLE_TYPE_LIST, priv->handle); + + gabble_group_mixin_finalize (object); + + G_OBJECT_CLASS (gabble_roster_channel_parent_class)->finalize (object); +} + + +static gboolean +_gabble_roster_channel_send_presence (GabbleRosterChannel *chan, + LmMessageSubType sub_type, + GabbleHandle handle, + const gchar *status, + GError **error) +{ + GabbleRosterChannelPrivate *priv; + GabbleHandleRepo *repo; + const char *contact; + LmMessage *message; + gboolean result; + + priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (chan); + repo = priv->conn->handles; + contact = gabble_handle_inspect (repo, TP_HANDLE_TYPE_CONTACT, handle); + + message = lm_message_new_with_sub_type (contact, + LM_MESSAGE_TYPE_PRESENCE, + sub_type); + + if (LM_MESSAGE_SUB_TYPE_SUBSCRIBE == sub_type) + lm_message_node_add_own_nick (message->node, priv->conn); + + if (status != NULL && status[0] != '\0') + lm_message_node_add_child (message->node, "status", status); + + result = _gabble_connection_send (priv->conn, message, error); + + lm_message_unref (message); + + return result; +} + + +/** + * _gabble_roster_channel_add_member_cb + * + * Called by the group mixin to add one member. + */ +static gboolean +_gabble_roster_channel_add_member_cb (GObject *obj, + GabbleHandle handle, + const gchar *message, + GError **error) +{ + GabbleRosterChannelPrivate *priv; + GabbleHandleRepo *repo; + gboolean ret = FALSE; + + priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (GABBLE_ROSTER_CHANNEL (obj)); + + repo = priv->conn->handles; + + gabble_debug (DEBUG_FLAG, "called on %s with handle %u (%s) \"%s\"", gabble_handle_inspect (repo, TP_HANDLE_TYPE_LIST, priv->handle), handle, + gabble_handle_inspect (repo, TP_HANDLE_TYPE_CONTACT, handle), message); + + /* publish list */ + if (GABBLE_LIST_HANDLE_PUBLISH == priv->handle) + { + /* send */ + ret = _gabble_roster_channel_send_presence (GABBLE_ROSTER_CHANNEL (obj), + LM_MESSAGE_SUB_TYPE_SUBSCRIBED, handle, message, error); + } + /* subscribe list */ + else if (GABBLE_LIST_HANDLE_SUBSCRIBE == priv->handle) + { + /* add item to the roster (GTalk depends on this, clearing the H flag) */ + gabble_roster_handle_add (priv->conn->roster, handle, NULL); + + /* send */ + ret = _gabble_roster_channel_send_presence (GABBLE_ROSTER_CHANNEL (obj), + LM_MESSAGE_SUB_TYPE_SUBSCRIBE, handle, message, error); + } + /* deny list */ + else if (GABBLE_LIST_HANDLE_DENY == priv->handle) + { + /* block contact */ + ret = gabble_roster_handle_set_blocked (priv->conn->roster, handle, TRUE, + error); + } + else + { + g_assert_not_reached (); + } + + return ret; +} + + +/** + * _gabble_roster_channel_remove_member_cb + * + * Called by the group mixin to remove one member. + */ +static gboolean +_gabble_roster_channel_remove_member_cb (GObject *obj, + GabbleHandle handle, + const gchar *message, + GError **error) +{ + GabbleRosterChannelPrivate *priv; + GabbleHandleRepo *repo; + gboolean ret = FALSE; + + priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (GABBLE_ROSTER_CHANNEL (obj)); + + repo = priv->conn->handles; + + gabble_debug (DEBUG_FLAG, "called on %s with handle %u (%s) \"%s\"", gabble_handle_inspect (repo, TP_HANDLE_TYPE_LIST, priv->handle), handle, + gabble_handle_inspect (repo, TP_HANDLE_TYPE_CONTACT, handle), message); + + /* publish list */ + if (GABBLE_LIST_HANDLE_PUBLISH == priv->handle) + { + /* send */ + ret = _gabble_roster_channel_send_presence (GABBLE_ROSTER_CHANNEL (obj), + LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED, handle, message, error); + + /* remove it from local_pending here, because roster callback doesn't + know if it can (subscription='none' is used both during request and + when it's rejected) */ + if (handle_set_is_member (GABBLE_ROSTER_CHANNEL (obj)->group.local_pending, handle)) + { + GIntSet *rem = g_intset_new (); + + g_intset_add (rem, handle); + gabble_group_mixin_change_members (obj, "", NULL, rem, NULL, NULL, + 0, 0); + + g_intset_destroy (rem); + } + } + /* subscribe list */ + else if (GABBLE_LIST_HANDLE_SUBSCRIBE == priv->handle) + { + /* send */ + ret = _gabble_roster_channel_send_presence (GABBLE_ROSTER_CHANNEL (obj), + LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE, handle, message, error); + } + /* known list */ + else if (GABBLE_LIST_HANDLE_KNOWN == priv->handle) + { + /* send roster subscription=remove IQ */ + ret = gabble_roster_handle_remove (priv->conn->roster, handle, error); + } + /* deny list */ + else if (GABBLE_LIST_HANDLE_DENY == priv->handle) + { + /* unblock contact */ + ret = gabble_roster_handle_set_blocked (priv->conn->roster, handle, FALSE, + error); + } + else + { + g_assert_not_reached (); + } + + return ret; +} + + +/** + * gabble_roster_channel_add_members + * + * Implements D-Bus method AddMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_add_members (GabbleRosterChannel *self, + const GArray *contacts, + const gchar *message, + GError **error) +{ + return gabble_group_mixin_add_members (G_OBJECT (self), contacts, message, + error); +} + + +/** + * gabble_roster_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_close (GabbleRosterChannel *self, + GError **error) +{ + g_set_error (error, TELEPATHY_ERRORS, NotImplemented, + "you may not close contact list channels"); + + return FALSE; +} + + +/** + * gabble_roster_channel_get_all_members + * + * Implements D-Bus method GetAllMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_all_members (GabbleRosterChannel *self, + GArray **ret, + GArray **ret1, + GArray **ret2, + GError **error) +{ + return gabble_group_mixin_get_all_members (G_OBJECT (self), ret, ret1, ret2, + error); +} + + +/** + * gabble_roster_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_channel_type (GabbleRosterChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_CONTACT_LIST); + + return TRUE; +} + + +/** + * gabble_roster_channel_get_group_flags + * + * Implements D-Bus method GetGroupFlags + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_group_flags (GabbleRosterChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_group_flags (G_OBJECT (self), ret, error); +} + + +/** + * gabble_roster_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_handle (GabbleRosterChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + GabbleRosterChannelPrivate *priv; + + g_assert (GABBLE_IS_ROSTER_CHANNEL (self)); + + priv = GABBLE_ROSTER_CHANNEL_GET_PRIVATE (self); + + *ret = TP_HANDLE_TYPE_LIST; + *ret1 = priv->handle; + + return TRUE; +} + + +/** + * gabble_roster_channel_get_handle_owners + * + * Implements D-Bus method GetHandleOwners + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_handle_owners (GabbleRosterChannel *self, + const GArray *handles, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_handle_owners (G_OBJECT (self), handles, ret, + error); +} + + +/** + * gabble_roster_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_interfaces (GabbleRosterChannel *self, + gchar ***ret, + GError **error) +{ + const char *interfaces[] = { TP_IFACE_CHANNEL_INTERFACE_GROUP, NULL }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_roster_channel_get_local_pending_members + * + * Implements D-Bus method GetLocalPendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_local_pending_members (GabbleRosterChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_local_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_roster_channel_get_members + * + * Implements D-Bus method GetMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_members (GabbleRosterChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_members (G_OBJECT (self), ret, error); +} + + +/** + * gabble_roster_channel_get_remote_pending_members + * + * Implements D-Bus method GetRemotePendingMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_remote_pending_members (GabbleRosterChannel *self, + GArray **ret, + GError **error) +{ + return gabble_group_mixin_get_remote_pending_members (G_OBJECT (self), ret, + error); +} + + +/** + * gabble_roster_channel_get_self_handle + * + * Implements D-Bus method GetSelfHandle + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_get_self_handle (GabbleRosterChannel *self, + guint *ret, + GError **error) +{ + return gabble_group_mixin_get_self_handle (G_OBJECT (self), ret, error); +} + + +/** + * gabble_roster_channel_remove_members + * + * Implements D-Bus method RemoveMembers + * on interface org.freedesktop.Telepathy.Channel.Interface.Group + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_roster_channel_remove_members (GabbleRosterChannel *self, + const GArray *contacts, + const gchar *message, + GError **error) +{ + return gabble_group_mixin_remove_members (G_OBJECT (self), contacts, message, + error); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble-search-channel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble-search-channel.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,680 @@ +/* + * gabble-im-channel.c - Source for GabbleSearchChannel + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "loudmouth/loudmouth.h" +#include +#include +#include + + +#define DEBUG_FLAG GABBLE_DEBUG_SEARCH + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-presence.h" +#include "gabble-presence-cache.h" +#include "handles.h" +#include "roster.h" +#include "telepathy-constants.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "telepathy-interfaces.h" +#include "tp-channel-iface.h" +#include "namespaces.h" + +#include "gabble-search-channel.h" +#include "gabble-search-channel-glue.h" +#include "search-mixin-signals-marshal.h" +#include "search-mixin.h" + +#include "gabble_enums.h" + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleSearchChannel, gabble_search_channel, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL)); + +#endif + +/* signal enum */ +enum +{ + CLOSED, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_SEARCH +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_search,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_search, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_search_channel_parent_class,gabble_search,gpointer) + #define gabble_search_channel_parent_class (*GET_WSD_VAR_NAME(gabble_search_channel_parent_class,gabble_search,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_search,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_search,s)()) + + +static void gabble_search_channel_init (GabbleSearchChannel *self); +static void gabble_search_channel_class_init (GabbleSearchChannelClass *klass); +static void gabble_search_channel_class_intern_init (gpointer klass) +{ + gabble_search_channel_parent_class = g_type_class_peek_parent (klass); + gabble_search_channel_class_init ((GabbleSearchChannelClass*) klass); + } + EXPORT_C GType gabble_search_channel_get_type (void) + { + if ((g_define_type_id == 0)) + { static const GTypeInfo g_define_type_info = + { sizeof (GabbleSearchChannelClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_search_channel_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleSearchChannel), 0, (GInstanceInitFunc) gabble_search_channel_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleSearchChannel"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) ((void *)0) }; g_type_add_interface_static (g_define_type_id, tp_channel_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; + }; + + + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + +/* properties */ +enum +{ + PROP_OBJECT_PATH = 1, + PROP_CHANNEL_TYPE, + PROP_HANDLE_TYPE, + PROP_HANDLE, + PROP_CONNECTION, + LAST_PROPERTY +}; + +/* private structure */ +typedef struct _GabbleSearchChannelPrivate GabbleSearchChannelPrivate; + +struct _GabbleSearchChannelPrivate +{ + GabbleConnection *conn; + char *object_path; + GabbleHandle handle; + gboolean closed; + gboolean dispose_has_run; +}; + +#define GABBLE_SEARCH_CHANNEL_GET_PRIVATE(obj) \ + ((GabbleSearchChannelPrivate *)obj->priv) + +static void +gabble_search_channel_init (GabbleSearchChannel *self) +{ + GabbleSearchChannelPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GABBLE_TYPE_SEARCH_CHANNEL, GabbleSearchChannelPrivate); + + self->priv = priv; +} + +static GObject * +gabble_search_channel_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleSearchChannelPrivate *priv; + DBusGConnection *bus; + + g_message("in gabble_search_channel_constructor\n"); + obj = G_OBJECT_CLASS (gabble_search_channel_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (GABBLE_SEARCH_CHANNEL (obj)); + + bus = tp_get_bus (); + dbus_g_connection_register_g_object (bus, priv->object_path, obj); + + + gabble_search_mixin_init (obj, G_STRUCT_OFFSET (GabbleSearchChannel, search_mixin)); + + + return obj; +} + +static void +gabble_search_channel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleSearchChannel *chan = GABBLE_SEARCH_CHANNEL (object); + GabbleSearchChannelPrivate *priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_value_set_string (value, priv->object_path); + break; + case PROP_CHANNEL_TYPE: + g_value_set_static_string (value, TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH); + break; + case PROP_HANDLE_TYPE: + g_value_set_uint (value, TP_HANDLE_TYPE_NONE); + break; + case PROP_HANDLE: + g_value_set_uint (value, 0 ); + break; + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_search_channel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleSearchChannel *chan = GABBLE_SEARCH_CHANNEL (object); + GabbleSearchChannelPrivate *priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_OBJECT_PATH: + g_free (priv->object_path); + priv->object_path = g_value_dup_string (value); + break; + case PROP_HANDLE: + priv->handle = g_value_get_uint (value); + break; + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void gabble_search_channel_dispose (GObject *object); +static void gabble_search_channel_finalize (GObject *object); + +static void +gabble_search_channel_class_init (GabbleSearchChannelClass *gabble_search_channel_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_search_channel_class); + GParamSpec *param_spec; + g_message("in gabble_search_channel_class_init"); + + g_type_class_add_private (gabble_search_channel_class, sizeof (GabbleSearchChannelPrivate)); + + object_class->constructor = gabble_search_channel_constructor; + + object_class->get_property = gabble_search_channel_get_property; + object_class->set_property = gabble_search_channel_set_property; + + object_class->dispose = gabble_search_channel_dispose; + object_class->finalize = gabble_search_channel_finalize; + + g_object_class_override_property (object_class, PROP_OBJECT_PATH, "object-path"); + g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type"); + g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type"); + g_object_class_override_property (object_class, PROP_HANDLE, "handle"); + + + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "Search channel object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (gabble_search_channel_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gabble_search_mixin_class_init (object_class, G_STRUCT_OFFSET (GabbleSearchChannelClass, mixin_class)); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (gabble_search_channel_class), &dbus_glib_gabble_search_channel_object_info); +} + +void +gabble_search_channel_dispose (GObject *object) +{ + GabbleSearchChannel *self = GABBLE_SEARCH_CHANNEL (object); + GabbleSearchChannelPrivate *priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + g_message("in gabble_search_channel_dispose\n"); + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + + if (!priv->closed) + g_signal_emit(self, signals[CLOSED], 0); + + if (G_OBJECT_CLASS (gabble_search_channel_parent_class)->dispose) + G_OBJECT_CLASS (gabble_search_channel_parent_class)->dispose (object); +} + +void +gabble_search_channel_finalize (GObject *object) +{ + GabbleSearchChannel *self = GABBLE_SEARCH_CHANNEL (object); + GabbleSearchChannelPrivate *priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + g_message("in gabble_search_channel_finalize\n"); + /* free any data held directly by the object here */ + if( priv->object_path ) + { + g_message("freeing priv->object_path in gabble_search_channel_finalize\n"); + g_free (priv->object_path); + priv->object_path = NULL; + } + + //also free the data,if any, held by mixin obj + //gabble_search_mixin_finalize(object); + + G_OBJECT_CLASS (gabble_search_channel_parent_class)->finalize (object); +} + + + +/** + * gabble_search_channel_close + * + * Implements D-Bus method Close + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_close (GabbleSearchChannel *self, + GError **error) +{ + GabbleSearchChannelPrivate *priv; + + g_assert (GABBLE_IS_SEARCH_CHANNEL (self)); + + gabble_debug (DEBUG_FLAG, "called on %p", self); + + g_message("gabble_search_channel_close"); + priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + if (priv->closed) + { + gabble_debug (DEBUG_FLAG, "channel already closed"); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Channel already closed"); + + return FALSE; + } + + + priv->closed = TRUE; + + g_signal_emit (self, signals[CLOSED], 0); + + return TRUE; +} + + +/** + * gabble_search_channel_get_channel_type + * + * Implements D-Bus method GetChannelType + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_get_channel_type (GabbleSearchChannel *self, + gchar **ret, + GError **error) +{ + *ret = g_strdup (TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH); + + return TRUE; +} + + +/** + * gabble_search_channel_get_interfaces + * + * Implements D-Bus method GetInterfaces + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_get_interfaces (GabbleSearchChannel *self, + gchar ***ret, + GError **error) +{ + const char *interfaces[] = { NULL }; + + *ret = g_strdupv ((gchar **) interfaces); + + return TRUE; +} + + +/** + * gabble_search_channel_search + * + * Implements D-Bus method Search + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_search ( GabbleSearchChannel *self, + GHashTable *params, + GError **error + ) +{ + GabbleSearchChannelPrivate *priv; + + g_message("In gabble_search_channel_search: serachchan is %u\n",self); + + g_assert (GABBLE_IS_SEARCH_CHANNEL (self)); + priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + return gabble_search_mixin_search (G_OBJECT (self), params, + priv->conn, error); + +} + +/** + * gabble_search_channel_get_search_state + * + * Implements D-Bus method GetSearchState + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_get_search_state ( GabbleSearchChannel *self, + guint *ret, + GError **error + ) +{ + g_message("In gabble_search_channel_get_search_state\n"); + return gabble_search_mixin_get_search_state (G_OBJECT (self),ret, error); + } + + +/** + * gabble_search_channel_get_handle + * + * Implements D-Bus method GetHandle + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_get_handle (GabbleSearchChannel *self, + guint *ret, + guint *ret1, + GError **error) +{ + GabbleSearchChannelPrivate *priv; + + g_assert (GABBLE_IS_SEARCH_CHANNEL (self)); + + priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + *ret = TP_HANDLE_TYPE_NONE; + //search channel doesnt correspond to any particular handle + *ret1 = 0; + + return TRUE; +} + +/** + * TODO: this method may be modified in future to get the search key types + * as dbus-glib binding tool doesnt support 'g' type signature + * Also this method should be able to give value + * for the options for list-single or list-multi type search keys if required + * gabble_search_channel_get_search_keys + * + * Implements D-Bus method GetSearchKeys + * on interface org.freedesktop.Telepathy.Channel + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns FALSE. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_channel_get_search_keys ( GabbleSearchChannel *self, + gchar **ret_instruction, + gchar ***ret_searchkeys, + GError **error + ) +{ + GabbleSearchChannelPrivate *priv; + + g_message("In gabble_search_channel_get_search_keys: serachchan is %u\n",self); + + g_assert (GABBLE_IS_SEARCH_CHANNEL (self)); + priv = GABBLE_SEARCH_CHANNEL_GET_PRIVATE (self); + + return gabble_search_mixin_get_search_keys (G_OBJECT (self),ret_instruction, + ret_searchkeys, + priv->conn, error); + } + + +/** + * search_channel_iq_cb: + * + * Called by loudmouth when we get an incoming . This handler + * is concerned only with search queries, and allows other handlers + * if queries other than search are received. + */ + +LmHandlerResult +search_channel_iq_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabbleSearchChannel *chan = GABBLE_SEARCH_CHANNEL (user_data); + GabbleSearchChannelPrivate *priv = NULL; + GabbleSearchMixin *mixin = NULL; + + LmMessageNode *iq_node, *query_node; + LmMessageSubType sub_type; + + LmMessageNode *x_node, *x_item_node, *result_node; + const char *x_node_type; + const gchar **from = NULL; + + GHashTable *results = NULL; + guint contact_handle = 0; + + + g_message("in search_channel_iq_cb: user data - chan is : %u\n", chan); + + sub_type = lm_message_get_sub_type (message); + + if (sub_type != LM_MESSAGE_SUB_TYPE_RESULT) + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + iq_node = lm_message_get_node (message); + query_node = lm_message_node_get_child_with_namespace (iq_node, "query", + NS_SEARCH); + + if (query_node == NULL || chan == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + + + priv= GABBLE_SEARCH_CHANNEL_GET_PRIVATE (chan); + mixin = GABBLE_SEARCH_MIXIN (chan); + + + x_node = lm_message_node_get_child_with_namespace (query_node, "x", NS_X_DATA); + + if( x_node ) + { + //if service supports data forms + result_node = x_node; + x_node_type = lm_message_node_get_attribute (x_node, "type" ); + if (0 != strcmp (x_node_type, "result")) + { + //this can be for search_keys_iq_cb + //callback received as result of request to get search key fields + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + //if(type == NULL), do some error handling + } + + else + result_node = query_node; + + + for (x_item_node = result_node->children; x_item_node; x_item_node = x_item_node->next) + { + LmMessageNode *item_node, *node; + GHashTable *search_result = NULL; + gboolean reported_field_has_type = FALSE; + + + if(!search_result) + search_result = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,NULL); + + //there should be only one reported field + //Later "reported" should also be used to get the types of search result fields + //'g' type currently not supported by dbus-glib-binding + if (0 != strcmp (x_item_node->name, "item") ) + continue; + + contact_handle = 0; + + //x_item_node is an item node + //get the field nodes from each item node + for (node = x_item_node->children; node; node = node->next) + { + const gchar *key, *value; + LmMessageNode *value_node; + GValue *val = g_new0(GValue, 1); + LmMessageNode *reported_field_node; + + + if (0 != strcmp (node->name, "field")) + continue; + + //node is a field or reported node + //get the name, type and value of each field + key = lm_message_node_get_attribute(node, "var"); + + value_node = lm_message_node_get_child(node, "value"); + + value = lm_message_node_get_value(value_node); + + if(0 == strcmp (key, "jid")) + { + g_message("getting contact_handle\n"); + contact_handle = gabble_handle_for_contact (priv->conn->handles, value, FALSE); + } + + g_value_init (val, G_TYPE_STRING); + //"val" should be a struct with members "var" and "type" + g_value_set_string (val, g_strdup(value) ); + g_hash_table_insert(search_result,g_strdup(key),val); + + } + + + g_message("search results: %u",g_hash_table_size(search_result)); + //emit the signal for search result received + _gabble_search_mixin_emit_search_result_received(G_OBJECT (chan),contact_handle, search_result); + + g_hash_table_destroy(search_result); + } + + + //if no search results, service must return empty query element + //so emit the signal for the same + if(!contact_handle) + { + + if(!results) + results = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,NULL); + + _gabble_search_mixin_emit_search_result_received(G_OBJECT (chan),contact_handle, results); + g_hash_table_destroy(results); + + } + + //search state should be completed + g_message("b4 set search state changed \n"); + _gabble_search_mixin_set_search_state(G_OBJECT (chan), TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER); + + //search request completed now, emit the signal for search state changed + g_message("b4 emiiting search state changed signal\n"); + _gabble_search_mixin_emit_search_state_changed(G_OBJECT (chan),TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gabble.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gabble.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,223 @@ +/* + * gabble.h - entry point and utility functions for telepathy-gabble + * Copyright (C) 2005 Collabora Ltd. + * Portions and/or its subsidiary/subsidiaris. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#ifdef HAVE_EXECINFO_H +#include +#endif /* HAVE_EXECINFO_H */ + +#ifdef HAVE_SIGNAL_H +#include +#endif /* HAVE_SIGNAL_H */ + +#include "debug.h" +#include "gabble-connection-manager.h" +#include "telepathy-errors.h" +#include "telepathy-errors-enumtypes.h" + +GSource *timeout = NULL; +GMainLoop *mainloop = NULL; +GabbleConnectionManager *manager = NULL; +gboolean connections_exist = FALSE; +guint timeout_id; + +#define DIE_TIME 5000 + +static gboolean +kill_connection_manager (gpointer data) +{ + g_debug ("%s: in kill_connection_manager", G_STRFUNC); +#ifdef ENABLE_DEBUG + if (!gabble_debug_flag_is_set (GABBLE_DEBUG_PERSIST) && !connections_exist) +#else + if (!connections_exist) +#endif + { + g_debug ("no connections, and timed out"); + g_object_unref (manager); + g_main_loop_quit (mainloop); + } + + timeout_id = 0; + g_debug ("%s: out kill_connection_manager", G_STRFUNC); + return FALSE; +} + +static void +new_connection (GabbleConnectionManager *conn, + gchar *bus_name, + gchar *object_path, + gchar *proto) +{ + connections_exist = TRUE; + + if (0 != timeout_id) + { + g_source_remove (timeout_id); + } +} + +static void +no_more_connections (GabbleConnectionManager *conn) +{ + connections_exist = FALSE; + g_debug ("%s: in no more connections", G_STRFUNC); + if (0 != timeout_id) + { + g_source_remove (timeout_id); + } + + timeout_id = g_timeout_add (DIE_TIME, kill_connection_manager, NULL); + g_debug ("%s: out no more connections", G_STRFUNC); +} + +#ifdef ENABLE_BACKTRACE +static void +print_backtrace (void) +{ +#if defined (HAVE_BACKTRACE) && defined (HAVE_BACKTRACE_SYMBOLS_FD) + void *array[20]; + size_t size; + +#define MSG "\n########## Backtrace (version " VERSION ") ##########\n" + write (STDERR_FILENO, MSG, strlen (MSG)); +#undef MSG + + size = backtrace (array, 20); + backtrace_symbols_fd (array, size, STDERR_FILENO); +#endif /* HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS_FD */ +} + +static void +critical_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_log_default_handler (log_domain, log_level, message, user_data); + print_backtrace (); +} + +#ifdef HAVE_SIGNAL +static void +segv_handler (int sig) +{ +#define MSG "caught SIGSEGV\n" + write (STDERR_FILENO, MSG, strlen (MSG)); +#undef MSG + + print_backtrace (); + abort (); +} +#endif /* HAVE_SIGNAL */ + +#endif /* ENABLE_BACKTRACE */ + +static void +add_signal_handlers (void) +{ +#if defined(HAVE_SIGNAL) && defined(ENABLE_BACKTRACE) + signal (SIGSEGV, segv_handler); +#endif /* HAVE_SIGNAL && ENABLE_BACKTRACE */ +} + + +main (int argc, + char **argv) +/* bsr main (int argc, + char **argv)*/ +{ + add_signal_handlers (); + g_type_init(); + + g_set_prgname("telepathy-gabble"); + +/* bsr #ifdef ENABLE_DEBUG*/ + gabble_debug_set_flags_from_env (); +//_dbus_setenv ("DBUS_VERBOSE","1"); + + if (g_getenv ("GABBLE_PERSIST")) + gabble_debug_set_flags (0xffff); +/*#endif bsr */ + + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + +#ifdef ENABLE_BACKTRACE + g_log_set_handler ("GLib-GObject", + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); + g_log_set_handler ("GLib", + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); + g_log_set_handler (NULL, + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | + G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_handler, NULL); +#endif /* ENABLE_BACKTRACE */ + } + + g_message("before gabble mainloop new \n"); + //getchar(); + /* exit(1); */ + mainloop = g_main_loop_new (NULL, FALSE); + + dbus_g_error_domain_register (TELEPATHY_ERRORS, + "org.freedesktop.Telepathy.Error", TELEPATHY_TYPE_ERRORS); + + g_message("after dbus_g_error_domain_register \n"); + //getchar(); + + manager = g_object_new (GABBLE_TYPE_CONNECTION_MANAGER, /*"name","GabbleConnectionManager",*/ NULL); /* bsr */ + g_assert (manager != NULL); + g_message("after g_object_new \n"); + //getchar(); + + g_signal_connect (manager, "new-connection", + (GCallback) new_connection, NULL); + g_message("after g_signal_connect \n"); + //getchar(); + + g_signal_connect (manager, "no-more-connections", + (GCallback) no_more_connections, NULL); + + g_message("calling gabble_connection_manager_register \n"); + _gabble_connection_manager_register (manager); + + g_message("started version " VERSION); + + timeout_id = g_timeout_add (DIE_TIME, kill_connection_manager, NULL); + + g_main_loop_run (mainloop); + g_message("extign tg \n"); + return 0; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gheap.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gheap.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,158 @@ +/* + * Header file for GHeap + * + * Copyright (C) 2006 Nokia Corporation. All rights reserved. + * + * Contact: Olli Salli (Nokia-M/Helsinki) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "gheap.h" + +#define DEFAULT_SIZE 64 + +struct _GHeap +{ + GPtrArray *data; + GCompareFunc comparator; +}; + + +GHeap * +g_heap_new (GCompareFunc comparator) +{ + GHeap *ret = g_slice_new (GHeap); + g_assert (comparator != NULL); + + ret->data = g_ptr_array_sized_new (DEFAULT_SIZE); + ret->comparator = comparator; + + return ret; +} + +void +g_heap_destroy (GHeap * heap) +{ + g_return_if_fail (heap != NULL); + + g_ptr_array_free (heap->data, TRUE); + g_slice_free (GHeap, heap); +} + +void +g_heap_clear (GHeap *heap) +{ + g_return_if_fail (heap != NULL); + + g_ptr_array_free (heap->data, TRUE); + heap->data = g_ptr_array_sized_new (DEFAULT_SIZE); +} + +#define HEAP_INDEX(heap, index) (g_ptr_array_index ((heap)->data, (index)-1)) + + +void +g_heap_add (GHeap *heap, gpointer element) +{ + guint m; + + g_return_if_fail (heap != NULL); + + g_ptr_array_add (heap->data, element); + m = heap->data->len; + while (m != 1) + { + gpointer parent = HEAP_INDEX (heap, m / 2); + + if (heap->comparator (element, parent) == -1) + { + HEAP_INDEX (heap, m / 2) = element; + HEAP_INDEX (heap, m) = parent; + m /= 2; + } + else + break; + } +} + + +gpointer +g_heap_peek_first (GHeap *heap) +{ + g_return_val_if_fail (heap != NULL, NULL); + + if (heap->data->len > 0) + return HEAP_INDEX (heap, 1); + else + return NULL; +} + + +gpointer +g_heap_extract_first (GHeap * heap) +{ + gpointer ret; + + g_return_val_if_fail (heap != NULL, NULL); + + if (heap->data->len > 0) + { + guint m = heap->data->len; + guint i = 1, j; + ret = HEAP_INDEX (heap, 1); + + HEAP_INDEX (heap, 1) = HEAP_INDEX (heap, m); + + while (i * 2 <= m) + { + /* select the child which is supposed to come FIRST */ + if ((i * 2 + 1 <= m) + && (heap-> + comparator (HEAP_INDEX (heap, i * 2), + HEAP_INDEX (heap, i * 2 + 1)) == 1)) + j = i * 2 + 1; + else + j = i * 2; + + if (heap->comparator (HEAP_INDEX (heap, i), HEAP_INDEX (heap, j)) == + 1) + { + gpointer tmp = HEAP_INDEX (heap, i); + HEAP_INDEX (heap, i) = HEAP_INDEX (heap, j); + HEAP_INDEX (heap, j) = tmp; + i = j; + } + else + break; + } + + g_ptr_array_remove_index (heap->data, m - 1); + } + else + ret = NULL; + + return ret; +} + + +guint +g_heap_size (GHeap *heap) +{ + g_return_val_if_fail (heap != NULL, 0); + + return heap->data->len; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/gintset.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/gintset.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,450 @@ +/* gintset.c - Source for a Glib-link set of integers + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include "gintset.h" + +#define DEFAULT_SIZE 16 +#define DEFAULT_INCREMENT 8 +#define DEFAULT_INCREMENT_LOG2 3 + +struct _GIntSet +{ + guint32 *bits; + guint size; +}; + +static GIntSet * +_g_intset_new_with_size (guint size) +{ + GIntSet *set = g_new (GIntSet, 1); + set->size = MAX (size, DEFAULT_SIZE); + set->bits = g_new0 (guint32, set->size); + return set; +} + + +GIntSet * +g_intset_new () +{ + return _g_intset_new_with_size (DEFAULT_SIZE); +} + +/** + * g_intset_destroy: + * @set: set + * + * delete the set + */ + +void +g_intset_destroy (GIntSet *set) +{ + g_return_if_fail (set != NULL); + + g_free (set->bits); + g_free (set); +} + +/** + * g_intset_clear: + * @set : set + * + * Unset every integer in the set. + */ +void +g_intset_clear (GIntSet *set) +{ + g_return_if_fail (set != NULL); + + memset (set->bits, 0, set->size * sizeof (guint32)); +} + +/** + * g_intset_add: + * @set: set + * @element: integer to add + * + * Add an integer into a GIntSet + */ + +void +g_intset_add (GIntSet *set, guint element) +{ + guint offset; + guint newsize; + + g_return_if_fail (set != NULL); + + offset = element >> 5; + + if (offset >= set->size) + { + newsize = ((offset>>DEFAULT_INCREMENT_LOG2) +1 ) << DEFAULT_INCREMENT_LOG2; + set->bits = g_renew(guint32, set->bits, newsize); + memset (set->bits + set->size, 0, sizeof(guint32) * (newsize - set->size)); + set->size = newsize; + g_assert(offsetbits[offset] = set->bits[offset] | (1<<(element & 0x1f)); +} + +/** + * g_intset_remove: + * @set: set + * @element: integer to add + * + * Remove an integer from a GIntSet + * Returns: TRUE if element was in set + */ + +gboolean +g_intset_remove (GIntSet *set, guint element) +{ + guint offset; + guint mask; + + g_return_val_if_fail (set != NULL, FALSE); + + offset = element >> 5; + mask = 1 << (element & 0x1f); + if (offset >= set->size) + return FALSE; + else if (!(set->bits[offset] & mask)) + return FALSE; + else + { + set->bits[offset] &= ~mask; + return TRUE; + } +} + +/** + * g_intset_is_member: + * @set: set + * @element: integer to test + * + * Tests if @element is a member of @set + * Returns: TRUE if element was in set + */ + +gboolean +g_intset_is_member (const GIntSet *set, guint element) +{ + guint offset; + + g_return_val_if_fail (set != NULL, FALSE); + + offset = element >> 5; + if (offset >= set->size) + return FALSE; + else + return (set->bits[offset] & (1 << (element & 0x1f))); +} + +/** + * g_intset_foreach: + * @set: set + * @func: @GIntFunc to use to iterate the set + * @userdata: user data to pass to each call of @func + * + * Iterates every member of the set calling @func + */ + +void +g_intset_foreach (const GIntSet *set, GIntFunc func, gpointer userdata) +{ + guint i, j; + + g_return_if_fail (set != NULL); + g_return_if_fail (func != NULL); + + for (i = 0; i < set->size; i++) + { + if (set->bits[i]) + for (j = 0; j < 32; j++) + { + if (set->bits[i] & 1 << j) + func (i * 32 + j, userdata); + } + } +} + + +static void +addint (guint32 i, gpointer data) +{ + GArray *array = (GArray *) data; + g_array_append_val (array, i); +} + +/** + * g_intset_to_array: + * @set: set to convert + * Convert a gintset to an array, allocates the array for you, hence you + * must free it after use. + */ + +GArray * +g_intset_to_array (GIntSet *set) +{ + GArray *array; + + g_return_val_if_fail (set != NULL, NULL); + + array = g_array_new (FALSE, TRUE, sizeof (guint32)); + + g_intset_foreach (set, addint, array); + + return array; +} + + +GIntSet * +g_intset_from_array (GArray *array) +{ + GIntSet *set; + guint32 max, i; + + g_return_val_if_fail (array != NULL, NULL); + + /* look at the 1st, last and middle values in the array to get an + * approximation of the largest */ + max = 0; + if (array->len > 0) + max = g_array_index (array, guint32, 0); + if (array->len > 1) + max = MAX (max, g_array_index (array, guint32, array->len - 1)); + if (array->len > 2) + max = MAX (max, g_array_index (array, guint32, (array->len - 1) >> 1)); + set = _g_intset_new_with_size (1 + (max >> 5)); + + for (i = 0; i < array->len; i++) + { + g_intset_add (set, g_array_index (array, guint32, i)); + } + + return set; +} + + +guint +g_intset_size (const GIntSet *set) +{ + guint i, count = 0; + guint32 n; + + g_return_val_if_fail (set != NULL, 0); + + for (i = 0; i < set->size; i++) + { + n = set->bits[i]; + n = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111); + count += ((n + (n >> 3)) & 030707070707) % 63; + } + + return count; +} + + +gboolean +g_intset_is_equal (const GIntSet *left, const GIntSet *right) +{ + const GIntSet *large, *small; + guint i; + + g_return_val_if_fail (left != NULL, FALSE); + g_return_val_if_fail (right != NULL, FALSE); + + if (left->size > right->size) + { + large = left; + small = right; + } + else + { + large = right; + small = left; + } + + for (i = 0; i < small->size; i++) + { + if (large->bits[i] != small->bits[i]) + return FALSE; + } + + for (i = small->size; i < large->size; i++) + { + if (large->bits[i] != 0) + return FALSE; + } + + return TRUE; +} + +GIntSet * +g_intset_copy (const GIntSet *orig) +{ + GIntSet *ret; + + g_return_val_if_fail (orig != NULL, NULL); + + ret = _g_intset_new_with_size (orig->size); + memcpy (ret->bits, orig->bits, (ret->size * sizeof (guint32))); + + return ret; +} + + +GIntSet * +g_intset_intersection (const GIntSet *left, const GIntSet *right) +{ + const GIntSet *large, *small; + GIntSet *ret; + guint i; + + g_return_val_if_fail (left != NULL, NULL); + g_return_val_if_fail (right != NULL, NULL); + + if (left->size > right->size) + { + large = left; + small = right; + } + else + { + large = right; + small = left; + } + + ret = g_intset_copy (small); + + for (i = 0; i < ret->size; i++) + { + ret->bits[i] &= large->bits[i]; + } + + return ret; +} + + +GIntSet * +g_intset_union (const GIntSet *left, const GIntSet *right) +{ + const GIntSet *large, *small; + GIntSet *ret; + guint i; + + g_return_val_if_fail (left != NULL, NULL); + g_return_val_if_fail (right != NULL, NULL); + + if (left->size > right->size) + { + large = left; + small = right; + } + else + { + large = right; + small = left; + } + + ret = g_intset_copy (large); + + for (i = 0; i < small->size; i++) + { + ret->bits[i] |= small->bits[i]; + } + + return ret; +} + + +GIntSet * +g_intset_difference (const GIntSet *left, const GIntSet *right) +{ + GIntSet *ret; + guint i; + + g_return_val_if_fail (left != NULL, NULL); + g_return_val_if_fail (right != NULL, NULL); + + ret = g_intset_copy (left); + + for (i = 0; i < MIN (right->size, left->size); i++) + { + ret->bits[i] &= ~right->bits[i]; + } + + return ret; +} + + +GIntSet * +g_intset_symmetric_difference (const GIntSet *left, const GIntSet *right) +{ + const GIntSet *large, *small; + GIntSet *ret; + guint i; + + g_return_val_if_fail (left != NULL, NULL); + g_return_val_if_fail (right != NULL, NULL); + + if (left->size > right->size) + { + large = left; + small = right; + } + else + { + large = right; + small = left; + } + + ret = g_intset_copy (large); + + for (i = 0; i < small->size; i++) + { + ret->bits[i] ^= small->bits[i]; + } + + return ret; +} + +static void +_dump_foreach (guint i, gpointer data) +{ + GString *tmp = (GString *) data; + + if (tmp->len == 0) + g_string_append_printf (tmp, "%d", i); + else + g_string_append_printf (tmp, " %d", i); +} + +gchar * +g_intset_dump (const GIntSet *set) +{ + GString *tmp = g_string_new (""); + + g_intset_foreach (set, _dump_foreach, tmp); + return g_string_free (tmp, FALSE); +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/group-mixin-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/group-mixin-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,150 @@ +/* + * group-mixin-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,UINT (group-mixin-signals-marshal.list:1) */ +void +group_mixin_marshal_VOID__UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + data2); +} + +/* VOID:STRING,BOXED,BOXED,BOXED,BOXED,UINT,UINT (group-mixin-signals-marshal.list:2) */ +void +group_mixin_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer arg_3, + gpointer arg_4, + gpointer arg_5, + guint arg_6, + guint arg_7, + gpointer data2); + register GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 8); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + g_marshal_value_peek_boxed (param_values + 3), + g_marshal_value_peek_boxed (param_values + 4), + g_marshal_value_peek_boxed (param_values + 5), + g_marshal_value_peek_uint (param_values + 6), + g_marshal_value_peek_uint (param_values + 7), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/group-mixin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/group-mixin.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,785 @@ +/* + * group-mixin.c - Source for GabbleGroupMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "ansi.h" +#include "debug.h" +#include "telepathy-errors.h" + + +#include "group-mixin.h" +#include "group-mixin-signals-marshal.h" + +#define DEBUG_FLAG GABBLE_DEBUG_GROUPS +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(offset_quark1,gabble_grp_mixin,GQuark) + #define offset_quark1 (*GET_WSD_VAR_NAME(offset_quark1,gabble_grp_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(offset_quark,gabble_grp_mixin,GQuark) + #define offset_quark (*GET_WSD_VAR_NAME(offset_quark,gabble_grp_mixin, s)()) + + +#endif + +static const char *group_change_reason_str(guint reason) +{ + switch (reason) + { + case TP_CHANNEL_GROUP_CHANGE_REASON_NONE: + return "unspecified reason"; + case TP_CHANNEL_GROUP_CHANGE_REASON_OFFLINE: + return "offline"; + case TP_CHANNEL_GROUP_CHANGE_REASON_KICKED: + return "kicked"; + case TP_CHANNEL_GROUP_CHANGE_REASON_BUSY: + return "busy"; + case TP_CHANNEL_GROUP_CHANGE_REASON_INVITED: + return "invited"; + case TP_CHANNEL_GROUP_CHANGE_REASON_BANNED: + return "banned"; + default: + return "(unknown reason code)"; + } +} + +struct _GabbleGroupMixinPrivate { + GabbleHandleSet *actors; + GHashTable *handle_owners; +}; + + +/** + * gabble_group_mixin_class_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObjectClass + */ +GQuark +gabble_group_mixin_class_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark1 = 0; +#endif + + if (!offset_quark1) + offset_quark1 = g_quark_from_static_string("GroupMixinClassOffsetQuark"); + return offset_quark1; +} + +/** + * gabble_group_mixin_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObject + */ +GQuark +gabble_group_mixin_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark = 0; +#endif + + if (!offset_quark) + offset_quark = g_quark_from_static_string("GroupMixinOffsetQuark"); + return offset_quark; +} + +void gabble_group_mixin_class_init (GObjectClass *obj_cls, + glong offset, + GabbleGroupMixinAddMemberFunc add_func, + GabbleGroupMixinRemMemberFunc rem_func) +{ + GabbleGroupMixinClass *mixin_cls; + + g_assert (G_IS_OBJECT_CLASS (obj_cls)); + + g_type_set_qdata (G_OBJECT_CLASS_TYPE (obj_cls), + GABBLE_GROUP_MIXIN_CLASS_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin_cls = GABBLE_GROUP_MIXIN_CLASS (obj_cls); + + mixin_cls->add_member = add_func; + mixin_cls->remove_member = rem_func; + + mixin_cls->group_flags_changed_signal_id = + g_signal_new ("group-flags-changed", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + group_mixin_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + mixin_cls->members_changed_signal_id = + g_signal_new ("members-changed", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + group_mixin_marshal_VOID__STRING_BOXED_BOXED_BOXED_BOXED_UINT_UINT, + G_TYPE_NONE, 7, G_TYPE_STRING, DBUS_TYPE_G_UINT_ARRAY, DBUS_TYPE_G_UINT_ARRAY, DBUS_TYPE_G_UINT_ARRAY, DBUS_TYPE_G_UINT_ARRAY, G_TYPE_UINT, G_TYPE_UINT); +} + +void gabble_group_mixin_init (GObject *obj, + glong offset, + GabbleHandleRepo *handle_repo, + GabbleHandle self_handle) +{ + GabbleGroupMixin *mixin; + + g_assert (G_IS_OBJECT (obj)); + + g_type_set_qdata (G_OBJECT_TYPE (obj), + GABBLE_GROUP_MIXIN_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin = GABBLE_GROUP_MIXIN (obj); + + mixin->handle_repo = handle_repo; + mixin->self_handle = self_handle; + + mixin->group_flags = 0; + + mixin->members = handle_set_new (handle_repo, TP_HANDLE_TYPE_CONTACT); + mixin->local_pending = handle_set_new (handle_repo, TP_HANDLE_TYPE_CONTACT); + mixin->remote_pending = handle_set_new (handle_repo, TP_HANDLE_TYPE_CONTACT); + + mixin->priv = g_new0 (GabbleGroupMixinPrivate, 1); + mixin->priv->handle_owners = g_hash_table_new (g_direct_hash, g_direct_equal); + mixin->priv->actors = handle_set_new (handle_repo, TP_HANDLE_TYPE_CONTACT); +} + +static void +handle_owners_foreach_unref (gpointer key, + gpointer value, + gpointer user_data) +{ + GabbleGroupMixin *mixin = user_data; + + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + GPOINTER_TO_UINT (key)); + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + GPOINTER_TO_UINT (value)); +} + +void gabble_group_mixin_finalize (GObject *obj) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + handle_set_destroy (mixin->priv->actors); + + g_hash_table_foreach (mixin->priv->handle_owners, + handle_owners_foreach_unref, + mixin); + + g_hash_table_destroy (mixin->priv->handle_owners); + + g_free (mixin->priv); + + handle_set_destroy (mixin->members); + handle_set_destroy (mixin->local_pending); + handle_set_destroy (mixin->remote_pending); +} + +gboolean +gabble_group_mixin_get_self_handle (GObject *obj, guint *ret, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + if (handle_set_is_member (mixin->members, mixin->self_handle) || + handle_set_is_member (mixin->local_pending, mixin->self_handle) || + handle_set_is_member (mixin->remote_pending, mixin->self_handle)) + { + *ret = mixin->self_handle; + } + else + { + *ret = 0; + } + + return TRUE; +} + +gboolean +gabble_group_mixin_get_group_flags (GObject *obj, guint *ret, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + *ret = mixin->group_flags; + + return TRUE; +} + +gboolean +gabble_group_mixin_add_members (GObject *obj, const GArray *contacts, const gchar *message, GError **error) +{ + GabbleGroupMixinClass *mixin_cls = GABBLE_GROUP_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + guint i; + GabbleHandle handle; + + /* reject invalid handles */ + if (!gabble_handles_are_valid (mixin->handle_repo, + TP_HANDLE_TYPE_CONTACT, + contacts, + FALSE, + error)) + return FALSE; + + /* check that adding is allowed by flags */ + for (i = 0; i < contacts->len; i++) + { + handle = g_array_index (contacts, GabbleHandle, i); + + if ((mixin->group_flags & TP_CHANNEL_GROUP_FLAG_CAN_ADD) == 0 && + !handle_set_is_member (mixin->local_pending, handle)) + { + gabble_debug (DEBUG_FLAG, "handle %u cannot be added to members without GROUP_FLAG_CAN_ADD", + handle); + + g_set_error (error, TELEPATHY_ERRORS, PermissionDenied, + "handle %u cannot be added to members without GROUP_FLAG_CAN_ADD", + handle); + + return FALSE; + } + } + + /* add handle by handle */ + for (i = 0; i < contacts->len; i++) + { + handle = g_array_index (contacts, GabbleHandle, i); + + if (handle_set_is_member (mixin->members, handle)) + { + gabble_debug (DEBUG_FLAG, "handle %u is already a member, skipping", handle); + + continue; + } + + if (!mixin_cls->add_member (obj, handle, message, error)) + { + return FALSE; + } + } + + return TRUE; +} + +gboolean +gabble_group_mixin_remove_members (GObject *obj, const GArray *contacts, const gchar *message, GError **error) +{ + GabbleGroupMixinClass *mixin_cls = GABBLE_GROUP_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + guint i; + GabbleHandle handle; + + /* reject invalid handles */ + if (!gabble_handles_are_valid (mixin->handle_repo, + TP_HANDLE_TYPE_CONTACT, + contacts, + FALSE, + error)) + return FALSE; + + /* check removing is allowed by flags */ + for (i = 0; i < contacts->len; i++) + { + handle = g_array_index (contacts, GabbleHandle, i); + + if (handle_set_is_member (mixin->members, handle)) + { + if ((mixin->group_flags & TP_CHANNEL_GROUP_FLAG_CAN_REMOVE) == 0) + { + gabble_debug (DEBUG_FLAG, "handle %u cannot be removed from members without GROUP_FLAG_CAN_REMOVE", + handle); + + g_set_error (error, TELEPATHY_ERRORS, PermissionDenied, + "handle %u cannot be removed from members without GROUP_FLAG_CAN_REMOVE", + handle); + + return FALSE; + } + } + else if (handle_set_is_member (mixin->remote_pending, handle)) + { + if ((mixin->group_flags & TP_CHANNEL_GROUP_FLAG_CAN_RESCIND) == 0) + { + gabble_debug (DEBUG_FLAG, "handle %u cannot be removed from remote pending without GROUP_FLAG_CAN_RESCIND", + handle); + + g_set_error (error, TELEPATHY_ERRORS, PermissionDenied, + "handle %u cannot be removed from remote pending without GROUP_FLAG_CAN_RESCIND", + handle); + + return FALSE; + } + } + else if (!handle_set_is_member (mixin->local_pending, handle)) + { + gabble_debug (DEBUG_FLAG, "handle %u is not a current or pending member", + handle); + + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "handle %u is not a current or pending member", handle); + + return FALSE; + } + } + + /* remove handle by handle */ + for (i = 0; i < contacts->len; i++) + { + handle = g_array_index (contacts, GabbleHandle, i); + + if (!mixin_cls->remove_member (obj, handle, message, error)) + { + return FALSE; + } + } + + return TRUE; +} + +gboolean +gabble_group_mixin_get_members (GObject *obj, GArray **ret, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + *ret = handle_set_to_array (mixin->members); + + return TRUE; +} + +gboolean +gabble_group_mixin_get_local_pending_members (GObject *obj, GArray **ret, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + *ret = handle_set_to_array (mixin->local_pending); + + return TRUE; +} + +gboolean +gabble_group_mixin_get_remote_pending_members (GObject *obj, GArray **ret, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + *ret = handle_set_to_array (mixin->remote_pending); + + return TRUE; +} + +gboolean +gabble_group_mixin_get_all_members (GObject *obj, GArray **ret, GArray **ret1, GArray **ret2, GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + + *ret = handle_set_to_array (mixin->members); + *ret1 = handle_set_to_array (mixin->local_pending); + *ret2 = handle_set_to_array (mixin->remote_pending); + + return TRUE; +} + +gboolean +gabble_group_mixin_get_handle_owners (GObject *obj, + const GArray *handles, + GArray **ret, + GError **error) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GabbleGroupMixinPrivate *priv = mixin->priv; + guint i; + + if ((mixin->group_flags & + TP_CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES) == 0) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "channel doesn't have channel specific handles"); + + return FALSE; + } + + if (!gabble_handles_are_valid (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + handles, FALSE, error)) + { + return FALSE; + } + + *ret = g_array_sized_new (FALSE, FALSE, sizeof (GabbleHandle), handles->len); + + for (i = 0; i < handles->len; i++) + { + GabbleHandle local_handle = g_array_index (handles, GabbleHandle, i); + GabbleHandle owner_handle; + + if (!handle_set_is_member (mixin->members, local_handle)) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "handle %u is not a member", local_handle); + + g_array_free (*ret, TRUE); + *ret = NULL; + + return FALSE; + } + + owner_handle = GPOINTER_TO_UINT ( + g_hash_table_lookup (priv->handle_owners, + GUINT_TO_POINTER (local_handle))); + + g_array_append_val (*ret, owner_handle); + } + + return TRUE; +} + +#define GFTS_APPEND_FLAG_IF_SET(flag) \ + if (flags & flag) \ + { \ + if (i++ > 0) \ + g_string_append (str, "|"); \ + g_string_append (str, #flag + 22); \ + } + +static gchar * +group_flags_to_string (TpChannelGroupFlags flags) +{ + gint i = 0; + GString *str; + + str = g_string_new ("[" ANSI_BOLD_OFF); + + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_CAN_ADD); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_CAN_REMOVE); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_CAN_RESCIND); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_MESSAGE_ADD); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_MESSAGE_REMOVE); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_MESSAGE_ACCEPT); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_MESSAGE_REJECT); + GFTS_APPEND_FLAG_IF_SET (TP_CHANNEL_GROUP_FLAG_MESSAGE_RESCIND); + + g_string_append (str, ANSI_BOLD_ON "]"); + + return g_string_free (str, FALSE); +} + +/** + * gabble_group_mixin_change_flags: + * + * Request a change to be made to the flags. Emits the + * signal with the changes which were made. + */ +void +gabble_group_mixin_change_flags (GObject *obj, + TpChannelGroupFlags add, + TpChannelGroupFlags remove) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GabbleGroupMixinClass *mixin_cls = GABBLE_GROUP_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + TpChannelGroupFlags added, removed; + + added = add & ~mixin->group_flags; + mixin->group_flags |= added; + + removed = remove & mixin->group_flags; + mixin->group_flags &= ~removed; + + if (add != 0 || remove != 0) + { + gchar *str_added, *str_removed, *str_flags; + + if (DEBUGGING) + { + str_added = group_flags_to_string (added); + str_removed = group_flags_to_string (removed); + str_flags = group_flags_to_string (mixin->group_flags); + + g_message (ANSI_BOLD_ON ANSI_FG_WHITE + "%s: emitting group flags changed\n" + " added : %s\n" + " removed : %s\n" + " flags now: %s\n" ANSI_RESET, + G_STRFUNC, str_added, str_removed, str_flags); + + fflush (stdout); + + g_free (str_added); + g_free (str_removed); + g_free (str_flags); + } + + g_signal_emit(obj, mixin_cls->group_flags_changed_signal_id, 0, added, removed); + } +} + +static gchar * +member_array_to_string (GabbleHandleRepo *repo, const GArray *array) +{ + GString *str; + guint i; + + str = g_string_new ("[" ANSI_BOLD_OFF); + + for (i = 0; i < array->len; i++) + { + GabbleHandle handle; + const gchar *handle_str; + + handle = g_array_index (array, guint32, i); + handle_str = gabble_handle_inspect (repo, TP_HANDLE_TYPE_CONTACT, handle); + + g_string_append_printf (str, "%s%u (%s)", + (i > 0) ? "\n " : "", + handle, handle_str); + } + + g_string_append (str, ANSI_BOLD_ON "]"); + + return g_string_free (str, FALSE); +} + +static void remove_handle_owners_if_exist (GObject *obj, GArray *array); + +/** + * gabble_group_mixin_change_members: + * + * Request members to be added, removed or marked as local or remote pending. + * Changes member sets, references, and emits the MembersChanged signal. + */ +gboolean +gabble_group_mixin_change_members (GObject *obj, + const gchar *message, + GIntSet *add, + GIntSet *remove, + GIntSet *local_pending, + GIntSet *remote_pending, + GabbleHandle actor, + guint reason) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GabbleGroupMixinClass *mixin_cls = GABBLE_GROUP_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + GIntSet *new_add, *new_remove, *new_local_pending, + *new_remote_pending, *tmp, *tmp2, *empty; + gboolean ret; + + empty = g_intset_new (); + + if (add == NULL) + add = empty; + + if (remove == NULL) + remove = empty; + + if (local_pending == NULL) + local_pending = empty; + + if (remote_pending == NULL) + remote_pending = empty; + + /* members + add */ + new_add = handle_set_update (mixin->members, add); + + /* members - remove */ + new_remove = handle_set_difference_update (mixin->members, remove); + + /* members - local_pending */ + tmp = handle_set_difference_update (mixin->members, local_pending); + g_intset_destroy (tmp); + + /* members - remote_pending */ + tmp = handle_set_difference_update (mixin->members, remote_pending); + g_intset_destroy (tmp); + + + /* local pending + local_pending */ + new_local_pending = handle_set_update (mixin->local_pending, local_pending); + + /* local pending - add */ + tmp = handle_set_difference_update (mixin->local_pending, add); + g_intset_destroy (tmp); + + /* local pending - remove */ + tmp = handle_set_difference_update (mixin->local_pending, remove); + tmp2 = g_intset_union (new_remove, tmp); + g_intset_destroy (new_remove); + g_intset_destroy (tmp); + new_remove = tmp2; + + /* local pending - remote_pending */ + tmp = handle_set_difference_update (mixin->local_pending, remote_pending); + g_intset_destroy (tmp); + + + /* remote pending + remote_pending */ + new_remote_pending = handle_set_update (mixin->remote_pending, remote_pending); + + /* remote pending - add */ + tmp = handle_set_difference_update (mixin->remote_pending, add); + g_intset_destroy (tmp); + + /* remote pending - remove */ + tmp = handle_set_difference_update (mixin->remote_pending, remove); + tmp2 = g_intset_union (new_remove, tmp); + g_intset_destroy (new_remove); + g_intset_destroy (tmp); + new_remove = tmp2; + + /* remote pending - local_pending */ + tmp = handle_set_difference_update (mixin->remote_pending, local_pending); + g_intset_destroy (tmp); + + if (g_intset_size (new_add) > 0 || + g_intset_size (new_remove) > 0 || + g_intset_size (new_local_pending) > 0 || + g_intset_size (new_remote_pending) > 0) + { + GArray *arr_add, *arr_remove, *arr_local, *arr_remote; + gchar *add_str, *rem_str, *local_str, *remote_str; + + /* translate intsets to arrays */ + arr_add = g_intset_to_array (new_add); + arr_remove = g_intset_to_array (new_remove); + arr_local = g_intset_to_array (new_local_pending); + arr_remote = g_intset_to_array (new_remote_pending); + + /* remove any handle owner mappings */ + remove_handle_owners_if_exist (obj, arr_remove); + + if (DEBUGGING) + { + add_str = member_array_to_string (mixin->handle_repo, arr_add); + rem_str = member_array_to_string (mixin->handle_repo, arr_remove); + local_str = member_array_to_string (mixin->handle_repo, arr_local); + remote_str = member_array_to_string (mixin->handle_repo, arr_remote); + + g_message (ANSI_BOLD_ON ANSI_FG_CYAN + "%s: emitting members changed\n" + " message : \"%s\"\n" + " added : %s\n" + " removed : %s\n" + " local_pending : %s\n" + " remote_pending: %s\n" + " actor : %u\n" + " reason : %u: %s\n" ANSI_RESET, + G_STRFUNC, message, add_str, rem_str, local_str, remote_str, + actor, reason, group_change_reason_str(reason)); + + fflush (stdout); + + g_free (add_str); + g_free (rem_str); + g_free (local_str); + g_free (remote_str); + } + + if (actor) + { + handle_set_add (mixin->priv->actors, actor); + } + /* emit signal */ + g_signal_emit(obj, mixin_cls->members_changed_signal_id, 0, + message, + arr_add, arr_remove, + arr_local, arr_remote, + actor, reason); + + /* free arrays */ + g_array_free (arr_add, TRUE); + g_array_free (arr_remove, TRUE); + g_array_free (arr_local, TRUE); + g_array_free (arr_remote, TRUE); + + ret = TRUE; + } + else + { + gabble_debug (DEBUG_FLAG, "not emitting signal, nothing changed"); + + ret = FALSE; + } + + /* free intsets */ + g_intset_destroy (new_add); + g_intset_destroy (new_remove); + g_intset_destroy (new_local_pending); + g_intset_destroy (new_remote_pending); + g_intset_destroy (empty); + + return ret; +} + +void +gabble_group_mixin_add_handle_owner (GObject *obj, + GabbleHandle local_handle, + GabbleHandle owner_handle) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GabbleGroupMixinPrivate *priv = mixin->priv; + + g_hash_table_insert (priv->handle_owners, GUINT_TO_POINTER (local_handle), + GUINT_TO_POINTER (owner_handle)); + + gabble_handle_ref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + local_handle); + gabble_handle_ref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + owner_handle); +} + +static void +remove_handle_owners_if_exist (GObject *obj, GArray *array) +{ + GabbleGroupMixin *mixin = GABBLE_GROUP_MIXIN (obj); + GabbleGroupMixinPrivate *priv = mixin->priv; + guint i; + + for (i = 0; i < array->len; i++) + { + GabbleHandle handle = g_array_index (array, guint32, i); + gpointer local_handle, owner_handle; + + if (g_hash_table_lookup_extended (priv->handle_owners, + GUINT_TO_POINTER (handle), + &local_handle, + &owner_handle)) + { + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + GPOINTER_TO_UINT (local_handle)); + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, + GPOINTER_TO_UINT (owner_handle)); + + g_hash_table_remove (priv->handle_owners, GUINT_TO_POINTER (handle)); + } + } +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/handle-set.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/handle-set.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,274 @@ +/* + * handle-set.c - a set which refs a handle when inserted + * + * Copyright (C) 2005,2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ +#include +#include "gintset.h" +#include "handles.h" + +#include "handle-set.h" + +struct _GabbleHandleSet +{ + GabbleHandleRepo *repo; + GIntSet *intset; + TpHandleType type; +}; + +/** + * handle_set_new: + * @repo: #GabbleHandleRepo that holds the handles to be reffed by this set + * + * Creates a new #GabbleHandleSet + * + * Returns: A new #GabbleHandleSet + */ + +GabbleHandleSet * +handle_set_new (GabbleHandleRepo *repo, TpHandleType type) +{ + GabbleHandleSet *set = g_new(GabbleHandleSet, 1); + set->intset = g_intset_new(); + set->repo = repo; + set->type = type; + + return set; +} + +static void +freer (GabbleHandleSet *set, GabbleHandle handle, gpointer userdata) +{ + handle_set_remove (set, handle); +} + +/** + * handle_set_destroy: + * @set:#GabbleHandleSet to destroy + * + * Delete a #GabbleHandleSet and unreference any handles that it holds + */ + +void +handle_set_destroy (GabbleHandleSet *set) +{ + handle_set_foreach (set, freer, NULL); + g_intset_destroy (set->intset); + g_free (set); +} + +/** + * handle_set_peek: + * @set:#GabbleHandleSet to peek at + * + * Get the underlying GIntSet used by this GabbleHandleSet + */ +GIntSet * +handle_set_peek (GabbleHandleSet *set) +{ + return set->intset; +} + +/** + * handle_set_add: + * @set: #GabbleHandleSet to add this handle to + * @handle: handle to add + * + * Add a handle to a #GabbleHandleSet,and reference it in the attched + * #GabbleHandleRepo + * + */ + +void +handle_set_add (GabbleHandleSet *set, GabbleHandle handle) +{ + g_return_if_fail (set != NULL); + g_return_if_fail (handle != 0); + + if (!g_intset_is_member(set->intset, handle)) + { + g_return_if_fail (gabble_handle_ref (set->repo, set->type, handle)); + + g_intset_add (set->intset, handle); + } +} + +/** + * handle_set_remove: + * @set: #GabbleHandleSet to remove this handle from + * @handle: handle to remove + * @type: type of handle + * + * Remove a handle to a #GabbleHandleSet,and unreference it in the attched + * #GabbleHandleRepo + * + * Returns: FALSE if the (handle,type) pair was invalid, or was not in this set + */ + + +gboolean +handle_set_remove (GabbleHandleSet *set, GabbleHandle handle) +{ + g_return_val_if_fail (set != NULL, FALSE); + g_return_val_if_fail (handle != 0, FALSE); + + if (g_intset_is_member(set->intset, handle)) + { + g_return_val_if_fail (gabble_handle_unref (set->repo, set->type, handle), FALSE); + + g_intset_remove (set->intset, handle); + return TRUE; + } + + return FALSE; +} + +/** + * handle_set_is_member: + * @set: A #GabbleHandleSet + * @handle: handle to check + * @type: type of handle + * + * Check if the (handle,type) pair is in this set + * + * Returns: TRUE if the (handle,type) pair is in this repo + * + */ + +gboolean +handle_set_is_member (GabbleHandleSet *set, GabbleHandle handle) +{ + return g_intset_is_member(set->intset, handle); +} + +typedef struct __foreach_data +{ + GabbleHandleSet *set; + GabbleHandleFunc func; + gpointer userdata; +} _foreach_data; + +static void +foreach_helper(guint i, gpointer userdata) +{ + _foreach_data *data = (_foreach_data*) userdata; + + data->func(data->set, i, data->userdata); +} + +void +handle_set_foreach (GabbleHandleSet *set, GabbleHandleFunc func, gpointer userdata) +{ + _foreach_data data; /*= {set, func, userdata};*/ + data.set = set; + data.func = func; + data.userdata = userdata; + g_intset_foreach (set->intset, foreach_helper, &data); +} + + +int +handle_set_size (GabbleHandleSet *set) +{ + return g_intset_size (set->intset); +} + +GArray *handle_set_to_array (GabbleHandleSet *set) +{ + g_return_val_if_fail (set != NULL, NULL); + + return g_intset_to_array (set->intset); +} + +static void +ref_one (guint handle, gpointer data) +{ + GabbleHandleSet *set = (GabbleHandleSet *) data; + gabble_handle_ref (set->repo, set->type, handle); +} + +/** + * handle_set_update: + * @set: a #GabbleHandleSet to update + * @add: a #GIntSet of handles to add + * + * Add a set of handles to a handle set, referencing those which are not + * already members. The GIntSet returned must be freed with g_intset_destroy. + * + * Returns: the handles which were added + */ + +GIntSet * +handle_set_update (GabbleHandleSet *set, const GIntSet *add) +{ + GIntSet *ret, *tmp; + + g_return_val_if_fail (set != NULL, NULL); + g_return_val_if_fail (add != NULL, NULL); + + /* reference each of ADD - CURRENT */ + ret = g_intset_difference (add, set->intset); + g_intset_foreach (ret, ref_one, set); + + /* update CURRENT to be the union of CURRENT and ADD */ + tmp = g_intset_union (add, set->intset); + g_intset_destroy (set->intset); + set->intset = tmp; + + return ret; +} + +static void +unref_one (guint handle, gpointer data) +{ + GabbleHandleSet *set = (GabbleHandleSet *) data; + gabble_handle_unref (set->repo, set->type, handle); +} + +/** + * handle_set_difference_update: + * @set: a #GabbleHandleSet to update + * @remove: a #GIntSet of handles to remove + * + * Remove a set of handles from a handle set, dereferencing those which are + * members. The GIntSet returned must be freed with g_intset_destroy. + * + * Returns: the handles which were removed + */ + +GIntSet * +handle_set_difference_update (GabbleHandleSet *set, const GIntSet *remove) +{ + GIntSet *ret, *tmp; + + g_return_val_if_fail (set != NULL, NULL); + g_return_val_if_fail (remove != NULL, NULL); + + /* dereference each of REMOVE n CURRENT */ + ret = g_intset_intersection (remove, set->intset); + g_intset_foreach (ret, unref_one, set); + + /* update CURRENT to be CURRENT - REMOVE */ + tmp = g_intset_difference (set->intset, remove); + g_intset_destroy (set->intset); + set->intset = tmp; + + return ret; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/handles.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/handles.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,985 @@ +/* + * handles.c - mechanism to store and retrieve handles on a connection + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#include "gheap.h" +#include "handles.h" +#include "handle-set.h" +#include "telepathy-errors.h" +#include "telepathy-helpers.h" +#include "util.h" + +#include "config.h" + +#ifdef ENABLE_HANDLE_LEAK_DEBUG +#include +#include +#include + + +typedef struct _HandleLeakTrace HandleLeakTrace; + +struct _HandleLeakTrace +{ + char **trace; + int len; +}; + +static void +handle_leak_trace_free (HandleLeakTrace *hltrace) +{ + free (hltrace->trace); + g_free (hltrace); +} + +static void +handle_leak_trace_free_gfunc (gpointer data, gpointer user_data) +{ + return handle_leak_trace_free ((HandleLeakTrace *) data); +} + +#endif /* ENABLE_HANDLE_LEAK_DEBUG */ + +/*#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + gchar** _s_handles_list_handle_strings() { return (gchar**)((libgabble_ImpurePtr()->_s_handles_list_handle_strings)); } + + #define list_handle_strings (GET_WSD_VAR_NAME(list_handle_strings,handles, s)()) + +#endif*/ + + +typedef struct _GabbleHandlePriv GabbleHandlePriv; + +struct _GabbleHandlePriv +{ + guint refcount; + gchar *string; +#ifdef ENABLE_HANDLE_LEAK_DEBUG + GSList *traces; +#endif /* ENABLE_HANDLE_LEAK_DEBUG */ + GData *datalist; +}; + +struct _GabbleHandleRepo +{ + GHashTable *contact_handles; + GHashTable *room_handles; + GData *list_handles; + GHashTable *contact_strings; + GHashTable *room_strings; + GHeap *free_contact_handles; + GHeap *free_room_handles; + guint contact_serial; + guint room_serial; + GData *client_contact_handle_sets; + GData *client_room_handle_sets; + DBusGProxy *bus_service_proxy; +}; + +//#ifndef EMULATOR +static const char *list_handle_strings[GABBLE_LIST_HANDLE_DENY] = +{ + "publish", /* GABBLE_LIST_HANDLE_PUBLISH */ + "subscribe", /* GABBLE_LIST_HANDLE_SUBSCRIBE */ + "known", /* GABBLE_LIST_HANDLE_KNOWN */ + "deny" /* GABBLE_LIST_HANDLE_DENY */ +}; +//#endif + +/* private functions */ + +static GabbleHandlePriv * +handle_priv_new () +{ + GabbleHandlePriv *priv; + + priv = g_new0 (GabbleHandlePriv, 1); + + g_datalist_init (&(priv->datalist)); + return priv; +} + +static void +handle_priv_free (GabbleHandlePriv *priv) +{ + g_assert (priv != NULL); + + g_free(priv->string); + g_datalist_clear (&(priv->datalist)); +#ifdef ENABLE_HANDLE_LEAK_DEBUG + g_slist_foreach (priv->traces, handle_leak_trace_free_gfunc, NULL); + g_slist_free (priv->traces); +#endif /* ENABLE_HANDLE_LEAK_DEBUG */ + g_free (priv); +} + +static GabbleHandlePriv * +handle_priv_lookup (GabbleHandleRepo *repo, + TpHandleType type, + GabbleHandle handle) +{ + GabbleHandlePriv *priv = NULL; + + g_assert (repo != NULL); + g_assert (gabble_handle_type_is_valid (type, NULL)); + g_assert (handle != 0); + + switch (type) { + case TP_HANDLE_TYPE_CONTACT: + priv = g_hash_table_lookup (repo->contact_handles, GINT_TO_POINTER (handle)); + break; + case TP_HANDLE_TYPE_ROOM: + priv = g_hash_table_lookup (repo->room_handles, GINT_TO_POINTER (handle)); + break; + case TP_HANDLE_TYPE_LIST: + priv = g_datalist_id_get_data (&repo->list_handles, handle); + break; + default: + g_assert_not_reached(); + } + + return priv; +} + +static GabbleHandle +gabble_handle_alloc (GabbleHandleRepo *repo, TpHandleType type) +{ + GabbleHandle ret = 0; + + g_assert (repo != NULL); + g_assert (gabble_handle_type_is_valid (type, NULL)); + + switch (type) { + case TP_HANDLE_TYPE_CONTACT: + if (g_heap_size (repo->free_contact_handles)) + ret = GPOINTER_TO_UINT (g_heap_extract_first (repo->free_contact_handles)); + else + ret = repo->contact_serial++; + break; + case TP_HANDLE_TYPE_ROOM: + if (g_heap_size (repo->free_room_handles)) + ret = GPOINTER_TO_UINT (g_heap_extract_first (repo->free_room_handles)); + else + ret = repo->room_serial++; + break; + default: + g_assert_not_reached(); + } + + return ret; +} + +static gint +handle_compare_func (gconstpointer a, gconstpointer b) +{ + GabbleHandle first = GPOINTER_TO_UINT (a); + GabbleHandle second = GPOINTER_TO_UINT (b); + + return (first == second) ? 0 : ((first < second) ? -1 : 1); +} + +static void +handle_priv_remove (GabbleHandleRepo *repo, + TpHandleType type, + GabbleHandle handle) +{ + GabbleHandlePriv *priv; + const gchar *string; + + g_assert (gabble_handle_type_is_valid (type, NULL)); + g_assert (handle != 0); + g_assert (repo != NULL); + + priv = handle_priv_lookup (repo, type, handle); + + g_assert (priv != NULL); + + string = priv->string; + + switch (type) { + case TP_HANDLE_TYPE_CONTACT: + g_hash_table_remove (repo->contact_strings, string); + g_hash_table_remove (repo->contact_handles, GINT_TO_POINTER (handle)); + if (handle == repo->contact_serial-1) + repo->contact_serial--; + else + g_heap_add (repo->free_contact_handles, GUINT_TO_POINTER (handle)); + break; + case TP_HANDLE_TYPE_ROOM: + g_hash_table_remove (repo->room_strings, string); + g_hash_table_remove (repo->room_handles, GINT_TO_POINTER (handle)); + if (handle == repo->room_serial-1) + repo->room_serial--; + else + g_heap_add (repo->free_room_handles, GUINT_TO_POINTER (handle)); + break; + case TP_HANDLE_TYPE_LIST: + g_dataset_id_remove_data (&repo->list_handles, handle); + break; + default: + g_assert_not_reached (); + } +} + +static void +handles_name_owner_changed_cb (DBusGProxy *proxy, + const gchar *name, + const gchar *old_owner, + const gchar *new_owner, + gpointer data) +{ + GabbleHandleRepo *repo = (GabbleHandleRepo *) data; + + if (old_owner && strlen (old_owner)) + { + if (!new_owner || !strlen (new_owner)) + { + g_datalist_remove_data (&repo->client_contact_handle_sets, old_owner); + g_datalist_remove_data (&repo->client_room_handle_sets, old_owner); + } + } +} + +/* public API */ + +/** + * gabble_handle_jid_is_valid + * + * Validates a jid for given handle type and returns TRUE/FALSE + * on success/failure. In the latter case further information is + * provided through error if set. + */ +gboolean +gabble_handle_jid_is_valid (TpHandleType type, const gchar *jid, GError **error) +{ + if (type == TP_HANDLE_TYPE_CONTACT || type == TP_HANDLE_TYPE_ROOM) + { + if (!strchr (jid, '@')) + { + g_debug ("%s: jid %s has no @", G_STRFUNC, jid); + + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "jid %s has no @", jid); + + return FALSE; + } + + /* FIXME: do more extensive checking */ + } + else + { + g_assert_not_reached (); + /* FIXME: add checking for other types here */ + } + + return TRUE; +} + +gboolean +gabble_handle_type_is_valid (TpHandleType type, GError **error) +{ + gboolean ret; + + if (type > TP_HANDLE_TYPE_NONE && type <= TP_HANDLE_TYPE_LIST) + { + ret = TRUE; + } + else + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid handle type %u", type); + ret = FALSE; + } + + return ret; +} + + +GabbleHandleRepo * +gabble_handle_repo_new () +{ + GabbleHandleRepo *repo; + GabbleHandle publish, subscribe, known, deny; + + repo = g_new0 (GabbleHandleRepo, 1); + + repo->contact_handles = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) handle_priv_free); + + repo->room_handles = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) handle_priv_free); + + repo->contact_strings = g_hash_table_new (g_str_hash, g_str_equal); + repo->room_strings = g_hash_table_new (g_str_hash, g_str_equal); + + repo->free_contact_handles = g_heap_new (handle_compare_func); + repo->free_room_handles = g_heap_new (handle_compare_func); + + repo->contact_serial = 1; + repo->room_serial = 1; + + g_datalist_init (&repo->list_handles); + + publish = GABBLE_LIST_HANDLE_PUBLISH; + g_datalist_id_set_data_full (&repo->list_handles, (GQuark) publish, + handle_priv_new(), (GDestroyNotify) handle_priv_free); + + subscribe = GABBLE_LIST_HANDLE_SUBSCRIBE; + g_datalist_id_set_data_full (&repo->list_handles, (GQuark) subscribe, + handle_priv_new(), (GDestroyNotify) handle_priv_free); + + known = GABBLE_LIST_HANDLE_KNOWN; + g_datalist_id_set_data_full (&repo->list_handles, (GQuark) known, + handle_priv_new(), (GDestroyNotify) handle_priv_free); + + deny = GABBLE_LIST_HANDLE_DENY; + g_datalist_id_set_data_full (&repo->list_handles, (GQuark) deny, + handle_priv_new(), (GDestroyNotify) handle_priv_free); + + g_datalist_init (&repo->client_contact_handle_sets); + g_datalist_init (&repo->client_room_handle_sets); + + repo->bus_service_proxy = dbus_g_proxy_new_for_name (tp_get_bus(), + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS); + + dbus_g_proxy_add_signal (repo->bus_service_proxy, + "NameOwnerChanged", + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal (repo->bus_service_proxy, + "NameOwnerChanged", + G_CALLBACK (handles_name_owner_changed_cb), + repo, + NULL); + + return repo; +} + +#ifdef ENABLE_HANDLE_LEAK_DEBUG + +static void +handle_leak_debug_printbt_foreach (gpointer data, gpointer user_data) +{ + HandleLeakTrace *hltrace = (HandleLeakTrace *) data; + int i; + + for (i = 1; i < hltrace->len; i++) + { + g_message ("\t\t%s\n", hltrace->trace[i]); + } + + g_message ("\n"); +} + +static void +handle_leak_debug_printhandles_foreach (gpointer key, gpointer value, gpointer ignore) +{ + GabbleHandle handle = GPOINTER_TO_UINT (key); + GabbleHandlePriv *priv = (GabbleHandlePriv *) value; + + g_message ("\t%5u: %s (%u refs), traces:\n", handle, priv->string, priv->refcount); + + g_slist_foreach (priv->traces, handle_leak_debug_printbt_foreach, NULL); +} + +static void +handle_leak_debug_print_report (GabbleHandleRepo *repo) +{ + g_assert (repo != NULL); + + g_message ("The following contact handles were not freed:\n"); + g_hash_table_foreach (repo->contact_handles, handle_leak_debug_printhandles_foreach, NULL); + g_message ("The following room handles were not freed:\n"); + g_hash_table_foreach (repo->room_handles, handle_leak_debug_printhandles_foreach, NULL); +} + +static HandleLeakTrace * +handle_leak_debug_bt () +{ + void *bt_addresses[16]; + HandleLeakTrace *ret = g_new0 (HandleLeakTrace, 1); + + ret->len = backtrace (bt_addresses, 16); + ret->trace = backtrace_symbols (bt_addresses, ret->len); + + return ret; +} + +#define HANDLE_LEAK_DEBUG_DO(traces_slist) \ + { (traces_slist) = g_slist_append ((traces_slist), handle_leak_debug_bt ()); } + +#else /* !ENABLE_HANDLE_LEAK_DEBUG */ + +#define HANDLE_LEAK_DEBUG_DO(traces_slist) {} + +#endif /* ENABLE_HANDLE_LEAK_DEBUG */ + + +void +gabble_handle_repo_destroy (GabbleHandleRepo *repo) +{ + g_assert (repo != NULL); + g_assert (repo->contact_handles); + g_assert (repo->room_handles); + g_assert (repo->contact_strings); + g_assert (repo->room_strings); + + g_datalist_clear (&repo->client_contact_handle_sets); + g_datalist_clear (&repo->client_room_handle_sets); + +#ifdef ENABLE_HANDLE_LEAK_DEBUG + handle_leak_debug_print_report (repo); +#endif /* ENABLE_HANDLE_LEAK_DEBUG */ + + g_hash_table_destroy (repo->contact_handles); + g_hash_table_destroy (repo->room_handles); + g_hash_table_destroy (repo->contact_strings); + g_hash_table_destroy (repo->room_strings); + g_heap_destroy (repo->free_contact_handles); + g_heap_destroy (repo->free_room_handles); + g_datalist_clear (&repo->list_handles); + + dbus_g_proxy_disconnect_signal (repo->bus_service_proxy, + "NameOwnerChanged", + G_CALLBACK (handles_name_owner_changed_cb), + repo); + g_object_unref (G_OBJECT (repo->bus_service_proxy)); + + g_free (repo); +} + + +gboolean +gabble_handle_is_valid (GabbleHandleRepo *repo, TpHandleType type, GabbleHandle handle, GError **error) +{ + GArray *arr; + gboolean ret; + + arr = g_array_new (FALSE, FALSE, sizeof (GabbleHandle)); + g_array_insert_val (arr, 0, handle); + + ret = gabble_handles_are_valid (repo, type, arr, FALSE, error); + + g_array_free (arr, TRUE); + + return ret; +} + +gboolean +gabble_handles_are_valid (GabbleHandleRepo *repo, + TpHandleType type, + const GArray *array, + gboolean allow_zero, + GError **error) +{ + guint i; + + g_return_val_if_fail (repo != NULL, FALSE); + g_return_val_if_fail (array != NULL, FALSE); + + if (!gabble_handle_type_is_valid (type, error)) + return FALSE; + + for (i = 0; i < array->len; i++) + { + GabbleHandle handle = g_array_index (array, GabbleHandle, i); + + if (handle == 0) + { + if (allow_zero) + continue; + + g_debug ("someone tried to validate handle zero"); + + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid handle %u", handle); + return FALSE; + } + + if (handle_priv_lookup (repo, type, handle) == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid handle %u", handle); + return FALSE; + } + } + + return TRUE; +} + + +gboolean +gabble_handle_ref (GabbleHandleRepo *repo, + TpHandleType type, + GabbleHandle handle) +{ + GabbleHandlePriv *priv; + + if (type == TP_HANDLE_TYPE_LIST) + { + if (handle >= GABBLE_LIST_HANDLE_PUBLISH && handle <= GABBLE_LIST_HANDLE_DENY) + return TRUE; + else + return FALSE; + } + + priv = handle_priv_lookup (repo, type, handle); + + if (priv == NULL) + return FALSE; + + priv->refcount++; + + HANDLE_LEAK_DEBUG_DO (priv->traces); + + return TRUE; +} + + +gboolean +gabble_handle_unref (GabbleHandleRepo *repo, + TpHandleType type, + GabbleHandle handle) +{ + GabbleHandlePriv *priv; + + if (type == TP_HANDLE_TYPE_LIST) + { + if (handle >= GABBLE_LIST_HANDLE_PUBLISH && handle <= GABBLE_LIST_HANDLE_DENY) + return TRUE; + else + return FALSE; + } + + priv = handle_priv_lookup (repo, type, handle); + + if (priv == NULL) + return FALSE; + + HANDLE_LEAK_DEBUG_DO (priv->traces); + + g_assert (priv->refcount > 0); + + priv->refcount--; + + if (priv->refcount == 0) + handle_priv_remove (repo, type, handle); + + return TRUE; +} + + +const char * +gabble_handle_inspect (GabbleHandleRepo *repo, + TpHandleType type, + GabbleHandle handle) +{ + GabbleHandlePriv *priv; + + if (type == TP_HANDLE_TYPE_LIST) + { + g_assert (handle >= GABBLE_LIST_HANDLE_PUBLISH + && handle <= GABBLE_LIST_HANDLE_DENY); + return list_handle_strings[handle-1]; + } + + priv = handle_priv_lookup (repo, type, handle); + + if (priv == NULL) + return NULL; + else + return priv->string; +} + +static GabbleHandle +_handle_lookup_by_jid (GabbleHandleRepo *repo, + const gchar *jid) +{ + GabbleHandle handle; + + handle = GPOINTER_TO_UINT (g_hash_table_lookup (repo->contact_strings, jid)); + + if (0 == handle) + return 0; + + return handle; +} + + +GabbleHandle +gabble_handle_for_contact (GabbleHandleRepo *repo, + const char *jid, + gboolean with_resource) +{ + char *username = NULL; + char *server = NULL; + char *resource = NULL; + char *clean_jid = NULL; + GabbleHandle handle = 0; + GabbleHandlePriv *priv; + + g_assert (repo != NULL); + g_assert (jid != NULL); + g_assert (*jid != '\0'); + + gabble_decode_jid (jid, &username, &server, &resource); + + if (NULL == username || '\0' == *username) + goto OUT; + + if (NULL == resource && with_resource) + goto OUT; + + if (NULL != resource) + { + clean_jid = g_strdup_printf ("%s@%s/%s", username, server, resource); + handle = _handle_lookup_by_jid (repo, clean_jid); + + if (0 != handle) + goto OUT; + } + + if (!with_resource) + { + g_free (clean_jid); + clean_jid = g_strdup_printf ("%s@%s", username, server); + handle = _handle_lookup_by_jid (repo, clean_jid); + + if (0 != handle) + goto OUT; + } + + handle = gabble_handle_alloc (repo, TP_HANDLE_TYPE_CONTACT); + priv = handle_priv_new (); + priv->string = clean_jid; + clean_jid = NULL; + g_hash_table_insert (repo->contact_handles, GINT_TO_POINTER (handle), priv); + g_hash_table_insert (repo->contact_strings, priv->string, GUINT_TO_POINTER (handle)); + + HANDLE_LEAK_DEBUG_DO (priv->traces); + +OUT: + + g_free (clean_jid); + g_free (username); + g_free (server); + g_free (resource); + return handle; +} + +gboolean +gabble_handle_for_room_exists (GabbleHandleRepo *repo, + const gchar *jid, + gboolean ignore_nick) +{ + GabbleHandle handle; + gchar *room, *service, *nick; + gchar *clean_jid; + + gabble_decode_jid (jid, &room, &service, &nick); + + if (!room || !service || room[0] == '\0') + return FALSE; + + if (ignore_nick || !nick) + clean_jid = g_strdup_printf ("%s@%s", room, service); + else + clean_jid = g_strdup_printf ("%s@%s/%s", room, service, nick); + + handle = GPOINTER_TO_UINT (g_hash_table_lookup (repo->room_strings, + clean_jid)); + + g_free (clean_jid); + g_free (room); + g_free (service); + g_free (nick); + + if (handle == 0) + return FALSE; + + return (handle_priv_lookup (repo, TP_HANDLE_TYPE_ROOM, handle) != NULL); +} + + +GabbleHandle +gabble_handle_for_room (GabbleHandleRepo *repo, + const gchar *jid) +{ + GabbleHandle handle; + gchar *room, *service, *clean_jid; + + g_assert (repo != NULL); + g_assert (jid != NULL); + g_assert (*jid != '\0'); + + handle = 0; + + room = service = NULL; + gabble_decode_jid (jid, &room, &service, NULL); + + if (room && service && *room != '\0') + { + clean_jid = g_strdup_printf ("%s@%s", room, service); + + handle = GPOINTER_TO_UINT (g_hash_table_lookup (repo->room_strings, clean_jid)); + + if (handle == 0) + { + GabbleHandlePriv *priv; + handle = gabble_handle_alloc (repo, TP_HANDLE_TYPE_ROOM); + priv = handle_priv_new (); + priv->string = clean_jid; + g_hash_table_insert (repo->room_handles, GUINT_TO_POINTER (handle), priv); + g_hash_table_insert (repo->room_strings, clean_jid, GUINT_TO_POINTER (handle)); + HANDLE_LEAK_DEBUG_DO (priv->traces); + } + else + { + g_free (clean_jid); + } + } + + g_free (room); + g_free (service); + + return handle; +} + + +GabbleHandle +gabble_handle_for_list (GabbleHandleRepo *repo, + const gchar *list) +{ + GabbleHandle handle = 0; + int i; + + g_assert (repo != NULL); + g_assert (list != NULL); + + for (i = 0; i < GABBLE_LIST_HANDLE_DENY; i++) + { + if (0 == strcmp (list_handle_strings[i], list)) + handle = (GabbleHandle) i + 1; + } + + return handle; +} + +/** + * gabble_handle_set_qdata: + * @repo: A #GabbleHandleRepo + * @type: The handle type + * @handle: A handle to set data on + * @key_id: Key id to associate data with + * @data: data to associate with handle + * @destroy: A #GDestroyNotify to call to detroy the data, + * or NULL if not needed. + * + * Associates a blob of data with a given handle and a given key + * + * If @destroy is set, then the data is freed when the handle is freed. + */ + +gboolean +gabble_handle_set_qdata (GabbleHandleRepo *repo, + TpHandleType type, GabbleHandle handle, + GQuark key_id, gpointer data, GDestroyNotify destroy) +{ + GabbleHandlePriv *priv; + priv = handle_priv_lookup (repo, type, handle); + + if (!priv) + return FALSE; + + g_datalist_id_set_data_full (&priv->datalist, key_id, data, destroy); + return TRUE; +} + +/** + * gabble_handle_get_qdata: + * @repo: A #GabbleHandleRepo + * @type: The handle type + * @handle: A handle to get data from + * @key_id: Key id of data to fetch + * + * Gets the data associated with a given key on a given handle + */ +gpointer +gabble_handle_get_qdata (GabbleHandleRepo *repo, + TpHandleType type, GabbleHandle handle, + GQuark key_id) +{ + GabbleHandlePriv *priv; + priv = handle_priv_lookup (repo, type, handle); + + if (!priv) + return NULL; + + return g_datalist_id_get_data(&priv->datalist, key_id); +} + +/** + * gabble_handle_client_hold: + * @repo: a #GabbleHandleRepo + * @client_name: D-Bus bus name of client to hold the handle for + * @handle: the handle to hold + * @type: type of handle to hold + * @error: used to return a pointer to a GError detailing any error that occurred + * + * Marks a handle as held by a given client. + * + * Returns: Whether the handle was succesfully marked as held or an error occurred. + */ + +gboolean +gabble_handle_client_hold (GabbleHandleRepo *repo, + const gchar *client_name, + GabbleHandle handle, + TpHandleType type, + GError **error) +{ + GData **handle_set_list; + GabbleHandleSet *handle_set; + + g_assert (repo != NULL); + + switch (type) + { + case TP_HANDLE_TYPE_CONTACT: + handle_set_list = &repo->client_contact_handle_sets; + break; + case TP_HANDLE_TYPE_ROOM: + handle_set_list = &repo->client_room_handle_sets; + break; + case TP_HANDLE_TYPE_LIST: + /* no-op */ + return TRUE; + default: + g_critical ("%s: called with invalid handle type %u", G_STRFUNC, type); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid handle type %u", type); + return FALSE; + } + + if (!client_name || *client_name == '\0') + { + g_critical ("%s: called with invalid client name", G_STRFUNC); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid client name"); + return FALSE; + } + + handle_set = (GabbleHandleSet*) g_datalist_get_data (handle_set_list, client_name); + + if (!handle_set) + { + handle_set = handle_set_new (repo, type); + g_datalist_set_data_full (handle_set_list, + client_name, + handle_set, + (GDestroyNotify) handle_set_destroy); + } + + handle_set_add (handle_set, handle); + + return TRUE; +} + +/** + * gabble_handle_client_release: + * @repo: a #GabbleHandleRepo + * @client_name: D-Bus bus name of client to release the handle for + * @handle: the handle to release + * @type: type of handle to release + * @error: used to return a pointer to a GError detailing any error that occurred + * + * Unmarks a handle as held by a given client. + * + * Returns: Whether the handle had been marked as held by the given client and now unmarked or not. + */ + +gboolean +gabble_handle_client_release (GabbleHandleRepo *repo, + const gchar *client_name, + GabbleHandle handle, + TpHandleType type, + GError **error) +{ + GData **handle_set_list; + GabbleHandleSet *handle_set; + + g_assert (repo != NULL); + + switch (type) + { + case TP_HANDLE_TYPE_CONTACT: + handle_set_list = &repo->client_contact_handle_sets; + break; + case TP_HANDLE_TYPE_ROOM: + handle_set_list = &repo->client_room_handle_sets; + break; + case TP_HANDLE_TYPE_LIST: + /* no-op */ + return TRUE; + default: + g_critical ("%s: called with invalid handle type %u", G_STRFUNC, type); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid handle type %u", type); + return FALSE; + } + + if (!client_name || *client_name == '\0') + { + g_critical ("%s: called with invalid client name", G_STRFUNC); + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid client name"); + return FALSE; + } + + handle_set = (GabbleHandleSet*) g_datalist_get_data (handle_set_list, client_name); + + if (!handle_set) + { + g_critical ("%s: no handle set found for the given client %s", G_STRFUNC, client_name); + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "the given client %s wasn't holding any handles", client_name); + return FALSE; + } + + if (!handle_set_remove (handle_set, handle)) + { + g_critical ("%s: the client %s wasn't holding the handle %u", G_STRFUNC, + client_name, handle); + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "the given client %s wasn't holding the handle %u", client_name, + handle); + return FALSE; + } + + return TRUE; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/im-factory.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/im-factory.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,474 @@ +/* + * im-factory.c - Source for GabbleImFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include +#include + +#include + +#include +#include + +#include "loudmouth/loudmouth.h" + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-im-channel.h" +#include "handles.h" +#include "telepathy-interfaces.h" +#include "text-mixin.h" +#include "tp-channel-factory-iface.h" + +#include "im-factory.h" + +static void gabble_im_factory_iface_init (gpointer g_iface, gpointer iface_data); + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleImFactory, gabble_im_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE, gabble_im_factory_iface_init)); +#endif + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(gabble_im_factory_parent_class,im_factory,gpointer) + #define gabble_im_factory_parent_class (*GET_WSD_VAR_NAME(gabble_im_factory_parent_class,im_factory,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,im_factory,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,im_factory,s)()) + +static void gabble_im_factory_init (GabbleImFactory *self); +static void gabble_im_factory_class_init (GabbleImFactoryClass *klass); +static void gabble_im_factory_class_intern_init (gpointer klass) +{ + gabble_im_factory_parent_class = g_type_class_peek_parent (klass); + gabble_im_factory_class_init ((GabbleImFactoryClass*) klass); + } + EXPORT_C GType gabble_im_factory_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleImFactoryClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_im_factory_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleImFactory), 0, (GInstanceInitFunc) gabble_im_factory_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleImFactory"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gabble_im_factory_iface_init }; g_type_add_interface_static (g_define_type_id, tp_channel_factory_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + +#endif + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_IM + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +typedef struct _GabbleImFactoryPrivate GabbleImFactoryPrivate; +struct _GabbleImFactoryPrivate +{ + GabbleConnection *conn; + LmMessageHandler *message_cb; + GHashTable *channels; + + gboolean dispose_has_run; +}; + +#define GABBLE_IM_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_IM_FACTORY, GabbleImFactoryPrivate)) + +static GObject *gabble_im_factory_constructor (GType type, guint n_props, GObjectConstructParam *props); + +static void +gabble_im_factory_init (GabbleImFactory *fac) +{ + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + priv->channels = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, g_object_unref); + + priv->message_cb = NULL; + + priv->conn = NULL; + priv->dispose_has_run = FALSE; +} + +static GObject * +gabble_im_factory_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + /* GabbleImFactoryPrivate *priv; */ + + obj = G_OBJECT_CLASS (gabble_im_factory_parent_class)-> + constructor (type, n_props, props); + /* priv = GABBLE_IM_FACTORY_GET_PRIVATE (obj); */ + + return obj; +} + + +static void +gabble_im_factory_dispose (GObject *object) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (object); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + priv->dispose_has_run = TRUE; + + tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object)); + g_assert (priv->channels == NULL); + + if (G_OBJECT_CLASS (gabble_im_factory_parent_class)->dispose) + G_OBJECT_CLASS (gabble_im_factory_parent_class)->dispose (object); +} + +static void +gabble_im_factory_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (object); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_im_factory_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (object); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_im_factory_class_init (GabbleImFactoryClass *gabble_im_factory_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_im_factory_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_im_factory_class, sizeof (GabbleImFactoryPrivate)); + + object_class->constructor = gabble_im_factory_constructor; + object_class->dispose = gabble_im_factory_dispose; + + object_class->get_property = gabble_im_factory_get_property; + object_class->set_property = gabble_im_factory_set_property; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "IM channel factory object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + +} + +static GabbleIMChannel *new_im_channel (GabbleImFactory *fac, GabbleHandle handle); + +static void im_channel_closed_cb (GabbleIMChannel *chan, gpointer user_data); + + +/** + * im_factory_message_cb: + * + * Called by loudmouth when we get an incoming . + */ +static LmHandlerResult +im_factory_message_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (user_data); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + const gchar *from, *body, *body_offset; + time_t stamp; + TpChannelTextMessageType msgtype; + GabbleHandle handle; + GabbleIMChannel *chan; + GabbleTextMixinSendError send_error; + + if (!gabble_text_mixin_parse_incoming_message (message, &from, &stamp, &msgtype, &body, &body_offset, &send_error)) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + if (body == NULL) + { + NODE_DEBUG (message->node, "got a message without a body field, ignoring"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + handle = gabble_handle_for_contact (priv->conn->handles, from, FALSE); + if (handle == 0) + { + NODE_DEBUG (message->node, "ignoring message node from malformed jid"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + gabble_debug (DEBUG_FLAG, "message from %s (handle %u), msgtype %d, body:\n%s", + from, handle, msgtype, body_offset); + + chan = g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)); + + if (chan == NULL) + { + if (send_error != CHANNEL_TEXT_SEND_NO_ERROR) + { + gabble_debug (DEBUG_FLAG, "ignoring message error; no sending channel"); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + gabble_debug (DEBUG_FLAG, "found no IM channel, creating one"); + + chan = new_im_channel (fac, handle); + } + + if (send_error != CHANNEL_TEXT_SEND_NO_ERROR) + { + _gabble_text_mixin_send_error_signal (G_OBJECT (chan), send_error, stamp, + msgtype, body_offset); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + if (_gabble_im_channel_receive (chan, msgtype, handle, from, + stamp, body_offset)) + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + +/** + * im_channel_closed_cb: + * + * Signal callback for when an IM channel is closed. Removes the references + * that #GabbleConnection holds to them. + */ +static void +im_channel_closed_cb (GabbleIMChannel *chan, gpointer user_data) +{ + GabbleImFactory *conn = GABBLE_IM_FACTORY (user_data); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (conn); + GabbleHandle contact_handle; + + if (priv->channels) + { + g_object_get (chan, "handle", &contact_handle, NULL); + + gabble_debug (DEBUG_FLAG, "removing channel with handle %d", contact_handle); + + g_hash_table_remove (priv->channels, GINT_TO_POINTER (contact_handle)); + } +} + +/** + * new_im_channel + */ +static GabbleIMChannel * +new_im_channel (GabbleImFactory *fac, GabbleHandle handle) +{ + GabbleImFactoryPrivate *priv; + GabbleIMChannel *chan; + char *object_path; + + g_assert (GABBLE_IS_IM_FACTORY (fac)); + + priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + object_path = g_strdup_printf ("%s/ImChannel%u", priv->conn->object_path, handle); + + chan = g_object_new (GABBLE_TYPE_IM_CHANNEL, + "connection", priv->conn, + "object-path", object_path, + "handle", handle, + NULL); + + gabble_debug (DEBUG_FLAG, "object path %s", object_path); + + g_signal_connect (chan, "closed", (GCallback) im_channel_closed_cb, fac); + + g_hash_table_insert (priv->channels, GINT_TO_POINTER (handle), chan); + + g_signal_emit_by_name (fac, "new-channel", chan); + + g_free (object_path); + + return chan; +} + +static void +gabble_im_factory_iface_close_all (TpChannelFactoryIface *iface) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (iface); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "closing channels"); + + if (priv->channels) + { + GHashTable *tmp = priv->channels; + priv->channels = NULL; + g_hash_table_destroy (tmp); + } +} + +static void +gabble_im_factory_iface_connecting (TpChannelFactoryIface *iface) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (iface); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "adding callbacks"); + + g_assert (priv->message_cb == NULL); + + priv->message_cb = lm_message_handler_new (im_factory_message_cb, fac, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, priv->message_cb, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_LAST); +} + + + +static void +gabble_im_factory_iface_connected (TpChannelFactoryIface *iface) +{ + /* nothing to do */ +} + +static void +gabble_im_factory_iface_disconnected (TpChannelFactoryIface *iface) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (iface); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "removing callbacks"); + + g_assert (priv->message_cb != NULL); + + lm_connection_unregister_message_handler (priv->conn->lmconn, priv->message_cb, + LM_MESSAGE_TYPE_MESSAGE); + lm_message_handler_unref (priv->message_cb); + priv->message_cb = NULL; +} + +struct _ForeachData +{ + TpChannelFunc foreach; + gpointer user_data; +}; + +static void +_foreach_slave (gpointer key, gpointer value, gpointer user_data) +{ + struct _ForeachData *data = (struct _ForeachData *) user_data; + TpChannelIface *chan = TP_CHANNEL_IFACE (value); + + data->foreach (chan, data->user_data); +} + +static void +gabble_im_factory_iface_foreach (TpChannelFactoryIface *iface, TpChannelFunc foreach, gpointer user_data) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (iface); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + struct _ForeachData data; + + data.user_data = user_data; + data.foreach = foreach; + + g_hash_table_foreach (priv->channels, _foreach_slave, &data); +} + +static TpChannelFactoryRequestStatus +gabble_im_factory_iface_request (TpChannelFactoryIface *iface, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + GabbleImFactory *fac = GABBLE_IM_FACTORY (iface); + GabbleImFactoryPrivate *priv = GABBLE_IM_FACTORY_GET_PRIVATE (fac); + GabbleIMChannel *chan; + + if (strcmp (chan_type, TP_IFACE_CHANNEL_TYPE_TEXT)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + + if (handle_type != TP_HANDLE_TYPE_CONTACT) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + + if (!gabble_handle_is_valid (priv->conn->handles, handle_type, handle, error)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR; + + chan = g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)); + + if (!chan) + chan = new_im_channel (fac, handle); + + g_assert (chan); + *ret = TP_CHANNEL_IFACE (chan); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; +} + +static void +gabble_im_factory_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface; + + klass->close_all = gabble_im_factory_iface_close_all; + klass->connecting = gabble_im_factory_iface_connecting; + klass->connected = gabble_im_factory_iface_connected; + klass->disconnected = gabble_im_factory_iface_disconnected; + klass->foreach = gabble_im_factory_iface_foreach; + klass->request = gabble_im_factory_iface_request; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/jingle-info.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/jingle-info.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,238 @@ +/* + * jingle-info.c - Source for Jingle info discovery + * Copyright (C) 2006 Collabora Ltd. + * Portions and/or its subsidiary/subsidiaries.All rights reserved. + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA + +#include "debug.h" +#include "jingle-info.h" +#include "gabble-error.h" +#include "namespaces.h" +#include "util.h" + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/** + * jingle_info_discover_servers: + * + * Discover available Jingle servers. + * + * @conn: The GabbleConnection# object initiating the discovery. + */ +void +jingle_info_discover_servers (GabbleConnection *conn) +{ + LmMessage *msg = NULL; + LmMessageNode *node; + GError *error = NULL; + GabbleHandle handle = conn->self_handle; + const gchar *jid = gabble_handle_inspect (conn->handles, TP_HANDLE_TYPE_CONTACT, handle); + + msg = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + + node = lm_message_node_add_child (msg->node, "query", NULL); + lm_message_node_set_attribute (node, "xmlns", NS_GOOGLE_JINGLE_INFO); + + if (!_gabble_connection_send (conn, msg, &error)) + { + g_warning ("%s: send failed: %s\n", G_STRFUNC, error->message); + goto OUT; + } + +OUT: + if (msg) + lm_message_unref (msg); + + if (error) + g_error_free (error); +} + + +/** + * jingle_info_iq_callback + * + * Called by loudmouth when we get an incoming . This handler + * is concerned only with Jingle info queries. + */ +LmHandlerResult +jingle_info_iq_callback (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + LmMessageSubType sub_type; + LmMessageNode *query_node, *parent_node, *node; + const gchar *str; + guint port; + + if ( NULL == conn ) + { + g_debug ("%s: accesing after dereferenced connection", G_STRFUNC); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + query_node = lm_message_node_get_child_with_namespace (message->node, + "query", NS_GOOGLE_JINGLE_INFO); + + if (query_node == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + NODE_DEBUG (message->node, "got"); + + sub_type = lm_message_get_sub_type (message); + + if (sub_type == LM_MESSAGE_SUB_TYPE_RESULT || + sub_type == LM_MESSAGE_SUB_TYPE_SET) + { + parent_node = lm_message_node_get_child (query_node, "stun"); + if (parent_node) + { + for (node = parent_node->children; node; node = node->next) + { + if (strcmp (node->name, "server") == 0) + { + str = lm_message_node_get_attribute (node, "host"); + if (str) + { + gabble_debug (DEBUG_FLAG, "setting 'stun-server' to '%s'", str); + + g_object_set (conn, "stun-server", str, NULL); + } + + str = lm_message_node_get_attribute (node, "udp"); + if (str) + { + port = atoi (str); + + gabble_debug (DEBUG_FLAG, "setting 'stun-port' to %d", port); + + g_object_set (conn, "stun-port", port, NULL); + } + + /* only grab the first one for now */ + break; + } + } + } + + parent_node = lm_message_node_get_child (query_node, "relay"); + if (parent_node) + { + gboolean found_server = FALSE; + + for (node = parent_node->children; node; node = node->next) + { + if (!found_server && strcmp (node->name, "server") == 0) + { + str = lm_message_node_get_attribute (node, "host"); + if (str) + { + gabble_debug (DEBUG_FLAG, "setting 'stun-relay-server' to '%s'", + str); + + g_object_set (conn, "stun-relay-server", str, NULL); + } + + str = lm_message_node_get_attribute (node, "udp"); + if (str) + { + port = atoi (str); + + gabble_debug (DEBUG_FLAG, "setting 'stun-relay-udp-port' to %d", + port); + + g_object_set (conn, "stun-relay-udp-port", port, NULL); + } + + str = lm_message_node_get_attribute (node, "tcp"); + if (str) + { + port = atoi (str); + + gabble_debug (DEBUG_FLAG, "setting 'stun-relay-tcp-port' to %d", + port); + + g_object_set (conn, "stun-relay-tcp-port", port, NULL); + } + + str = lm_message_node_get_attribute (node, "tcpssl"); + if (str) + { + port = atoi (str); + + gabble_debug (DEBUG_FLAG, "setting 'stun-relay-ssltcp-port' to %d", + port); + + g_object_set (conn, "stun-relay-ssltcp-port", port, NULL); + } + + found_server = TRUE; + } + else if (strcmp (node->name, "token") == 0) + { + str = lm_message_node_get_value (node); + if (str) + { + gabble_debug (DEBUG_FLAG, "setting 'stun-relay-magic-cookie' to '%s'", + str); + + g_object_set (conn, "stun-relay-magic-cookie", str, NULL); + } + } + } + } + + if (sub_type == LM_MESSAGE_SUB_TYPE_SET) + { + _gabble_connection_acknowledge_set_iq (conn, message); + } + } + else if (sub_type == LM_MESSAGE_SUB_TYPE_ERROR) + { + GabbleXmppError xmpp_error = INVALID_XMPP_ERROR; + + node = lm_message_node_get_child (message->node, "error"); + if (node) + { + xmpp_error = gabble_xmpp_error_from_node (node); + } + + str = gabble_xmpp_error_string (xmpp_error); + + g_warning ("%s: jingle info error: %s", G_STRFUNC, + (str) ? str : "unknown error"); + } + else + { + NODE_DEBUG (message->node, "unknown message sub type"); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/libgabble_wsd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/libgabble_wsd.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,378 @@ +/* + * libgabble_wsd.cpp part of telepathygabble + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "libgabble_wsd_solution.h" +#include "gabble_enums.h" +#include +#include "telepathy-interfaces.h" +#include // For emulator WSD API + +const TUid KLibGabbleUid3 = {0x2000F852}; // This is the UID of the library +struct libgabble_global_struct *libgabble_ImpurePtr() +{ + #if defined(__WINSCW__) || defined(__WINS__) + + // Access the PLS of this process + struct libgabble_global_struct *g = Pls(KLibGabbleUid3, &libgabble_Init); + return g; + + #else + + return NULL; + + #endif +} + +int libgabble_Init(libgabble_global_struct *g) +{ + + +Handler handlers[10] = { + { + { "initiate", "session-initiate", NULL }, + JS_STATE_PENDING_CREATED, + JS_STATE_PENDING_CREATED, + { NULL }, + JS_STATE_PENDING_INITIATED + }, + { + { "accept", "session-accept", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_PENDING_INITIATED, + { NULL }, + JS_STATE_ACTIVE + }, + { + { "reject", NULL }, + JS_STATE_PENDING_INITIATE_SENT, + JS_STATE_PENDING_INITIATED, + { NULL }, + JS_STATE_INVALID + }, + { + { "terminate", "session-terminate", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ENDED, + { NULL }, + JS_STATE_INVALID + }, + { + { "candidates", "transport-info", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { NULL }, + JS_STATE_INVALID + }, + { + { "content-add", NULL }, + JS_STATE_ACTIVE, + JS_STATE_ACTIVE, + { NULL }, + JS_STATE_INVALID, + }, + { + { "content-modify", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { NULL }, + JS_STATE_INVALID + }, + { + { "content-accept", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { NULL }, + JS_STATE_INVALID + }, + { + { "content-remove", "content-decline", NULL }, + JS_STATE_PENDING_INITIATED, + JS_STATE_ACTIVE, + { NULL }, + JS_STATE_INVALID + }, + { + { NULL }, + JS_STATE_INVALID, + JS_STATE_INVALID, + { NULL }, + JS_STATE_INVALID + } +}; + +GDebugKey keys[] = { + { "presence", GABBLE_DEBUG_PRESENCE }, + { "groups", GABBLE_DEBUG_GROUPS }, + { "roster", GABBLE_DEBUG_ROSTER }, + { "disco", GABBLE_DEBUG_DISCO }, + { "properties", GABBLE_DEBUG_PROPERTIES }, + { "roomlist", GABBLE_DEBUG_ROOMLIST }, + { "media-channel", GABBLE_DEBUG_MEDIA }, + { "muc", GABBLE_DEBUG_MUC }, + { "connection", GABBLE_DEBUG_CONNECTION }, + { "persist", GABBLE_DEBUG_PERSIST }, + { "vcard", GABBLE_DEBUG_VCARD }, + { 0, }, +}; + +gchar NO_ALIAS[10] = "none"; + +gchar assumed_caps[3][150] = +{ + TP_IFACE_CHANNEL_TYPE_TEXT, + TP_IFACE_CHANNEL_INTERFACE_GROUP, + NULL +}; + + +gchar muc_roles[4][20] = +{ + "none", + "visitor", + "participant", + "moderator", +}; + +gchar muc_affiliations[4][20] = +{ + "none", + "member", + "admin", + "owner", +}; + +gchar video_codec_params[6][20] = { + "x", "y", "width", "height", "layer", "transparent", +}; + + +char list_handle_strings[4][20] = +{ + "publish", /* GABBLE_LIST_HANDLE_PUBLISH */ + "subscribe", /* GABBLE_LIST_HANDLE_SUBSCRIBE */ + "known", /* GABBLE_LIST_HANDLE_KNOWN */ + "deny" /* GABBLE_LIST_HANDLE_DENY */ +}; + + if(g) + { + + + //g->GET_WSD_VAR_NAME(flags,gabble_debug,s) = flags; + g->GET_WSD_VAR_NAME(log_handler, gabble_debug, s) = 0; + g->GET_WSD_VAR_NAME(etype,gabble_enum_types,s) = 0; + + g->GET_WSD_VAR_NAME(etype,gabble_media_session_enum_types,s) = 0; + g->GET_WSD_VAR_NAME(etype1,gabble_media_session_enum_types,s) = 0; + g->GET_WSD_VAR_NAME(etype2,gabble_media_session_enum_types,s) = 0; + + + + + g->GET_WSD_VAR_NAME(quark,gabble_disco,s) = 0; + g->GET_WSD_VAR_NAME(quark,gabble_error,s) = 0; + + + g->GET_WSD_VAR_NAME(ssl,gabble_conmgr,s) = TRUE; + g->GET_WSD_VAR_NAME(httpport,gabble_conmgr,s) = 8080; + g->GET_WSD_VAR_NAME(httpproxyport,gabble_conmgr,s) = 443; + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_conmgr,s)),0,LAST_SIGNAL_CON_MGR*sizeof(guint)); + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_con,s)),0,LAST_SIGNAL_CON*sizeof(guint)); + g->GET_WSD_VAR_NAME(arguments,gabble_con, s) = NULL; + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_im,s)),0,LAST_SIGNAL_IM*sizeof(guint)); + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_search,s)),0,LAST_SIGNAL_SEARCH*sizeof(guint)); + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_muc,s)),0,LAST_SIGNAL_MUC*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_med_chnl,s)),0,LAST_SIGNAL_MED_CHANNEL*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_med_sess,s)),0,LAST_SIGNAL_MED_SESSION*sizeof(guint)); + + + + + g->GET_WSD_VAR_NAME(google_audio_caps,gabble_med_sess,s) = PRESENCE_CAP_GOOGLE_VOICE; + + int some = PRESENCE_CAP_JINGLE | PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO | + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P; + + g->GET_WSD_VAR_NAME(jingle_audio_caps,gabble_med_sess,s) = (GabblePresenceCapabilities)some; + + some = PRESENCE_CAP_JINGLE | PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO | + PRESENCE_CAP_GOOGLE_TRANSPORT_P2P; + g->GET_WSD_VAR_NAME(jingle_video_caps,gabble_med_sess,s) = + (GabblePresenceCapabilities) some; + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_med_sess,s)),0,MAX_STREAM_NAME_LEN*sizeof(gchar)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_med_stream,s)),0,LAST_SIGNAL_MED_STREAM*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_pre_cache,s)),0,LAST_SIGNAL_PRE_CACHE*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_register,s)),0,LAST_SIGNAL_REGISTER*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_ros_chnl,s)),0,LAST_SIGNAL_ROS_CHNL*sizeof(guint)); + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_room_chnl,s)),0,LAST_SIGNAL_ROOM_CHNL*sizeof(guint)); + + g->GET_WSD_VAR_NAME(offset_quark1,gabble_mixin,s) = 0; + g->GET_WSD_VAR_NAME(offset_quark,gabble_mixin,s) = 0; + + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_roster,s)),0,LAST_SIGNAL_ROSTER*sizeof(guint)); + + g->GET_WSD_VAR_NAME(quark,gabble_errors,s) = 0; + + g->GET_WSD_VAR_NAME(busCon,gabble_helpers,s) = NULL; + g->GET_WSD_VAR_NAME(bus_proxy,gabble_helpers,s) = NULL; + + g->GET_WSD_VAR_NAME(offset_quark1,gabble_txt_mixin,s) = 0; + g->GET_WSD_VAR_NAME(offset_quark,gabble_txt_mixin,s) = 0; + + memset(&(g->GET_WSD_VAR_NAME(alloc1,gabble_txt_mixin,s)),0,sizeof(GabbleAllocator)); + + g->GET_WSD_VAR_NAME(type,gabble_chnl_iface,s) = 0; + g->GET_WSD_VAR_NAME(initialized,gabble_chnl_iface,s) = EFalse; + + g->GET_WSD_VAR_NAME(type,gabble_fac_iface,s) = 0; + g->GET_WSD_VAR_NAME(initialized,gabble_fac_iface,s) = EFalse; + + memset(&(g->GET_WSD_VAR_NAME(signals,gabble_vcard_mgr,s)),0,LAST_SIGNAL_VCARD_MGR*sizeof(guint)); + + g->GET_WSD_VAR_NAME(quark1,gabble_vcard_mgr,s) = 0; + g->GET_WSD_VAR_NAME(quark2,gabble_vcard_mgr,s) = 0; + + g->GET_WSD_VAR_NAME(offset_quark1,gabble_grp_mixin,s) = 0; + g->GET_WSD_VAR_NAME(offset_quark,gabble_grp_mixin,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_disco_parent_class,gabble_disco,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_disco,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_connection_manager_parent_class,gabble_conmgr,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_conmgr,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_connection_parent_class,gabble_con,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_con,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_im_channel_parent_class,gabble_im,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_im,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_search_channel_parent_class,gabble_search,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_search,s) = 0; + + + g->GET_WSD_VAR_NAME(gabble_muc_channel_parent_class,gabble_muc,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_muc,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_media_channel_parent_class,gabble_med_chnl,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_med_chnl,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_media_stream_parent_class,gabble_med_stream,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_med_stream,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_presence_parent_class,gabble_presence,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_presence,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_presence_cache_parent_class,gabble_pre_cache,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_pre_cache,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_register_parent_class,gabble_register,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_register,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_roster_channel_parent_class,gabble_ros_chnl,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_ros_chnl,s) = 0; + + + g->GET_WSD_VAR_NAME(gabble_roomlist_channel_parent_class,gabble_room_chnl,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_room_chnl,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_im_factory_parent_class ,im_factory,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,im_factory,s) = 0; + + + g->GET_WSD_VAR_NAME(gabble_media_factory_parent_class ,media_factory,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,media_factory,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_muc_factory_parent_class ,muc_factory,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,muc_factory,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_vcard_manager_parent_class ,gabble_vcard_mgr,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_vcard_mgr,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_media_session_parent_class ,gabble_med_sess,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_med_sess,s) = 0; + + g->GET_WSD_VAR_NAME(gabble_roster_parent_class ,gabble_roster,s) = ((void *)0); + g->GET_WSD_VAR_NAME(g_define_type_id,gabble_roster,s) = 0; + + + memcpy (&(g->GET_WSD_VAR_NAME(keys,gabble_debug,s)), keys, 12*sizeof(GDebugKey)); + strcpy((g->GET_WSD_VAR_NAME(NO_ALIAS,gabble_vcard_mgr,s)), NO_ALIAS); + + memset(&(g->GET_WSD_VAR_NAME(assumed_caps,gabble_con,s)),0,3*150*sizeof(gchar)); + + strcpy((g->GET_WSD_VAR_NAME(assumed_caps,gabble_con,s))[0], assumed_caps[0]); + strcpy((g->GET_WSD_VAR_NAME(assumed_caps,gabble_con,s))[0], assumed_caps[1]); + + strcpy((g->GET_WSD_VAR_NAME(muc_roles,gabble_muc,s))[0], muc_roles[0]); + strcpy((g->GET_WSD_VAR_NAME(muc_roles,gabble_muc,s))[1], muc_roles[1]); + strcpy((g->GET_WSD_VAR_NAME(muc_roles,gabble_muc,s))[2], muc_roles[2]); + strcpy((g->GET_WSD_VAR_NAME(muc_roles,gabble_muc,s))[3], muc_roles[3]); + + + strcpy((g->GET_WSD_VAR_NAME(muc_affiliations,gabble_muc,s))[0], muc_affiliations[0]); + strcpy((g->GET_WSD_VAR_NAME(muc_affiliations,gabble_muc,s))[1], muc_affiliations[1]); + strcpy((g->GET_WSD_VAR_NAME(muc_affiliations,gabble_muc,s))[2], muc_affiliations[2]); + strcpy((g->GET_WSD_VAR_NAME(muc_affiliations,gabble_muc,s))[3], muc_affiliations[3]); + + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[0], video_codec_params[0]); + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[1], video_codec_params[1]); + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[2], video_codec_params[2]); + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[3], video_codec_params[3]); + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[4], video_codec_params[4]); + strcpy((g->GET_WSD_VAR_NAME(video_codec_params,gabble_med_stream,s))[5], video_codec_params[5]); + + strcpy((g->GET_WSD_VAR_NAME(list_handle_strings,handles,s))[0], list_handle_strings[0]); + strcpy((g->GET_WSD_VAR_NAME(list_handle_strings,handles,s))[1], list_handle_strings[1]); + strcpy((g->GET_WSD_VAR_NAME(list_handle_strings,handles,s))[2], list_handle_strings[2]); + strcpy((g->GET_WSD_VAR_NAME(list_handle_strings,handles,s))[3], list_handle_strings[3]); + + memcpy (&(g->GET_WSD_VAR_NAME(handlers,gabble_med_sess,s)), handlers, 10*sizeof(Handler)); + + return 0; + } + return 1; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/media-factory.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/media-factory.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,666 @@ +/* + * media-factory.c - Source for GabbleMediaFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include +#include + +#include + +#include +#include + +#include "loudmouth/loudmouth.h" + + +#include "debug.h" +#include "gabble-connection.h" +#include "gabble-media-channel.h" +#include "handles.h" +#include "media-factory.h" +#include "namespaces.h" +#include "telepathy-interfaces.h" +#include "text-mixin.h" +#include "tp-channel-factory-iface.h" +#include "util.h" + +static void gabble_media_factory_iface_init (gpointer g_iface, gpointer iface_data); +static LmHandlerResult media_factory_jingle_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleMediaFactory, gabble_media_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE, gabble_media_factory_iface_init)); + +#endif + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(gabble_media_factory_parent_class,media_factory,gpointer) + #define gabble_media_factory_parent_class (*GET_WSD_VAR_NAME(gabble_media_factory_parent_class,media_factory,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,media_factory,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,media_factory,s)()) + +static void gabble_media_factory_init (GabbleMediaFactory *self); +static void gabble_media_factory_class_init (GabbleMediaFactoryClass *klass); +static void gabble_media_factory_class_intern_init (gpointer klass) +{ +gabble_media_factory_parent_class = g_type_class_peek_parent (klass); + gabble_media_factory_class_init ((GabbleMediaFactoryClass*) klass); +} + EXPORT_C GType gabble_media_factory_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleMediaFactoryClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_media_factory_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMediaFactory), 0, (GInstanceInitFunc) gabble_media_factory_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMediaFactory"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gabble_media_factory_iface_init }; g_type_add_interface_static (g_define_type_id, tp_channel_factory_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; +#endif + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +typedef struct _GabbleMediaFactoryPrivate GabbleMediaFactoryPrivate; +struct _GabbleMediaFactoryPrivate +{ + GabbleConnection *conn; + LmMessageHandler *jingle_cb; + + GPtrArray *channels; + guint channel_index; + + GHashTable *session_chans; + + gboolean dispose_has_run; +}; + +#define GABBLE_MEDIA_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_MEDIA_FACTORY, GabbleMediaFactoryPrivate)) + +static GObject *gabble_media_factory_constructor (GType type, guint n_props, GObjectConstructParam *props); + +static void +gabble_media_factory_init (GabbleMediaFactory *fac) +{ + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + priv->channels = g_ptr_array_sized_new (1); + priv->channel_index = 0; + + priv->jingle_cb = NULL; + + priv->conn = NULL; + priv->dispose_has_run = FALSE; + + priv->session_chans = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); +} + +static GObject * +gabble_media_factory_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + GabbleMediaFactoryPrivate *priv; + + obj = G_OBJECT_CLASS (gabble_media_factory_parent_class)-> + constructor (type, n_props, props); + priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (obj); + + return obj; +} + + +static void +gabble_media_factory_dispose (GObject *object) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (object); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + priv->dispose_has_run = TRUE; + + tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object)); + g_assert (priv->channels == NULL); + + if (priv->session_chans) + { + g_assert (g_hash_table_size (priv->session_chans) == 0); + g_hash_table_destroy (priv->session_chans); + priv->session_chans = NULL; + } + + if (G_OBJECT_CLASS (gabble_media_factory_parent_class)->dispose) + G_OBJECT_CLASS (gabble_media_factory_parent_class)->dispose (object); +} + +static void +gabble_media_factory_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (object); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_media_factory_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (object); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_media_factory_class_init (GabbleMediaFactoryClass *gabble_media_factory_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_media_factory_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_media_factory_class, sizeof (GabbleMediaFactoryPrivate)); + + object_class->constructor = gabble_media_factory_constructor; + object_class->dispose = gabble_media_factory_dispose; + + object_class->get_property = gabble_media_factory_get_property; + object_class->set_property = gabble_media_factory_set_property; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "media channel factory object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + +} + +static gboolean _gabble_media_factory_sid_in_use (GabbleMediaFactory *fac, const gchar *sid); +static GabbleMediaChannel *new_media_channel (GabbleMediaFactory *fac, GabbleHandle handle); +static void media_channel_closed_cb (GabbleMediaChannel *chan, gpointer user_data); + +/** + * media_factory_jingle_cb + * + * Called by loudmouth when we get an incoming . This handler + * is concerned only with jingle session queries, and allows other + * handlers to be called for other queries. + */ +static LmHandlerResult +media_factory_jingle_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (user_data); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + LmMessageNode *iq_node, *session_node; + const gchar *from, *id, *action, *sid; + gchar *resource; + GabbleHandle handle; + GabbleMediaChannel *chan = NULL; + gboolean chan_is_new = FALSE; + GError *error = NULL; + + g_assert (lmconn == priv->conn->lmconn); + + /* all jingle actions are sets */ + if (LM_MESSAGE_SUB_TYPE_SET != lm_message_get_sub_type (message)) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + /* is it for us? */ + iq_node = lm_message_get_node (message); + session_node = lm_message_node_get_child_with_namespace (message->node, + "jingle", NS_JINGLE); + + if (session_node != NULL) + { + action = lm_message_node_get_attribute (session_node, "action"); + } + else + { + session_node = lm_message_node_get_child_with_namespace (iq_node, + "session", NS_GOOGLE_SESSION); + + if (session_node == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + action = lm_message_node_get_attribute (session_node, "type"); + } + + if (action == NULL) + { + NODE_DEBUG (iq_node, "session action not found"); + goto BAD_REQUEST; + } + + from = lm_message_node_get_attribute (iq_node, "from"); + if (from == NULL) + { + NODE_DEBUG (iq_node, "'from' attribute not found"); + goto BAD_REQUEST; + } + + handle = gabble_handle_for_contact (priv->conn->handles, from, FALSE); + if (handle == 0) + { + NODE_DEBUG (iq_node, "unable to get handle for sender"); + goto BAD_REQUEST; + } + + id = lm_message_node_get_attribute (iq_node, "id"); + if (id == NULL) + { + NODE_DEBUG (iq_node, "'id' attribute not found"); + goto BAD_REQUEST; + } + + /* does the session exist? */ + sid = lm_message_node_get_attribute (session_node, "sid"); + if (sid == NULL) + sid = lm_message_node_get_attribute (session_node, "id"); + + if (sid == NULL) + { + NODE_DEBUG (iq_node, "unable to get session id"); + goto BAD_REQUEST; + } + + if (_gabble_media_factory_sid_in_use (fac, sid)) + { + /* if it's media session, we should have it in here */ + chan = g_hash_table_lookup (priv->session_chans, sid); + } + + /* it's a new session */ + if (chan == NULL) + { + /* if the session is unknown, the only allowed action is "initiate" */ + if (g_strdiff (action, "initiate") && + g_strdiff (action, "session-initiate")) + { + NODE_DEBUG (iq_node, + "action is not \"initiate\" or \"session-initiate\", rejecting"); + goto BAD_REQUEST; + } + + gabble_debug (DEBUG_FLAG, "creating media channel"); + + chan = new_media_channel (fac, handle); + chan_is_new = TRUE; + } + + g_assert (chan != NULL); + + gabble_debug (DEBUG_FLAG, "dispatching to session %s", sid); + g_object_ref (chan); + gabble_decode_jid (from, NULL, NULL, &resource); + + if (_gabble_media_channel_dispatch_session_action (chan, handle, resource, + sid, message, session_node, action, &error)) + { + if (chan_is_new) + g_signal_emit_by_name (fac, "new-channel", chan); + } + else + { + if (chan_is_new) + gabble_media_channel_close (chan, NULL); + + g_assert (error != NULL); + _gabble_connection_send_iq_error (priv->conn, message, error->code, + error->message); + } + + g_object_unref (chan); + g_free (resource); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + +BAD_REQUEST: + _gabble_connection_send_iq_error ( + priv->conn, message, XMPP_ERROR_BAD_REQUEST, NULL); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static const gchar * +_gabble_media_factory_get_unique_sid (GabbleMediaFactory *fac) +{ + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + guint32 val; + gchar *sid = NULL; + gboolean unique = FALSE; + + while (!unique) + { + val = g_random_int_range (1000000, G_MAXINT); + + g_free (sid); + sid = g_strdup_printf ("%u", val); + + unique = !_gabble_media_factory_sid_in_use (fac, sid); + } + + g_hash_table_insert (priv->session_chans, sid, NULL); + + return sid; +} + +static gboolean +_gabble_media_factory_sid_in_use (GabbleMediaFactory *fac, const gchar *sid) +{ + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + gpointer key, value; + + return g_hash_table_lookup_extended (priv->session_chans, sid, &key, &value); +} + +const gchar * +_gabble_media_factory_allocate_sid (GabbleMediaFactory *fac, GabbleMediaChannel *chan) +{ + const gchar *sid = _gabble_media_factory_get_unique_sid (fac); + + g_return_val_if_fail (sid, NULL); + + return _gabble_media_factory_register_sid (fac, sid, chan); +} + +const gchar * +_gabble_media_factory_register_sid (GabbleMediaFactory *fac, + const gchar *sid, + GabbleMediaChannel *chan) +{ + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + gchar *sid_copy = g_strdup (sid); + + g_hash_table_replace (priv->session_chans, sid_copy, chan); + + return sid_copy; +} + +void +_gabble_media_factory_free_sid (GabbleMediaFactory *fac, const gchar *sid) +{ + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + if (g_hash_table_lookup (priv->session_chans, sid)) + { + g_hash_table_remove (priv->session_chans, sid); + } +} + +static gboolean +_remove_sid_mapping (gpointer key, gpointer value, gpointer user_data) +{ + GabbleMediaChannel *chan = GABBLE_MEDIA_CHANNEL (value); + GabbleMediaChannel *target_chan = GABBLE_MEDIA_CHANNEL (user_data); + + if (chan == target_chan) return TRUE; + return FALSE; +} + +/** + * media_channel_closed_cb: + * + * Signal callback for when a media channel is closed. Removes the references + * that #GabbleMediaFactory holds to them. Also removes all the sessions for + * the closed channel. + */ +static void +media_channel_closed_cb (GabbleMediaChannel *chan, gpointer user_data) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (user_data); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + if (priv->channels) + { + gabble_debug (DEBUG_FLAG, "removing media channel %p with ref count %d", + chan, G_OBJECT (chan)->ref_count); + + g_ptr_array_remove (priv->channels, chan); + g_object_unref (chan); + } + + if (priv->session_chans) + { + g_hash_table_foreach_remove (priv->session_chans, _remove_sid_mapping, chan); + } +} + +/** + * new_media_channel + * + * Creates a new empty GabbleMediaChannel. + */ +static GabbleMediaChannel * +new_media_channel (GabbleMediaFactory *fac, GabbleHandle creator) +{ + GabbleMediaFactoryPrivate *priv; + GabbleMediaChannel *chan; + gchar *object_path; + + g_assert (GABBLE_IS_MEDIA_FACTORY (fac)); + + priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + object_path = g_strdup_printf ("%s/MediaChannel%u", priv->conn->object_path, + priv->channel_index); + priv->channel_index += 1; + + chan = g_object_new (GABBLE_TYPE_MEDIA_CHANNEL, + "connection", priv->conn, + "factory", fac, + "object-path", object_path, + "creator", creator, + NULL); + + gabble_debug (DEBUG_FLAG, "object path %s", object_path); + + g_signal_connect (chan, "closed", (GCallback) media_channel_closed_cb, fac); + + g_ptr_array_add (priv->channels, chan); + + g_free (object_path); + + return chan; +} + + +static void +gabble_media_factory_iface_close_all (TpChannelFactoryIface *iface) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (iface); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + guint i; + + gabble_debug (DEBUG_FLAG, "closing channels"); + + if (priv->channels) + { + GPtrArray *tmp = priv->channels; + priv->channels = NULL; + + + for (i = 0; i < tmp->len; i++) + { + GabbleMediaChannel *chan = g_ptr_array_index (tmp, i); + + gabble_debug (DEBUG_FLAG, "about to unref channel with ref_count %d", + G_OBJECT (chan)->ref_count); + + g_object_unref (chan); + } + + g_ptr_array_free (tmp, TRUE); + } + + if (priv->session_chans) + { + g_hash_table_destroy (priv->session_chans); + priv->session_chans = NULL; + } +} + +static void +gabble_media_factory_iface_connecting (TpChannelFactoryIface *iface) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (iface); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + g_assert(priv->conn != NULL); + g_assert(priv->conn->lmconn != NULL); + + gabble_debug (DEBUG_FLAG, "adding callbacks"); + + priv->jingle_cb = lm_message_handler_new (media_factory_jingle_cb, fac, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, priv->jingle_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); +} + +static void +gabble_media_factory_iface_connected (TpChannelFactoryIface *iface) +{ + /* nothing to do */ +} + +static void +gabble_media_factory_iface_disconnected (TpChannelFactoryIface *iface) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (iface); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + + g_assert (priv->jingle_cb != NULL); + + gabble_debug (DEBUG_FLAG, "removing callbacks"); + + lm_connection_unregister_message_handler (priv->conn->lmconn, priv->jingle_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->jingle_cb); + priv->jingle_cb = NULL; +} + +static void +gabble_media_factory_iface_foreach (TpChannelFactoryIface *iface, TpChannelFunc foreach, gpointer user_data) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (iface); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + guint i; + + for (i = 0; i < priv->channels->len; i++) + { + foreach (TP_CHANNEL_IFACE (g_ptr_array_index (priv->channels, i)), user_data); + } +} + +static TpChannelFactoryRequestStatus +gabble_media_factory_iface_request (TpChannelFactoryIface *iface, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (iface); + GabbleMediaFactoryPrivate *priv = GABBLE_MEDIA_FACTORY_GET_PRIVATE (fac); + GabbleMediaChannel *chan = NULL; + + if (strcmp (chan_type, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + + if (handle_type == 0) + { + /* create an empty channel */ + chan = new_media_channel (fac, priv->conn->self_handle); + } + else if (handle_type == TP_HANDLE_TYPE_CONTACT) + { + chan = new_media_channel (fac, priv->conn->self_handle); + + if (!_gabble_media_channel_add_member (G_OBJECT (chan), handle, "", error)) + { + gboolean close_ret; + + close_ret = gabble_media_channel_close (chan, NULL); + g_assert (close_ret); + + return TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR; + } + } + else + { + return TP_CHANNEL_FACTORY_REQUEST_STATUS_INVALID_HANDLE; + } + + g_assert (chan != NULL); + g_signal_emit_by_name (fac, "new-channel", chan); + + *ret = TP_CHANNEL_IFACE (chan); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; +} + +static void +gabble_media_factory_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface; + + klass->close_all = gabble_media_factory_iface_close_all; + klass->connected = gabble_media_factory_iface_connected; + klass->connecting = gabble_media_factory_iface_connecting; + klass->disconnected = gabble_media_factory_iface_disconnected; + klass->foreach = gabble_media_factory_iface_foreach; + klass->request = gabble_media_factory_iface_request; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/muc-factory.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/muc-factory.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,879 @@ +/* + * muc-factory.c - Source for GabbleMucFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include +#include + +#include + +#include +#include + +#include "loudmouth/loudmouth.h" + +#include "debug.h" +#include "disco.h" +#include "gabble-connection.h" +#include "gabble-presence-cache.h" +#include "gabble-muc-channel.h" +#include "gabble-roomlist-channel.h" +#include "handles.h" +#include "muc-factory.h" +#include "namespaces.h" +#include "telepathy-interfaces.h" +#include "text-mixin.h" +#include "tp-channel-factory-iface.h" +#include "util.h" + +static void gabble_muc_factory_iface_init (gpointer g_iface, gpointer iface_data); + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleMucFactory, gabble_muc_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE, gabble_muc_factory_iface_init)); +#endif + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(gabble_muc_factory_parent_class,muc_factory,gpointer) + #define gabble_muc_factory_parent_class (*GET_WSD_VAR_NAME(gabble_muc_factory_parent_class,muc_factory,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,muc_factory,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,muc_factory,s)()) + +static void gabble_muc_factory_init (GabbleMucFactory *self); +static void gabble_muc_factory_class_init (GabbleMucFactoryClass *klass); +static void gabble_muc_factory_class_intern_init (gpointer klass) +{ + gabble_muc_factory_parent_class = g_type_class_peek_parent (klass); + gabble_muc_factory_class_init ((GabbleMucFactoryClass*) klass); + } + EXPORT_C GType gabble_muc_factory_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleMucFactoryClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_muc_factory_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleMucFactory), 0, (GInstanceInitFunc) gabble_muc_factory_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleMucFactory"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gabble_muc_factory_iface_init }; g_type_add_interface_static (g_define_type_id, tp_channel_factory_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + +#endif +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_MUC + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +typedef struct _GabbleMucFactoryPrivate GabbleMucFactoryPrivate; +struct _GabbleMucFactoryPrivate +{ + GabbleConnection *conn; + + LmMessageHandler *message_cb; + LmMessageHandler *presence_cb; + + GHashTable *channels; + GabbleRoomlistChannel *roomlist_channel; + + GHashTable *disco_requests; + + gboolean dispose_has_run; +}; + +#define GABBLE_MUC_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_MUC_FACTORY, GabbleMucFactoryPrivate)) + +static GObject *gabble_muc_factory_constructor (GType type, guint n_props, GObjectConstructParam *props); + +static void +gabble_muc_factory_init (GabbleMucFactory *fac) +{ + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + priv->channels = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, g_object_unref); + + priv->disco_requests = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, NULL); + + priv->message_cb = NULL; + priv->presence_cb = NULL; + + priv->conn = NULL; + priv->dispose_has_run = FALSE; +} + +static GObject * +gabble_muc_factory_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + /* GabbleMucFactoryPrivate *priv; */ + + obj = G_OBJECT_CLASS (gabble_muc_factory_parent_class)-> + constructor (type, n_props, props); + /* priv = GABBLE_MUC_FACTORY_GET_PRIVATE (obj); */ + + return obj; +} + +static void +cancel_disco_request (gpointer key, gpointer value, gpointer user_data) +{ + GabbleDisco *disco = GABBLE_DISCO (user_data); + GabbleDiscoRequest *request = (GabbleDiscoRequest *) key; + + gabble_disco_cancel_request (disco, request); +} + +static void +gabble_muc_factory_dispose (GObject *object) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (object); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + priv->dispose_has_run = TRUE; + + tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object)); + + g_hash_table_foreach (priv->disco_requests, cancel_disco_request, priv->conn->disco); + g_hash_table_destroy (priv->disco_requests); + + if (G_OBJECT_CLASS (gabble_muc_factory_parent_class)->dispose) + G_OBJECT_CLASS (gabble_muc_factory_parent_class)->dispose (object); +} + +static void +gabble_muc_factory_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (object); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_muc_factory_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (object); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_muc_factory_class_init (GabbleMucFactoryClass *gabble_muc_factory_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_muc_factory_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_muc_factory_class, sizeof (GabbleMucFactoryPrivate)); + + object_class->constructor = gabble_muc_factory_constructor; + object_class->dispose = gabble_muc_factory_dispose; + + object_class->get_property = gabble_muc_factory_get_property; + object_class->set_property = gabble_muc_factory_set_property; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "MUC factory object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); +} + + +static GabbleMucChannel * +get_muc_from_jid (GabbleMucFactory *fac, const gchar *jid) +{ + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + GabbleHandle handle; + GabbleMucChannel *chan = NULL; + + if (gabble_handle_for_room_exists (priv->conn->handles, jid, TRUE)) + { + handle = gabble_handle_for_room (priv->conn->handles, jid); + + chan = g_hash_table_lookup (priv->channels, GUINT_TO_POINTER (handle)); + } + + return chan; +} + + +/** + * muc_channel_closed_cb: + * + * Signal callback for when a MUC channel is closed. Removes the references + * that MucFactory holds to them. + */ +static void +muc_channel_closed_cb (GabbleMucChannel *chan, gpointer user_data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (user_data); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + GabbleHandle room_handle; + + if (priv->channels != NULL) + { + g_object_get (chan, "handle", &room_handle, NULL); + + gabble_debug (DEBUG_FLAG, "removing MUC channel with handle %d", room_handle); + + g_hash_table_remove (priv->channels, GINT_TO_POINTER (room_handle)); + } +} + +static void +muc_ready_cb (GabbleMucChannel *chan, + gpointer data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (data); + + gabble_debug (DEBUG_FLAG, "chan=%p", chan); + + g_signal_emit_by_name (fac, "new-channel", chan); +} + +static void +muc_join_error_cb (GabbleMucChannel *chan, + GError *error, + gpointer data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (data); + + gabble_debug (DEBUG_FLAG, "error->code=%u, error->message=\"%s\"", error->code, error->message); + + g_signal_emit_by_name (fac, "channel-error", chan, error); +} + +/** + * new_muc_channel + */ +static GabbleMucChannel * +new_muc_channel (GabbleMucFactory *fac, GabbleHandle handle, gboolean invite_self) +{ + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + GabbleMucChannel *chan; + char *object_path; + + g_assert (g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)) == NULL); + + object_path = g_strdup_printf ("%s/MucChannel%u", priv->conn->object_path, handle); + + gabble_debug (DEBUG_FLAG, "creating new chan, object path %s", object_path); + + chan = g_object_new (GABBLE_TYPE_MUC_CHANNEL, + "connection", priv->conn, + "object-path", object_path, + "handle", handle, + "invite-self", invite_self, + NULL); + + g_signal_connect (chan, "closed", (GCallback) muc_channel_closed_cb, fac); + + g_hash_table_insert (priv->channels, GINT_TO_POINTER (handle), chan); + + g_free (object_path); + + g_signal_connect (chan, "ready", G_CALLBACK (muc_ready_cb), fac); + g_signal_connect (chan, "join-error", G_CALLBACK (muc_join_error_cb), + fac); + + return chan; +} + + +struct DiscoInviteData { + GabbleMucFactory *factory; + gchar *reason; + GabbleHandle inviter; +}; + +/** + * obsolete_invite_disco_cb: + * + * Callback for disco request we fired upon encountering obsolete disco. + * If the object is in fact MUC room, create a channel for it. + */ +static void +obsolete_invite_disco_cb (GabbleDisco *self, + GabbleDiscoRequest *request, + const gchar *jid, + const gchar *node, + LmMessageNode *query_result, + GError* error, + gpointer user_data) +{ + struct DiscoInviteData *data = (struct DiscoInviteData *) user_data; + + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (data->factory); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + LmMessageNode *identity; + const char *category, *type; + GabbleHandle handle; + + g_hash_table_remove (priv->disco_requests, request); + + identity = lm_message_node_get_child (query_result, "identity"); + if (NULL == identity) + return; + + category = lm_message_node_get_attribute (identity, "category"); + if (NULL == category) + return; + + type = lm_message_node_get_attribute (identity, "type"); + if (NULL == type) + return; + + if (0 != strcmp (category, "conference") || + 0 != strcmp (type, "text")) + { + gabble_debug (DEBUG_FLAG, "obsolete invite request specified invalid jid '%s', ignoring", jid); + } + + /* OK, it's MUC after all, create a new channel */ + handle = gabble_handle_for_room (priv->conn->handles, jid); + + if (g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)) == NULL) + { + GabbleMucChannel *chan; + chan = new_muc_channel (fac, handle, FALSE); + _gabble_muc_channel_handle_invited (chan, data->inviter, data->reason); + } + else + { + gabble_debug (DEBUG_FLAG, "ignoring invite to a room '%s' we're already in", jid); + } + + g_free (data->reason); + g_free (data); +} + + +/** + * muc_factory_message_cb: + * + * Called by loudmouth when we get an incoming . + * We filter only groupchat and MUC messages, ignoring the rest. + */ +static LmHandlerResult +muc_factory_message_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *message, + gpointer user_data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (user_data); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + const gchar *from, *body, *body_offset; + time_t stamp; + TpChannelTextMessageType msgtype; + LmMessageNode *node; + TpHandleType handle_type; + GabbleHandle room_handle, handle; + GabbleMucChannel *chan; + GabbleTextMixinSendError send_error; + + if (!gabble_text_mixin_parse_incoming_message (message, &from, &stamp, + &msgtype, &body, &body_offset, &send_error)) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + /* does it have a muc subnode? */ + node = lm_message_node_get_child_with_namespace (message->node, "x", + NS_MUC_USER); + if (node != NULL) + { + /* and an invitation? */ + node = lm_message_node_get_child (node, "invite"); + if (node != NULL) + { + LmMessageNode *reason_node; + const gchar *invite_from, *reason; + GabbleHandle inviter_handle; + + if (send_error != CHANNEL_TEXT_SEND_NO_ERROR) + { + NODE_DEBUG (message->node, "got a MUC invitation message " + "with a send error; ignoring"); + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + invite_from = lm_message_node_get_attribute (node, "from"); + if (invite_from == NULL) + { + NODE_DEBUG (message->node, "got a MUC invitation message " + "without a from field on the invite node, " + "ignoring"); + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + inviter_handle = gabble_handle_for_contact (priv->conn->handles, + invite_from, FALSE); + + reason_node = lm_message_node_get_child (node, "reason"); + if (reason_node != NULL) + { + reason = lm_message_node_get_value (reason_node); + } + else + { + reason = ""; + NODE_DEBUG (message->node, "no MUC invite reason specified"); + } + + /* create the channel */ + handle = gabble_handle_for_room (priv->conn->handles, from); + + if (g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)) == NULL) + { + chan = new_muc_channel (fac, handle, FALSE); + _gabble_muc_channel_handle_invited (chan, inviter_handle, reason); + } + else + { + NODE_DEBUG (message->node, "ignoring invite to a room we're already in"); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + } + else + { + GabbleHandle inviter_handle; + GabbleDiscoRequest *request; + const gchar *reason; + struct DiscoInviteData *disco_udata; + + /* check for obsolete invite method */ + for (node = message->node->children; node != NULL; node = node->next) + if (strcmp (node->name, "x") == 0) + if (lm_message_node_has_namespace (node, NS_X_CONFERENCE, NULL)) + break; + + if (node == NULL) + goto HANDLE_MESSAGE; + + /* the room JID is in x */ + from = lm_message_node_get_attribute (node, "jid"); + if (from == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + /* the inviter JID is in "from" */ + inviter_handle = gabble_handle_for_contact (priv->conn->handles, + from, FALSE); + + /* reason is the body */ + reason = body; + + disco_udata = g_new0 (struct DiscoInviteData, 1); + disco_udata->factory = fac; + disco_udata->reason = g_strdup (reason); + disco_udata->inviter = inviter_handle; + + NODE_DEBUG (message->node, "received obsolete invite method"); + + request = gabble_disco_request (priv->conn->disco, GABBLE_DISCO_TYPE_INFO, + from, NULL, obsolete_invite_disco_cb, disco_udata, G_OBJECT (fac), NULL); + + if (request != NULL) + g_hash_table_insert (priv->disco_requests, request, NULL); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + +HANDLE_MESSAGE: + + /* check if a room with the jid exists */ + if (!gabble_handle_for_room_exists (priv->conn->handles, from, TRUE)) + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + room_handle = gabble_handle_for_room (priv->conn->handles, from); + + /* find the MUC channel */ + chan = g_hash_table_lookup (priv->channels, GUINT_TO_POINTER (room_handle)); + + if (chan == NULL) + { + g_warning ("%s: ignoring groupchat message from known handle with " + "no MUC channel", G_STRFUNC); + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + /* get the handle of the sender, which is either the room + * itself or one of its members */ + if (gabble_handle_for_room_exists (priv->conn->handles, from, FALSE)) + { + handle_type = TP_HANDLE_TYPE_ROOM; + handle = room_handle; + } + else + { + handle_type = TP_HANDLE_TYPE_CONTACT; + handle = gabble_handle_for_contact (priv->conn->handles, from, TRUE); + } + + if (send_error != CHANNEL_TEXT_SEND_NO_ERROR) + { + _gabble_text_mixin_send_error_signal (G_OBJECT (chan), send_error, stamp, + msgtype, body_offset); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + if (_gabble_muc_channel_receive (chan, msgtype, handle_type, handle, stamp, + body_offset, message)) + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + + +/** + * connection_presence_muc_cb: + * @handler: #LmMessageHandler for this message + * @connection: #LmConnection that originated the message + * @message: the presence message + * @user_data: callback data + * + * Called by loudmouth when we get an incoming . + */ +static LmHandlerResult +muc_factory_presence_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *msg, + gpointer user_data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (user_data); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + const char *from; + LmMessageSubType sub_type; + GabbleMucChannel *muc_chan; + LmMessageNode *x_node; + + g_assert (lmconn == priv->conn->lmconn); + + from = lm_message_node_get_attribute (msg->node, "from"); + + if (from == NULL) + { + NODE_DEBUG (msg->node, "presence stanza without from attribute, ignoring"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + sub_type = lm_message_get_sub_type (msg); + + muc_chan = get_muc_from_jid (fac, from); + + /* is it an error and for a MUC? */ + if (sub_type == LM_MESSAGE_SUB_TYPE_ERROR + && muc_chan != NULL) + { + _gabble_muc_channel_presence_error (muc_chan, from, msg->node); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + x_node = lm_message_node_get_child_with_namespace (msg->node, "x", NS_MUC_USER); + + /* is it a MUC member presence? */ + if (x_node != NULL) + { + if (muc_chan != NULL) + { + GabbleHandle handle; + + handle = gabble_handle_for_contact (priv->conn->handles, from, TRUE); + if (handle == 0) + { + NODE_DEBUG (msg->node, "discarding MUC presence from malformed jid"); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + _gabble_muc_channel_member_presence_updated (muc_chan, handle, + msg, x_node); + } + else + { + NODE_DEBUG (msg->node, "discarding unexpected MUC member presence"); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + } + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + +} + +static void +roomlist_channel_closed_cb (GabbleRoomlistChannel *chan, gpointer data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (data); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + if (priv->roomlist_channel != NULL) + { + g_object_unref (priv->roomlist_channel); + priv->roomlist_channel = NULL; + } +} + +static gboolean +make_roomlist_channel (GabbleMucFactory *fac) +{ + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + if (priv->roomlist_channel == NULL) + { + const gchar *server; + gchar *object_path; + + server = _gabble_connection_find_conference_server (priv->conn); + + if (server == NULL) + return FALSE; + + object_path = g_strdup_printf ("%s/RoomlistChannel", priv->conn->object_path); + + priv->roomlist_channel = _gabble_roomlist_channel_new (priv->conn, + object_path, server); + + g_signal_connect (priv->roomlist_channel, "closed", + (GCallback) roomlist_channel_closed_cb, fac); + + g_signal_emit_by_name (fac, "new-channel", priv->roomlist_channel); + + g_free (object_path); + } + + return TRUE; +} + + + +static void +gabble_muc_factory_iface_close_all (TpChannelFactoryIface *iface) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (iface); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "closing channels"); + + if (priv->channels != NULL) + { + GHashTable *tmp = priv->channels; + priv->channels = NULL; + g_hash_table_destroy (tmp); + } + + if (priv->roomlist_channel != NULL) + { + GObject *tmp = G_OBJECT (priv->roomlist_channel); + priv->roomlist_channel = NULL; + g_object_unref (tmp); + } +} + +static void +gabble_muc_factory_iface_connecting (TpChannelFactoryIface *iface) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (iface); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "adding callbacks"); + + g_assert (priv->message_cb == NULL); + g_assert (priv->presence_cb == NULL); + + priv->message_cb = lm_message_handler_new (muc_factory_message_cb, fac, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, priv->message_cb, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_NORMAL); + + priv->presence_cb = lm_message_handler_new (muc_factory_presence_cb, fac, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, priv->presence_cb, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_NORMAL); +} + + +static void +gabble_muc_factory_iface_connected (TpChannelFactoryIface *iface) +{ + /* nothing to do */ +} + +static void +gabble_muc_factory_iface_disconnected (TpChannelFactoryIface *iface) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (iface); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "removing callbacks"); + + g_assert (priv->message_cb != NULL); + g_assert (priv->presence_cb != NULL); + + lm_connection_unregister_message_handler (priv->conn->lmconn, priv->message_cb, + LM_MESSAGE_TYPE_MESSAGE); + lm_message_handler_unref (priv->message_cb); + priv->message_cb = NULL; + + lm_connection_unregister_message_handler (priv->conn->lmconn, priv->presence_cb, + LM_MESSAGE_TYPE_PRESENCE); + lm_message_handler_unref (priv->presence_cb); + priv->presence_cb = NULL; +} + +struct _ForeachData +{ + TpChannelFunc foreach; + gpointer user_data; +}; + +static void +_foreach_slave (gpointer key, gpointer value, gpointer user_data) +{ + struct _ForeachData *data = (struct _ForeachData *) user_data; + TpChannelIface *chan = TP_CHANNEL_IFACE (value); + + data->foreach (chan, data->user_data); +} + +static void +gabble_muc_factory_iface_foreach (TpChannelFactoryIface *iface, TpChannelFunc foreach, gpointer user_data) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (iface); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + struct _ForeachData data; + + data.user_data = user_data; + data.foreach = foreach; + + g_hash_table_foreach (priv->channels, _foreach_slave, &data); + + if (priv->roomlist_channel != NULL) + foreach (TP_CHANNEL_IFACE (priv->roomlist_channel), user_data); +} + +static TpChannelFactoryRequestStatus +gabble_muc_factory_iface_request (TpChannelFactoryIface *iface, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + GabbleMucFactory *fac = GABBLE_MUC_FACTORY (iface); + GabbleMucFactoryPrivate *priv = GABBLE_MUC_FACTORY_GET_PRIVATE (fac); + GabbleMucChannel *chan; + + if (!g_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_ROOM_LIST)) + { + /* FIXME - delay if services aren't discovered yet? */ + if (!make_roomlist_channel (fac)) + { + gabble_debug (DEBUG_FLAG, "no conference server available for roomlist request"); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + } + *ret = TP_CHANNEL_IFACE (priv->roomlist_channel); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; + } + + if (strcmp (chan_type, TP_IFACE_CHANNEL_TYPE_TEXT)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + + if (handle_type != TP_HANDLE_TYPE_ROOM) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + + if (!gabble_handle_is_valid (priv->conn->handles, TP_HANDLE_TYPE_ROOM, handle, NULL)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_INVALID_HANDLE; + + chan = g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)); + if (!chan) + { + chan = new_muc_channel (fac, handle, TRUE); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_QUEUED; + } + + if (_gabble_muc_channel_is_ready (chan)) + { + *ret = TP_CHANNEL_IFACE (chan); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; + } + else + { + return TP_CHANNEL_FACTORY_REQUEST_STATUS_QUEUED; + } +} + +static void +gabble_muc_factory_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface; + + klass->close_all = gabble_muc_factory_iface_close_all; + klass->connecting = gabble_muc_factory_iface_connecting; + klass->connected = gabble_muc_factory_iface_connected; + klass->disconnected = gabble_muc_factory_iface_disconnected; + klass->foreach = gabble_muc_factory_iface_foreach; + klass->request = gabble_muc_factory_iface_request; +} + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/properties-mixin-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/properties-mixin-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,67 @@ +/* + * properties-mixin-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/properties-mixin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/properties-mixin.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,830 @@ +/* + * properties-mixin.c - Source for GabblePropertiesMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_PROPERTIES + +#include "ansi.h" +#include "debug.h" +#include "properties-mixin.h" +#include "properties-mixin-signals-marshal.h" +#include "telepathy-errors.h" + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(offset_quark1,gabble_mixin,GQuark) + #define offset_quark1 (*GET_WSD_VAR_NAME(offset_quark1,gabble_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(offset_quark,gabble_mixin,GQuark) + #define offset_quark (*GET_WSD_VAR_NAME(offset_quark,gabble_mixin, s)()) + + +#endif + +struct _GabblePropertiesContext { + GabblePropertiesMixinClass *mixin_cls; + GabblePropertiesMixin *mixin; + + DBusGMethodInvocation *dbus_ctx; + guint32 remaining; + GValue **values; +}; + +struct _GabblePropertiesMixinPrivate { + GObject *object; + GabblePropertiesContext context; +}; + +/** + * gabble_properties_mixin_class_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObjectClass + */ +GQuark +gabble_properties_mixin_class_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark1= 0; +#endif + if (!offset_quark1) + offset_quark1 = g_quark_from_static_string("PropertiesMixinClassOffsetQuark"); + return offset_quark1; +} + +/** + * gabble_properties_mixin_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObject + */ +GQuark +gabble_properties_mixin_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark = 0; +#endif + if (!offset_quark) + offset_quark = g_quark_from_static_string("PropertiesMixinOffsetQuark"); + return offset_quark; +} + +void gabble_properties_mixin_class_init (GObjectClass *obj_cls, + glong offset, + const GabblePropertySignature *signatures, + guint num_properties, + GabblePropertiesSetFunc set_func) +{ + GabblePropertiesMixinClass *mixin_cls; + + g_assert (G_IS_OBJECT_CLASS (obj_cls)); + + g_type_set_qdata (G_OBJECT_CLASS_TYPE (obj_cls), + GABBLE_PROPERTIES_MIXIN_CLASS_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS (obj_cls); + + mixin_cls->signatures = signatures; + mixin_cls->num_props = num_properties; + + mixin_cls->set_properties = set_func; + + mixin_cls->properties_changed_signal_id = + g_signal_new ("properties-changed", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_collection ("GPtrArray", (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_VALUE, G_TYPE_INVALID))))); + + mixin_cls->property_flags_changed_signal_id = + g_signal_new ("property-flags-changed", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, (dbus_g_type_get_collection ("GPtrArray", (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID))))); +} + +void gabble_properties_mixin_init (GObject *obj, glong offset) +{ + GabblePropertiesMixinClass *mixin_cls; + GabblePropertiesMixin *mixin; + GabblePropertiesContext *ctx; + + g_assert (G_IS_OBJECT (obj)); + + g_type_set_qdata (G_OBJECT_TYPE (obj), + GABBLE_PROPERTIES_MIXIN_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin = GABBLE_PROPERTIES_MIXIN (obj); + mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + + mixin->properties = g_new0 (GabbleProperty, mixin_cls->num_props); + + mixin->priv = g_new0 (GabblePropertiesMixinPrivate, 1); + mixin->priv->object = obj; + + ctx = &mixin->priv->context; + ctx->mixin_cls = mixin_cls; + ctx->mixin = mixin; + ctx->values = g_new0 (GValue *, mixin_cls->num_props); +} + +void gabble_properties_mixin_finalize (GObject *obj) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GabblePropertiesContext *ctx = &mixin->priv->context; + guint i; + + for (i = 0; i < mixin_cls->num_props; i++) + { + GabbleProperty *prop = &mixin->properties[i]; + + if (prop->value) + { + g_value_unset (prop->value); + g_free (prop->value); + } + + if (ctx->values[i]) + { + g_value_unset (ctx->values[i]); + } + } + + g_free (ctx->values); + + g_free (mixin->priv); + + g_free (mixin->properties); +} + +gboolean +gabble_properties_mixin_list_properties (GObject *obj, GPtrArray **ret, GError **error) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + guint i; + + *ret = g_ptr_array_sized_new (mixin_cls->num_props); + + for (i = 0; i < mixin_cls->num_props; i++) + { + const GabblePropertySignature *sig = &mixin_cls->signatures[i]; + GabbleProperty *prop = &mixin->properties[i]; + const gchar *dbus_sig; + GValue val = { 0, }; + + switch (sig->type) { + case G_TYPE_BOOLEAN: + dbus_sig = "b"; + break; + case G_TYPE_INT: + dbus_sig = "i"; + break; + case G_TYPE_UINT: + dbus_sig = "u"; + break; + case G_TYPE_STRING: + dbus_sig = "s"; + break; + default: + g_assert_not_reached (); + continue; + }; + + g_value_init (&val, TP_TYPE_PROPERTY_INFO_STRUCT); + g_value_take_boxed (&val, + dbus_g_type_specialized_construct (TP_TYPE_PROPERTY_INFO_STRUCT)); + + dbus_g_type_struct_set (&val, + 0, i, + 1, sig->name, + 2, dbus_sig, + 3, prop->flags, + G_MAXUINT); + + g_ptr_array_add (*ret, g_value_get_boxed (&val)); + } + + return TRUE; +} + +gboolean +gabble_properties_mixin_get_properties (GObject *obj, const GArray *properties, GPtrArray **ret, GError **error) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + guint i; + + /* Check input property identifiers */ + for (i = 0; i < properties->len; i++) + { + guint prop_id = g_array_index (properties, guint, i); + + /* Valid? */ + if (prop_id >= mixin_cls->num_props) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid property identifier %d", prop_id); + + return FALSE; + } + + /* Permitted? */ + if (!gabble_properties_mixin_is_readable (obj, prop_id)) + { + g_set_error (error, TELEPATHY_ERRORS, PermissionDenied, + "permission denied for property identifier %d", prop_id); + + return FALSE; + } + } + + /* If we got this far, return the actual values */ + *ret = g_ptr_array_sized_new (properties->len); + + for (i = 0; i < properties->len; i++) + { + guint prop_id = g_array_index (properties, guint, i); + GValue val_struct = { 0, }; + + /* id/value struct */ + g_value_init (&val_struct, TP_TYPE_PROPERTY_VALUE_STRUCT); + g_value_take_boxed (&val_struct, + dbus_g_type_specialized_construct (TP_TYPE_PROPERTY_VALUE_STRUCT)); + + dbus_g_type_struct_set (&val_struct, + 0, prop_id, + 1, mixin->properties[prop_id].value, + G_MAXUINT); + + g_ptr_array_add (*ret, g_value_get_boxed (&val_struct)); + } + + return TRUE; +} + +void +gabble_properties_mixin_set_properties (GObject *obj, + const GPtrArray *properties, + DBusGMethodInvocation *context) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GabblePropertiesContext *ctx = &mixin->priv->context; + GError *error = NULL; + guint i; + + /* Is another SetProperties request already in progress? */ + if (ctx->dbus_ctx) + { + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "A SetProperties request is already in progress"); + goto ERROR; + } + + ctx->dbus_ctx = context; + error = NULL; + + /* Check input property identifiers */ + for (i = 0; i < properties->len; i++) + { + GValue val_struct = { 0, }; + guint prop_id; + GValue *prop_val; + + g_value_init (&val_struct, TP_TYPE_PROPERTY_VALUE_STRUCT); + g_value_set_static_boxed (&val_struct, g_ptr_array_index (properties, i)); + + dbus_g_type_struct_get (&val_struct, + 0, &prop_id, + 1, &prop_val, + G_MAXUINT); + + /* Valid? */ + if (prop_id >= mixin_cls->num_props) + { + g_value_unset (prop_val); + + error = g_error_new (TELEPATHY_ERRORS, InvalidArgument, + "invalid property identifier %d", prop_id); + goto ERROR; + } + + /* Store the value in the context */ + ctx->remaining |= 1 << prop_id; + ctx->values[prop_id] = prop_val; + + /* Permitted? */ + if (!gabble_properties_mixin_is_writable (obj, prop_id)) + { + error = g_error_new (TELEPATHY_ERRORS, PermissionDenied, + "permission denied for property identifier %d", prop_id); + goto ERROR; + } + + /* Compatible type? */ + if (!g_value_type_compatible (G_VALUE_TYPE (prop_val), + mixin_cls->signatures[prop_id].type)) + { + error = g_error_new (TELEPATHY_ERRORS, NotAvailable, + "incompatible value type for property identifier %d", + prop_id); + goto ERROR; + } + } + + if (mixin_cls->set_properties) + { + if (mixin_cls->set_properties (obj, ctx, &error)) + return; + } + else + { + gabble_properties_context_return (ctx, NULL); + return; + } + +ERROR: + gabble_properties_context_return (ctx, error); +} + +gboolean +gabble_properties_mixin_has_property (GObject *obj, const gchar *name, + guint *property) +{ + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + guint i; + + for (i = 0; i < mixin_cls->num_props; i++) + { + if (strcmp (mixin_cls->signatures[i].name, name) == 0) + { + if (property) + *property = i; + + return TRUE; + } + } + + return FALSE; +} + +gboolean +gabble_properties_context_has (GabblePropertiesContext *ctx, guint property) +{ + g_assert (property < ctx->mixin_cls->num_props); + + return (ctx->values[property] != NULL); +} + +gboolean +gabble_properties_context_has_other_than (GabblePropertiesContext *ctx, guint property) +{ + g_assert (property < ctx->mixin_cls->num_props); + + return ((ctx->remaining & ~(1 << property)) != 0); +} + +const GValue * +gabble_properties_context_get (GabblePropertiesContext *ctx, guint property) +{ + g_assert (property < ctx->mixin_cls->num_props); + + return ctx->values[property]; +} + +guint +gabble_properties_context_get_value_count (GabblePropertiesContext *ctx) +{ + guint i, n; + + n = 0; + for (i = 0; i < ctx->mixin_cls->num_props; i++) + { + if (ctx->values[i]) + n++; + } + + return n; +} + +void +gabble_properties_context_remove (GabblePropertiesContext *ctx, guint property) +{ + g_assert (property < ctx->mixin_cls->num_props); + + ctx->remaining &= ~(1 << property); +} + +void +gabble_properties_context_return (GabblePropertiesContext *ctx, GError *error) +{ + GObject *obj = ctx->mixin->priv->object; + GArray *changed_props_val, *changed_props_flags; + guint i; + + gabble_debug (DEBUG_FLAG, "%s", (error) ? "failure" : "success"); + + changed_props_val = changed_props_flags = NULL; + + for (i = 0; i < ctx->mixin_cls->num_props; i++) + { + if (ctx->values[i]) + { + if (!error) + { + gabble_properties_mixin_change_value (obj, i, ctx->values[i], + &changed_props_val); + + gabble_properties_mixin_change_flags (obj, i, + TP_PROPERTY_FLAG_READ, 0, &changed_props_flags); + } + + g_value_unset (ctx->values[i]); + ctx->values[i] = NULL; + } + } + + if (!error) + { + gabble_properties_mixin_emit_changed (obj, &changed_props_val); + gabble_properties_mixin_emit_flags (obj, &changed_props_flags); + + dbus_g_method_return (ctx->dbus_ctx); + } + else + { + dbus_g_method_return_error (ctx->dbus_ctx, error); + g_error_free (error); + } + + ctx->dbus_ctx = NULL; + ctx->remaining = 0; +} + +gboolean +gabble_properties_context_return_if_done (GabblePropertiesContext *ctx) +{ + if (ctx->remaining == 0) + { + gabble_properties_context_return (ctx, NULL); + return TRUE; + } + + return FALSE; +} + +#define RPTS_APPEND_FLAG_IF_SET(flag) \ + if (flags & flag) \ + { \ + if (i++ > 0) \ + g_string_append (str, "|"); \ + g_string_append (str, #flag + 17); \ + } + +static gchar * +property_flags_to_string (TpPropertyFlags flags) +{ + gint i = 0; + GString *str; + + str = g_string_new ("[" ANSI_BOLD_OFF); + + RPTS_APPEND_FLAG_IF_SET (TP_PROPERTY_FLAG_READ); + RPTS_APPEND_FLAG_IF_SET (TP_PROPERTY_FLAG_WRITE); + + g_string_append (str, ANSI_BOLD_ON "]"); + + return g_string_free (str, FALSE); +} + +static gboolean +values_are_equal (const GValue *v1, const GValue *v2) +{ + GType type = G_VALUE_TYPE (v1); + const gchar *s1, *s2; + + switch (type) { + case G_TYPE_BOOLEAN: + return (g_value_get_boolean (v1) == g_value_get_boolean (v2)); + + case G_TYPE_STRING: + s1 = g_value_get_string (v1); + s2 = g_value_get_string (v2); + + /* are they both NULL? */ + if (s1 == s2) + return TRUE; + + /* is one of them NULL? */ + if (s1 == NULL || s2 == NULL) + return FALSE; + + return (strcmp (s1, s2) == 0); + + case G_TYPE_UINT: + return (g_value_get_uint (v1) == g_value_get_uint (v2)); + + case G_TYPE_INT: + return (g_value_get_int (v1) == g_value_get_int (v2)); + } + + return FALSE; +} + +void +gabble_properties_mixin_change_value (GObject *obj, guint prop_id, + const GValue *new_value, + GArray **props) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GabbleProperty *prop; + + g_assert (prop_id < mixin_cls->num_props); + + prop = &mixin->properties[prop_id]; + + if (prop->value) + { + if (values_are_equal (prop->value, new_value)) + return; + } + else + { + prop->value = g_new0 (GValue, 1); + g_value_init (prop->value, mixin_cls->signatures[prop_id].type); + } + + g_value_copy (new_value, prop->value); + + if (props) + { + guint i; + + if (*props == NULL) + { + *props = g_array_sized_new (FALSE, FALSE, sizeof (guint), + mixin_cls->num_props); + } + + for (i = 0; i < (*props)->len; i++) + { + if (g_array_index (*props, guint, i) == prop_id) + return; + } + + g_array_append_val (*props, prop_id); + } + else + { + GArray *changed_props = g_array_sized_new (FALSE, FALSE, + sizeof (guint), 1); + g_array_append_val (changed_props, prop_id); + + gabble_properties_mixin_emit_changed (obj, &changed_props); + } +} + +void +gabble_properties_mixin_change_flags (GObject *obj, guint prop_id, + TpPropertyFlags add, + TpPropertyFlags remove, + GArray **props) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GabbleProperty *prop; + guint prev_flags; + + g_assert (prop_id < mixin_cls->num_props); + + prop = &mixin->properties[prop_id]; + + prev_flags = prop->flags; + + prop->flags |= add; + prop->flags &= ~remove; + + if (prop->flags == prev_flags) + return; + + if (props) + { + guint i; + + if (*props == NULL) + { + *props = g_array_sized_new (FALSE, FALSE, sizeof (guint), + mixin_cls->num_props); + } + + for (i = 0; i < (*props)->len; i++) + { + if (g_array_index (*props, guint, i) == prop_id) + return; + } + + g_array_append_val (*props, prop_id); + } + else + { + GArray *changed_props = g_array_sized_new (FALSE, FALSE, + sizeof (guint), 1); + g_array_append_val (changed_props, prop_id); + + gabble_properties_mixin_emit_flags (obj, &changed_props); + } +} + +void +gabble_properties_mixin_emit_changed (GObject *obj, GArray **props) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GPtrArray *prop_arr; + GValue prop_list = { 0, }; + guint i; + + if (*props == NULL) + return; + + if ((*props)->len == 0) + return; + + prop_arr = g_ptr_array_sized_new ((*props)->len); + + if (DEBUGGING) + g_message (ANSI_BOLD_ON ANSI_FG_CYAN + "%s: emitting properties changed for propert%s:\n", + G_STRFUNC, ((*props)->len > 1) ? "ies" : "y"); + + for (i = 0; i < (*props)->len; i++) + { + GValue prop_val = { 0, }; + guint prop_id = g_array_index (*props, guint, i); + + g_value_init (&prop_val, TP_TYPE_PROPERTY_VALUE_STRUCT); + g_value_take_boxed (&prop_val, + dbus_g_type_specialized_construct (TP_TYPE_PROPERTY_VALUE_STRUCT)); + + dbus_g_type_struct_set (&prop_val, + 0, prop_id, + 1, mixin->properties[prop_id].value, + G_MAXUINT); + + g_ptr_array_add (prop_arr, g_value_get_boxed (&prop_val)); + + if (DEBUGGING) + g_message (" %s\n", mixin_cls->signatures[prop_id].name); + } + + if (DEBUGGING) + { + g_message (ANSI_RESET); + fflush (stdout); + } + + g_signal_emit (obj, mixin_cls->properties_changed_signal_id, 0, prop_arr); + + g_value_init (&prop_list, TP_TYPE_PROPERTY_VALUE_LIST); + g_value_take_boxed (&prop_list, prop_arr); + g_value_unset (&prop_list); + + g_array_free (*props, TRUE); + *props = NULL; +} + +void +gabble_properties_mixin_emit_flags (GObject *obj, GArray **props) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + GPtrArray *prop_arr; + GValue prop_list = { 0, }; + guint i; + + if (*props == NULL) + return; + + if ((*props)->len == 0) + return; + + prop_arr = g_ptr_array_sized_new ((*props)->len); + + if (DEBUGGING) + g_message (ANSI_BOLD_ON ANSI_FG_WHITE + "%s: emitting properties flags changed for propert%s:\n", + G_STRFUNC, ((*props)->len > 1) ? "ies" : "y"); + + for (i = 0; i < (*props)->len; i++) + { + GValue prop_val = { 0, }; + guint prop_id = g_array_index (*props, guint, i); + guint prop_flags; + + prop_flags = mixin->properties[prop_id].flags; + + g_value_init (&prop_val, TP_TYPE_PROPERTY_FLAGS_STRUCT); + g_value_take_boxed (&prop_val, + dbus_g_type_specialized_construct (TP_TYPE_PROPERTY_FLAGS_STRUCT)); + + dbus_g_type_struct_set (&prop_val, + 0, prop_id, + 1, prop_flags, + G_MAXUINT); + + g_ptr_array_add (prop_arr, g_value_get_boxed (&prop_val)); + + if (DEBUGGING) + { + gchar *str_flags = property_flags_to_string (prop_flags); + + g_message (" %s's flags now: %s\n", + mixin_cls->signatures[prop_id].name, str_flags); + + g_free (str_flags); + } + } + + if (DEBUGGING) + { + g_message (ANSI_RESET); + fflush (stdout); + } + + g_signal_emit (obj, mixin_cls->property_flags_changed_signal_id, 0, prop_arr); + + g_value_init (&prop_list, TP_TYPE_PROPERTY_FLAGS_LIST); + g_value_take_boxed (&prop_list, prop_arr); + g_value_unset (&prop_list); + + g_array_free (*props, TRUE); + *props = NULL; +} + +gboolean +gabble_properties_mixin_is_readable (GObject *obj, guint prop_id) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + + if (prop_id >= mixin_cls->num_props) + return FALSE; + + return ((mixin->properties[prop_id].flags & TP_PROPERTY_FLAG_READ) != 0); +} + +gboolean +gabble_properties_mixin_is_writable (GObject *obj, guint prop_id) +{ + GabblePropertiesMixin *mixin = GABBLE_PROPERTIES_MIXIN (obj); + GabblePropertiesMixinClass *mixin_cls = GABBLE_PROPERTIES_MIXIN_CLASS ( + G_OBJECT_GET_CLASS (obj)); + + if (prop_id >= mixin_cls->num_props) + return FALSE; + + return ((mixin->properties[prop_id].flags & TP_PROPERTY_FLAG_WRITE) != 0); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/roster.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/roster.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,1653 @@ +/* + * roster.c - Source for Gabble roster helper + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include + +#include "telepathy-interfaces.h" +#include "tp-channel-factory-iface.h" + +#include "debug.h" +#include "gabble-connection.h" +#include "gabble-roster-channel.h" +#include "namespaces.h" +#include "roster.h" +#include "util.h" + +#include "gabble_enums.h" + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_ROSTER +#define GOOGLE_ROSTER_VERSION "2" + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* Properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +/* signal enum */ +enum +{ + NICKNAME_UPDATE, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_ROSTER +#endif + +}; + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_roster,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_roster, s)()) + +#else + + static guint signals[LAST_SIGNAL] = {0}; + +#endif + + +typedef struct _GabbleRosterPrivate GabbleRosterPrivate; +struct _GabbleRosterPrivate +{ + GabbleConnection *conn; + + LmMessageHandler *iq_cb; + LmMessageHandler *presence_cb; + + GHashTable *channels; + GHashTable *items; + + gboolean roster_received; + gboolean dispose_has_run; +}; + +typedef enum +{ + GOOGLE_ITEM_TYPE_NORMAL = 0, + GOOGLE_ITEM_TYPE_BLOCKED, + GOOGLE_ITEM_TYPE_HIDDEN, + GOOGLE_ITEM_TYPE_PINNED +} GoogleItemType; + +typedef struct _GabbleRosterItem GabbleRosterItem; +struct _GabbleRosterItem +{ + GabbleRosterSubscription subscription; + gboolean ask_subscribe; + GoogleItemType google_type; + gchar *name; + gchar **groups; +}; + +static void gabble_roster_factory_iface_init (); +static void gabble_roster_init (GabbleRoster *roster); +static GObject * gabble_roster_constructor (GType type, guint n_props, GObjectConstructParam *props); +static void gabble_roster_dispose (GObject *object); +static void gabble_roster_finalize (GObject *object); +static void gabble_roster_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec); +static void gabble_roster_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec); + +static void _gabble_roster_item_free (GabbleRosterItem *item); + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleRoster, gabble_roster, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE, gabble_roster_factory_iface_init)); +#else + GET_STATIC_VAR_FROM_TLS(gabble_roster_parent_class,gabble_roster,gpointer) + #define gabble_roster_parent_class (*GET_WSD_VAR_NAME(gabble_roster_parent_class,gabble_roster,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_roster,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_roster,s)()) + + + static void gabble_roster_init (GabbleRoster *self); + static void gabble_roster_class_init (GabbleRosterClass *klass); + static void gabble_roster_class_intern_init (gpointer klass) { gabble_roster_parent_class = g_type_class_peek_parent (klass); gabble_roster_class_init ((GabbleRosterClass*) klass); } EXPORT_C GType gabble_roster_get_type (void) { if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleRosterClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_roster_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleRoster), 0, (GInstanceInitFunc) gabble_roster_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleRoster"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gabble_roster_factory_iface_init }; g_type_add_interface_static (g_define_type_id, tp_channel_factory_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + +#endif + +#define GABBLE_ROSTER_GET_PRIVATE(o) ((GabbleRosterPrivate*) ((o)->priv)); + +static void +gabble_roster_class_init (GabbleRosterClass *gabble_roster_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_roster_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_roster_class, sizeof (GabbleRosterPrivate)); + + object_class->constructor = gabble_roster_constructor; + + object_class->dispose = gabble_roster_dispose; + object_class->finalize = gabble_roster_finalize; + + object_class->get_property = gabble_roster_get_property; + object_class->set_property = gabble_roster_set_property; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "XMPP roster object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, + PROP_CONNECTION, + param_spec); + + signals[NICKNAME_UPDATE] = g_signal_new ( + "nickname-update", + G_TYPE_FROM_CLASS (gabble_roster_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); +} + +static void +gabble_roster_init (GabbleRoster *obj) +{ + GabbleRosterPrivate *priv = + G_TYPE_INSTANCE_GET_PRIVATE (obj, GABBLE_TYPE_ROSTER, GabbleRosterPrivate); + + obj->priv = priv; + + priv->channels = g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + g_object_unref); + + priv->items = g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + (GDestroyNotify) _gabble_roster_item_free); +} + +static GObject * +gabble_roster_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + /* GabbleRosterPrivate *priv; */ + + obj = G_OBJECT_CLASS (gabble_roster_parent_class)-> + constructor (type, n_props, props); + /* priv = GABBLE_ROSTER_GET_PRIVATE (GABBLE_ROSTER (obj)); */ + + return obj; +} + +void +gabble_roster_dispose (GObject *object) +{ + GabbleRoster *self = GABBLE_ROSTER (object); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (self); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + + priv->dispose_has_run = TRUE; + + g_assert (priv->iq_cb == NULL); + g_assert (priv->presence_cb == NULL); + + tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object)); + g_assert (priv->channels == NULL); + + if (G_OBJECT_CLASS (gabble_roster_parent_class)->dispose) + G_OBJECT_CLASS (gabble_roster_parent_class)->dispose (object); +} + +static void +item_handle_unref_foreach (gpointer key, gpointer data, gpointer user_data) +{ + GabbleHandle handle = (GabbleHandle) key; + GabbleRosterPrivate *priv = (GabbleRosterPrivate *) user_data; + + gabble_handle_unref (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, handle); +} + +void +gabble_roster_finalize (GObject *object) +{ + GabbleRoster *self = GABBLE_ROSTER (object); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (self); + + gabble_debug (DEBUG_FLAG, "called with %p", object); + + g_hash_table_foreach (priv->items, item_handle_unref_foreach, priv); + g_hash_table_destroy (priv->items); + + G_OBJECT_CLASS (gabble_roster_parent_class)->finalize (object); +} + +static void +gabble_roster_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleRoster *roster = GABBLE_ROSTER (object); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_roster_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleRoster *roster = GABBLE_ROSTER (object); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +_gabble_roster_item_free (GabbleRosterItem *item) +{ + g_assert (item != NULL); + + g_strfreev (item->groups); + g_free (item->name); + g_free (item); +} + +static const gchar * +_subscription_to_string (GabbleRosterSubscription subscription) +{ + switch (subscription) + { + case GABBLE_ROSTER_SUBSCRIPTION_NONE: + return "none"; + case GABBLE_ROSTER_SUBSCRIPTION_FROM: + return "from"; + case GABBLE_ROSTER_SUBSCRIPTION_TO: + return "to"; + case GABBLE_ROSTER_SUBSCRIPTION_BOTH: + return "both"; + case GABBLE_ROSTER_SUBSCRIPTION_REMOVE: + return "remove"; + default: + g_assert_not_reached (); + return NULL; + } +} + +static GabbleRosterSubscription +_parse_item_subscription (LmMessageNode *item_node) +{ + const gchar *subscription; + + g_assert (item_node != NULL); + + subscription = lm_message_node_get_attribute (item_node, "subscription"); + + if (NULL == subscription || 0 == strcmp (subscription, "none")) + return GABBLE_ROSTER_SUBSCRIPTION_NONE; + else if (0 == strcmp (subscription, "from")) + return GABBLE_ROSTER_SUBSCRIPTION_FROM; + else if (0 == strcmp (subscription, "to")) + return GABBLE_ROSTER_SUBSCRIPTION_TO; + else if (0 == strcmp (subscription, "both")) + return GABBLE_ROSTER_SUBSCRIPTION_BOTH; + else if (0 == strcmp (subscription, "remove")) + return GABBLE_ROSTER_SUBSCRIPTION_REMOVE; + else + { + NODE_DEBUG (item_node, "got unexpected subscription value"); + return GABBLE_ROSTER_SUBSCRIPTION_NONE; + } +} + +static gchar ** +_parse_item_groups (LmMessageNode *item_node) +{ + LmMessageNode *group_node; + GPtrArray *strv; + + strv = g_ptr_array_new (); + + for (group_node = item_node->children; + NULL != group_node; + group_node = group_node->next) + { + if (0 != strcmp (group_node->name, "group")) + continue; + + if (NULL == group_node->value) + continue; + + g_ptr_array_add (strv, g_strdup (group_node->value)); + } + + g_ptr_array_add (strv, NULL); + + return (gchar **) g_ptr_array_free (strv, FALSE); +} + +static const gchar * +_google_item_type_to_string (GoogleItemType google_type) +{ + switch (google_type) + { + case GOOGLE_ITEM_TYPE_NORMAL: + return NULL; + case GOOGLE_ITEM_TYPE_BLOCKED: + return "B"; + case GOOGLE_ITEM_TYPE_HIDDEN: + return "H"; + case GOOGLE_ITEM_TYPE_PINNED: + return "P"; + } + + g_assert_not_reached (); + + return NULL; +} + +static GoogleItemType +_parse_google_item_type (LmMessageNode *item_node) +{ + const gchar *google_type; + + g_assert (item_node != NULL); + + google_type = lm_message_node_get_attribute (item_node, "gr:t"); + + if (NULL == google_type) + return GOOGLE_ITEM_TYPE_NORMAL; + else if (!g_strdiff (google_type, "B")) + return GOOGLE_ITEM_TYPE_BLOCKED; + else if (!g_strdiff (google_type, "H")) + return GOOGLE_ITEM_TYPE_HIDDEN; + else if (!g_strdiff (google_type, "P")) + return GOOGLE_ITEM_TYPE_PINNED; + + NODE_DEBUG (item_node, "got unexpected google contact type value"); + + return GOOGLE_ITEM_TYPE_NORMAL; +} + +static gboolean +_google_roster_item_should_keep (LmMessageNode *item_node, + GabbleRosterItem *item) +{ + const gchar *attr; + + /* skip automatically subscribed Google roster items */ + attr = lm_message_node_get_attribute (item_node, "gr:autosub"); + + if (!g_strdiff (attr, "true")) + return FALSE; + + /* skip email addresses that replied to an invite */ + attr = lm_message_node_get_attribute (item_node, "gr:alias-for"); + + if (attr != NULL) + return FALSE; + + /* allow items that we've requested a subscription from */ + if (item->ask_subscribe) + return TRUE; + + if (item->subscription != GABBLE_ROSTER_SUBSCRIPTION_NONE) + return TRUE; + + /* discard anything else */ + return FALSE; +} + +static GabbleRosterItem * +_gabble_roster_item_get (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterItem *item; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (roster != NULL); + g_assert (GABBLE_IS_ROSTER (roster)); + g_assert (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL)); + + item = g_hash_table_lookup (priv->items, GINT_TO_POINTER (handle)); + + if (NULL == item) + { + item = g_new0 (GabbleRosterItem, 1); + gabble_handle_ref (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, handle); + g_hash_table_insert (priv->items, GINT_TO_POINTER (handle), item); + } + + return item; +} + +static void +_gabble_roster_item_remove (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (roster != NULL); + g_assert (GABBLE_IS_ROSTER (roster)); + g_assert (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL)); + + g_hash_table_remove (priv->items, GINT_TO_POINTER (handle)); + gabble_handle_unref (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, handle); +} + +static GabbleRosterItem * +_gabble_roster_item_update (GabbleRoster *roster, + GabbleHandle handle, + LmMessageNode *node, + gboolean google_roster_mode) +{ + GabbleRosterItem *item; + const gchar *ask, *name; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (roster != NULL); + g_assert (GABBLE_IS_ROSTER (roster)); + g_assert (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL)); + g_assert (node != NULL); + + item = _gabble_roster_item_get (roster, handle); + + item->subscription = _parse_item_subscription (node); + + ask = lm_message_node_get_attribute (node, "ask"); + if (NULL != ask && 0 == strcmp (ask, "subscribe")) + item->ask_subscribe = TRUE; + else + item->ask_subscribe = FALSE; + + if (google_roster_mode) + { + item->google_type = _parse_google_item_type (node); + + /* discard roster item if strange, just hide it if it's hidden */ + if (item->google_type == GOOGLE_ITEM_TYPE_HIDDEN) + { + gabble_debug (DEBUG_FLAG, "Google roster: caching hidden contact %d (%s)", handle, + lm_message_node_get_attribute (node, "jid")); + item->subscription = GABBLE_ROSTER_SUBSCRIPTION_NONE; + } + else if (!_google_roster_item_should_keep (node, item)) + { + gabble_debug (DEBUG_FLAG, "Google roster: discarding odd contact %d (%s)", handle, + lm_message_node_get_attribute (node, "jid")); + item->subscription = GABBLE_ROSTER_SUBSCRIPTION_REMOVE; + } + } + + if (item->subscription == GABBLE_ROSTER_SUBSCRIPTION_REMOVE) + name = NULL; + else + name = lm_message_node_get_attribute (node, "name"); + + if (g_strdiff (item->name, name)) + { + g_free (item->name); + item->name = g_strdup (name); + + gabble_debug (DEBUG_FLAG, "name for handle %d changed to %s", handle, name); + g_signal_emit (G_OBJECT (roster), signals[NICKNAME_UPDATE], 0, handle); + } + + g_strfreev (item->groups); + item->groups = _parse_item_groups (node); + + return item; +} + + +#ifdef ENABLE_DEBUG +static gchar * +_gabble_roster_item_dump (GabbleRosterItem *item) +{ + GString *str; + + g_assert (item != NULL); + + str = g_string_new ("subscription: "); + + g_string_append (str, _subscription_to_string (item->subscription)); + + if (item->ask_subscribe) + g_string_append (str, ", ask: subscribe"); + + if (item->google_type != GOOGLE_ITEM_TYPE_NORMAL) + g_string_append_printf (str, ", google_type: %s", + _google_item_type_to_string (item->google_type)); + + if (item->name) + g_string_append_printf (str, ", name: %s", item->name); + + if (item->groups) + { + gchar **tmp; + g_string_append (str, ", groups: { "); + for (tmp = item->groups; *tmp; tmp++) + { + g_string_append (str, *tmp); + g_string_append_c (str, ' '); + } + g_string_append (str, "}"); + } + + return g_string_free (str, FALSE); +} +#endif /* ENABLE_DEBUG */ + + +static LmMessage * +_gabble_roster_message_new (GabbleRoster *roster, + LmMessageSubType sub_type, + LmMessageNode **query_return) +{ + LmMessage *message; + LmMessageNode *query_node; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (roster != NULL); + g_assert (GABBLE_IS_ROSTER (roster)); + + message = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_IQ, + sub_type); + + query_node = lm_message_node_add_child (message->node, "query", NULL); + + if (NULL != query_return) + *query_return = query_node; + + lm_message_node_set_attribute (query_node, "xmlns", NS_ROSTER); + + if (priv->conn->features & GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER) + { + lm_message_node_set_attributes (query_node, + "xmlns:gr", NS_GOOGLE_ROSTER, + "gr:ext", GOOGLE_ROSTER_VERSION, + "gr:include", "all", + NULL); + } + + return message; +} + + +static LmMessage * +_gabble_roster_item_to_message (GabbleRoster *roster, + GabbleHandle handle, + LmMessageNode **item_return) +{ + const gchar *jid; + + LmMessage *message; + LmMessageNode *query_node, *item_node; + GabbleRosterItem *item; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (roster != NULL); + g_assert (GABBLE_IS_ROSTER (roster)); + g_assert (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL)); + + item = _gabble_roster_item_get (roster, handle); + + message = _gabble_roster_message_new (roster, LM_MESSAGE_SUB_TYPE_SET, + &query_node); + + item_node = lm_message_node_add_child (query_node, "item", NULL); + + if (NULL != item_return) + *item_return = item_node; + + jid = gabble_handle_inspect (priv->conn->handles, TP_HANDLE_TYPE_CONTACT, + handle); + lm_message_node_set_attribute (item_node, "jid", jid); + + if (item->subscription != GABBLE_ROSTER_SUBSCRIPTION_NONE) + { + const gchar *subscription = _subscription_to_string (item->subscription); + lm_message_node_set_attribute (item_node, "subscription", subscription); + } + + if (item->subscription == GABBLE_ROSTER_SUBSCRIPTION_REMOVE) + goto DONE; + + if ((priv->conn->features & GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER) && + item->google_type != GOOGLE_ITEM_TYPE_NORMAL) + lm_message_node_set_attribute (item_node, "gr:t", + _google_item_type_to_string (item->google_type)); + + if (item->ask_subscribe) + lm_message_node_set_attribute (item_node, "ask", "subscribe"); + + if (item->name) + lm_message_node_set_attribute (item_node, "name", item->name); + + if (item->groups) + { + gchar **tmp; + + for (tmp = item->groups; *tmp; tmp++) + { + lm_message_node_add_child (item_node, "group", *tmp); + } + } + +DONE: + return message; +} + +static GabbleRosterChannel * +_gabble_roster_create_channel (GabbleRoster *roster, + GabbleHandle handle) +{ + const char *name; + char *object_path; + + GabbleRosterChannel *chan; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (priv->channels != NULL); + g_assert (g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)) == NULL); + + name = gabble_handle_inspect (priv->conn->handles, TP_HANDLE_TYPE_LIST, handle); + object_path = g_strdup_printf ("%s/RosterChannel/%s", priv->conn->object_path, name); + chan = g_object_new (GABBLE_TYPE_ROSTER_CHANNEL, + "connection", priv->conn, + "object-path", object_path, + "handle", handle, + NULL); + + gabble_debug (DEBUG_FLAG, "created %s", object_path); + g_free (object_path); + + g_hash_table_insert (priv->channels, GINT_TO_POINTER (handle), chan); + + if (priv->roster_received) + { + gabble_debug (DEBUG_FLAG, "roster already received, emitting signal for %s list channel", + name); + + g_signal_emit_by_name (roster, "new-channel", chan); + } + else + { + gabble_debug (DEBUG_FLAG, "roster not yet received, not emitting signal for %s list channel", + name); + } + + return chan; +} + +static GabbleRosterChannel * +_gabble_roster_get_channel (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterChannel *chan; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (priv->channels != NULL); + g_assert (gabble_handle_is_valid (priv->conn->handles, TP_HANDLE_TYPE_LIST, handle, NULL)); + + chan = g_hash_table_lookup (priv->channels, GINT_TO_POINTER (handle)); + + if (chan == NULL) + chan = _gabble_roster_create_channel (roster, handle); + + return chan; +} + +static void +_gabble_roster_emit_one (gpointer key, + gpointer value, + gpointer data) +{ + GabbleRoster *roster = GABBLE_ROSTER (data); + GabbleRosterChannel *chan = GABBLE_ROSTER_CHANNEL (value); +#ifdef ENABLE_DEBUG + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + GabbleHandle handle = GPOINTER_TO_INT (key); + const gchar *name = gabble_handle_inspect (priv->conn->handles, TP_HANDLE_TYPE_LIST, handle); + + gabble_debug (DEBUG_FLAG, "roster now received, emitting signal signal for %s list channel", + name); +#endif + + g_signal_emit_by_name (roster, "new-channel", chan); +} + +static void +_gabble_roster_received (GabbleRoster *roster) +{ + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (priv->channels != NULL); + + if (!priv->roster_received) + { + priv->roster_received = TRUE; + + g_hash_table_foreach (priv->channels, _gabble_roster_emit_one, roster); + } +} + +/** + * gabble_roster_iq_cb + * + * Called by loudmouth when we get an incoming . This handler + * is concerned only with roster queries, and allows other handlers + * if queries other than rosters are received. + */ +static LmHandlerResult +gabble_roster_iq_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + const gchar *from; + gboolean google_roster = FALSE; + LmMessageNode *iq_node, *query_node; + LmMessageSubType sub_type; + + GabbleRoster *roster = GABBLE_ROSTER (user_data); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (lmconn == priv->conn->lmconn); + + if (priv->channels == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + iq_node = lm_message_get_node (message); + query_node = lm_message_node_get_child_with_namespace (iq_node, "query", + NS_ROSTER); + + if (query_node == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + from = lm_message_node_get_attribute (message->node, "from"); + + if (from != NULL) + { + GabbleHandle sender; + + sender = gabble_handle_for_contact (priv->conn->handles, + from, FALSE); + + if (sender != priv->conn->self_handle) + { + NODE_DEBUG (iq_node, "discarding roster IQ which is not from " + "ourselves or the server"); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + } + + if (priv->conn->features & GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER) + { + const char *gr_ext; + + gr_ext = lm_message_node_get_attribute (query_node, "gr:ext"); + + if (!g_strdiff (gr_ext, GOOGLE_ROSTER_VERSION)) + google_roster = TRUE; + } + + sub_type = lm_message_get_sub_type (message); + + /* if this is a result, it's from our initial query. if it's a set, + * it's a roster push. either way, parse the items. */ + switch (sub_type) + { + LmMessageNode *item_node; + GIntSet *pub_add, *pub_rem, + *sub_add, *sub_rem, *sub_rp, + *known_add, *known_rem, + *deny_add, *deny_rem; + GArray *removed; + GabbleHandle handle; + GabbleRosterChannel *chan; + guint i; + + case LM_MESSAGE_SUB_TYPE_RESULT: + case LM_MESSAGE_SUB_TYPE_SET: + /* asymmetry is because we don't get locally pending subscription + * requests via , we get it via */ + pub_add = g_intset_new (); + pub_rem = g_intset_new (); + sub_add = g_intset_new (); + sub_rem = g_intset_new (); + sub_rp = g_intset_new (); + known_add = g_intset_new (); + known_rem = g_intset_new (); + removed = g_array_new (FALSE, FALSE, sizeof (GabbleHandle)); + + if (google_roster) + { + deny_add = g_intset_new (); + deny_rem = g_intset_new (); + } + else + { + deny_add = NULL; + deny_rem = NULL; + } + + /* get the publish channel first because we need it when processing */ + handle = GABBLE_LIST_HANDLE_PUBLISH; + chan = _gabble_roster_get_channel (roster, handle); + + /* iterate every sub-node, which we expect to be s */ + for (item_node = query_node->children; + item_node; + item_node = item_node->next) + { + const char *jid; + GabbleRosterItem *item; + + if (strcmp (item_node->name, "item")) + { + NODE_DEBUG (item_node, "query sub-node is not item, skipping"); + continue; + } + + jid = lm_message_node_get_attribute (item_node, "jid"); + if (!jid) + { + NODE_DEBUG (item_node, "item node has no jid, skipping"); + continue; + } + + handle = gabble_handle_for_contact (priv->conn->handles, jid, FALSE); + if (handle == 0) + { + NODE_DEBUG (item_node, "item jid is malformed, skipping"); + continue; + } + + item = _gabble_roster_item_update (roster, handle, item_node, + google_roster); + +#ifdef ENABLE_DEBUG + if (DEBUGGING) + { + gchar *dump = _gabble_roster_item_dump (item); + gabble_debug (DEBUG_FLAG, "jid: %s, %s", jid, dump); + g_free (dump); + } +#endif + + /* handle publish list changes */ + switch (item->subscription) + { + case GABBLE_ROSTER_SUBSCRIPTION_FROM: + case GABBLE_ROSTER_SUBSCRIPTION_BOTH: + g_intset_add (pub_add, handle); + break; + case GABBLE_ROSTER_SUBSCRIPTION_NONE: + case GABBLE_ROSTER_SUBSCRIPTION_TO: + case GABBLE_ROSTER_SUBSCRIPTION_REMOVE: + /* publish channel is a bit odd, the roster item doesn't tell us + * if someone is awaiting our approval - we get this via presence + * type=subscribe, so we have to not remove them if they're + * already local_pending in our publish channel */ + if (!handle_set_is_member (chan->group.local_pending, handle)) + { + g_intset_add (pub_rem, handle); + } + break; + default: + g_assert_not_reached (); + } + + /* handle subscribe list changes */ + switch (item->subscription) + { + case GABBLE_ROSTER_SUBSCRIPTION_TO: + case GABBLE_ROSTER_SUBSCRIPTION_BOTH: + g_intset_add (sub_add, handle); + break; + case GABBLE_ROSTER_SUBSCRIPTION_NONE: + case GABBLE_ROSTER_SUBSCRIPTION_FROM: + if (item->ask_subscribe) + g_intset_add (sub_rp, handle); + else + g_intset_add (sub_rem, handle); + break; + case GABBLE_ROSTER_SUBSCRIPTION_REMOVE: + g_intset_add (sub_rem, handle); + break; + default: + g_assert_not_reached (); + } + + /* handle known list changes */ + switch (item->subscription) + { + case GABBLE_ROSTER_SUBSCRIPTION_NONE: + case GABBLE_ROSTER_SUBSCRIPTION_TO: + case GABBLE_ROSTER_SUBSCRIPTION_FROM: + case GABBLE_ROSTER_SUBSCRIPTION_BOTH: + if (item->google_type == GOOGLE_ITEM_TYPE_HIDDEN) + g_intset_add (known_rem, handle); + else + g_intset_add (known_add, handle); + break; + case GABBLE_ROSTER_SUBSCRIPTION_REMOVE: + g_intset_add (known_rem, handle); + break; + default: + g_assert_not_reached (); + } + + /* handle deny list changes */ + if (google_roster) + { + switch (item->subscription) + { + case GABBLE_ROSTER_SUBSCRIPTION_NONE: + case GABBLE_ROSTER_SUBSCRIPTION_TO: + case GABBLE_ROSTER_SUBSCRIPTION_FROM: + case GABBLE_ROSTER_SUBSCRIPTION_BOTH: + if (item->google_type == GOOGLE_ITEM_TYPE_BLOCKED) + g_intset_add (deny_add, handle); + else + g_intset_add (deny_rem, handle); + break; + case GABBLE_ROSTER_SUBSCRIPTION_REMOVE: + g_intset_add (deny_rem, handle); + break; + default: + g_assert_not_reached (); + } + } + + /* delay removing items from roster until signals have been emitted; + * otherwise handles go out of scope! */ + if (GABBLE_ROSTER_SUBSCRIPTION_REMOVE == item->subscription) + g_array_append_val (removed, handle); + } + + /* chan was initialised to the publish channel before the for loop */ + + gabble_debug (DEBUG_FLAG, "calling change members on publish channel"); + gabble_group_mixin_change_members (G_OBJECT (chan), + "", pub_add, pub_rem, NULL, NULL, 0, 0); + + handle = GABBLE_LIST_HANDLE_SUBSCRIBE; + chan = _gabble_roster_get_channel (roster, handle); + + gabble_debug (DEBUG_FLAG, "calling change members on subscribe channel"); + gabble_group_mixin_change_members (G_OBJECT (chan), + "", sub_add, sub_rem, NULL, sub_rp, 0, 0); + + handle = GABBLE_LIST_HANDLE_KNOWN; + chan = _gabble_roster_get_channel (roster, handle); + + gabble_debug (DEBUG_FLAG, "calling change members on known channel"); + gabble_group_mixin_change_members (G_OBJECT (chan), + "", known_add, known_rem, NULL, NULL, 0, 0); + + if (google_roster) + { + handle = GABBLE_LIST_HANDLE_DENY; + chan = _gabble_roster_get_channel (roster, handle); + + gabble_debug (DEBUG_FLAG, "calling change members on deny channel"); + gabble_group_mixin_change_members (G_OBJECT (chan), + "", deny_add, deny_rem, NULL, NULL, 0, 0); + + g_intset_destroy (deny_add); + g_intset_destroy (deny_rem); + } + + for (i = 0; i < removed->len; i++) + _gabble_roster_item_remove (roster, + g_array_index (removed, GabbleHandle, i)); + + g_intset_destroy (pub_add); + g_intset_destroy (pub_rem); + g_intset_destroy (sub_add); + g_intset_destroy (sub_rem); + g_intset_destroy (sub_rp); + g_intset_destroy (known_add); + g_intset_destroy (known_rem); + g_array_free (removed, TRUE); + break; + default: + NODE_DEBUG (iq_node, "unhandled roster IQ"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + switch (sub_type) + { + case LM_MESSAGE_SUB_TYPE_RESULT: + /* result means it's a roster push, so the roster is now complete and we + * can emit signals */ + _gabble_roster_received (roster); + break; + case LM_MESSAGE_SUB_TYPE_SET: + /* acknowledge roster */ + _gabble_connection_acknowledge_set_iq (priv->conn, message); + break; + default: + break; + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + + +static void +_gabble_roster_send_presence_ack (GabbleRoster *roster, + const gchar *from, + LmMessageSubType sub_type, + gboolean changed) +{ + LmMessage *reply; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + if (!changed) + { + gabble_debug (DEBUG_FLAG, "not sending ack to avoid loop with buggy server"); + return; + } + + switch (sub_type) + { + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE: + sub_type = LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED; + break; + case LM_MESSAGE_SUB_TYPE_SUBSCRIBED: + sub_type = LM_MESSAGE_SUB_TYPE_SUBSCRIBE; + break; + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED: + sub_type = LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE; + break; + default: + g_assert_not_reached(); + return; + } + + reply = lm_message_new_with_sub_type (from, + LM_MESSAGE_TYPE_PRESENCE, + sub_type); + + _gabble_connection_send (priv->conn, reply, NULL); + + lm_message_unref (reply); +} + + +/** + * connection_presence_roster_cb: + * @handler: #LmMessageHandler for this message + * @connection: #LmConnection that originated the message + * @message: the presence message + * @user_data: callback data + * + * Called by loudmouth when we get an incoming . + */ +static LmHandlerResult +gabble_roster_presence_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + LmMessageNode *pres_node, *child_node; + const char *from; + LmMessageSubType sub_type; + GIntSet *tmp; + GabbleHandle handle; + const gchar *status_message = NULL; + GabbleRosterChannel *chan = NULL; + gboolean changed; + GabbleRoster *roster = GABBLE_ROSTER (user_data); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_assert (lmconn == priv->conn->lmconn); + + if (priv->channels == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + pres_node = lm_message_get_node (message); + + from = lm_message_node_get_attribute (pres_node, "from"); + + if (from == NULL) + { + NODE_DEBUG (pres_node, "presence stanza without from attribute, ignoring"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + sub_type = lm_message_get_sub_type (message); + + handle = gabble_handle_for_contact (priv->conn->handles, from, FALSE); + + if (handle == 0) + { + NODE_DEBUG (pres_node, "ignoring presence from malformed jid"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (handle == priv->conn->self_handle) + { + NODE_DEBUG (pres_node, "ignoring presence from ourselves on another resource"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + g_assert (handle != 0); + + child_node = lm_message_node_get_child (pres_node, "status"); + if (child_node) + status_message = lm_message_node_get_value (child_node); + + switch (sub_type) + { + case LM_MESSAGE_SUB_TYPE_SUBSCRIBE: + gabble_debug (DEBUG_FLAG, "making %s (handle %u) local pending on the publish channel", + from, handle); + + tmp = g_intset_new (); + g_intset_add (tmp, handle); + + handle = GABBLE_LIST_HANDLE_PUBLISH; + chan = _gabble_roster_get_channel (roster, handle); + gabble_group_mixin_change_members (G_OBJECT (chan), status_message, + NULL, NULL, tmp, NULL, 0, 0); + + g_intset_destroy (tmp); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE: + gabble_debug (DEBUG_FLAG, "removing %s (handle %u) from the publish channel", + from, handle); + + tmp = g_intset_new (); + g_intset_add (tmp, handle); + + handle = GABBLE_LIST_HANDLE_PUBLISH; + chan = _gabble_roster_get_channel (roster, handle); + changed = gabble_group_mixin_change_members (G_OBJECT (chan), + status_message, NULL, tmp, NULL, NULL, 0, 0); + + _gabble_roster_send_presence_ack (roster, from, sub_type, changed); + + g_intset_destroy (tmp); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + case LM_MESSAGE_SUB_TYPE_SUBSCRIBED: + gabble_debug (DEBUG_FLAG, "adding %s (handle %u) to the subscribe channel", + from, handle); + + tmp = g_intset_new (); + g_intset_add (tmp, handle); + + handle = GABBLE_LIST_HANDLE_SUBSCRIBE; + chan = _gabble_roster_get_channel (roster, handle); + changed = gabble_group_mixin_change_members (G_OBJECT (chan), + status_message, tmp, NULL, NULL, NULL, 0, 0); + + _gabble_roster_send_presence_ack (roster, from, sub_type, changed); + + g_intset_destroy (tmp); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + case LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED: + gabble_debug (DEBUG_FLAG, "removing %s (handle %u) from the subscribe channel", + from, handle); + + tmp = g_intset_new (); + g_intset_add (tmp, handle); + + handle = GABBLE_LIST_HANDLE_SUBSCRIBE; + chan = _gabble_roster_get_channel (roster, handle); + changed = gabble_group_mixin_change_members (G_OBJECT (chan), + status_message, NULL, tmp, NULL, NULL, 0, 0); + + _gabble_roster_send_presence_ack (roster, from, sub_type, changed); + + g_intset_destroy (tmp); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + default: + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } +} + +static void +gabble_roster_factory_iface_close_all (TpChannelFactoryIface *iface) +{ + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + gabble_debug (DEBUG_FLAG, "closing channels"); + + if (priv->channels) + { + g_hash_table_destroy (priv->channels); + priv->channels = NULL; + } +} + +static void +gabble_roster_factory_iface_connecting (TpChannelFactoryIface *iface) +{ + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + gabble_debug (DEBUG_FLAG, "adding callbacks"); + + g_assert (priv->iq_cb == NULL); + g_assert (priv->presence_cb == NULL); + + priv->iq_cb = lm_message_handler_new (gabble_roster_iq_cb, + roster, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, + priv->iq_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); + + priv->presence_cb = lm_message_handler_new (gabble_roster_presence_cb, + roster, NULL); + lm_connection_register_message_handler (priv->conn->lmconn, + priv->presence_cb, + LM_MESSAGE_TYPE_PRESENCE, + LM_HANDLER_PRIORITY_LAST); +} + +static void +gabble_roster_factory_iface_connected (TpChannelFactoryIface *iface) +{ + LmMessage *message; + + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + gabble_debug (DEBUG_FLAG, "requesting roster"); + + message = _gabble_roster_message_new (roster, LM_MESSAGE_SUB_TYPE_GET, NULL); + + _gabble_connection_send (priv->conn, message, NULL); + + lm_message_unref (message); +} + +static void +gabble_roster_factory_iface_disconnected (TpChannelFactoryIface *iface) +{ + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + gabble_debug (DEBUG_FLAG, "removing callbacks"); + + g_assert (priv->iq_cb != NULL); + g_assert (priv->presence_cb != NULL); + + lm_connection_unregister_message_handler (priv->conn->lmconn, + priv->iq_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (priv->iq_cb); + priv->iq_cb = NULL; + + lm_connection_unregister_message_handler (priv->conn->lmconn, + priv->presence_cb, + LM_MESSAGE_TYPE_PRESENCE); + lm_message_handler_unref (priv->presence_cb); + priv->presence_cb = NULL; +} + +struct foreach_data { + TpChannelFunc func; + gpointer data; +}; + +static void +_gabble_roster_factory_iface_foreach_one (gpointer key, + gpointer value, + gpointer data) +{ + TpChannelIface *chan = TP_CHANNEL_IFACE (value); + struct foreach_data *foreach = (struct foreach_data *) data; + + foreach->func (chan, foreach->data); +} + +static void +gabble_roster_factory_iface_foreach (TpChannelFactoryIface *iface, + TpChannelFunc func, + gpointer data) +{ + struct foreach_data foreach; + + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + foreach.func = func; + foreach.data = data; + + g_hash_table_foreach (priv->channels, + _gabble_roster_factory_iface_foreach_one, &foreach); +} + +static TpChannelFactoryRequestStatus +gabble_roster_factory_iface_request (TpChannelFactoryIface *iface, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + GabbleRoster *roster = GABBLE_ROSTER (iface); + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + if (strcmp (chan_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + + if (handle_type != TP_HANDLE_TYPE_LIST) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + + if (!gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_LIST, + handle, + NULL)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_INVALID_HANDLE; + + /* disallow "deny" channels if we don't have google:roster support */ + if (handle == GABBLE_LIST_HANDLE_DENY && + !(priv->conn->features & GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + + if (priv->roster_received) + { + GabbleRosterChannel *chan; + chan = _gabble_roster_get_channel (roster, handle); + *ret = TP_CHANNEL_IFACE (chan); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; + } + else + { + return TP_CHANNEL_FACTORY_REQUEST_STATUS_QUEUED; + } +} + +static void +gabble_roster_factory_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface; + + klass->close_all = gabble_roster_factory_iface_close_all; + klass->connecting = gabble_roster_factory_iface_connecting; + klass->connected = gabble_roster_factory_iface_connected; + klass->disconnected = gabble_roster_factory_iface_disconnected; + klass->foreach = gabble_roster_factory_iface_foreach; + klass->request = gabble_roster_factory_iface_request; +} + +GabbleRoster * +gabble_roster_new (GabbleConnection *conn) +{ + g_return_val_if_fail (conn != NULL, NULL); + + return g_object_new (GABBLE_TYPE_ROSTER, + "connection", conn, + NULL); +} + +GabbleRosterSubscription +gabble_roster_handle_get_subscription (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterItem *item; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, GABBLE_ROSTER_SUBSCRIPTION_NONE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), + GABBLE_ROSTER_SUBSCRIPTION_NONE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), + GABBLE_ROSTER_SUBSCRIPTION_NONE); + + item = g_hash_table_lookup (priv->items, GINT_TO_POINTER (handle)); + + if (NULL == item) + return GABBLE_ROSTER_SUBSCRIPTION_NONE; + + return item->subscription; +} + +gboolean +gabble_roster_handle_set_blocked (GabbleRoster *roster, + GabbleHandle handle, + gboolean blocked, + GError **error) +{ + GabbleRosterItem *item; + GoogleItemType orig_type; + LmMessage *message; + gboolean ret; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, FALSE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), FALSE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), FALSE); + g_return_val_if_fail (priv->conn->features & + GABBLE_CONNECTION_FEATURES_GOOGLE_ROSTER, FALSE); + + item = _gabble_roster_item_get (roster, handle); + orig_type = item->google_type; + + if (blocked == (orig_type == GOOGLE_ITEM_TYPE_BLOCKED)) + return TRUE; + + /* temporarily set the desired block state and generate a message */ + if (blocked) + item->google_type = GOOGLE_ITEM_TYPE_BLOCKED; + else + item->google_type = GOOGLE_ITEM_TYPE_NORMAL; + message = _gabble_roster_item_to_message (roster, handle, NULL); + item->google_type = orig_type; + + ret = _gabble_connection_send (priv->conn, message, error); + + lm_message_unref (message); + + return ret; +} + +gboolean +gabble_roster_handle_has_entry (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterItem *item; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, FALSE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), FALSE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), FALSE); + + item = g_hash_table_lookup (priv->items, GINT_TO_POINTER (handle)); + + return (NULL != item); +} + +const gchar * +gabble_roster_handle_get_name (GabbleRoster *roster, + GabbleHandle handle) +{ + GabbleRosterItem *item; + + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, NULL); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), NULL); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), NULL); + + item = g_hash_table_lookup (priv->items, GINT_TO_POINTER (handle)); + + if (NULL == item) + return NULL; + + return item->name; +} + +gboolean +gabble_roster_handle_set_name (GabbleRoster *roster, + GabbleHandle handle, + const gchar *name, + GError **error) +{ + LmMessage *message; + LmMessageNode *item_node; + gboolean ret; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, FALSE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), FALSE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + message = _gabble_roster_item_to_message (roster, handle, &item_node); + + lm_message_node_set_attribute (item_node, "name", name); + + ret = _gabble_connection_send (priv->conn, message, error); + + lm_message_unref (message); + + return ret; +} + +gboolean +gabble_roster_handle_remove (GabbleRoster *roster, + GabbleHandle handle, + GError **error) +{ + GabbleRosterItem *item; + GabbleRosterSubscription subscription; + LmMessage *message; + gboolean ret; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, FALSE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), FALSE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), FALSE); + + item = _gabble_roster_item_get (roster, handle); + subscription = item->subscription; + item->subscription = GABBLE_ROSTER_SUBSCRIPTION_REMOVE; + + message = _gabble_roster_item_to_message (roster, handle, NULL); + ret = _gabble_connection_send (priv->conn, message, error); + lm_message_unref (message); + + item->subscription = subscription; + + return ret; +} + +gboolean +gabble_roster_handle_add (GabbleRoster *roster, + GabbleHandle handle, + GError **error) +{ + GabbleRosterItem *item; + LmMessage *message; + gboolean do_add = FALSE; + gboolean ret; + GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster); + + g_return_val_if_fail (roster != NULL, FALSE); + g_return_val_if_fail (GABBLE_IS_ROSTER (roster), FALSE); + g_return_val_if_fail (gabble_handle_is_valid (priv->conn->handles, + TP_HANDLE_TYPE_CONTACT, handle, NULL), FALSE); + + if (!gabble_roster_handle_has_entry (roster, handle)) + do_add = TRUE; + + item = _gabble_roster_item_get (roster, handle); + + if (item->google_type == GOOGLE_ITEM_TYPE_HIDDEN) + { + item->google_type = GOOGLE_ITEM_TYPE_NORMAL; + do_add = TRUE; + } + + if (!do_add) + return TRUE; + + message = _gabble_roster_item_to_message (roster, handle, NULL); + ret = _gabble_connection_send (priv->conn, message, error); + lm_message_unref (message); + + return ret; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/search-factory.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/search-factory.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,412 @@ +/* + * search-factory.c - Source for GabbleSearchFactory + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include +#include + +#include +#include + +#include +#include + +#include "loudmouth/loudmouth.h" + +#include "debug.h" +#include "gabble-connection.h" +#include "telepathy-interfaces.h" +#include "tp-channel-factory-iface.h" + +#include "search-mixin.h" +#include "gabble-search-channel.h" + +#include "search-factory.h" + +static void gabble_search_factory_iface_init (gpointer g_iface, gpointer iface_data); + +#ifndef EMULATOR +G_DEFINE_TYPE_WITH_CODE (GabbleSearchFactory, gabble_search_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE, gabble_search_factory_iface_init)); +#endif + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(gabble_search_factory_parent_class,search_factory,gpointer) + #define gabble_search_factory_parent_class (*GET_WSD_VAR_NAME(gabble_search_factory_parent_class,search_factory,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,search_factory,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,search_factory,s)()) + +static void gabble_search_factory_init (GabbleSearchFactory *self); +static void gabble_search_factory_class_init (GabbleSearchFactoryClass *klass); +static void gabble_search_factory_class_intern_init (gpointer klass) +{ + gabble_search_factory_parent_class = g_type_class_peek_parent (klass); + gabble_search_factory_class_init ((GabbleSearchFactoryClass*) klass); + } + EXPORT_C GType gabble_search_factory_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleSearchFactoryClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_search_factory_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleSearchFactory), 0, (GInstanceInitFunc) gabble_search_factory_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleSearchFactory"), &g_define_type_info, (GTypeFlags) 0); { { static const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gabble_search_factory_iface_init }; g_type_add_interface_static (g_define_type_id, tp_channel_factory_iface_get_type(), &g_implement_interface_info); } ; } } return g_define_type_id; } ; + +#endif + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_IM + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/* properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + +typedef struct _GabbleSearchFactoryPrivate GabbleSearchFactoryPrivate; +struct _GabbleSearchFactoryPrivate +{ + GabbleConnection *conn; + GArray *channels; + gboolean dispose_has_run; +}; + +#define GABBLE_SEARCH_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GABBLE_TYPE_SEARCH_FACTORY, GabbleSearchFactoryPrivate)) + +static GObject *gabble_search_factory_constructor (GType type, guint n_props, GObjectConstructParam *props); + +static void +gabble_search_factory_init (GabbleSearchFactory *fac) +{ + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + priv->channels = g_array_sized_new (FALSE, FALSE, sizeof (guint), 1); + priv->conn = NULL; + priv->dispose_has_run = FALSE; +} + +static GObject * +gabble_search_factory_constructor (GType type, guint n_props, + GObjectConstructParam *props) +{ + GObject *obj; + /* GabbleSearchFactoryPrivate *priv; */ + + obj = G_OBJECT_CLASS (gabble_search_factory_parent_class)-> + constructor (type, n_props, props); + /* priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (obj); */ + + return obj; +} + + +static void +gabble_search_factory_dispose (GObject *object) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (object); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + if (priv->dispose_has_run) + return; + + gabble_debug (DEBUG_FLAG, "dispose called"); + priv->dispose_has_run = TRUE; + + tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object)); + g_assert (priv->channels == NULL); + + if (G_OBJECT_CLASS (gabble_search_factory_parent_class)->dispose) + G_OBJECT_CLASS (gabble_search_factory_parent_class)->dispose (object); +} + +static void +gabble_search_factory_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (object); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->conn); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_search_factory_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (object); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + switch (property_id) { + case PROP_CONNECTION: + priv->conn = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_search_factory_class_init (GabbleSearchFactoryClass *gabble_search_factory_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_search_factory_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_search_factory_class, sizeof (GabbleSearchFactoryPrivate)); + + object_class->constructor = gabble_search_factory_constructor; + object_class->dispose = gabble_search_factory_dispose; + + object_class->get_property = gabble_search_factory_get_property; + object_class->set_property = gabble_search_factory_set_property; + + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "Search channel factory object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + +} + +static GabbleSearchChannel *new_search_channel (GabbleSearchFactory *fac, GabbleHandle handle); + +static void search_channel_closed_cb (GabbleSearchChannel *chan, gpointer user_data); + + + +/** + * search_channel_closed_cb: + * + * Signal callback for when search channel is closed. Removes the references + * that #GabbleConnection holds to them. + */ +static void +search_channel_closed_cb (GabbleSearchChannel *chan, gpointer user_data) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (user_data); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + g_message("in search_channel_closed_cb"); + if (priv->channels) + { + g_array_remove_index( priv->channels, chan->channel_index ); + } + + lm_connection_unregister_message_handler (priv->conn->lmconn, chan->iq_cb, + LM_MESSAGE_TYPE_IQ); + lm_message_handler_unref (chan->iq_cb); + chan->iq_cb = NULL; + g_object_unref (chan); + chan = NULL; +} + +/** + * new_search_channel + */ +static GabbleSearchChannel * +new_search_channel (GabbleSearchFactory *fac, GabbleHandle handle) +{ + GabbleSearchFactoryPrivate *priv; + GabbleSearchChannel *chan; + char *object_path; + + g_assert (GABBLE_IS_SEARCH_FACTORY (fac)); + + priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + g_message("in new_search_channel:handle %u\n",handle); + + object_path = g_strdup_printf ("%s/SearchChannel%u", priv->conn->object_path, handle); + + gabble_debug (DEBUG_FLAG, "object path %s", object_path); + + + + // handle type should be none and handle value should be zero + // so handle passed in g_object_new + chan = g_object_new (GABBLE_TYPE_SEARCH_CHANNEL, + "connection", priv->conn, + "object-path", object_path, + "handle", handle, + NULL); + + g_message("in new_search_channel: chan is %u\n", chan); + + g_array_append_val(priv->channels, chan); + + g_signal_connect (chan, "closed", (GCallback) search_channel_closed_cb,fac); + + + g_signal_emit_by_name (fac, "new-channel", chan); + + g_free (object_path); + chan->channel_index = priv->channels->len - 1; + + //added for search as chan need to be passed as userdata in search_channel_iq_cb + chan->iq_cb = lm_message_handler_new (search_channel_iq_cb, chan , NULL); + lm_connection_register_message_handler (priv->conn->lmconn, chan->iq_cb, + LM_MESSAGE_TYPE_IQ, + LM_HANDLER_PRIORITY_NORMAL); + + return chan; +} + +static void +gabble_search_factory_iface_close_all (TpChannelFactoryIface *iface) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (iface); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + gabble_debug (DEBUG_FLAG, "closing channels"); + + if (priv->channels) + { + g_array_free ( priv->channels, TRUE); + priv->channels = NULL; + } +} + +static void +gabble_search_factory_iface_connecting (TpChannelFactoryIface *iface) +{ + /* nothing to do */ +} + + + +static void +gabble_search_factory_iface_connected (TpChannelFactoryIface *iface) +{ + /* nothing to do */ +} + +static void +gabble_search_factory_iface_disconnected (TpChannelFactoryIface *iface) +{ + // free any object here + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (iface); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + + if (priv->channels) + { + g_array_free ( priv->channels, TRUE); + priv->channels = NULL; + } +} + +struct _ForeachData +{ + TpChannelFunc foreach; + gpointer user_data; +}; + +static void +_foreach_slave ( gpointer value, gpointer user_data ) +{ + struct _ForeachData *data = (struct _ForeachData *) user_data; + TpChannelIface *chan = TP_CHANNEL_IFACE (value); + + data->foreach (chan, data->user_data); +} + + +static void +gabble_search_factory_iface_foreach (TpChannelFactoryIface *iface, TpChannelFunc foreach, gpointer user_data) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (iface); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + struct _ForeachData data; + guint i = 0; + GabbleSearchChannel *chan = NULL; + + data.user_data = user_data; + data.foreach = foreach; + + for( i = 0; i< priv->channels->len ; i++ ) + { + chan = GABBLE_SEARCH_CHANNEL ( g_array_index(priv->channels,guint,i) ); + _foreach_slave(chan, &data); + } + +} + +static TpChannelFactoryRequestStatus +gabble_search_factory_iface_request (TpChannelFactoryIface *iface, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + GabbleSearchFactory *fac = GABBLE_SEARCH_FACTORY (iface); + GabbleSearchFactoryPrivate *priv = GABBLE_SEARCH_FACTORY_GET_PRIVATE (fac); + GabbleSearchChannel *chan; + + if (strcmp (chan_type, TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH)) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_IMPLEMENTED; + + // should always pass handle type as none and handle as zero + + if ((handle_type != TP_HANDLE_TYPE_NONE) || handle ) + return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE; + + + g_message("in gabble_search_factory_iface_request:handle %u\n",handle); + + chan = new_search_channel (fac, handle); + g_assert (chan); + *ret = TP_CHANNEL_IFACE (chan); + return TP_CHANNEL_FACTORY_REQUEST_STATUS_DONE; +} + +static void +gabble_search_factory_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface; + + klass->close_all = gabble_search_factory_iface_close_all; + klass->connecting = gabble_search_factory_iface_connecting; + klass->connected = gabble_search_factory_iface_connected; + klass->disconnected = gabble_search_factory_iface_disconnected; + klass->foreach = gabble_search_factory_iface_foreach; + klass->request = gabble_search_factory_iface_request; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/search-keys-info.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/search-keys-info.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,298 @@ +/* + * search-keys-info.c - Source for Jingle info discovery + * Copyright (C) 2008 Collabora Ltd. + * and/or its subsidiaries. All rights reserved. + * @author Ole Andre Vadla Ravnaas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#define DEBUG_FLAG GABBLE_DEBUG_MEDIA + +#include "debug.h" +#include "search-keys-info.h" +#include "gabble-error.h" +#include "namespaces.h" +#include "util.h" + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + +/** + * get_search_keys_info: + * + * get search keys + * + */ +void +get_search_keys_info (GabbleConnection *conn, const gchar *jid ) +{ + LmMessage *msg; + LmMessageNode *query_node; + gboolean result; + gchar *service = NULL; + GError *error = NULL; + + conn->search_service_jid = g_strdup( jid ); + + msg= lm_message_new_with_sub_type ( jid, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_GET); + query_node = lm_message_node_add_child (msg->node, "query", NULL); + + lm_message_node_set_attribute (query_node, "xmlns", NS_SEARCH); + + if (!_gabble_connection_send (conn, msg, &error)) + { + g_warning ("%s: send failed: %s\n", G_STRFUNC, error->message); + goto OUT; + } + +OUT: + if (msg) + lm_message_unref (msg); + + if (error) + g_error_free (error); + +} + + +/** + * _gabble_submit_search_form: + * + * Submit search form + * + */ +gboolean +_gabble_submit_search_form (GabbleConnection *conn) +{ + LmMessage *msg; + LmMessageNode *query_node; + LmMessageNode *x_node; + LmMessageNode *field_node, *value_node; + gboolean result; + const gchar *jid; + gchar *service = NULL; + GError **error = NULL; + + g_message("_gabble_submit_search_form\n"); + jid = gabble_handle_inspect (conn->handles, TP_HANDLE_TYPE_CONTACT, conn->self_handle); + g_message("jid is %s\n",jid); + gabble_decode_jid(jid, NULL /*username*/,&service,NULL/*resource*/); + g_message("service is %s\n",service); + + msg= lm_message_new_with_sub_type ( service, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + query_node = lm_message_node_add_child (msg->node, "query", NULL); + + lm_message_node_set_attribute (query_node, "xmlns", NS_SEARCH); + + x_node = lm_message_node_add_child ( query_node, "x", NULL ); + + lm_message_node_set_attributes (x_node, + "xmlns", NS_X_DATA, + "type", "submit", + NULL); + + field_node = lm_message_node_add_child ( x_node, "x", NULL ); + + lm_message_node_set_attributes (x_node, + "type", "hidden", + "var", "FORM_TYPE", + NULL); + + value_node = lm_message_node_get_child(field_node, "value"); + lm_message_node_set_value(value_node,"NS_SEARCH"); + + g_message("_gabble_submit_search_form b4 _gabble_connection_send\n"); + + result = _gabble_connection_send (conn, msg, error); + lm_message_unref (msg); + + if (!result) + return FALSE; + + return TRUE; +} + + +/** + * search_keys_iq_cb + * + * Called by loudmouth when we get an incoming . This handler + * is concerned only with Requesting Search Keys info queries. + */ +LmHandlerResult +search_keys_iq_cb (LmMessageHandler *handler, + LmConnection *lmconn, + LmMessage *message, + gpointer user_data) +{ + GabbleConnection *conn = GABBLE_CONNECTION (user_data); + + LmMessageSubType sub_type; + LmMessageNode *query_node, *x_node, *result_node,*x_item_node; + const gchar *str; + const gchar *type, *field_label,*field_var, *field_type; + guint i = 0; + + if ( NULL == conn ) + { + g_debug ("%s: accesing after dereferenced connection", G_STRFUNC); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + query_node = lm_message_node_get_child_with_namespace (message->node, + "query", NS_SEARCH); + + if (query_node == NULL) + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + + sub_type = lm_message_get_sub_type (message); + + if (sub_type != LM_MESSAGE_SUB_TYPE_RESULT) + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (sub_type == LM_MESSAGE_SUB_TYPE_RESULT) + { + x_node = lm_message_node_get_child_with_namespace (query_node, "x", NS_X_DATA); + + if( x_node ) + { + //if service supports data forms + result_node = x_node; + type = lm_message_node_get_attribute (x_node, "type" ); + + if (0 == strcmp (type, "form")) + { + gint filed_count = 0; + + for (x_item_node = result_node->children; x_item_node; x_item_node = x_item_node->next) + { + if( 0 == strcmp (x_item_node->name, "field") ) + { + filed_count++; + } + } + + if(conn->search_key_names == NULL) + { + conn->search_key_names = (gchar**)g_new0( gchar*, filed_count); + } + + if(conn->search_key_ht == NULL) + { + conn->search_key_ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + } + + conn->search_form = TRUE; + for (x_item_node = result_node->children; x_item_node; x_item_node = x_item_node->next) + { + + // "reported" should also be used to get the types of search result fields + //'g' type currently not supported by dbus-glib-binding + if (0 != strcmp (x_item_node->name, "field") + && 0 != strcmp (x_item_node->name, "instructions")) + continue; + + + if( 0 == strcmp (x_item_node->name, "instructions") ) + { + //get the instructions + g_message("get the instuction\n"); + conn->search_instr = g_strdup( lm_message_node_get_value(x_item_node) ); + g_message("after gettting the instuction\n"); + continue; + } + + if( 0 == strcmp (x_item_node->name, "field") ) + { + //node is a field node + //get the name of each field + //type also ..later + field_type = lm_message_node_get_attribute(x_item_node, "type"); + if( 0 == strcmp (field_type, "hidden") ) + { + //see later if this must be sent while sending request to the server + continue; + } + //get the "type" of the attr as well along with "var" + //to send it to the client later + //dbus-glib-binding tool support 'g' type + field_label = lm_message_node_get_attribute(x_item_node, "label"); + + g_message("b4 gettting the search_key_names\n"); + conn->search_key_names[i] = g_strdup(field_label); + g_message("after gettting the search_key_names\n"); + g_message("%s\n",conn->search_key_names[i]); + field_var = lm_message_node_get_attribute(x_item_node, "var"); + g_hash_table_insert(conn->search_key_ht,g_strdup(field_label),g_strdup(field_var)); + i++; + + } + } + + conn->search_key_names[i] = NULL; + // this should be done when we need to give the + // search result attributes in advance to the client + // and if we are able to give the type also + + + } + + } + else + { + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + + } + + else if (sub_type == LM_MESSAGE_SUB_TYPE_ERROR) + { + GabbleXmppError xmpp_error = INVALID_XMPP_ERROR; + + result_node = lm_message_node_get_child (message->node, "error"); + if (result_node) + { + xmpp_error = gabble_xmpp_error_from_node (result_node); + } + + str = gabble_xmpp_error_string (xmpp_error); + + g_warning ("%s: jingle info error: %s", G_STRFUNC, + (str) ? str : "unknown error"); + } + else + { + NODE_DEBUG (message->node, "unknown message sub type"); + } + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +} + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/search-mixin-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/search-mixin-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,112 @@ +/* + * search-mixin-signals-marshal.c - Source for GabbleSearchMixinSignalsMarshal + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * @author Senko Rasic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + + +/* VOID:UINT,BOXED (search-mixin-signals-marshal.list:11) */ + +void +search_mixin_marshal_VOID__UINT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_BOXED) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + data2); +} + + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/search-mixin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/search-mixin.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,497 @@ +/* + * search-mixin.c - Source for GabbleSearchMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * @author Senko Rasic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "loudmouth/loudmouth.h" +#include +#include +#include +#include +#include + +#include "telepathy-constants.h" +#include "telepathy-errors.h" + + +#include "debug.h" +#include "gabble-connection.h" +#include "namespaces.h" +#include "roster.h" +#include "util.h" + + +#include "search-mixin.h" +#include "search-mixin-signals-marshal.h" + + +#include "gabble_enums.h" + +#define _GNU_SOURCE /* Needed for strptime (_XOPEN_SOURCE can also be used). */ + +#define DEBUG_FLAG GABBLE_DEBUG_SEARCH + + +/* allocator */ + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(offset_quark1,gabble_search_mixin,GQuark) + #define offset_quark1 (*GET_WSD_VAR_NAME(offset_quark1,gabble_search_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(offset_quark,gabble_search_mixin,GQuark) + #define offset_quark (*GET_WSD_VAR_NAME(offset_quark,gabble_search_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(alloc1,gabble_search_mixin,GabbleAllocator) + #define alloc1 (*GET_WSD_VAR_NAME(alloc1,gabble_search_mixin, s)()) + +#endif + +/* +Moved to gabble_enums.h +typedef struct _GabbleAllocator GabbleAllocator; +struct _GabbleAllocator +{ + gulong size; + guint limit; + guint count; +};*/ + + +typedef struct _IsKeyValidUserData IsKeyValidUserData; + +struct _IsKeyValidUserData +{ + GError **error; + gchar **search_key_names; + gboolean is_key_found; +}; + + +typedef struct _SearchKeyVarUserData SearchKeyVarUserData; + +struct _SearchKeyVarUserData +{ + LmMessageNode *x_node; + GabbleConnection *conn; + +}; + + +#define ga_new0(alloc, type) \ + ((type *) gabble_allocator_alloc0 (alloc)) + +static void +gabble_allocator_init (GabbleAllocator *alloc, gulong size, guint limit) +{ + g_assert (alloc != NULL); + g_assert (size > 0); + g_assert (limit > 0); + + alloc->size = size; + alloc->limit = limit; +} + +static gpointer gabble_allocator_alloc0 (GabbleAllocator *alloc) +{ + gpointer ret; + + g_assert (alloc != NULL); + g_assert (alloc->count <= alloc->limit); + + if (alloc->count == alloc->limit) + { + ret = NULL; + } + else + { + ret = g_malloc0 (alloc->size); + alloc->count++; + } + + return ret; +} + +static void gabble_allocator_free (GabbleAllocator *alloc, gpointer thing) +{ + g_assert (alloc != NULL); + g_assert (thing != NULL); + + g_free (thing); + alloc->count--; +} + + +/** + * gabble_search_mixin_class_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObjectClass + */ +GQuark +gabble_search_mixin_class_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark1 = 0; +#endif + + if (!offset_quark1) + offset_quark1 = g_quark_from_static_string("SearchMixinClassOffsetQuark"); + return offset_quark1; +} + +/** + * gabble_search_mixin_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObject + */ +GQuark +gabble_search_mixin_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark = 0; +#endif + + if (!offset_quark) + offset_quark = g_quark_from_static_string("SearchMixinOffsetQuark"); + return offset_quark; +} + + +/* GabbleSearchMixin */ +void +gabble_search_mixin_class_init (GObjectClass *obj_cls, glong offset) +{ + GabbleSearchMixinClass *mixin_cls; + + g_assert (G_IS_OBJECT_CLASS (obj_cls)); + + g_type_set_qdata (G_OBJECT_CLASS_TYPE (obj_cls), + GABBLE_SEARCH_MIXIN_CLASS_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin_cls = GABBLE_SEARCH_MIXIN_CLASS (obj_cls); + + + mixin_cls->search_result_received_signal_id = g_signal_new ("search-result-received", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + search_mixin_marshal_VOID__UINT_BOXED, + G_TYPE_NONE, + 2, G_TYPE_UINT, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE )); + + mixin_cls->search_state_changed_signal_id = g_signal_new ("search-state-changed", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT ); + +} + +void +gabble_search_mixin_init (GObject *obj, + glong offset ) +{ + GabbleSearchMixin *mixin; + + g_assert (G_IS_OBJECT (obj)); + + g_type_set_qdata (G_OBJECT_TYPE (obj), + GABBLE_SEARCH_MIXIN_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin = GABBLE_SEARCH_MIXIN (obj); + + mixin->search_state = TP_CHANNEL_CONTACT_SEARCH_STATE_BEFORE; + + } + +void +gabble_search_mixin_finalize (GObject *obj) +{ + GabbleSearchMixin *mixin = GABBLE_SEARCH_MIXIN (obj); + /* free any data held directly by the object here */ +} + +static void +setfield_foreach (gpointer key, gpointer value, gpointer user_data) +{ + const gchar *search_data_string = NULL; + SearchKeyVarUserData *key_var_struct = (SearchKeyVarUserData*)user_data; + LmMessageNode *field_node; + const gchar *search_key_var = NULL; + GType g_type = G_VALUE_TYPE (value); + + switch (g_type) + { + case G_TYPE_STRING: + search_data_string = g_value_get_string(value); + break; + default: + g_assert_not_reached (); + } + + search_key_var = (gchar *) g_hash_table_lookup (key_var_struct->conn->search_key_ht, + key /*Label*/); + field_node = lm_message_node_add_child ( key_var_struct->x_node, "field", NULL ); + lm_message_node_set_attribute ( field_node, "var", search_key_var ); + lm_message_node_add_child ( field_node, "value", search_data_string ); +} +static void +gabble_search_keynames_are_valid ( gpointer key, gpointer value, + gpointer userdata ) +{ + guint i; + const gchar *search_data_string = g_value_get_string(value); + IsKeyValidUserData *key_valid_struct = (IsKeyValidUserData*)userdata; + gchar **search_key_names = key_valid_struct->search_key_names; + + if( !key_valid_struct->is_key_found ) + return; + + if( key == NULL ) + { + key_valid_struct->is_key_found = FALSE; + return; + } + + + for (i = 0; search_key_names[i]; i++) + { + if (0 == strcmp (search_key_names[i], key)) + { + g_message("searchkey %s is valid\n",key); + if( search_data_string ) + g_message("value is %s\n",search_data_string); + return; + } + } + key_valid_struct->is_key_found = FALSE; + g_message("searchkey %s is invalid\n",key); + g_set_error ( key_valid_struct->error, TELEPATHY_ERRORS, InvalidArgument, + "invalid search key found : %s\n", key); +} + + +/** + * gabble_search_mixin_search + * + * Implements D-Bus method Search + * on interface org.freedesktop.Telepathy.Channel.Type.ContactSearch + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_search_mixin_search (GObject *obj,GHashTable *params, + GabbleConnection *conn, + GError **error) +{ + LmMessage *msg; + LmMessageNode *query_node; + LmMessageNode *x_node; + gboolean result; + const gchar *service = NULL; + GabbleSearchMixin *mixin = GABBLE_SEARCH_MIXIN (obj); + IsKeyValidUserData *user_data = NULL; + SearchKeyVarUserData *get_keyvar_userdata = NULL; + + + if (params == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid argument \n"); + return FALSE; + } + + if ( !g_hash_table_size(params) ) + { + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid argument, no key-value pair to do search\n"); + return FALSE; + } + + service = conn->search_service_jid; + + if (service == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "Search Service is not available\n"); + return FALSE; + } + + g_message("service is %s\n",service); + + if (conn->search_key_names == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "search key names not available"); + return FALSE; + } + + user_data = g_new0 (IsKeyValidUserData, 1); + user_data->is_key_found = TRUE; + user_data->error = error; + user_data->search_key_names = conn->search_key_names; + + g_hash_table_foreach (params, gabble_search_keynames_are_valid, user_data ); + + if(!user_data->is_key_found) + { + g_free(user_data); + g_message("invalid searchkey found\n"); + return FALSE; + } + + g_free(user_data); + + msg= lm_message_new_with_sub_type ( service, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_SET); + query_node = lm_message_node_add_child (msg->node, "query", NULL); + + lm_message_node_set_attribute (query_node, "xmlns", NS_SEARCH); + + x_node = lm_message_node_add_child ( query_node, "x", NULL ); + + lm_message_node_set_attributes (x_node, + "xmlns", NS_X_DATA, + "type", "submit", + NULL); + + get_keyvar_userdata = g_new0 (SearchKeyVarUserData, 1); + get_keyvar_userdata->x_node = x_node; + get_keyvar_userdata->conn = conn; + + g_hash_table_foreach (params, setfield_foreach, get_keyvar_userdata ); + + g_free(get_keyvar_userdata); + + result = _gabble_connection_send (conn, msg, error); + lm_message_unref (msg); + + if (!result) + return FALSE; + + //this means for each search attempt, a new channel should be created + mixin->search_state = TP_CHANNEL_CONTACT_SEARCH_STATE_DURING; + + //send search state changed signal if required + _gabble_search_mixin_emit_search_state_changed(obj,mixin->search_state); + + return TRUE; +} + +gboolean gabble_search_mixin_get_search_state ( GObject *obj, + guint *ret, + GError **error ) +{ + GabbleSearchMixin *mixin = GABBLE_SEARCH_MIXIN (obj); + *ret = mixin->search_state; + return TRUE; +} + + +/** + * gabble_search_mixin_get_search_keys + * + * Implements D-Bus method GetSearchKeys + * on interface org.freedesktop.Telepathy.Channel.Type.ContactSearch + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean +gabble_search_mixin_get_search_keys ( GObject *obj, + gchar **ret_instruction, + gchar ***ret_searchkeys, + GabbleConnection *conn, + GError **error + ) +{ + //later this method should be modified to give + //types of search keys fields also + + if (conn->search_key_names == NULL) + { + g_set_error (error, TELEPATHY_ERRORS, NotAvailable, + "search keys not available"); + return FALSE; + } + + *ret_searchkeys = g_strdupv ((gchar **) conn->search_key_names); + *ret_instruction = g_strdup ( (gchar*)conn->search_instr); + + g_message("conn->search_instr :%s\n",(gchar*)conn->search_instr); + g_message("ret_instruction :%s\n",(gchar*)*ret_instruction ); + + return TRUE; +} + + +void +_gabble_search_mixin_emit_search_result_received (GObject *obj, + guint contact_handle, + GHashTable *values ) +{ + GabbleSearchMixinClass *mixin_cls = GABBLE_SEARCH_MIXIN_CLASS (G_OBJECT_GET_CLASS + (obj)); + + g_signal_emit (obj, mixin_cls->search_result_received_signal_id, 0, + contact_handle, + values ); +} + +void +_gabble_search_mixin_emit_search_state_changed (GObject *obj, + guint search_state ) +{ + GabbleSearchMixinClass *mixin_cls = GABBLE_SEARCH_MIXIN_CLASS (G_OBJECT_GET_CLASS + (obj)); + g_signal_emit (obj, mixin_cls->search_state_changed_signal_id, 0, + search_state ); +} + +void +_gabble_search_mixin_set_search_state (GObject *obj, guint state ) +{ + GabbleSearchMixin *mixin = GABBLE_SEARCH_MIXIN (obj); + mixin->search_state = state; +} + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/sha1.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/sha1.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,649 @@ +/*- + * Copyright (c) 2001-2003 Allan Saddi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ALLAN SADDI AND HIS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL ALLAN SADDI OR HIS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: sha1.c 680 2003-07-25 21:57:38Z asaddi $ + */ + +/* + * Define WORDS_BIGENDIAN if compiling on a big-endian architecture. + * + * Define SHA1_TEST to test the implementation using the NIST's + * sample messages. The output should be: + * + * a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d + * 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1 + * 34aa973c d4c4daa4 f61eeb2b dbad2731 6534016f + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif + +#include + + +#include "sha1.h" + +#ifndef lint +static const char rcsid[] = + "$Id: sha1.c 680 2003-07-25 21:57:38Z asaddi $"; +#endif /* !lint */ + +#define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) +#define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) + +#define F_0_19(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define F_20_39(x, y, z) ((x) ^ (y) ^ (z)) +#define F_40_59(x, y, z) (((x) & ((y) | (z))) | ((y) & (z))) +#define F_60_79(x, y, z) ((x) ^ (y) ^ (z)) + +#define DO_ROUND(F, K) { \ + temp = ROTL(a, 5) + F(b, c, d) + e + *(W++) + K; \ + e = d; \ + d = c; \ + c = ROTL(b, 30); \ + b = a; \ + a = temp; \ +} + +#define K_0_19 0x5a827999L +#define K_20_39 0x6ed9eba1L +#define K_40_59 0x8f1bbcdcL +#define K_60_79 0xca62c1d6L + +#ifndef RUNTIME_ENDIAN + +#ifdef WORDS_BIGENDIAN + +#define BYTESWAP(x) (x) +#define BYTESWAP64(x) (x) + +#else /* WORDS_BIGENDIAN */ + +#define BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \ + (ROTL((x), 8) & 0x00ff00ffL)) +#define BYTESWAP64(x) _byteswap64(x) + +static +#ifdef G_HAVE_INLINE +inline +#endif +uint64_t _byteswap64(uint64_t x) +{ + uint32_t a = x >> 32; + uint32_t b = (uint32_t) x; + return ((uint64_t) BYTESWAP(b) << 32) | (uint64_t) BYTESWAP(a); +} + +#endif /* WORDS_BIGENDIAN */ + +#else /* !RUNTIME_ENDIAN */ + +#define BYTESWAP(x) _byteswap(sc->littleEndian, x) +#define BYTESWAP64(x) _byteswap64(sc->littleEndian, x) + +#define _BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \ + (ROTL((x), 8) & 0x00ff00ffL)) +#define _BYTESWAP64(x) __byteswap64(x) + +static +#ifdef G_HAVE_INLINE +inline +#endif +uint64_t __byteswap64(uint64_t x) +{ + uint32_t a = x >> 32; + uint32_t b = (uint32_t) x; + return ((uint64_t) _BYTESWAP(b) << 32) | (uint64_t) _BYTESWAP(a); +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +uint32_t _byteswap(int littleEndian, uint32_t x) +{ + if (!littleEndian) + return x; + else + return _BYTESWAP(x); +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +uint64_t _byteswap64(int littleEndian, uint64_t x) +{ + if (!littleEndian) + return x; + else + return _BYTESWAP64(x); +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +void setEndian(int *littleEndianp) +{ + union { + uint32_t w; + uint8_t b[4]; + } endian; + + endian.w = 1L; + *littleEndianp = endian.b[0] != 0; +} + +#endif /* !RUNTIME_ENDIAN */ + +static const uint8_t padding[64] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void +SHA1Init (SHA1Context *sc) +{ +#ifdef RUNTIME_ENDIAN + setEndian (&sc->littleEndian); +#endif /* RUNTIME_ENDIAN */ + + sc->totalLength = 0LL; + sc->hash[0] = 0x67452301L; + sc->hash[1] = 0xefcdab89L; + sc->hash[2] = 0x98badcfeL; + sc->hash[3] = 0x10325476L; + sc->hash[4] = 0xc3d2e1f0L; + sc->bufferLength = 0L; +} + +static void +burnStack (int size) +{ + char buf[128]; + + memset (buf, 0, sizeof (buf)); + size -= sizeof (buf); + if (size > 0) + burnStack (size); +} + +static void +SHA1Guts (SHA1Context *sc, const uint32_t *cbuf) +{ + uint32_t buf[80]; + uint32_t *W, *W3, *W8, *W14, *W16; + uint32_t a, b, c, d, e, temp; + int i; + + W = buf; + + for (i = 15; i >= 0; i--) { + *(W++) = BYTESWAP(*cbuf); + cbuf++; + } + + W16 = &buf[0]; + W14 = &buf[2]; + W8 = &buf[8]; + W3 = &buf[13]; + + for (i = 63; i >= 0; i--) { + *W = *(W3++) ^ *(W8++) ^ *(W14++) ^ *(W16++); + *W = ROTL(*W, 1); + W++; + } + + a = sc->hash[0]; + b = sc->hash[1]; + c = sc->hash[2]; + d = sc->hash[3]; + e = sc->hash[4]; + + W = buf; + +#ifndef SHA1_UNROLL +#define SHA1_UNROLL 20 +#endif /* !SHA1_UNROLL */ + +#if SHA1_UNROLL == 1 + for (i = 19; i >= 0; i--) + DO_ROUND(F_0_19, K_0_19); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_20_39, K_20_39); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_40_59, K_40_59); + + for (i = 19; i >= 0; i--) + DO_ROUND(F_60_79, K_60_79); +#elif SHA1_UNROLL == 2 + for (i = 9; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 9; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 4 + for (i = 4; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 4; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 5 + for (i = 3; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 3; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 10 + for (i = 1; i >= 0; i--) { + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + } + + for (i = 1; i >= 0; i--) { + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + } +#elif SHA1_UNROLL == 20 + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + DO_ROUND(F_0_19, K_0_19); + + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + DO_ROUND(F_20_39, K_20_39); + + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + DO_ROUND(F_40_59, K_40_59); + + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); + DO_ROUND(F_60_79, K_60_79); +#else /* SHA1_UNROLL */ +#error SHA1_UNROLL must be 1, 2, 4, 5, 10 or 20! +#endif + + sc->hash[0] += a; + sc->hash[1] += b; + sc->hash[2] += c; + sc->hash[3] += d; + sc->hash[4] += e; +} + +void +SHA1Update (SHA1Context *sc, const void *vdata, uint32_t len) +{ + const uint8_t *data = vdata; + uint32_t bufferBytesLeft; + uint32_t bytesToCopy; + int needBurn = 0; + +#ifdef SHA1_FAST_COPY + if (sc->bufferLength) { + bufferBytesLeft = 64L - sc->bufferLength; + + bytesToCopy = bufferBytesLeft; + if (bytesToCopy > len) + bytesToCopy = len; + + memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); + + sc->totalLength += bytesToCopy * 8L; + + sc->bufferLength += bytesToCopy; + data += bytesToCopy; + len -= bytesToCopy; + + if (sc->bufferLength == 64L) { + SHA1Guts (sc, sc->buffer.words); + needBurn = 1; + sc->bufferLength = 0L; + } + } + + while (len > 63) { + sc->totalLength += 512L; + + SHA1Guts (sc, data); + needBurn = 1; + + data += 64L; + len -= 64L; + } + + if (len) { + memcpy (&sc->buffer.bytes[sc->bufferLength], data, len); + + sc->totalLength += len * 8L; + + sc->bufferLength += len; + } +#else /* SHA1_FAST_COPY */ + while (len) { + bufferBytesLeft = 64L - sc->bufferLength; + + bytesToCopy = bufferBytesLeft; + if (bytesToCopy > len) + bytesToCopy = len; + + memcpy (&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); + + sc->totalLength += bytesToCopy * 8L; + + sc->bufferLength += bytesToCopy; + data += bytesToCopy; + len -= bytesToCopy; + + if (sc->bufferLength == 64L) { + SHA1Guts (sc, sc->buffer.words); + needBurn = 1; + sc->bufferLength = 0L; + } + } +#endif /* SHA1_FAST_COPY */ + + if (needBurn) + burnStack (sizeof (uint32_t[86]) + sizeof (uint32_t *[5]) + sizeof (int)); +} + +void +SHA1Final (SHA1Context *sc, uint8_t hash[SHA1_HASH_SIZE]) +{ + uint32_t bytesToPad; + uint64_t lengthPad; + int i; + + bytesToPad = 120L - sc->bufferLength; + if (bytesToPad > 64L) + bytesToPad -= 64L; + + lengthPad = BYTESWAP64(sc->totalLength); + + SHA1Update (sc, padding, bytesToPad); + SHA1Update (sc, &lengthPad, 8L); + + if (hash) { + for (i = 0; i < SHA1_HASH_WORDS; i++) { +#ifdef SHA1_FAST_COPY + *((uint32_t *) hash) = BYTESWAP(sc->hash[i]); +#else /* SHA1_FAST_COPY */ + hash[0] = (uint8_t) (sc->hash[i] >> 24); + hash[1] = (uint8_t) (sc->hash[i] >> 16); + hash[2] = (uint8_t) (sc->hash[i] >> 8); + hash[3] = (uint8_t) sc->hash[i]; +#endif /* SHA1_FAST_COPY */ + hash += 4; + } + } +} + +#ifdef SHA1_TEST + +#include +#include +#include + +int +main (int argc, char *argv[]) +{ + SHA1Context foo; + uint8_t hash[SHA1_HASH_SIZE]; + char buf[1000]; + int i; + + SHA1Init (&foo); + SHA1Update (&foo, "abc", 3); + SHA1Final (&foo, hash); + + for (i = 0; i < SHA1_HASH_SIZE;) { + printf ("%02x", hash[i++]); + if (!(i % 4)) + printf (" "); + } + printf ("\n"); + + SHA1Init (&foo); + SHA1Update (&foo, + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + 56); + SHA1Final (&foo, hash); + + for (i = 0; i < SHA1_HASH_SIZE;) { + printf ("%02x", hash[i++]); + if (!(i % 4)) + printf (" "); + } + printf ("\n"); + + SHA1Init (&foo); + memset (buf, 'a', sizeof (buf)); + for (i = 0; i < 1000; i++) + SHA1Update (&foo, buf, sizeof (buf)); + SHA1Final (&foo, hash); + + for (i = 0; i < SHA1_HASH_SIZE;) { + printf ("%02x", hash[i++]); + if (!(i % 4)) + printf (" "); + } + printf ("\n"); + + exit (0); +} + +#endif /* SHA1_TEST */ + + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/telepathy-errors-enumtypes.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/telepathy-errors-enumtypes.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,67 @@ +/* + * telepathy-errors-enumtypes.c - Source for Gabble service discovery + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * -- LET'S DISCO!!! \o/ \o_ _o/ /\o/\ _/o/- -\o\_ -- + */ +/* Generated data (by glib-mkenums) */ +//vinod: changed system path to local +#include "telepathy-errors.h" + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(etype,gabble_enum_types,GType) + #define etype (*GET_WSD_VAR_NAME(etype,gabble_enum_types,s)()) + +#endif + +/* enumerations from "telepathy-errors.h" */ +#ifdef SYMBIAN +EXPORT_C +#endif +GType +telepathy_errors_get_type (void) +{ + +#ifndef EMULATOR + static GType etype = 0; +#endif + + if (etype == 0) { + static const GEnumValue values[] = { + { ChannelBanned, "ChannelBanned", "ChannelBanned" }, + { ChannelFull, "ChannelFull", "ChannelFull" }, + { ChannelInviteOnly, "ChannelInviteOnly", "ChannelInviteOnly" }, + { Disconnected, "Disconnected", "Disconnected" }, + { InvalidArgument, "InvalidArgument", "InvalidArgument" }, + { InvalidHandle, "InvalidHandle", "InvalidHandle" }, + { NetworkError, "NetworkError", "NetworkError" }, + { NotAvailable, "NotAvailable", "NotAvailable" }, + { NotImplemented, "NotImplemented", "NotImplemented" }, + { PermissionDenied, "PermissionDenied", "PermissionDenied" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static ("TelepathyErrors", values); + } + return etype; +} + +/* Generated data ends here */ + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/telepathy-errors.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/telepathy-errors.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,45 @@ +/* + * telepathy-errors.c - Source for D-Bus error types used in telepathy + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "telepathy-errors.h" + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(quark,gabble_errors,GQuark) + #define quark (*GET_WSD_VAR_NAME(quark,gabble_errors, s)()) + +#endif + +#ifdef SYMBIAN +EXPORT_C +#endif +GQuark +telepathy_errors_quark (void) +{ +#ifndef EMULATOR + static GQuark quark = 0; +#endif + + if (!quark) + quark = g_quark_from_static_string ("telepathy_errors"); + return quark; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/telepathy-helpers.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/telepathy-helpers.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,118 @@ +/* + * telepathy-helpers.c - Source for some Telepathy D-Bus helper functions + * Copyright (C) 2005 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "telepathy-helpers.h" + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(busCon,gabble_helpers,DBusGConnection*) + #define busCon (*GET_WSD_VAR_NAME(busCon,gabble_helpers, s)()) + + GET_STATIC_VAR_FROM_TLS(bus_proxy,gabble_helpers,DBusGProxy*) + #define bus_proxy (*GET_WSD_VAR_NAME(bus_proxy,gabble_helpers, s)()) + +#endif + + +DBusGConnection * +tp_get_bus () +{ +#ifndef EMULATOR + static DBusGConnection *busCon = NULL; +#endif + + if (busCon == NULL) + { + GError *error = NULL; + + busCon = dbus_g_bus_get (DBUS_BUS_SESSION/*DBUS_BUS_STARTER*/, &error); + + if (busCon == NULL) + { + g_warning ("Failed to connect to starter bus: %s", error->message); + exit (1); + } + } + + return busCon; +} + +DBusGProxy * +tp_get_bus_proxy () +{ +#ifndef EMULATOR + static DBusGProxy *bus_proxy = NULL; +#endif + + if (bus_proxy == NULL) + { + DBusGConnection *bus = tp_get_bus (); + + bus_proxy = dbus_g_proxy_new_for_name (bus, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + + if (bus_proxy == NULL) + g_error ("Failed to get proxy object for bus."); + } + + return bus_proxy; +} + +static void _list_builder (gpointer key, gpointer value, gpointer data); + +GSList * +tp_hash_to_key_value_list (GHashTable *hash) +{ + GSList *ret = NULL; + + g_hash_table_foreach (hash, _list_builder, &ret); + + return ret; +} + +void +tp_key_value_list_free (GSList *list) +{ + GSList *iter; + + for (iter = list; iter; iter = g_slist_next(iter)) + { + g_free (iter->data); + } + + g_slist_free (list); +} + +static void _list_builder (gpointer key, gpointer value, gpointer data) +{ + GSList **list = (GSList **) data; + TpKeyValue *kv = g_new0 (TpKeyValue, 1); + + kv->key = key; + kv->value = value; + + *list = g_slist_prepend (*list, kv); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/text-mixin-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/text-mixin-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,191 @@ +/* + * text-mixin-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:UINT,UINT,UINT,UINT,UINT,STRING (text-mixin-signals-marshal.list:1) */ +void +text_mixin_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + guint arg_4, + guint arg_5, + gpointer arg_6, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 7); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_uint (param_values + 4), + g_marshal_value_peek_uint (param_values + 5), + g_marshal_value_peek_string (param_values + 6), + data2); +} + +/* VOID:UINT,UINT,UINT,STRING (text-mixin-signals-marshal.list:2) */ +void +text_mixin_marshal_VOID__UINT_UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + guint arg_3, + gpointer arg_4, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 5); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_uint (param_values + 3), + g_marshal_value_peek_string (param_values + 4), + data2); +} + +/* VOID:UINT,UINT,STRING (text-mixin-signals-marshal.list:3) */ +void +text_mixin_marshal_VOID__UINT_UINT_STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_STRING) (gpointer data1, + guint arg_1, + guint arg_2, + gpointer arg_3, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_UINT_STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), + g_marshal_value_peek_string (param_values + 3), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/text-mixin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/text-mixin.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,819 @@ +/* + * text-mixin.c - Source for GabbleTextMixin + * Copyright (C) 2006 Collabora Ltd. + * + * @author Ole Andre Vadla Ravnaas + * @author Robert McQueen + * @author Senko Rasic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "loudmouth/loudmouth.h" +#include +#include +#include +#include +#include + +#include "telepathy-constants.h" +#include "telepathy-errors.h" + + +#include "debug.h" +#include "gabble-connection.h" +#include "namespaces.h" +#include "roster.h" +#include "util.h" + +#include "text-mixin.h" +#include "text-mixin-signals-marshal.h" + +#include "gabble_enums.h" + +#define _GNU_SOURCE /* Needed for strptime (_XOPEN_SOURCE can also be used). */ +#define DEBUG_FLAG GABBLE_DEBUG_IM +#define TP_TYPE_PENDING_MESSAGE_STRUCT (dbus_g_type_get_struct ("GValueArray", \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_UINT, \ + G_TYPE_STRING, \ + G_TYPE_INVALID)) + +/* allocator */ + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(offset_quark1,gabble_txt_mixin,GQuark) + #define offset_quark1 (*GET_WSD_VAR_NAME(offset_quark1,gabble_txt_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(offset_quark,gabble_txt_mixin,GQuark) + #define offset_quark (*GET_WSD_VAR_NAME(offset_quark,gabble_txt_mixin, s)()) + + GET_STATIC_VAR_FROM_TLS(alloc1,gabble_txt_mixin,GabbleAllocator) + #define alloc1 (*GET_WSD_VAR_NAME(alloc1,gabble_txt_mixin, s)()) + +#endif + +/* +Moved to gabble_enums.h +typedef struct _GabbleAllocator GabbleAllocator; +struct _GabbleAllocator +{ + gulong size; + guint limit; + guint count; +};*/ + + + +#define ga_new0(alloc, type) \ + ((type *) gabble_allocator_alloc0 (alloc)) + +static void +gabble_allocator_init (GabbleAllocator *alloc, gulong size, guint limit) +{ + g_assert (alloc != NULL); + g_assert (size > 0); + g_assert (limit > 0); + + alloc->size = size; + alloc->limit = limit; +} + +static gpointer gabble_allocator_alloc0 (GabbleAllocator *alloc) +{ + gpointer ret; + + g_assert (alloc != NULL); + g_assert (alloc->count <= alloc->limit); + + if (alloc->count == alloc->limit) + { + ret = NULL; + } + else + { + ret = g_malloc0 (alloc->size); + alloc->count++; + } + + return ret; +} + +static void gabble_allocator_free (GabbleAllocator *alloc, gpointer thing) +{ + g_assert (alloc != NULL); + g_assert (thing != NULL); + + g_free (thing); + alloc->count--; +} + +/* pending message */ +#define MAX_PENDING_MESSAGES 256 +#define MAX_MESSAGE_SIZE 1024 - 1 + +typedef struct _GabblePendingMessage GabblePendingMessage; +struct _GabblePendingMessage +{ + guint id; + time_t timestamp; + GabbleHandle sender; + TpChannelTextMessageType type; + char *text; + guint flags; +}; + +/** + * gabble_text_mixin_class_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObjectClass + */ +GQuark +gabble_text_mixin_class_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark1 = 0; +#endif + + if (!offset_quark1) + offset_quark1 = g_quark_from_static_string("TextMixinClassOffsetQuark"); + return offset_quark1; +} + +/** + * gabble_text_mixin_get_offset_quark: + * + * Returns: the quark used for storing mixin offset on a GObject + */ +GQuark +gabble_text_mixin_get_offset_quark () +{ +#ifndef EMULATOR + static GQuark offset_quark = 0; +#endif + + if (!offset_quark) + offset_quark = g_quark_from_static_string("TextMixinOffsetQuark"); + return offset_quark; +} + + +/* GabbleTextMixin */ +void +gabble_text_mixin_class_init (GObjectClass *obj_cls, glong offset) +{ + GabbleTextMixinClass *mixin_cls; + + g_assert (G_IS_OBJECT_CLASS (obj_cls)); + + g_type_set_qdata (G_OBJECT_CLASS_TYPE (obj_cls), + GABBLE_TEXT_MIXIN_CLASS_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin_cls = GABBLE_TEXT_MIXIN_CLASS (obj_cls); + + mixin_cls->lost_message_signal_id = g_signal_new ("lost-message", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + mixin_cls->received_signal_id = g_signal_new ("received", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + text_mixin_marshal_VOID__UINT_UINT_UINT_UINT_UINT_STRING, + G_TYPE_NONE, 6, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING); + + mixin_cls->send_error_signal_id = g_signal_new ("send-error", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + text_mixin_marshal_VOID__UINT_UINT_UINT_STRING, + G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING); + + mixin_cls->sent_signal_id = g_signal_new ("sent", + G_OBJECT_CLASS_TYPE (obj_cls), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + text_mixin_marshal_VOID__UINT_UINT_STRING, + G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING); +} + +void +gabble_text_mixin_init (GObject *obj, + glong offset, + GabbleHandleRepo *handle_repo, + gboolean send_nick) +{ + GabbleTextMixin *mixin; + + g_assert (G_IS_OBJECT (obj)); + + g_type_set_qdata (G_OBJECT_TYPE (obj), + GABBLE_TEXT_MIXIN_OFFSET_QUARK, + GINT_TO_POINTER (offset)); + + mixin = GABBLE_TEXT_MIXIN (obj); + + mixin->pending = g_queue_new (); + mixin->handle_repo = handle_repo; + mixin->recv_id = 0; + mixin->msg_types = g_array_sized_new (FALSE, FALSE, sizeof (guint), 4); + + mixin->message_lost = FALSE; +} + +void +gabble_text_mixin_set_message_types (GObject *obj, + ...) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + va_list args; + guint type; + + va_start (args, obj); + + while ((type = va_arg (args, guint)) != G_MAXUINT) + g_array_append_val (mixin->msg_types, type); + + va_end (args); +} + +static void _gabble_pending_free (GabblePendingMessage *msg); +static GabbleAllocator * _gabble_pending_get_alloc (); + +void +gabble_text_mixin_finalize (GObject *obj) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + GabblePendingMessage *msg; + + /* free any data held directly by the object here */ + + msg = g_queue_pop_head(mixin->pending); + while (msg) + { + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, msg->sender); + _gabble_pending_free (msg); + msg = g_queue_pop_head(mixin->pending); + } + + g_queue_free (mixin->pending); + + g_array_free (mixin->msg_types, TRUE); +} + +/** + * _gabble_pending_get_alloc + * + * Returns a GabbleAllocator for creating up to 256 pending messages, but no + * more. + */ +static GabbleAllocator * +_gabble_pending_get_alloc () +{ + +#ifndef EMULATOR + static GabbleAllocator alloc1 = { 0, }; +#endif + + if (0 == alloc1.size) + gabble_allocator_init (&alloc1, sizeof(GabblePendingMessage), MAX_PENDING_MESSAGES); + + return &alloc1; +} + +#define _gabble_pending_new0() \ + (ga_new0 (_gabble_pending_get_alloc (), GabblePendingMessage)) + +/** + * _gabble_pending_free + * + * Free up a GabblePendingMessage struct. + */ +static void _gabble_pending_free (GabblePendingMessage *msg) +{ + g_free (msg->text); + gabble_allocator_free (_gabble_pending_get_alloc (), msg); +} + +/** + * _gabble_text_mixin_receive + * + */ +gboolean gabble_text_mixin_receive (GObject *obj, + TpChannelTextMessageType type, + GabbleHandle sender, + time_t timestamp, + const char *text) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + GabbleTextMixinClass *mixin_cls = GABBLE_TEXT_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + + gchar *end; + GabblePendingMessage *msg; + gsize len; + + msg = _gabble_pending_new0 (); + + if (msg == NULL) + { + gabble_debug (DEBUG_FLAG, "no more pending messages available, giving up"); + + if (!mixin->message_lost) + { + g_signal_emit (obj, mixin_cls->lost_message_signal_id, 0); + mixin->message_lost = TRUE; + } + + return FALSE; + } + + len = strlen (text); + + if (len > MAX_MESSAGE_SIZE) + { + gabble_debug (DEBUG_FLAG, "message exceeds maximum size, truncating"); + + msg->flags |= TP_CHANNEL_TEXT_MESSAGE_FLAG_TRUNCATED; + + end = g_utf8_find_prev_char (text, text+MAX_MESSAGE_SIZE); + if (end) + len = end-text; + else + len = 0; + } + + msg->text = g_try_malloc (len + 1); + + if (msg->text == NULL) + { + gabble_debug (DEBUG_FLAG, "unable to allocate message, giving up"); + + if (!mixin->message_lost) + { + g_signal_emit (obj, mixin_cls->lost_message_signal_id, 0); + mixin->message_lost = TRUE; + } + + _gabble_pending_free (msg); + + return FALSE; + } + + g_strlcpy (msg->text, text, len + 1); + + msg->id = mixin->recv_id++; + msg->timestamp = timestamp; + msg->sender = sender; + msg->type = type; + + gabble_handle_ref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, msg->sender); + g_queue_push_tail (mixin->pending, msg); + + g_signal_emit (obj, mixin_cls->received_signal_id, 0, + msg->id, + msg->timestamp, + msg->sender, + msg->type, + msg->flags, + msg->text); + + gabble_debug (DEBUG_FLAG, "queued message %u", msg->id); + + mixin->message_lost = FALSE; + + return TRUE; +} + +static gint +compare_pending_message (gconstpointer haystack, + gconstpointer needle) +{ + GabblePendingMessage *msg = (GabblePendingMessage *) haystack; + guint id = GPOINTER_TO_INT (needle); + + return (msg->id != id); +} + +/** + * gabble_text_mixin_acknowledge_pending_messages + * + * Implements D-Bus method AcknowledgePendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_text_mixin_acknowledge_pending_messages (GObject *obj, const GArray * ids, GError **error) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + GList **nodes; + GabblePendingMessage *msg; + guint i; + + nodes = g_new(GList *, ids->len); + + for (i = 0; i < ids->len; i++) + { + guint id = g_array_index(ids, guint, i); + + nodes[i] = g_queue_find_custom (mixin->pending, + GINT_TO_POINTER (id), + compare_pending_message); + + if (nodes[i] == NULL) + { + gabble_debug (DEBUG_FLAG, "invalid message id %u", id); + + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid message id %u", id); + + g_free(nodes); + return FALSE; + } + } + + for (i = 0; i < ids->len; i++) + { + msg = (GabblePendingMessage *) nodes[i]->data; + + gabble_debug (DEBUG_FLAG, "acknowleding message id %u", msg->id); + + g_queue_remove (mixin->pending, msg); + + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, msg->sender); + _gabble_pending_free (msg); + } + + g_free(nodes); + return TRUE; +} + +/** + * gabble_text_mixin_list_pending_messages + * + * Implements D-Bus method ListPendingMessages + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_text_mixin_list_pending_messages (GObject *obj, gboolean clear, GPtrArray ** ret, GError **error) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + guint count; + GPtrArray *messages; + GList *cur; + + count = g_queue_get_length (mixin->pending); + messages = g_ptr_array_sized_new (count); + + for (cur = (clear ? g_queue_pop_head_link(mixin->pending) + : g_queue_peek_head_link(mixin->pending)); + cur != NULL; + cur = (clear ? g_queue_pop_head_link(mixin->pending) + : cur->next)) + { + GabblePendingMessage *msg = (GabblePendingMessage *) cur->data; + GValue val = { 0, }; + + g_value_init (&val, TP_TYPE_PENDING_MESSAGE_STRUCT); + g_value_take_boxed (&val, + dbus_g_type_specialized_construct (TP_TYPE_PENDING_MESSAGE_STRUCT)); + dbus_g_type_struct_set (&val, + 0, msg->id, + 1, msg->timestamp, + 2, msg->sender, + 3, msg->type, + 4, msg->flags, + 5, msg->text, + G_MAXUINT); + + g_ptr_array_add (messages, g_value_get_boxed (&val)); + } + + *ret = messages; + + return TRUE; +} + +/** + * gabble_text_mixin_send + * + * Implements D-Bus method Send + * on interface org.freedesktop.Telepathy.Channel.Type.Text + * + * @error: Used to return a pointer to a GError detailing any error + * that occurred, D-Bus will throw the error only if this + * function returns false. + * + * Returns: TRUE if successful, FALSE if an error was thrown. + */ +gboolean gabble_text_mixin_send (GObject *obj, guint type, guint subtype, + const char *recipient, const gchar *text, + GabbleConnection *conn, gboolean emit_signal, + GError **error) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + LmMessage *msg; + gboolean result; + time_t timestamp; + + if (type > TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE) + { + gabble_debug (DEBUG_FLAG, "invalid message type %u", type); + + g_set_error (error, TELEPATHY_ERRORS, InvalidArgument, + "invalid message type: %u", type); + + return FALSE; + } + + if (!subtype) + { + switch (type) + { + case TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL: + case TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION: + subtype = LM_MESSAGE_SUB_TYPE_CHAT; + break; + case TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE: + subtype = LM_MESSAGE_SUB_TYPE_NORMAL; + break; + } + } + + msg = lm_message_new_with_sub_type (recipient, LM_MESSAGE_TYPE_MESSAGE, subtype); + + if (mixin->send_nick) + { + lm_message_node_add_own_nick (msg->node, conn); + mixin->send_nick = FALSE; + } + + if (type == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION) + { + gchar *tmp; + tmp = g_strconcat ("/me ", text, NULL); + lm_message_node_add_child (msg->node, "body", tmp); + g_free (tmp); + } + else + { + lm_message_node_add_child (msg->node, "body", text); + } + + result = _gabble_connection_send (conn, msg, error); + lm_message_unref (msg); + + if (!result) + return FALSE; + + if (emit_signal) + { + timestamp = time (NULL); + + gabble_text_mixin_emit_sent (obj, timestamp, type, text); + } + + return TRUE; +} + +void +gabble_text_mixin_emit_sent (GObject *obj, + time_t timestamp, + guint type, + const char *text) +{ + GabbleTextMixinClass *mixin_cls = GABBLE_TEXT_MIXIN_CLASS (G_OBJECT_GET_CLASS + (obj)); + + g_signal_emit (obj, mixin_cls->sent_signal_id, 0, + timestamp, + type, + text); +} + +gboolean +gabble_text_mixin_get_message_types (GObject *obj, GArray **ret, GError **error) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + guint i; + + *ret = g_array_sized_new (FALSE, FALSE, sizeof (guint), + mixin->msg_types->len); + + for (i = 0; i < mixin->msg_types->len; i++) + { + g_array_append_val (*ret, g_array_index (mixin->msg_types, guint, i)); + } + + return TRUE; +} + + +void +gabble_text_mixin_clear (GObject *obj) +{ + GabbleTextMixin *mixin = GABBLE_TEXT_MIXIN (obj); + GabblePendingMessage *msg; + + msg = g_queue_pop_head(mixin->pending); + while (msg) + { + gabble_handle_unref (mixin->handle_repo, TP_HANDLE_TYPE_CONTACT, msg->sender); + _gabble_pending_free (msg); + msg = g_queue_pop_head(mixin->pending); + } +} + +gboolean +gabble_text_mixin_parse_incoming_message (LmMessage *message, + const gchar **from, + time_t *stamp, + TpChannelTextMessageType *msgtype, + const gchar **body, + const gchar **body_offset, + GabbleTextMixinSendError *send_error) +{ + const gchar *type; + LmMessageNode *node; + + *send_error = CHANNEL_TEXT_SEND_NO_ERROR; + + if (lm_message_get_sub_type (message) == LM_MESSAGE_SUB_TYPE_ERROR) + { + LmMessageNode *error_node; + + error_node = lm_message_node_get_child (message->node, "error"); + if (error_node) + { + GabbleXmppError err = gabble_xmpp_error_from_node (error_node); + gabble_debug (DEBUG_FLAG, "got xmpp error: %s: %s", gabble_xmpp_error_string (err), + gabble_xmpp_error_description (err)); + + /* these are based on descriptions of errors, and some testing */ + switch (err) + { + case XMPP_ERROR_SERVICE_UNAVAILABLE: + case XMPP_ERROR_RECIPIENT_UNAVAILABLE: + *send_error = CHANNEL_TEXT_SEND_ERROR_OFFLINE; + break; + + case XMPP_ERROR_ITEM_NOT_FOUND: + case XMPP_ERROR_JID_MALFORMED: + case XMPP_ERROR_REMOTE_SERVER_TIMEOUT: + *send_error = CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT; + break; + + case XMPP_ERROR_FORBIDDEN: + *send_error = CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED; + break; + + case XMPP_ERROR_RESOURCE_CONSTRAINT: + *send_error = CHANNEL_TEXT_SEND_ERROR_TOO_LONG; + break; + + case XMPP_ERROR_FEATURE_NOT_IMPLEMENTED: + *send_error = CHANNEL_TEXT_SEND_ERROR_NOT_IMPLEMENTED; + break; + + default: + *send_error = CHANNEL_TEXT_SEND_ERROR_UNKNOWN; + } + } + else + { + *send_error = CHANNEL_TEXT_SEND_ERROR_UNKNOWN; + } + } + + *from = lm_message_node_get_attribute (message->node, "from"); + if (*from == NULL) + { + NODE_DEBUG (message->node, "got a message without a from field"); + return FALSE; + } + + type = lm_message_node_get_attribute (message->node, "type"); + + /* + * Parse timestamp of delayed messages. For non-delayed, it's + * 0 and the channel code should set the current timestamp. + */ + *stamp = 0; + + node = lm_message_node_get_child_with_namespace (message->node, "x", + NS_X_DELAY); + if (node != NULL) + { + const gchar *stamp_str, *p; + struct tm stamp_tm = { 0, }; + + stamp_str = lm_message_node_get_attribute (node, "stamp"); + if (stamp_str != NULL) + { + p = strptime (stamp_str, "%Y%m%dT%T", &stamp_tm); + if (p == NULL || *p != '\0') + { + g_warning ("%s: malformed date string '%s' for jabber:x:delay", + G_STRFUNC, stamp_str); + } + else + { + *stamp = 0; // bsr timegm (&stamp_tm); + } + } + } + + /* + * Parse body if it exists. + */ + node = lm_message_node_get_child (message->node, "body"); + + if (node) + { + *body = lm_message_node_get_value (node); + } + else + { + *body = NULL; + } + + /* Messages starting with /me are ACTION messages, and the /me should be + * removed. type="chat" messages are NORMAL. everything else is + * something that doesn't necessarily expect a reply or ongoing + * conversation ("normal") or has been auto-sent, so we make it NOTICE in + * all other cases. */ + + *msgtype = TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE; + *body_offset = *body; + + if (*body) + { + if (0 == strncmp (*body, "/me ", 4)) + { + *msgtype = TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION; + *body_offset = *body + 4; + } + else if (type != NULL && (0 == strcmp (type, "chat") || + 0 == strcmp (type, "groupchat"))) + { + *msgtype = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL; + *body_offset = *body; + } + } + + return TRUE; +} + +void +_gabble_text_mixin_send_error_signal (GObject *obj, + GabbleTextMixinSendError error, + time_t timestamp, + TpChannelTextMessageType type, + const gchar *text) +{ + GabbleTextMixinClass *mixin_cls = GABBLE_TEXT_MIXIN_CLASS (G_OBJECT_GET_CLASS (obj)); + + g_signal_emit (obj, mixin_cls->send_error_signal_id, 0, error, timestamp, type, text, 0); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/tp-channel-factory-iface-signals-marshal.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/tp-channel-factory-iface-signals-marshal.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,103 @@ +/* + * tp-channel-factory-iface-signals-marshal.c + * Copyright (C) 2006 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:OBJECT,POINTER (tp-channel-factory-iface-signals-marshal.list:1) */ +void +tp_channel_factory_iface_marshal_VOID__OBJECT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__OBJECT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/tp-channel-factory-iface.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/tp-channel-factory-iface.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,138 @@ +/* + * tp-channel-factory-iface.c - Stubs for Telepathy Channel Factory interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "tp-channel-factory-iface.h" +#include "tp-channel-factory-iface-signals-marshal.h" +#include "tp-channel-iface.h" + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(initialized,gabble_fac_iface,gboolean) + #define initialized (*GET_WSD_VAR_NAME(initialized,gabble_fac_iface, s)()) + + GET_STATIC_VAR_FROM_TLS(type,gabble_fac_iface,GType) + #define type (*GET_WSD_VAR_NAME(type,gabble_fac_iface, s)()) + +#endif + + +static void +tp_channel_factory_iface_base_init (gpointer klass) +{ +#ifndef EMULATOR + static gboolean initialized = FALSE; +#endif + + if (!initialized) { + initialized = TRUE; + + g_signal_new ("new-channel", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + g_signal_new ("channel-error", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + tp_channel_factory_iface_marshal_VOID__OBJECT_POINTER, + G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_POINTER); + } +} + +GType +tp_channel_factory_iface_get_type (void) +{ + +#ifndef EMULATOR + static GType type = 0; +#endif + + if (type == 0) { + static const GTypeInfo info = { + sizeof (TpChannelFactoryIfaceClass), + tp_channel_factory_iface_base_init, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + + type = g_type_register_static (G_TYPE_INTERFACE, "TpChannelFactoryIface", &info, 0); + } + + return type; +} + +void +tp_channel_factory_iface_close_all (TpChannelFactoryIface *self) +{ + TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->close_all (self); +} + +void +tp_channel_factory_iface_connecting (TpChannelFactoryIface *self) +{ + TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->connecting (self); +} + +void +tp_channel_factory_iface_connected (TpChannelFactoryIface *self) +{ + TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->connected (self); +} + +void +tp_channel_factory_iface_disconnected (TpChannelFactoryIface *self) +{ + TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->disconnected (self); +} + +void +tp_channel_factory_iface_foreach (TpChannelFactoryIface *self, + TpChannelFunc func, + gpointer data) +{ + TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->foreach (self, func, data); +} + +TpChannelFactoryRequestStatus +tp_channel_factory_iface_request (TpChannelFactoryIface *self, + const gchar *chan_type, + TpHandleType handle_type, + guint handle, + TpChannelIface **ret, + GError **error) +{ + return (TP_CHANNEL_FACTORY_IFACE_GET_CLASS (self)->request (self, chan_type, + handle_type, handle, ret, error)); +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/tp-channel-iface.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/tp-channel-iface.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,115 @@ +/* + * tp-channel-iface.c - Stubs for Telepathy Channel interface + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "tp-channel-iface.h" + + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_VAR_FROM_TLS(type,gabble_chnl_iface,GType) + #define type (*GET_WSD_VAR_NAME(type,gabble_chnl_iface, s)()) + + GET_STATIC_VAR_FROM_TLS(initialized,gabble_chnl_iface,gboolean) + #define initialized (*GET_WSD_VAR_NAME(initialized,gabble_chnl_iface, s)()) + +#endif + +static void +tp_channel_iface_base_init (gpointer klass) +{ +#ifndef EMULATOR + static gboolean initialized = FALSE; +#endif + + if (!initialized) { + GParamSpec *param_spec; + + initialized = TRUE; + + param_spec = g_param_spec_string ("object-path", "D-Bus object path", + "The D-Bus object path used for this " + "object on the bus.", + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_interface_install_property (klass, param_spec); + + param_spec = g_param_spec_string ("channel-type", "Telepathy channel type", + "The D-Bus interface representing the " + "type of this channel.", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_interface_install_property (klass, param_spec); + + param_spec = g_param_spec_uint ("handle-type", "Contact handle type", + "The TpHandleType representing a " + "contact handle.", + 0, G_MAXUINT32, 0, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_interface_install_property (klass, param_spec); + + param_spec = g_param_spec_uint ("handle", "Contact handle", + "The GabbleHandle representing the contact " + "with whom this channel communicates.", + 0, G_MAXUINT32, 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB); + g_object_interface_install_property (klass, param_spec); + } +} + + +GType +tp_channel_iface_get_type (void) +{ + +#ifndef EMULATOR + static GType type = 0; +#endif + + + if (type == 0) { + static const GTypeInfo info = { + sizeof (TpChannelIfaceClass), + tp_channel_iface_base_init, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + + type = g_type_register_static (G_TYPE_INTERFACE, "TpChannelIface", &info, 0); + } + + return type; +} diff -r 000000000000 -r d0f3a028347a telepathygabble/src/util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/util.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,267 @@ +/* + * util.c - Source for Gabble utility functions + * Copyright (C) 2006 Collabora Ltd. + * + * @author Robert McQueen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include "namespaces.h" +#include "gabble-connection.h" + +#include "util.h" +#include "sha1.h" + +gchar * +sha1_hex (const gchar *bytes, guint len) +{ + SHA1Context sc; + uint8_t hash[SHA1_HASH_SIZE]; + gchar *hex_hash = g_malloc (SHA1_HASH_SIZE*2 + 1); + int i; + + SHA1Init (&sc); + SHA1Update (&sc, bytes, len); + SHA1Final (&sc, hash); + + for (i = 0; i < SHA1_HASH_SIZE; i++) + { + sprintf (hex_hash + 2 * i, "%02x", (unsigned int) hash[i]); + } + + return hex_hash; +} + +gboolean +g_strdiff (const gchar *left, const gchar *right) +{ + if ((NULL == left) != (NULL == right)) + return TRUE; + + else if (left == right) + return FALSE; + + else + return (0 != strcmp (left, right)); +} + +static void +lm_message_node_add_nick (LmMessageNode *node, const gchar *nick) +{ + LmMessageNode *nick_node; + + nick_node = lm_message_node_add_child (node, "nick", nick); + lm_message_node_set_attribute (nick_node, "xmlns", NS_NICK); +} + +void +lm_message_node_add_own_nick (LmMessageNode *node, + GabbleConnection *connection) +{ + gchar *nick; + GabbleConnectionAliasSource source; + + source = _gabble_connection_get_cached_alias (connection, + connection->self_handle, &nick); + + if (source > GABBLE_CONNECTION_ALIAS_FROM_JID) + lm_message_node_add_nick (node, nick); + + g_free (nick); +} + +void +lm_message_node_steal_children (LmMessageNode *snatcher, + LmMessageNode *mum) +{ + LmMessageNode *baby; + + g_return_if_fail (snatcher->children == NULL); + + if (mum->children == NULL) + return; + + snatcher->children = mum->children; + mum->children = NULL; + + for (baby = snatcher->children; + baby != NULL; + baby = baby->next) + baby->parent = snatcher; +} + +gboolean +lm_message_node_has_namespace (LmMessageNode *node, + const gchar *ns, + const gchar *tag) +{ + gchar *attribute = NULL; + const gchar *node_ns; + gboolean ret; + + if (tag != NULL) + attribute = g_strconcat ("xmlns:", tag, NULL); + + node_ns = lm_message_node_get_attribute (node, + tag != NULL ? attribute : "xmlns"); + + ret = !g_strdiff (node_ns, ns); + + g_free (attribute); + + return ret; +} + +LmMessageNode * +lm_message_node_get_child_with_namespace (LmMessageNode *node, + const gchar *name, + const gchar *ns) +{ + LmMessageNode *tmp; + + for (tmp = node->children; + tmp != NULL; + tmp = tmp->next) + { + gchar *tag = NULL; + gboolean found; + + if (g_strdiff (tmp->name, name)) + { + const gchar *suffix; + + suffix = strchr (tmp->name, ':'); + + if (suffix == NULL) + continue; + else + suffix++; + + if (g_strdiff (suffix, name)) + continue; + + tag = g_strndup (tmp->name, suffix - tmp->name - 1); + } + + found = lm_message_node_has_namespace (tmp, ns, tag); + + g_free (tag); + + if (found) + return tmp; + } + + return NULL; +} + +/** + * gabble_decode_jid + * + * Parses a JID which may be one of the following forms: + * server + * server/resource + * username@server + * username@server/resource + * room@service/nick + * and sets the caller's username_room, server_service and resource_nick + * pointers to the username/room, server/service and resource/nick parts + * respectively, if available in the provided JID. The caller may set any of + * the pointers to NULL if they are not interested in a certain component. + * + * The returned values may be NULL or zero-length if a component was either + * not present or zero-length respectively in the given JID. The username/room + * and server/service are lower-cased because the Jabber protocol treats them + * case-insensitively. + */ +void +gabble_decode_jid (const gchar *jid, + gchar **username_room, + gchar **server_service, + gchar **resource_nick) +{ + char *tmp_jid, *tmp_username, *tmp_server, *tmp_resource; + + g_assert (jid != NULL); + g_assert (*jid != '\0'); + + if (username_room != NULL) + *username_room = NULL; + + if (server_service != NULL) + *server_service = NULL; + + if (resource_nick != NULL) + *resource_nick = NULL; + + /* take a local copy so we don't modify the caller's string */ + tmp_jid = g_strdup (jid); + + /* find an @ in username, truncate username to that length, and point + * 'server' to the byte afterwards */ + tmp_server = strchr (tmp_jid, '@'); + if (tmp_server) + { + tmp_username = tmp_jid; + + *tmp_server = '\0'; + tmp_server++; + + /* store the username if the user provided a pointer */ + if (username_room != NULL) + *username_room = g_utf8_strdown (tmp_username, -1); + } + else + { + tmp_username = NULL; + tmp_server = tmp_jid; + } + + /* if we have a server, find a / in it, truncate it to that length, and point + * 'resource' to the byte afterwards. otherwise, do the same to username to + * find any resource there. */ + tmp_resource = strchr (tmp_server, '/'); + if (tmp_resource) + { + *tmp_resource = '\0'; + tmp_resource++; + + /* store the resource if the user provided a pointer */ + if (resource_nick != NULL) + *resource_nick = g_strdup (tmp_resource); + } + + /* the server must be stored after the resource, in case we truncated a + * resource from it */ + if (server_service != NULL) + *server_service = g_utf8_strdown (tmp_server, -1); + + /* free our working copy */ + g_free (tmp_jid); +} + +/* extend a pointer by an offset, provided the offset is not 0 */ +gpointer +gabble_mixin_offset_cast (gpointer instance, + guint offset) +{ + g_return_val_if_fail (offset != 0, NULL); + + return ((guchar *) instance + offset); +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/vcard-manager.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/vcard-manager.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,956 @@ +/* + * vcard-manager.c - Source for Gabble vCard lookup helper + * + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include +#include + +#include "debug.h" +#include "gabble-connection.h" +#include "namespaces.h" +#include "telepathy-helpers.h" +#include "util.h" +#include "vcard-manager.h" + +#include "gabble_enums.h" + +#define DBUS_API_SUBJECT_TO_CHANGE +#define DEBUG_FLAG GABBLE_DEBUG_VCARD +#define DEFAULT_REQUEST_TIMEOUT 20000 + +#ifdef DEBUG_FLAG +//#define DEBUG(format, ...) +#define DEBUGGING 0 +#define NODE_DEBUG(n, s) +#endif /* DEBUG_FLAG */ + + +#ifndef EMULATOR +G_DEFINE_TYPE(GabbleVCardManager, gabble_vcard_manager, G_TYPE_OBJECT); +#endif + +/* signal enum */ +enum +{ + NICKNAME_UPDATE, + LAST_SIGNAL +#ifdef EMULATOR + = LAST_SIGNAL_VCARD_MGR +#endif + +}; + +#ifdef EMULATOR +#include "libgabble_wsd_solution.h" + + GET_STATIC_ARRAY_FROM_TLS(signals,gabble_vcard_mgr,guint) + #define signals (GET_WSD_VAR_NAME(signals,gabble_vcard_mgr, s)()) + + GET_STATIC_VAR_FROM_TLS(quark1,gabble_vcard_mgr,GQuark) + #define quark1 (*GET_WSD_VAR_NAME(quark1,gabble_vcard_mgr, s)()) + + GET_STATIC_VAR_FROM_TLS(quark2,gabble_vcard_mgr,GQuark) + #define quark2 (*GET_WSD_VAR_NAME(quark2,gabble_vcard_mgr, s)()) + + GET_STATIC_VAR_FROM_TLS(gabble_vcard_manager_parent_class,gabble_vcard_mgr,gpointer) + #define gabble_vcard_manager_parent_class (*GET_WSD_VAR_NAME(gabble_vcard_manager_parent_class,gabble_vcard_mgr,s)()) + + GET_STATIC_VAR_FROM_TLS(g_define_type_id,gabble_vcard_mgr,GType) + #define g_define_type_id (*GET_WSD_VAR_NAME(g_define_type_id,gabble_vcard_mgr,s)()) + + GET_STATIC_ARRAY_FROM_TLS(NO_ALIAS,gabble_vcard_mgr,gchar) + #define NO_ALIAS (GET_WSD_VAR_NAME(NO_ALIAS,gabble_vcard_mgr,s)()) + +static void gabble_vcard_manager_init (GabbleVCardManager *self); +static void gabble_vcard_manager_class_init (GabbleVCardManagerClass *klass); +static void gabble_vcard_manager_class_intern_init (gpointer klass) + { + gabble_vcard_manager_parent_class = g_type_class_peek_parent (klass); + gabble_vcard_manager_class_init ((GabbleVCardManagerClass*) klass); + } + EXPORT_C GType gabble_vcard_manager_get_type (void) + { + if ((g_define_type_id == 0)) { static const GTypeInfo g_define_type_info = { sizeof (GabbleVCardManagerClass), (GBaseInitFunc) ((void *)0), (GBaseFinalizeFunc) ((void *)0), (GClassInitFunc) gabble_vcard_manager_class_intern_init, (GClassFinalizeFunc) ((void *)0), ((void *)0), sizeof (GabbleVCardManager), 0, (GInstanceInitFunc) gabble_vcard_manager_init, ((void *)0) }; g_define_type_id = g_type_register_static ( ((GType) ((20) << (2))), g_intern_static_string ("GabbleVCardManager"), &g_define_type_info, (GTypeFlags) 0); { {} ; } } return g_define_type_id; } ; + +#else + + static guint signals[LAST_SIGNAL] = {0}; + + static const gchar *NO_ALIAS = "none"; + +#endif + + +/* Properties */ +enum +{ + PROP_CONNECTION = 1, + LAST_PROPERTY +}; + + + +typedef struct _GabbleVCardManagerPrivate GabbleVCardManagerPrivate; +struct _GabbleVCardManagerPrivate +{ + GabbleConnection *connection; + GList *requests; + gboolean dispose_has_run; +}; + +struct _GabbleVCardManagerRequest +{ + GabbleVCardManager *manager; + guint timer_id; + guint timeout; + + GabbleHandle handle; + gchar **edit_args; + + GabbleVCardManagerCb callback; + gpointer user_data; + GObject *bound_object; +}; + +GQuark +gabble_vcard_manager_error_quark (void) +{ + +#ifndef EMULATOR + static GQuark quark1 = 0; +#endif + + if (!quark1) + quark1 = g_quark_from_static_string ("gabble-vcard-manager-error"); + return quark1; +} + +GQuark +gabble_vcard_manager_cache_quark (void) +{ + +#ifndef EMULATOR + static GQuark quark2 = 0; +#endif + + if (!quark2) + quark2 = g_quark_from_static_string ("gabble-vcard-manager-cache"); + return quark2; +} + +#define GABBLE_VCARD_MANAGER_GET_PRIVATE(o) ((GabbleVCardManagerPrivate*)((o)->priv)); + +static void +gabble_vcard_manager_init (GabbleVCardManager *obj) +{ + GabbleVCardManagerPrivate *priv = + G_TYPE_INSTANCE_GET_PRIVATE (obj, GABBLE_TYPE_VCARD_MANAGER, GabbleVCardManagerPrivate); + obj->priv = priv; + +} + +static void gabble_vcard_manager_set_property (GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec); +static void gabble_vcard_manager_get_property (GObject *object, guint property_id, + GValue *value, GParamSpec *pspec); +static void gabble_vcard_manager_dispose (GObject *object); +static void gabble_vcard_manager_finalize (GObject *object); + +static void +gabble_vcard_manager_class_init (GabbleVCardManagerClass *gabble_vcard_manager_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (gabble_vcard_manager_class); + GParamSpec *param_spec; + + g_type_class_add_private (gabble_vcard_manager_class, sizeof (GabbleVCardManagerPrivate)); + + object_class->get_property = gabble_vcard_manager_get_property; + object_class->set_property = gabble_vcard_manager_set_property; + + object_class->dispose = gabble_vcard_manager_dispose; + object_class->finalize = gabble_vcard_manager_finalize; + + param_spec = g_param_spec_object ("connection", "GabbleConnection object", + "Gabble connection object that owns this " + "vCard lookup helper object.", + GABBLE_TYPE_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + /* signal definitions */ + + signals[NICKNAME_UPDATE] = + g_signal_new ("nickname-update", + G_TYPE_FROM_CLASS (gabble_vcard_manager_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + +} + +static void +gabble_vcard_manager_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GabbleVCardManager *chan = GABBLE_VCARD_MANAGER (object); + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + g_value_set_object (value, priv->connection); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gabble_vcard_manager_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GabbleVCardManager *chan = GABBLE_VCARD_MANAGER (object); + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (chan); + + switch (property_id) { + case PROP_CONNECTION: + priv->connection = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void cancel_request (GabbleVCardManagerRequest *request); + +void +gabble_vcard_manager_dispose (GObject *object) +{ + DBusGProxy *bus_proxy; + GabbleVCardManager *self = GABBLE_VCARD_MANAGER (object); + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (self); + bus_proxy = tp_get_bus_proxy (); + + if (priv->dispose_has_run) + return; + + priv->dispose_has_run = TRUE; + + /* cancel request removes the element from the list after cancelling */ + while (priv->requests) + cancel_request (priv->requests->data); + + if (G_OBJECT_CLASS (gabble_vcard_manager_parent_class)->dispose) + G_OBJECT_CLASS (gabble_vcard_manager_parent_class)->dispose (object); +} + +void +gabble_vcard_manager_finalize (GObject *object) +{ + G_OBJECT_CLASS (gabble_vcard_manager_parent_class)->finalize (object); +} + +static void +status_changed_cb (GObject *object, + guint status, + guint reason, + gpointer user_data) +{ + GabbleVCardManager *self = GABBLE_VCARD_MANAGER (user_data); + GabbleConnection *conn = GABBLE_CONNECTION (object); + + if (status == TP_CONN_STATUS_CONNECTED) + { + gchar *alias; + GabbleConnectionAliasSource alias_src; + + /* if we have a better alias, patch it into our vCard on the server */ + alias_src = _gabble_connection_get_cached_alias (conn, + conn->self_handle, + &alias); + if (alias_src > GABBLE_CONNECTION_ALIAS_FROM_VCARD) + { + /* ignore errors, just kick off the request in the background */ + gabble_vcard_manager_edit (self, 0, NULL, NULL, G_OBJECT (conn), + NULL, "NICKNAME", alias, NULL); + } + else + { + /* find out our own alias, so it's in the cache; again, + * there's nothing useful we can do with errors really + */ + gabble_vcard_manager_request (self, conn->self_handle, + 0, NULL, NULL, NULL, NULL); + } + + g_free(alias); + } +} + +/** + * gabble_vcard_manager_new: + * @conn: The #GabbleConnection to use for vCard lookup + * + * Creates an object to use for Jabber vCard lookup (JEP 0054). + * There should be one of these per connection + */ +GabbleVCardManager * +gabble_vcard_manager_new (GabbleConnection *conn) +{ + GabbleVCardManager *self; + + g_return_val_if_fail (GABBLE_IS_CONNECTION (conn), NULL); + + self = GABBLE_VCARD_MANAGER (g_object_new (GABBLE_TYPE_VCARD_MANAGER, "connection", conn, NULL)); + g_signal_connect (conn, "status-changed", + G_CALLBACK (status_changed_cb), self); + return self; +} + +static void notify_delete_request (gpointer data, GObject *obj); + +static void +delete_request (GabbleVCardManagerRequest *request) +{ + GabbleVCardManager *manager = request->manager; + GabbleVCardManagerPrivate *priv; + + gabble_debug (DEBUG_FLAG, "Discarding request %p", request); + + g_assert (NULL != request); + g_assert (GABBLE_IS_VCARD_MANAGER (manager)); + + priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + + g_assert (NULL != g_list_find (priv->requests, request)); + + priv->requests = g_list_remove (priv->requests, request); + + if (NULL != request->bound_object) + { + g_object_weak_unref (request->bound_object, notify_delete_request, request); + } + + if (0 != request->timer_id) + { + g_source_remove (request->timer_id); + } + + gabble_handle_unref (priv->connection->handles, TP_HANDLE_TYPE_CONTACT, + request->handle); + g_strfreev (request->edit_args); + + g_free (request); +} + +static gboolean +timeout_request (gpointer data) +{ + GabbleVCardManagerRequest *request = (GabbleVCardManagerRequest*) data; + GError *err; + g_return_val_if_fail (data != NULL, FALSE); + + err = g_error_new (GABBLE_VCARD_MANAGER_ERROR, GABBLE_VCARD_MANAGER_ERROR_TIMEOUT, + "Request timed out"); + gabble_debug (DEBUG_FLAG, "Request %p timed out, notifying callback %p", + request, request->callback); + if (request->callback) + { + (request->callback)(request->manager, request, request->handle, + NULL, err, request->user_data); + } + g_error_free (err); + + request->timer_id = 0; + delete_request (request); + return FALSE; +} + +static void +cancel_request (GabbleVCardManagerRequest *request) +{ + GError *err; + + g_assert (request != NULL); + + err = g_error_new (GABBLE_VCARD_MANAGER_ERROR, GABBLE_VCARD_MANAGER_ERROR_CANCELLED, + "Request cancelled"); + gabble_debug (DEBUG_FLAG, "Request %p cancelled, notifying callback %p", + request, request->callback); + if (request->callback) + { + (request->callback)(request->manager, request, request->handle, + NULL, err, request->user_data); + } + g_error_free (err); + + delete_request (request); +} + +static void +observe_vcard (GabbleConnection *conn, GabbleVCardManager *manager, + GabbleHandle handle, LmMessageNode *vcard_node) +{ + LmMessageNode *nick_node = lm_message_node_get_child (vcard_node, + "NICKNAME"); + + gabble_debug (DEBUG_FLAG, "Observing vCard for %u", handle); + NODE_DEBUG(vcard_node, "their vCard is"); + + if (nick_node) + { + const gchar *nick = lm_message_node_get_value (nick_node); + + gabble_debug (DEBUG_FLAG, "%u has \"%s\"", handle, nick ? nick : "(null)"); + + if (nick && *nick) + { + /* nicknames are comma-separated, let's use the first one */ + gchar **bits = g_strsplit (nick, ",", 2); + + if (bits[0]) + { + gchar *alias = g_strdup (bits[0]); + + gabble_debug (DEBUG_FLAG, "... using \"%s\" as their alias", alias); + + g_signal_emit (G_OBJECT (manager), signals[NICKNAME_UPDATE], + 0, handle); + if (!gabble_handle_set_qdata (conn->handles, + TP_HANDLE_TYPE_CONTACT, + handle, + gabble_vcard_manager_cache_quark(), + alias, g_free)) + { + gabble_debug (DEBUG_FLAG, "failed to cache their alias"); + g_free (alias); + } + + } + + g_strfreev (bits); + } + } + else + { + const gchar *fn = NULL; + /* let's see if they have a FN (formatted name) instead */ + nick_node = lm_message_node_get_child (vcard_node, "FN"); + if (nick_node) + fn = lm_message_node_get_value (nick_node); + gabble_debug (DEBUG_FLAG, "%u has no , but has \"%s\"", handle, + fn ? fn : "(null)"); + if (fn && *fn) + { + gchar *alias = g_strdup (fn); + + gabble_debug (DEBUG_FLAG, "... using \"%s\" as their alias", alias); + + g_signal_emit (G_OBJECT (manager), signals[NICKNAME_UPDATE], + 0, handle); + if (!gabble_handle_set_qdata (conn->handles, + TP_HANDLE_TYPE_CONTACT, + handle, + gabble_vcard_manager_cache_quark(), + alias, g_free)) + { + gabble_debug (DEBUG_FLAG, "failed to cache their alias"); + g_free (alias); + } + } + else + { + /* remember that they don't have an alias */ + if (!gabble_handle_set_qdata (conn->handles, + TP_HANDLE_TYPE_CONTACT, + handle, + gabble_vcard_manager_cache_quark (), + (gchar *) NO_ALIAS, NULL)) + gabble_debug (DEBUG_FLAG, "failed to cache their lack of vcard alias"); + } + + } +} + +static GabbleVCardManagerRequest *request_send (GabbleVCardManagerRequest *, + LmMessageNode *replacement, + const gchar *jid, + GError **); + +static LmHandlerResult +replace_reply_cb (GabbleConnection *conn, LmMessage *sent_msg, + LmMessage *reply_msg, GObject *object, gpointer user_data) +{ + LmMessageNode *vcard_node = NULL; + GError *err = NULL; + GabbleVCardManagerRequest *request = (GabbleVCardManagerRequest*) user_data; + GabbleVCardManager *manager = GABBLE_VCARD_MANAGER (object); + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + + g_assert (request); + + gabble_debug (DEBUG_FLAG, "Replace request got a reply: conn@%p, sent_msg@%p, reply_msg@%p, " + "bound object@%p, request@%p", conn, sent_msg, reply_msg, object, + user_data); + + if (!g_list_find (priv->requests, request)) + { + gabble_debug (DEBUG_FLAG, "I don't care about that request any more"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + if (lm_message_get_sub_type (reply_msg) == LM_MESSAGE_SUB_TYPE_ERROR) + { + LmMessageNode *error_node; + + error_node = lm_message_node_get_child (reply_msg->node, "error"); + if (error_node) + { + err = gabble_xmpp_error_to_g_error ( + gabble_xmpp_error_from_node (error_node)); + } + + if (err == NULL) + { + err = g_error_new (GABBLE_VCARD_MANAGER_ERROR, + GABBLE_VCARD_MANAGER_ERROR_UNKNOWN, + "an unknown error occurred"); + } + } + else + { + vcard_node = lm_message_node_get_child (sent_msg->node, "vCard"); + } + + gabble_debug (DEBUG_FLAG, "Request %p %s, notifying callback %p", request, + err ? "failed" : "succeeded", request->callback); + if (request->callback) + { + request->callback (request->manager, request, request->handle, + vcard_node, err, request->user_data); + } + delete_request (request); + + if (err) + g_error_free (err); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static LmHandlerResult +request_reply_cb (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + GObject *object, + gpointer user_data) +{ + LmMessageNode *vcard_node = NULL; + GError *err = NULL; + GabbleVCardManagerRequest *request = (GabbleVCardManagerRequest*) user_data; + GabbleVCardManager *manager = GABBLE_VCARD_MANAGER (object); + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + + g_assert (request); + + gabble_debug (DEBUG_FLAG, "Fetch request got a reply: conn@%p, sent_msg@%p, reply_msg@%p, " + "bound object@%p, request@%p", conn, sent_msg, reply_msg, object, + user_data); + + if (!g_list_find (priv->requests, request)) + { + gabble_debug (DEBUG_FLAG, "I don't care about that request any more"); + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + + if (lm_message_get_sub_type (reply_msg) == LM_MESSAGE_SUB_TYPE_ERROR) + { + LmMessageNode *error_node; + + error_node = lm_message_node_get_child (reply_msg->node, "error"); + if (error_node) + { + err = gabble_xmpp_error_to_g_error ( + gabble_xmpp_error_from_node (error_node)); + } + + if (err == NULL) + { + err = g_error_new (GABBLE_VCARD_MANAGER_ERROR, + GABBLE_VCARD_MANAGER_ERROR_UNKNOWN, + "an unknown error occurred"); + } + } + else + { + vcard_node = lm_message_node_get_child (reply_msg->node, "vCard"); + + if (NULL == vcard_node) + { + gabble_debug (DEBUG_FLAG, "successful lookup response contained no node, " + "creating an empty one"); + + vcard_node = lm_message_node_add_child (reply_msg->node, "vCard", + NULL); + lm_message_node_set_attribute (vcard_node, "xmlns", NS_VCARD_TEMP); + } + + observe_vcard (conn, manager, request->handle, vcard_node); + } + + if (vcard_node && request->edit_args) + { + gchar **ptr; + for (ptr = request->edit_args; *ptr; ptr++) + { + gchar *key = *ptr; + gchar *value = *(++ptr); + LmMessageNode *node; + + if (!value) + { + /* oops, someone passed in an odd number of args. */ + g_assert_not_reached (); + break; + } + + node = lm_message_node_get_child (vcard_node, key); + if (node) + { + lm_message_node_set_value (node, value); + } + else + { + node = lm_message_node_add_child (vcard_node, key, value); + } + } + + request_send (request, vcard_node, NULL, &err); + + if (err) + { + gabble_debug (DEBUG_FLAG, "Request %p failed, notifying callback %p", + request, request->callback); + if (request->callback) + { + request->callback (request->manager, request, request->handle, + NULL, err, request->user_data); + } + } + else + { + gabble_debug (DEBUG_FLAG, "Request %p fetch succeeded", request); + /* early return to avoid deleting the request */ + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + } + else + { + gabble_debug (DEBUG_FLAG, "Request %p %s, notifying callback %p", + request, err ? "failed" : "succeeded", request->callback); + if (request->callback) + { + request->callback (request->manager, request, request->handle, + vcard_node, err, request->user_data); + } + } + + delete_request (request); + + if (err) + g_error_free (err); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +/* If @replacement is NULL sends a request, calling request_reply_cb when + * it returns. + * + * Otherwise steals its children and sends an update, calling + * replace_reply_cb when it returns. + * + * Frees the @request on error, returns it on success. */ +static GabbleVCardManagerRequest * +request_send (GabbleVCardManagerRequest *request, + LmMessageNode *replacement, + const gchar *jid, + GError **error) +{ + LmMessage *msg; + LmMessageNode *lm_node; + GabbleVCardManager *self = request->manager; + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (self); + + gabble_debug (DEBUG_FLAG, "Sending off request %p to %s for %s", request, + replacement ? "replace vCard" : "retrieve vCard", + jid ? jid : "myself"); + msg = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, + (replacement + ? LM_MESSAGE_SUB_TYPE_SET + : LM_MESSAGE_SUB_TYPE_GET)); + lm_node = lm_message_node_add_child (msg->node, "vCard", NULL); + lm_message_node_set_attribute (lm_node, "xmlns", NS_VCARD_TEMP); + + if (replacement) + lm_message_node_steal_children (lm_node, replacement); + + if (! _gabble_connection_send_with_reply (priv->connection, msg, + (replacement ? replace_reply_cb : request_reply_cb), + G_OBJECT(self), request, error)) + { + delete_request (request); + lm_message_unref (msg); + return NULL; + } + else + { + if (0 == request->timer_id) + { + request->timer_id = + g_timeout_add (request->timeout, timeout_request, request); + } + lm_message_unref (msg); + return request; + } +} + +static void +notify_delete_request (gpointer data, GObject *obj) +{ + GabbleVCardManagerRequest *request = (GabbleVCardManagerRequest *) data; + request->bound_object = NULL; + delete_request (request); +} + +/* Request the vCard for the given handle. When it arrives, call the given + * callback. + * + * The callback may be NULL if you just want the side-effect of this + * operation, which is to update the cached alias. + */ +GabbleVCardManagerRequest * +gabble_vcard_manager_request (GabbleVCardManager *self, + GabbleHandle handle, + guint timeout, + GabbleVCardManagerCb callback, + gpointer user_data, + GObject *object, + GError **error) +{ + GabbleVCardManagerRequest *request; + const gchar *jid; + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (self); + + if (timeout == 0) + timeout = DEFAULT_REQUEST_TIMEOUT; + + request = g_new0 (GabbleVCardManagerRequest, 1); + gabble_debug (DEBUG_FLAG, "Created request %p to retrieve <%u>'s vCard", + request, handle); + request->timeout = timeout; + request->manager = self; + gabble_handle_ref (priv->connection->handles, TP_HANDLE_TYPE_CONTACT, + handle); + request->handle = handle; + request->callback = callback; + request->user_data = user_data; + request->bound_object = object; + + if (NULL != object) + g_object_weak_ref (object, notify_delete_request, request); + + priv->requests = g_list_prepend (priv->requests, request); + if (handle == priv->connection->self_handle) + { + jid = NULL; + } + else + { + jid = gabble_handle_inspect (priv->connection->handles, + TP_HANDLE_TYPE_CONTACT, handle); + } + + return request_send (request, NULL, jid, error); +} + +GabbleVCardManagerRequest * +gabble_vcard_manager_replace (GabbleVCardManager *self, + LmMessageNode *replacement, + guint timeout, + GabbleVCardManagerCb callback, + gpointer user_data, + GObject *object, + GError **error) +{ + GabbleVCardManagerRequest *request; + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (self); + + if (timeout == 0) + timeout = DEFAULT_REQUEST_TIMEOUT; + + request = g_new0 (GabbleVCardManagerRequest, 1); + gabble_debug (DEBUG_FLAG, "Created request %p to replace my vCard", + request); + request->timeout = timeout; + request->manager = self; + gabble_handle_ref (priv->connection->handles, TP_HANDLE_TYPE_CONTACT, + priv->connection->self_handle); + request->handle = priv->connection->self_handle; + request->callback = callback; + request->user_data = user_data; + request->bound_object = object; + + if (NULL != object) + g_object_weak_ref (object, notify_delete_request, request); + + priv->requests = g_list_prepend (priv->requests, request); + + return request_send (request, replacement, NULL, error); +} + +GabbleVCardManagerRequest * +gabble_vcard_manager_edit (GabbleVCardManager *self, + guint timeout, + GabbleVCardManagerCb callback, + gpointer user_data, + GObject *object, + GError **error, + ...) +{ + va_list ap; + size_t i, argc; + GabbleVCardManagerRequest *request; + GabbleVCardManagerPrivate *priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (self); + + if (timeout == 0) + timeout = DEFAULT_REQUEST_TIMEOUT; + + request = g_new0 (GabbleVCardManagerRequest, 1); + gabble_debug (DEBUG_FLAG, "Created request %p to edit my vCard", request); + request->timeout = timeout; + request->manager = self; + gabble_handle_ref (priv->connection->handles, TP_HANDLE_TYPE_CONTACT, + priv->connection->self_handle); + request->handle = priv->connection->self_handle; + request->callback = callback; + request->user_data = user_data; + request->bound_object = object; + + if (NULL != object) + g_object_weak_ref (object, notify_delete_request, request); + + priv->requests = g_list_prepend (priv->requests, request); + + argc = 0; + va_start (ap, error); + while (va_arg (ap, const gchar *) != NULL) + { + argc++; + } + va_end (ap); + g_return_val_if_fail (argc % 2 == 0, NULL); + + request->edit_args = g_new (gchar *, argc + 1); + + va_start (ap, error); + for (i = 0; i < argc; i++) + { + request->edit_args[i] = g_strdup (va_arg (ap, const gchar *)); + } + request->edit_args[argc] = NULL; + va_end (ap); + + return request_send (request, NULL, NULL, error); +} + +void +gabble_vcard_manager_cancel_request (GabbleVCardManager *manager, + GabbleVCardManagerRequest *request) +{ + GabbleVCardManagerPrivate *priv; + + g_return_if_fail (GABBLE_IS_VCARD_MANAGER (manager)); + g_return_if_fail (NULL != request); + + priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + + g_return_if_fail (NULL != g_list_find (priv->requests, request)); + + cancel_request (request); +} + +/** + * Return the cached alias derived from the vCard for the given handle, + * if any. If there is no cached alias, return NULL. + */ +const gchar * +gabble_vcard_manager_get_cached_alias (GabbleVCardManager *manager, + GabbleHandle handle) +{ + GabbleVCardManagerPrivate *priv; + const gchar *s; + + g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (manager), NULL); + + priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + + s = gabble_handle_get_qdata (priv->connection->handles, + TP_HANDLE_TYPE_CONTACT, + handle, + gabble_vcard_manager_cache_quark()); + + if (s == NO_ALIAS) + s = NULL; + + gabble_debug (DEBUG_FLAG, "Cached alias for %u is \"%s\"", handle, s ? s : "(null)"); + return s; +} + +/** + * Return TRUE if we've tried looking up an alias for this handle before. + */ +gboolean +gabble_vcard_manager_has_cached_alias (GabbleVCardManager *manager, + GabbleHandle handle) +{ + GabbleVCardManagerPrivate *priv; + gpointer p; + + g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (manager), FALSE); + + priv = GABBLE_VCARD_MANAGER_GET_PRIVATE (manager); + p = gabble_handle_get_qdata (priv->connection->handles, + TP_HANDLE_TYPE_CONTACT, + handle, + gabble_vcard_manager_cache_quark()); + return p != NULL; +} + diff -r 000000000000 -r d0f3a028347a telepathygabble/src/write-mgr-file.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telepathygabble/src/write-mgr-file.c Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,104 @@ +/* + * write_mgr_file.c - utility to produce gabble.manager. Part of Gabble. + * Copyright (C) 2006 Collabora Ltd. + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include + +#include "telepathy-constants.h" +#include "gabble-connection-manager.h" + +static gchar * +mgr_file_contents (const char *busname, + const char *objpath, + const GabbleProtocolSpec *protocols, + GError **error) +{ + GKeyFile *f = g_key_file_new(); + const GabbleProtocolSpec *protocol; + const GabbleParamSpec *row; + + g_key_file_set_string(f, "ConnectionManager", "BusName", busname); + g_key_file_set_string(f, "ConnectionManager", "ObjectPath", objpath); + + for (protocol = protocols; protocol->name; protocol++) + { + gchar *section_name = g_strdup_printf("Protocol %s", protocol->name); + + for (row = protocol->parameters; row->name; row++) + { + gchar *param_name = g_strdup_printf("param-%s", row->name); + gchar *param_value = g_strdup_printf("%s%s%s", row->dtype, + (row->flags & TP_CONN_MGR_PARAM_FLAG_REQUIRED ? " required" : ""), + (row->flags & TP_CONN_MGR_PARAM_FLAG_REGISTER ? " register" : "")); + g_key_file_set_string(f, section_name, param_name, param_value); + g_free(param_value); + g_free(param_name); + } + + for (row = protocol->parameters; row->name; row++) + { + if (row->flags & TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT) + { + gchar *default_name = g_strdup_printf("default-%s", row->name); + + switch (row->gtype) + { + case G_TYPE_STRING: + g_key_file_set_string(f, section_name, default_name, + row->def); + break; + case G_TYPE_INT: + case G_TYPE_UINT: + g_key_file_set_integer(f, section_name, default_name, + GPOINTER_TO_INT(row->def)); + break; + case G_TYPE_BOOLEAN: + g_key_file_set_boolean(f, section_name, default_name, + GPOINTER_TO_INT(row->def) ? 1 : 0); + } + g_free(default_name); + } + } + g_free(section_name); + } + return g_key_file_to_data(f, NULL, error); +} + +int +main (void) +{ + GError *error = NULL; + + gchar *s = mgr_file_contents(GABBLE_CONN_MGR_BUS_NAME, + GABBLE_CONN_MGR_OBJECT_PATH, + gabble_protocols, &error); + if (!s) + { + fprintf(stderr, error->message); + g_error_free(error); + return 1; + } + g_message("%s", s); + getchar(); //vinod + g_free(s); + return 0; +}