os/ossrv/ofdbus/dbus/tsrc/testapps/method/src/method.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include<stdio.h>  
sl@0
    20
#include "test-utils.h"
sl@0
    21
#include<string.h> 
sl@0
    22
#include<ctype.h>
sl@0
    23
#include<unistd.h>  
sl@0
    24
#define TEST_BUS_NAME_TEMP "Test.Method.Call"
sl@0
    25
 
sl@0
    26
void called_method(DBusMessage* msg, DBusConnection* connection)
sl@0
    27
{
sl@0
    28
	DBusMessage* reply; 
sl@0
    29
	DBusMessageIter args;
sl@0
    30
	DBusMessageIter in_args;
sl@0
    31
	
sl@0
    32
	char* in_str;
sl@0
    33
	DBusError error;
sl@0
    34
	   
sl@0
    35
	dbus_uint32_t status = 94;
sl@0
    36
sl@0
    37
	dbus_error_init(&error);
sl@0
    38
	dbus_message_iter_init(msg, &in_args);
sl@0
    39
	 
sl@0
    40
	reply = dbus_message_new_method_return(msg);
sl@0
    41
	dbus_message_iter_init_append(reply, &args);
sl@0
    42
	  
sl@0
    43
	do{
sl@0
    44
		dbus_message_iter_get_basic(&in_args, &in_str);
sl@0
    45
					
sl@0
    46
		dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &in_str);
sl@0
    47
		
sl@0
    48
	}while(dbus_message_iter_next(&in_args));
sl@0
    49
	 
sl@0
    50
	dbus_connection_send(connection, reply, NULL);
sl@0
    51
	
sl@0
    52
	dbus_connection_flush(connection);
sl@0
    53
}
sl@0
    54
sl@0
    55
sl@0
    56
