sl@0: /*
sl@0: * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0: * All rights reserved.
sl@0: * This component and the accompanying materials are made available
sl@0: * under the terms of "Eclipse Public License v1.0"
sl@0: * which accompanies this distribution, and is available
sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: *
sl@0: * Initial Contributors:
sl@0: * Nokia Corporation - initial contribution.
sl@0: *
sl@0: * Contributors:
sl@0: *
sl@0: * Description: 
sl@0: *
sl@0: */
sl@0: 
sl@0: 
sl@0: #include<stdio.h>  
sl@0: #include "test-utils.h"
sl@0: #include<string.h> 
sl@0: #include<ctype.h>
sl@0: #include<unistd.h>  
sl@0: #define TEST_BUS_NAME_TEMP "Test.Method.Call"
sl@0:  
sl@0: void called_method(DBusMessage* msg, DBusConnection* connection)
sl@0: {
sl@0: 	DBusMessage* reply; 
sl@0: 	DBusMessageIter args;
sl@0: 	DBusMessageIter in_args;
sl@0: 	
sl@0: 	char* in_str;
sl@0: 	DBusError error;
sl@0: 	   
sl@0: 	dbus_uint32_t status = 94;
sl@0: 
sl@0: 	dbus_error_init(&error);
sl@0: 	dbus_message_iter_init(msg, &in_args);
sl@0: 	 
sl@0: 	reply = dbus_message_new_method_return(msg);
sl@0: 	dbus_message_iter_init_append(reply, &args);
sl@0: 	  
sl@0: 	do{
sl@0: 		dbus_message_iter_get_basic(&in_args, &in_str);
sl@0: 					
sl@0: 		dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &in_str);
sl@0: 		
sl@0: 	}while(dbus_message_iter_next(&in_args));
sl@0: 	 
sl@0: 	dbus_connection_send(connection, reply, NULL);
sl@0: 	
sl@0: 	dbus_connection_flush(connection);
sl@0: }
sl@0: 
sl@0: 
sl@0: void called_variable_args_method(DBusMessage* msg, DBusConnection* connection)
sl@0: {
sl@0: 	DBusMessage* reply;
sl@0: 	DBusMessageIter iter;
sl@0: 	DBusMessageIter sub_iter;
sl@0: 	void* arg = malloc(20);
sl@0: 	char* str;
sl@0: 	int no;
sl@0: 	int i;
sl@0: 	dbus_int32_t* array;
sl@0: 	dbus_int32_t return_value = 0;
sl@0: 	dbus_bool_t valid_flag = TRUE;
sl@0: 	
sl@0: 
sl@0: 	
sl@0: 	
sl@0: 	reply = dbus_message_new_method_return(msg);
sl@0: 	dbus_message_iter_init(msg, &iter);
sl@0: 	
sl@0: 	do{
sl@0: 		switch(dbus_message_iter_get_arg_type(&iter))
sl@0: 		{
sl@0: 			case DBUS_TYPE_BOOLEAN:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_bool_t*)arg != TRUE)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_INT16:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_int16_t*)arg != -16)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_INT32:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_int32_t*)arg != -32)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_INT64:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_int64_t*)arg != -64)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_UINT16:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_uint16_t*)arg != 16)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_UINT32:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_uint32_t*)arg != 32)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_UINT64:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(dbus_uint64_t*)arg != 64)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_DOUBLE:
sl@0: 				dbus_message_iter_get_basic(&iter, arg);
sl@0: 				if(*(double*)arg != 12.34567)
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_STRING:
sl@0: 				dbus_message_iter_get_basic(&iter, &str);
sl@0: 				if(strcmp("DBus Testing", str))
sl@0: 					valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_ARRAY: 
sl@0: 				dbus_message_iter_recurse(&iter, &sub_iter);
sl@0: 				no = dbus_message_iter_get_array_len(&sub_iter);
sl@0: 				dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0: 				for(i=0;i<no;i++)
sl@0: 					if(array[i] != (i+1))
sl@0: 						valid_flag = FALSE;
sl@0: 				break;
sl@0: 			case DBUS_TYPE_STRUCT: 
sl@0: 				dbus_message_iter_recurse(&iter, &sub_iter);
sl@0: 				do{
sl@0: 					switch(dbus_message_iter_get_arg_type(&sub_iter))
sl@0: 					{
sl@0: 					case DBUS_TYPE_INT32: 
sl@0: 						dbus_message_iter_get_basic(&sub_iter, arg);
sl@0: 						if(*(dbus_int32_t*)arg != -32)
sl@0: 							valid_flag = FALSE;
sl@0: 						break;    
sl@0: 					case DBUS_TYPE_STRING:
sl@0: 						dbus_message_iter_get_basic(&sub_iter, &str);
sl@0: 						if(strcmp("DBus Testing", str))
sl@0: 							valid_flag = FALSE;
sl@0: 						break;
sl@0: 					case DBUS_TYPE_DOUBLE:
sl@0: 						dbus_message_iter_get_basic(&sub_iter, arg);
sl@0: 						if(*(double*)arg != 12.34567)
sl@0: 							valid_flag = FALSE;
sl@0: 						break;
sl@0: 					default: 
sl@0: 						valid_flag = FALSE;
sl@0: 					
sl@0: 					}                               
sl@0: 				}while(dbus_message_iter_next(&sub_iter));
sl@0: 				
sl@0: 				break; 
sl@0: 			default: 
sl@0: 				valid_flag = FALSE;
sl@0: 		}
sl@0: 	}while(dbus_message_iter_next(&iter));
sl@0: 	
sl@0: 	if(!valid_flag)
sl@0: 		return_value = 1;
sl@0: 	else
sl@0: 		return_value = 0;
sl@0: 	
sl@0: 	dbus_message_append_args(reply, DBUS_TYPE_INT32, &return_value, DBUS_TYPE_INVALID);
sl@0: 	dbus_connection_send(connection, reply, NULL);
sl@0: 	dbus_connection_flush(connection);
sl@0: }
sl@0:  
sl@0: void called_simple(DBusMessage* msg, DBusConnection* connection)
sl@0: {
sl@0: 	DBusMessage* reply;	
sl@0: 	dbus_int32_t return_value = 9090;
sl@0: 	
sl@0: 	reply = dbus_message_new_method_return(msg);
sl@0: 	
sl@0: 	dbus_message_append_args(reply, DBUS_TYPE_INT32, &return_value, DBUS_TYPE_INVALID);
sl@0: 	dbus_connection_send(connection, reply, NULL);
sl@0: 	dbus_connection_flush(connection);
sl@0: }
sl@0: 
sl@0: 
sl@0: void called_file_send(DBusMessage* msg, DBusConnection* connection)
sl@0: {
sl@0: 	DBusMessage* reply;
sl@0: 	int return_value = 8080;
sl@0: 	DBusMessageIter iter;
sl@0: 	DBusMessageIter sub_iter;
sl@0: 	int no; 
sl@0: 	unsigned char* array;
sl@0: 	FILE* fp=NULL; 
sl@0: 	
sl@0: 	dbus_message_iter_init(msg, &iter);
sl@0: 	dbus_message_iter_recurse(&iter, &sub_iter);
sl@0: 	no = dbus_message_iter_get_array_len(&sub_iter);
sl@0: 	dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0: 	
sl@0: 	fp = fopen("c:\\data\\images\\pictures\\bunbask1.jpg", "a+"); 
sl@0: 	if(!fp) 
sl@0: 	{
sl@0: 		printf("Failed to open file");
sl@0: 		return;
sl@0: 	}
sl@0: 	
sl@0: 	fwrite(array, sizeof(unsigned char), no, fp);
sl@0: 	
sl@0: 	if(fp)
sl@0: 		fclose(fp);
sl@0: 	
sl@0: 	reply = dbus_message_new_method_return(msg);
sl@0: 	dbus_connection_send(connection, reply, NULL);
sl@0: 	dbus_connection_flush(connection);
sl@0: }
sl@0: 
sl@0: void called_file_send_time(DBusMessage* msg,DBusConnection* connection)
sl@0: 	{
sl@0: 		DBusMessageIter iter;
sl@0: 		DBusMessageIter sub_iter;
sl@0: 		int no; 
sl@0: 		unsigned char* array;
sl@0: 		FILE* fp=NULL; 
sl@0: 		DBusMessage* reply;
sl@0: 		char* file_name;
sl@0: 		
sl@0: 		reply = dbus_message_new_method_return(msg);
sl@0: 		dbus_connection_send(connection, reply, NULL);
sl@0: 		dbus_connection_flush(connection);
sl@0: 		
sl@0: 		dbus_message_iter_init(msg, &iter);
sl@0: 		dbus_message_iter_get_basic(&iter, &file_name);
sl@0: 		dbus_message_iter_next(&iter);
sl@0: 		dbus_message_iter_recurse(&iter, &sub_iter);
sl@0: 		no = dbus_message_iter_get_array_len(&sub_iter);
sl@0: 		dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0: 		
sl@0: 		strcat(file_name, "_1");
sl@0: 		fp = fopen(file_name, "w+");
sl@0: 		if(!fp) 
sl@0: 		{
sl@0: 			printf("Failed to open file %s", file_name);
sl@0: 			getchar();
sl@0: 		}
sl@0: 		
sl@0: 		fwrite(array, sizeof(unsigned char), no, fp);
sl@0: 		if(fp)
sl@0: 			fclose(fp);
sl@0: 	}
sl@0: 
sl@0: void called_sign_test(DBusMessage* msg, DBusConnection* connection)
sl@0: {
sl@0: 	DBusError error;
sl@0: 	const char* signature;
sl@0: 	const char* msg_sign;
sl@0: 	const char* msg_sign1;
sl@0: 	DBusSignatureIter sign_iter;
sl@0: 	DBusSignatureIter sub_sign_iter;
sl@0: 	DBusSignatureIter sub_sign_iter1;
sl@0: 	DBusMessageIter iter;
sl@0: 	DBusMessage* reply;
sl@0: 	int type;
sl@0: 	int sub_type;
sl@0: 	const char* sub_signature;
sl@0: 	
sl@0: 	dbus_error_init(&error);
sl@0: 	
sl@0: 	dbus_message_iter_init(msg, &iter);
sl@0: 	msg_sign = dbus_message_iter_get_signature(&iter);
sl@0: 	dbus_message_iter_next(&iter);
sl@0: 	dbus_message_iter_next(&iter);
sl@0: 	msg_sign1 = dbus_message_iter_get_signature(&iter);
sl@0: 	
sl@0: 	signature = dbus_message_get_signature(msg);
sl@0: 	dbus_signature_iter_init(&sign_iter, signature);
sl@0: 	if(dbus_signature_validate_single(signature, &error))
sl@0: 	{
sl@0: 		exit(1);
sl@0: 	}
sl@0: 	do{
sl@0: 		type = dbus_signature_iter_get_current_type(&sign_iter);
sl@0: 		switch(type)
sl@0: 		{
sl@0: 		case DBUS_TYPE_ARRAY:
sl@0: 			dbus_signature_iter_recurse(&sign_iter, &sub_sign_iter1);
sl@0: 			sub_type = dbus_signature_iter_get_element_type(&sign_iter);
sl@0: 			break;
sl@0: 		case DBUS_TYPE_STRUCT:
sl@0: 			dbus_signature_iter_recurse(&sign_iter, &sub_sign_iter);
sl@0: 			sub_signature = dbus_signature_iter_get_signature(&sign_iter); 
sl@0: 			dbus_error_init(&error);
sl@0: 			if(!dbus_signature_validate_single(sub_signature, &error))
sl@0: 			{
sl@0: 				exit(1);
sl@0: 			}
sl@0: 			break;
sl@0: 		}
sl@0: 	}while(dbus_signature_iter_next(&sign_iter));
sl@0: 	
sl@0: 	reply = dbus_message_new_method_return(msg);
sl@0: 	dbus_message_append_args(reply, DBUS_TYPE_SIGNATURE, &signature, DBUS_TYPE_SIGNATURE, &sub_signature, DBUS_TYPE_INT32, &sub_type, DBUS_TYPE_SIGNATURE, &msg_sign, DBUS_TYPE_SIGNATURE, &msg_sign1, DBUS_TYPE_INVALID);
sl@0: 	dbus_connection_send(connection, reply, NULL);
sl@0: 	dbus_connection_flush(connection);
sl@0: 	
sl@0: 	dbus_free((void*)msg_sign);
sl@0: 	dbus_free((void*)msg_sign1);
sl@0: 	dbus_message_unref(reply);
sl@0: }
sl@0: 
sl@0: void called_file_send_whole(DBusMessage* msg, DBusConnection* connection)
sl@0: 	{
sl@0: 		DBusMessageIter iter;
sl@0: 		DBusMessageIter sub_iter;
sl@0: 		int no; 
sl@0: 		unsigned char* array;
sl@0: 		FILE* fp=NULL;
sl@0: 		DBusMessage* reply;
sl@0: 		
sl@0: 		reply = dbus_message_new_method_return(msg);
sl@0: 		dbus_connection_send(connection, reply, NULL);
sl@0: 		dbus_connection_flush(connection);
sl@0: 		
sl@0: 		dbus_message_iter_init(msg, &iter);
sl@0: 		dbus_message_iter_recurse(&iter, &sub_iter);
sl@0: 		no = dbus_message_iter_get_array_len(&sub_iter);
sl@0: 		dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0: 		
sl@0: 		fp = fopen("c:\\data\\Images\\Pictures\\test.mp3", "a+"); 
sl@0: 		if(!fp) 
sl@0: 		{
sl@0: 			printf("Failed to open file");
sl@0: 			getchar();
sl@0: 		}
sl@0: 		
sl@0: 		fwrite(array, sizeof(unsigned char), no, fp);
sl@0: 		
sl@0: 		if(fp)
sl@0: 			fclose(fp);
sl@0: 		
sl@0: 		dbus_message_unref(reply);
sl@0: 	}
sl@0: 
sl@0: int main()
sl@0: {
sl@0: 	DBusError error;
sl@0: 	DBusError error1;
sl@0: 	DBusConnection* connection;
sl@0: 	DBusMessage* msg;
sl@0: 	DBusObjectPathVTable vtable = 
sl@0: 	{
sl@0: 		NULL,NULL,NULL
sl@0: 	}; 
sl@0: 	
sl@0: 	dbus_error_init(&error);
sl@0: 	dbus_error_init(&error1);
sl@0: 
sl@0: 	connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
sl@0: 	
sl@0: 	if(dbus_error_is_set(&error))
sl@0: 	{
sl@0: 		fprintf(stdout, "Error Occured :: %s", error.name);
sl@0: 		return 1;
sl@0: 	}
sl@0: 	
sl@0: 
sl@0: 	
sl@0: 	if(dbus_connection_register_object_path (connection, "/Test/Method/Object", &vtable, NULL))
sl@0: 	{
sl@0: 		fprintf(stdout, "Object Path registered.");
sl@0: 	}
sl@0: 	else
sl@0: 	{
sl@0: 		fprintf(stdout, "Object Path not able to register.");
sl@0: 		return 1;
sl@0: 	}
sl@0:  
sl@0: 
sl@0: 
sl@0: 	if(dbus_bus_request_name (connection, TEST_BUS_NAME_TEMP, DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &error1) == -1)
sl@0: 	{
sl@0: 		fprintf(stdout, "Not able to request name.");
sl@0: 	}
sl@0: 	else
sl@0: 	{
sl@0: 		fprintf(stdout, "Name Request Successful");
sl@0: 	}
sl@0: 	
sl@0: 	while(TRUE)
sl@0: 	{	
sl@0: 		dbus_connection_read_write(connection, 0);
sl@0: 		
sl@0: 		msg = dbus_connection_pop_message(connection);
sl@0: 			
sl@0: 		if(msg == NULL)
sl@0: 		{
sl@0: 			sleep(1);
sl@0: 			continue;
sl@0: 		}
sl@0: 		     
sl@0: 		fprintf(stdout, "Message Detected");
sl@0: 		
sl@0: 		if(DBUS_MESSAGE_TYPE_SIGNAL == dbus_message_get_type(msg))
sl@0: 		{
sl@0: 			fprintf(stdout, "Message is Signal.");
sl@0: 		}
sl@0: 		
sl@0: 		if(DBUS_MESSAGE_TYPE_METHOD_CALL == dbus_message_get_type(msg))
sl@0: 		{
sl@0: 			fprintf(stdout, "Message is Method call.");
sl@0: 		}
sl@0: 		
sl@0: 				
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "method"))
sl@0: 			{
sl@0: 			called_method(msg, connection);
sl@0: 			break;
sl@0: 			} 
sl@0: 		
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "variable_args_method"))
sl@0: 			{
sl@0: 			
sl@0: 			called_variable_args_method(msg, connection);
sl@0: 			break;
sl@0: 			} 
sl@0: 		 
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "simple"))
sl@0: 			{
sl@0: 			
sl@0: 			called_simple(msg, connection);
sl@0: 	//		break;
sl@0: 			}
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send"))
sl@0: 			{
sl@0: 			
sl@0: 			called_file_send(msg, connection);
sl@0: 	//		break; 
sl@0: 			} 
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "sign_test"))
sl@0: 			{
sl@0: 			
sl@0: 			called_sign_test(msg, connection);
sl@0: 			break; 
sl@0: 			} 
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send_whole"))
sl@0: 			{
sl@0: 			
sl@0: 			called_file_send_whole(msg, connection);
sl@0: 			break; 
sl@0: 			}
sl@0: 		
sl@0: 		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send_time"))
sl@0: 			{
sl@0: 			
sl@0: 			called_file_send_time(msg, connection);
sl@0: 	//		break;
sl@0: 			}
sl@0: 		
sl@0: 	dbus_message_unref(msg);	
sl@0: 		
sl@0: 	}
sl@0: 	
sl@0: 	dbus_message_unref(msg);
sl@0: 	dbus_bus_release_name(connection,TEST_BUS_NAME_TEMP,&error1);
sl@0: 	dbus_connection_unregister_object_path(connection,"/Test/Method/Object");
sl@0: 
sl@0: 	dbus_connection_unref(connection);	
sl@0: 
sl@0: 	return 0;
sl@0: }