isolationserver/isoserver/src/isoutils.c
changeset 0 d0f3a028347a
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#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;
+	
+	}