void called_variable_args_method(DBusMessage* msg, DBusConnection* connection)
sl@0
    57
{
sl@0
    58
	DBusMessage* reply;
sl@0
    59
	DBusMessageIter iter;
sl@0
    60
	DBusMessageIter sub_iter;
sl@0
    61
	void* arg = malloc(20);
sl@0
    62
	char* str;
sl@0
    63
	int no;
sl@0
    64
	int i;
sl@0
    65
	dbus_int32_t* array;
sl@0
    66
	dbus_int32_t return_value = 0;
sl@0
    67
	dbus_bool_t valid_flag = TRUE;
sl@0
    68
	
sl@0
    69
sl@0
    70
	
sl@0
    71
	
sl@0
    72
	reply = dbus_message_new_method_return(msg);
sl@0
    73
	dbus_message_iter_init(msg, &iter);
sl@0
    74
	
sl@0
    75
	do{
sl@0
    76
		switch(dbus_message_iter_get_arg_type(&iter))
sl@0
    77
		{
sl@0
    78
			case DBUS_TYPE_BOOLEAN:
sl@0
    79
				dbus_message_iter_get_basic(&iter, arg);
sl@0
    80
				if(*(dbus_bool_t*)arg != TRUE)
sl@0
    81
					valid_flag = FALSE;
sl@0
    82
				break;
sl@0
    83
			case DBUS_TYPE_INT16:
sl@0
    84
				dbus_message_iter_get_basic(&iter, arg);
sl@0
    85
				if(*(dbus_int16_t*)arg != -16)
sl@0
    86
					valid_flag = FALSE;
sl@0
    87
				break;
sl@0
    88
			case DBUS_TYPE_INT32:
sl@0
    89
				dbus_message_iter_get_basic(&iter, arg);
sl@0
    90
				if(*(dbus_int32_t*)arg != -32)
sl@0
    91
					valid_flag = FALSE;
sl@0
    92
				break;
sl@0
    93
			case DBUS_TYPE_INT64:
sl@0
    94
				dbus_message_iter_get_basic(&iter, arg);
sl@0
    95
				if(*(dbus_int64_t*)arg != -64)
sl@0
    96
					valid_flag = FALSE;
sl@0
    97
				break;
sl@0
    98
			case DBUS_TYPE_UINT16:
sl@0
    99
				dbus_message_iter_get_basic(&iter, arg);
sl@0
   100
				if(*(dbus_uint16_t*)arg != 16)
sl@0
   101
					valid_flag = FALSE;
sl@0
   102
				break;
sl@0
   103
			case DBUS_TYPE_UINT32:
sl@0
   104
				dbus_message_iter_get_basic(&iter, arg);
sl@0
   105
				if(*(dbus_uint32_t*)arg != 32)
sl@0
   106
					valid_flag = FALSE;
sl@0
   107
				break;
sl@0
   108
			case DBUS_TYPE_UINT64:
sl@0
   109
				dbus_message_iter_get_basic(&iter, arg);
sl@0
   110
				if(*(dbus_uint64_t*)arg != 64)
sl@0
   111
					valid_flag = FALSE;
sl@0
   112
				break;
sl@0
   113
			case DBUS_TYPE_DOUBLE:
sl@0
   114
				dbus_message_iter_get_basic(&iter, arg);
sl@0
   115
				if(*(double*)arg != 12.34567)
sl@0
   116
					valid_flag = FALSE;
sl@0
   117
				break;
sl@0
   118
			case DBUS_TYPE_STRING:
sl@0
   119
				dbus_message_iter_get_basic(&iter, &str);
sl@0
   120
				if(strcmp("DBus Testing", str))
sl@0
   121
					valid_flag = FALSE;
sl@0
   122
				break;
sl@0
   123
			case DBUS_TYPE_ARRAY: 
sl@0
   124
				dbus_message_iter_recurse(&iter, &sub_iter);
sl@0
   125
				no = dbus_message_iter_get_array_len(&sub_iter);
sl@0
   126
				dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0
   127
				for(i=0;i<no;i++)
sl@0
   128
					if(array[i] != (i+1))
sl@0
   129
						valid_flag = FALSE;
sl@0
   130
				break;
sl@0
   131
			case DBUS_TYPE_STRUCT: 
sl@0
   132
				dbus_message_iter_recurse(&iter, &sub_iter);
sl@0
   133
				do{
sl@0
   134
					switch(dbus_message_iter_get_arg_type(&sub_iter))
sl@0
   135
					{
sl@0
   136
					case DBUS_TYPE_INT32: 
sl@0
   137
						dbus_message_iter_get_basic(&sub_iter, arg);
sl@0
   138
						if(*(dbus_int32_t*)arg != -32)
sl@0
   139
							valid_flag = FALSE;
sl@0
   140
						break;    
sl@0
   141
					case DBUS_TYPE_STRING:
sl@0
   142
						dbus_message_iter_get_basic(&sub_iter, &str);
sl@0
   143
						if(strcmp("DBus Testing", str))
sl@0
   144
							valid_flag = FALSE;
sl@0
   145
						break;
sl@0
   146
					case DBUS_TYPE_DOUBLE:
sl@0
   147
						dbus_message_iter_get_basic(&sub_iter, arg);
sl@0
   148
						if(*(double*)arg != 12.34567)
sl@0
   149
							valid_flag = FALSE;
sl@0
   150
						break;
sl@0
   151
					default: 
sl@0
   152
						valid_flag = FALSE;
sl@0
   153
					
sl@0
   154
					}                               
sl@0
   155
				}while(dbus_message_iter_next(&sub_iter));
sl@0
   156
				
sl@0
   157
				break; 
sl@0
   158
			default: 
sl@0
   159
				valid_flag = FALSE;
sl@0
   160
		}
sl@0
   161
	}while(dbus_message_iter_next(&iter));
sl@0
   162
	
sl@0
   163
	if(!valid_flag)
sl@0
   164
		return_value = 1;
sl@0
   165
	else
sl@0
   166
		return_value = 0;
sl@0
   167
	
sl@0
   168
	dbus_message_append_args(reply, DBUS_TYPE_INT32, &return_value, DBUS_TYPE_INVALID);
sl@0
   169
	dbus_connection_send(connection, reply, NULL);
sl@0
   170
	dbus_connection_flush(connection);
sl@0
   171
}
sl@0
   172
 
sl@0
   173
void called_simple(DBusMessage* msg, DBusConnection* connection)
sl@0
   174
{
sl@0
   175
	DBusMessage* reply;	
sl@0
   176
	dbus_int32_t return_value = 9090;
sl@0
   177
	
sl@0
   178
	reply = dbus_message_new_method_return(msg);
sl@0
   179
	
sl@0
   180
	dbus_message_append_args(reply, DBUS_TYPE_INT32, &return_value, DBUS_TYPE_INVALID);
sl@0
   181
	dbus_connection_send(connection, reply, NULL);
sl@0
   182
	dbus_connection_flush(connection);
sl@0
   183
}
sl@0
   184
sl@0
   185
sl@0
   186
