isolationserver/isoserver/src/isoservermain.c
changeset 10 59927b2d3b75
parent 0 d0f3a028347a
--- a/isolationserver/isoserver/src/isoservermain.c	Tue Feb 02 01:10:06 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,496 +0,0 @@
-/*
-* ============================================================================
-*  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 <glib.h>
-
-#include <gtypes.h>
-#include <sys/types.h>   
-#include <stdlib.h>
-#include <string.h>
-
-#include <netinet/in.h>
-#include <stdio.h>  
-#include <netdb.h>
-#include <unistd.h>
-#include <errno.h>
-#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;
-	}