void called_file_send(DBusMessage* msg, DBusConnection* connection)
sl@0
   187
{
sl@0
   188
	DBusMessage* reply;
sl@0
   189
	int return_value = 8080;
sl@0
   190
	DBusMessageIter iter;
sl@0
   191
	DBusMessageIter sub_iter;
sl@0
   192
	int no; 
sl@0
   193
	unsigned char* array;
sl@0
   194
	FILE* fp=NULL; 
sl@0
   195
	
sl@0
   196
	dbus_message_iter_init(msg, &iter);
sl@0
   197
	dbus_message_iter_recurse(&iter, &sub_iter);
sl@0
   198
	no = dbus_message_iter_get_array_len(&sub_iter);
sl@0
   199
	dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0
   200
	
sl@0
   201
	fp = fopen("c:\\data\\images\\pictures\\bunbask1.jpg", "a+"); 
sl@0
   202
	if(!fp) 
sl@0
   203
	{
sl@0
   204
		printf("Failed to open file");
sl@0
   205
		return;
sl@0
   206
	}
sl@0
   207
	
sl@0
   208
	fwrite(array, sizeof(unsigned char), no, fp);
sl@0
   209
	
sl@0
   210
	if(fp)
sl@0
   211
		fclose(fp);
sl@0
   212
	
sl@0
   213
	reply = dbus_message_new_method_return(msg);
sl@0
   214
	dbus_connection_send(connection, reply, NULL);
sl@0
   215
	dbus_connection_flush(connection);
sl@0
   216
}
sl@0
   217
sl@0
   218
void called_file_send_time(DBusMessage* msg,DBusConnection* connection)
sl@0
   219
	{
sl@0
   220
		DBusMessageIter iter;
sl@0
   221
		DBusMessageIter sub_iter;
sl@0
   222
		int no; 
sl@0
   223
		unsigned char* array;
sl@0
   224
		FILE* fp=NULL; 
sl@0
   225
		DBusMessage* reply;
sl@0
   226
		char* file_name;
sl@0
   227
		
sl@0
   228
		reply = dbus_message_new_method_return(msg);
sl@0
   229
		dbus_connection_send(connection, reply, NULL);
sl@0
   230
		dbus_connection_flush(connection);
sl@0
   231
		
sl@0
   232
		dbus_message_iter_init(msg, &iter);
sl@0
   233
		dbus_message_iter_get_basic(&iter, &file_name);
sl@0
   234
		dbus_message_iter_next(&iter);
sl@0
   235
		dbus_message_iter_recurse(&iter, &sub_iter);
sl@0
   236
		no = dbus_message_iter_get_array_len(&sub_iter);
sl@0
   237
		dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0
   238
		
sl@0
   239
		strcat(file_name, "_1");
sl@0
   240
		fp = fopen(file_name, "w+");
sl@0
   241
		if(!fp) 
sl@0
   242
		{
sl@0
   243
			printf("Failed to open file %s", file_name);
sl@0
   244
			getchar();
sl@0
   245
		}
sl@0
   246
		
sl@0
   247
		fwrite(array, sizeof(unsigned char), no, fp);
sl@0
   248
		if(fp)
sl@0
   249
			fclose(fp);
sl@0
   250
	}
sl@0
   251
sl@0
   252
void called_sign_test(DBusMessage* msg, DBusConnection* connection)
sl@0
   253
{
sl@0
   254
	DBusError error;
sl@0
   255
	const char* signature;
sl@0
   256
	const char* msg_sign;
sl@0
   257
	const char* msg_sign1;
sl@0
   258
	DBusSignatureIter sign_iter;
sl@0
   259
	DBusSignatureIter sub_sign_iter;
sl@0
   260
	DBusSignatureIter sub_sign_iter1;
sl@0
   261
	DBusMessageIter iter;
sl@0
   262
	DBusMessage* reply;
sl@0
   263
	int type;
sl@0
   264
	int sub_type;
sl@0
   265
	const char* sub_signature;
sl@0
   266
	
sl@0
   267
	dbus_error_init(&error);
sl@0
   268
	
sl@0
   269
	dbus_message_iter_init(msg, &iter);
sl@0
   270
	msg_sign = dbus_message_iter_get_signature(&iter);
sl@0
   271
	dbus_message_iter_next(&iter);
sl@0
   272
	dbus_message_iter_next(&iter);
sl@0
   273
	msg_sign1 = dbus_message_iter_get_signature(&iter);
sl@0
   274
	
sl@0
   275
	signature = dbus_message_get_signature(msg);
sl@0
   276
	dbus_signature_iter_init(&sign_iter, signature);
sl@0
   277
	if(dbus_signature_validate_single(signature, &error))
sl@0
   278
	{
sl@0
   279
		exit(1);
sl@0
   280
	}
sl@0
   281
	do{
sl@0
   282
		type = dbus_signature_iter_get_current_type(&sign_iter);
sl@0
   283
		switch(type)
sl@0
   284
		{
sl@0
   285
		case DBUS_TYPE_ARRAY:
sl@0
   286
			dbus_signature_iter_recurse(&sign_iter, &sub_sign_iter1);
sl@0
   287
			sub_type = dbus_signature_iter_get_element_type(&sign_iter);
sl@0
   288
			break;
sl@0
   289
		case DBUS_TYPE_STRUCT:
sl@0
   290
			dbus_signature_iter_recurse(&sign_iter, &sub_sign_iter);
sl@0
   291
			sub_signature = dbus_signature_iter_get_signature(&sign_iter); 
sl@0
   292
			dbus_error_init(&error);
sl@0
   293
			if(!dbus_signature_validate_single(sub_signature, &error))
sl@0
   294
			{
sl@0
   295
				exit(1);
sl@0
   296
			}
sl@0
   297
			break;
sl@0
   298
		}
sl@0
   299
	}while(dbus_signature_iter_next(&sign_iter));
sl@0
   300
	
sl@0
   301
	reply = dbus_message_new_method_return(msg);
sl@0
   302
	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
   303
	dbus_connection_send(connection, reply, NULL);
sl@0
   304
	dbus_connection_flush(connection);
sl@0
   305
	
sl@0
   306
	dbus_free((void*)msg_sign);
sl@0
   307
	dbus_free((void*)msg_sign1);
sl@0
   308
	dbus_message_unref(reply);
sl@0
   309
}
sl@0
   310
sl@0
   311
void called_file_send_whole(DBusMessage* msg, DBusConnection* connection)
sl@0
   312
	{
sl@0
   313
		DBusMessageIter iter;
sl@0
   314
		DBusMessageIter sub_iter;
sl@0
   315
		int no; 
sl@0
   316
		unsigned char* array;
sl@0
   317
		FILE* fp=NULL;
sl@0
   318
		DBusMessage* reply;
sl@0
   319
		
sl@0
   320
		reply = dbus_message_new_method_return(msg);
sl@0
   321
		dbus_connection_send(connection, reply, NULL);
sl@0
   322
		dbus_connection_flush(connection);
sl@0
   323
		
sl@0
   324
		dbus_message_iter_init(msg, &iter);
sl@0
   325
		dbus_message_iter_recurse(&iter, &sub_iter);
sl@0
   326
		no = dbus_message_iter_get_array_len(&sub_iter);
sl@0
   327
		dbus_message_iter_get_fixed_array(&sub_iter, &array, &no);
sl@0
   328
		
sl@0
   329
		fp = fopen("c:\\data\\Images\\Pictures\\test.mp3", "a+"); 
sl@0
   330
		if(!fp) 
sl@0
   331
		{
sl@0
   332
			printf("Failed to open file");
sl@0
   333
			getchar();
sl@0
   334
		}
sl@0
   335
		
sl@0
   336
		fwrite(array, sizeof(unsigned char), no, fp);
sl@0
   337
		
sl@0
   338
		if(fp)
sl@0
   339
			fclose(fp);
sl@0
   340
		
sl@0
   341
		dbus_message_unref(reply);
sl@0
   342
	}
sl@0
   343
sl@0
   344
int main()
sl@0
   345
{
sl@0
   346
	DBusError error;
sl@0
   347
	DBusError error1;
sl@0
   348
	DBusConnection* connection;
sl@0
   349
	DBusMessage* msg;
sl@0
   350
	DBusObjectPathVTable vtable = 
sl@0
   351
	{
sl@0
   352
		NULL,NULL,NULL
sl@0
   353
	}; 
sl@0
   354
	
sl@0
   355
	dbus_error_init(&error);
sl@0
   356
	dbus_error_init(&error1);
sl@0
   357
sl@0
   358
	connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
sl@0
   359
	
sl@0
   360
	if(dbus_error_is_set(&error))
sl@0
   361
	{
sl@0
   362
		fprintf(stdout, "Error Occured :: %s", error.name);
sl@0
   363
		return 1;
sl@0
   364
	}
sl@0
   365
	
sl@0
   366
sl@0
   367
	
sl@0
   368
	if(dbus_connection_register_object_path (connection, "/Test/Method/Object", &vtable, NULL))
sl@0
   369
	{
sl@0
   370
		fprintf(stdout, "Object Path registered.");
sl@0
   371
	}
sl@0
   372
	else
sl@0
   373
	{
sl@0
   374
		fprintf(stdout, "Object Path not able to register.");
sl@0
   375
		return 1;
sl@0
   376
	}
sl@0
   377
 
sl@0
   378
sl@0
   379
sl@0
   380
	if(dbus_bus_request_name (connection, TEST_BUS_NAME_TEMP, DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &error1) == -1)
sl@0
   381
	{
sl@0
   382
		fprintf(stdout, "Not able to request name.");
sl@0
   383
	}
sl@0
   384
	else
sl@0
   385
	{
sl@0
   386
		fprintf(stdout, "Name Request Successful");
sl@0
   387
	}
sl@0
   388
	
sl@0
   389
	while(TRUE)
sl@0
   390
	{	
sl@0
   391
		dbus_connection_read_write(connection, 0);
sl@0
   392
		
sl@0
   393
		msg = dbus_connection_pop_message(connection);
sl@0
   394
			
sl@0
   395
		if(msg == NULL)
sl@0
   396
		{
sl@0
   397
			sleep(1);
sl@0
   398
			continue;
sl@0
   399
		}
sl@0
   400
		     
sl@0
   401
		fprintf(stdout, "Message Detected");
sl@0
   402
		
sl@0
   403
		if(DBUS_MESSAGE_TYPE_SIGNAL == dbus_message_get_type(msg))
sl@0
   404
		{
sl@0
   405
			fprintf(stdout, "Message is Signal.");
sl@0
   406
		}
sl@0
   407
		
sl@0
   408
		if(DBUS_MESSAGE_TYPE_METHOD_CALL == dbus_message_get_type(msg))
sl@0
   409
		{
sl@0
   410
			fprintf(stdout, "Message is Method call.");
sl@0
   411
		}
sl@0
   412
		
sl@0
   413
				
sl@0
   414
		if(dbus_message_is_method_call(msg, "test.Method.Call", "method"))
sl@0
   415
			{
sl@0
   416
			called_method(msg, connection);
sl@0
   417
			break;
sl@0
   418
			} 
sl@0
   419
		
sl@0
   420
		if(dbus_message_is_method_call(msg, "test.Method.Call", "variable_args_method"))
sl@0
   421
			{
sl@0
   422
			
sl@0
   423
			called_variable_args_method(msg, connection);
sl@0
   424
			break;
sl@0
   425
			} 
sl@0
   426
		 
sl@0
   427
		if(dbus_message_is_method_call(msg, "test.Method.Call", "simple"))
sl@0
   428
			{
sl@0
   429
			
sl@0
   430
			called_simple(msg, connection);
sl@0
   431
	//		break;
sl@0
   432
			}
sl@0
   433
		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send"))
sl@0
   434
			{
sl@0
   435
			
sl@0
   436
			called_file_send(msg, connection);
sl@0
   437
	//		break; 
sl@0
   438
			} 
sl@0
   439
		if(dbus_message_is_method_call(msg, "test.Method.Call", "sign_test"))
sl@0
   440
			{
sl@0
   441
			
sl@0
   442
			called_sign_test(msg, connection);
sl@0
   443
			break; 
sl@0
   444
			} 
sl@0
   445
		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send_whole"))
sl@0
   446
			{
sl@0
   447
			
sl@0
   448
			called_file_send_whole(msg, connection);
sl@0
   449
			break; 
sl@0
   450
			}
sl@0
   451
		
sl@0
   452
		if(dbus_message_is_method_call(msg, "test.Method.Call", "file_send_time"))
sl@0
   453
			{
sl@0
   454
			
sl@0
   455
			called_file_send_time(msg, connection);
sl@0
   456
	//		break;
sl@0
   457
			}
sl@0
   458
		
sl@0
   459
	dbus_message_unref(msg);	
sl@0
   460
		
sl@0
   461
	}
sl@0
   462
	
sl@0
   463
	dbus_message_unref(msg);
sl@0
   464
	dbus_bus_release_name(connection,TEST_BUS_NAME_TEMP,&error1);
sl@0
   465
	dbus_connection_unregister_object_path(connection,"/Test/Method/Object");
sl@0
   466
sl@0
   467
	dbus_connection_unref(connection);	
sl@0
   468
sl@0
   469
	return 0;
sl@0
   470
}