doubango/tinySIP/test/test_stack.h
c732d49e
 /*
 * Copyright (C) 2009 Mamadou Diop.
 *
 * Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org>
 *	
 * This file is part of Open Source Doubango Framework.
 *
 * DOUBANGO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *	
 * DOUBANGO 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 General Public License
 * along with DOUBANGO.
 *
 */
 #ifndef _TEST_STACK_H
 #define _TEST_STACK_H
 
 #ifndef LOCAL_IP
 #	ifdef ANDROID
 #		define LOCAL_IP	"10.0.2.15"
 #	else
 #		define LOCAL_IP	TNET_SOCKET_HOST_ANY
 #	endif
 #endif
 
 #define TEST_STACK_SDP \
 	"v=0\r\n" \
 	"o=bob 2890844730 2890844731 IN IP4 host.example.com\r\n" \
 	"s=\r\n" \
 	"c=IN IP4 192.168.0.12\r\n" \
 	"t=0 0\r\n" \
 	"m=audio 54344 RTP/AVP 0\r\n" \
 	"a=rtpmap:0 PCMU/8000\r\n"
 
 #define TEST_STACK_PIDF \
 	"<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
 	"<presence xmlns:cp=\"urn:ietf:params:xml:ns:pidf:cipid\" xmlns:caps=\"urn:ietf:params:xml:ns:pidf:caps\" xmlns:rpid=\"urn:ietf:params:xml:ns:pidf:rpid\" xmlns:pdm=\"urn:ietf:params:xml:ns:pidf:data-model\" xmlns:p=\"urn:ietf:params:xml:ns:pidf-diff\" xmlns:op=\"urn:oma:xml:prs:pidf:oma-pres\" entity=\"sip:mamadou@"DOMAIN"\" xmlns=\"urn:ietf:params:xml:ns:pidf\">"\
 	"  <pdm:person id=\"CRUVREZS\">"\
 	"	<op:overriding-willingness>"\
 	"	  <op:basic>open</op:basic>"\
 	"	</op:overriding-willingness>"\
 	"	<rpid:activities>"\
 	"	  <rpid:unknown />"\
 	"	</rpid:activities>"\
 	"	<rpid:mood>"\
 	"	  <rpid:neutral />"\
 	"	</rpid:mood>"\
 	"	<pdm:note>Hello world</pdm:note>"\
 	"  </pdm:person>"\
 	"  <pdm:device id=\"d0001\">"\
 	"	<status>"\
 	"	  <basic>open</basic>"\
 	"	</status>"\
 	"	<caps:devcaps>"\
 	"	  <caps:mobility>"\
 	"		<caps:supported>"\
 	"		  <caps:fixed />"\
 	"		</caps:supported>"\
 	"	  </caps:mobility>"\
 	"	</caps:devcaps>"\
 	"	<op:network-availability>"\
 	"	  <op:network id=\"IMS\">"\
 	"		<op:active />"\
 	"	  </op:network>"\
 	"	</op:network-availability>"\
 	"	<pdm:deviceID>urn:uuid:dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc</pdm:deviceID>"\
 	"  </pdm:device>"\
 	"</presence>"
 
 int test_stack_callback(const tsip_event_t *sipevent)
 {
 	TSK_DEBUG_INFO("\n====\nSTACK event: %d [%s] with opid=%lld\n=====", 
 		sipevent->code, sipevent->phrase, tsip_ssession_get_id(sipevent->ss));
 
 	// For ssessions created by the stack ==> call tsk_object_ref(sipevent->ssession);
 	// to take ownership.
 	
 	switch(sipevent->type)
 	{
 		//
 		// REGISTER 
 		//
 		case tsip_event_register:
 			{
 				const tsip_register_event_t* _event;
 				TSK_DEBUG_INFO("SIP event(REGISTER)");
 				
 				_event = TSIP_REGISTER_EVENT(sipevent);
 				switch(_event->type){
 					case tsip_ao_register: /* Answer to Outgoing REGISTER */
 						{
 							if(TSIP_RESPONSE_IS_2XX(sipevent->sipmessage)){
 								TSK_DEBUG_INFO("Registration succeed.");
 							}
 							else{
 								TSK_DEBUG_INFO("Registration failed.");
 							}
 							break;
 						}
 					case tsip_ao_unregister: /* Answer to Outgoing UNREGISTER */
 						{
 							if(TSIP_RESPONSE_IS_2XX(sipevent->sipmessage)){
 								TSK_DEBUG_INFO("UnRegistration succeed.");
 							}
 							else{
 								TSK_DEBUG_INFO("UnRegistration failed.");
 							}
 							break;
 						}
 					default:
 						break;
 				}
 
 				break;
 			}
 
 		//
 		// INVITE
 		//
 		case tsip_event_invite:
 			{
 				TSK_DEBUG_INFO("SIP event(INVITE)");
 				break;
 			}
 
 		// 
 		// MESSAGE
 		//
 		case tsip_event_message:
 			{
 				const tsip_message_event_t* _event;
 				TSK_DEBUG_INFO("SIP event(MESSAGE)");
 				
 				_event = TSIP_MESSAGE_EVENT(sipevent);
 				switch(_event->type)
 				{
 					case tsip_i_message: /* Incoming MESSAGE */
 						{
 							if(TSIP_MESSAGE_HAS_CONTENT(sipevent->sipmessage)){
 								TSK_DEBUG_INFO("MESSAGE Content: %s", TSIP_MESSAGE_CONTENT(sipevent->sipmessage));
 							}
 							break;
 						}
 					case tsip_ao_message: /* Answer to Outgoing MESSAGE */
 						{
 							if(TSIP_RESPONSE_IS_2XX(sipevent->sipmessage)){
 								TSK_DEBUG_INFO("MESSAGE successfully sent.");
 							}
 							else{
 								TSK_DEBUG_INFO("Failed to send MESSAGE (sip code:%d).", TSIP_RESPONSE_CODE(sipevent->sipmessage));
 							}
 						}
 					default:
 						break;
 				}
 				
 				break;
 			}
 		
 		// 
 		// PUBLISH
 		//
 		case tsip_event_publish:
 			{
 				TSK_DEBUG_INFO("SIP event(PUBLISH)");
 				break;
 			}
 		
 		//
 		// SUBSCRIBE
 		//
 		case tsip_event_subscribe:
 			{
 				const tsip_subscribe_event_t* _event;
 				TSK_DEBUG_INFO("SIP event(SUBSCRIBE)");
 				
 				_event = TSIP_SUBSCRIBE_EVENT(sipevent);
 				switch(_event->type)
 				{
 				case tsip_i_notify: /* Incoming NOTIFY */
 					{
 						if(TSIP_MESSAGE_CONTENT_DATA(sipevent->sipmessage)){
 							TSK_DEBUG_INFO("NOTIFY Content: %s", TSIP_MESSAGE_CONTENT(sipevent->sipmessage));
 						}
 						break;
 					}
 				case tsip_ao_subscribe: /* Answer to Outgoing SUBSCRIBE */
 					{
 						if(TSIP_RESPONSE_IS_2XX(sipevent->sipmessage)){
 							TSK_DEBUG_INFO("Subscription succeed.");
 						}
 						else{
 							TSK_DEBUG_INFO("Subscription failed.");
 						}
 						break;
 					}
 				case tsip_ao_unsubscribe: /* Answer to Outgoing UNSUBSCRIBE */
 					{
 						if(TSIP_RESPONSE_IS_2XX(sipevent->sipmessage)){
 							TSK_DEBUG_INFO("UnSubscription succeed.");
 						}
 						else{
 							TSK_DEBUG_INFO("UnSubscription failed.");
 						}
 						break;
 					}
 				default:
 					break;
 				}
 
 				break;
 			}
 
 		default:
 			{
 				TSK_DEBUG_INFO("SIP event(UNKNOWN)");
 				break;
 			}
 	}
 
 	//tsk_thread_sleep(1000000);
 
 	return 0;
 }
 
 
 void test_stack()
 {
 #define DOMAIN "ericsson.com"
 //#define DOMAIN "micromethod.com"
 //#define DOMAIN "ims.inexbee.com"
 //#define DOMAIN "sip2sip.info"
 
 	const void* usr_context = tsk_null;
 	int ret;
 	uint16_t AMF = 0x0001;
 /*
 	tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, 
 		TSIP_STACK_SET_DISPLAY_NAME("2233392625"),
 		TSIP_STACK_SET_PUBLIC_IDENTITY("sip:2233392625@"DOMAIN),
 		TSIP_STACK_SET_PRIVATE_IDENTITY("2233392625"),
 		TSIP_STACK_SET_PASSWORD("d3sb7j4fb8"),
 		TSIP_STACK_SET_REALM("sip:"DOMAIN), // FIXME: without sip:
 		TSIP_STACK_SET_LOCAL_IP(LOCAL_IP),
 		//TSIP_STACK_SET_DISCOVERY_NAPTR(1),
 		//TSIP_STACK_SET_PROXY_CSCF("proxy.sipthor.net", "udp", 0),
 		//TSIP_STACK_SET_PROXY_CSCF("192.168.0.15", "udp", 0),
 		TSIP_STACK_SET_PROXY_CSCF_PORT(5060),
 		TSIP_STACK_SET_MOBILITY("fixed"),
 		TSIP_STACK_SET_DEVICE_ID("dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc"),
 		TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
 		TSIP_STACK_SET_PRIVACY("header;id"),
 */
 
 	/*
 	tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, 
 		TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
 		TSIP_STACK_SET_PUBLIC_IDENTITY("sip:mamadou@"DOMAIN),
 		TSIP_STACK_SET_PRIVATE_IDENTITY("mamadou@"DOMAIN),
 		TSIP_STACK_SET_PASSWORD("mamadou"),
 		TSIP_STACK_SET_REALM("sip:"DOMAIN), // FIXME: without sip:
 		TSIP_STACK_SET_LOCAL_IP(LOCAL_IP),
 		//TSIP_STACK_SET_DISCOVERY_NAPTR(1),
 		TSIP_STACK_SET_PROXY_CSCF("192.168.0.15", "udp", 0),
 		//TSIP_STACK_SET_PROXY_CSCF_PORT(5081),
 		TSIP_STACK_SET_PROXY_CSCF_PORT(5060),
 		//TSIP_STACK_SET_SECAGREE_IPSEC("hmac-md5-96", "null", "trans", "esp"),
 		TSIP_STACK_SET_MOBILITY("fixed"),
 		TSIP_STACK_SET_DEVICE_ID("dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc"),
 		TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
 		TSIP_STACK_SET_PRIVACY("header;id"),
 */
 
 	
 	
 	int32_t port = 4060;
 /*
 	tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, "sip:"DOMAIN, "mamadou@"DOMAIN, "sip:mamadou@"DOMAIN,
 		TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
 		TSIP_STACK_SET_PASSWORD("mamadou"),
 		TSIP_STACK_SET_IMS_AKA_AMF(AMF),
 		TSIP_STACK_SET_IMS_AKA_OPERATOR_ID("0xff08"),
 		TSIP_STACK_SET_HEADER("User-Agent", "IM-client/OMA1.0 doubango/v1.0.0"),
 		
 		TSIP_STACK_SET_PROXY_CSCF("192.168.16.225", port, "udp", "ipv4"),
 		
 		TSIP_STACK_SET_EARLY_IMS(tsk_true),
 */
 
 	tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, "sip:"DOMAIN, "mamadou@"DOMAIN, "sip:mamadou@"DOMAIN,
 		TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
 		TSIP_STACK_SET_PASSWORD("mamadou"),
 		TSIP_STACK_SET_IMS_AKA_AMF(AMF),
 		TSIP_STACK_SET_IMS_AKA_OPERATOR_ID("0xff08"),
 		TSIP_STACK_SET_HEADER("User-Agent", "IM-client/OMA1.0 doubango/v1.0.0"),
 		
 		TSIP_STACK_SET_PROXY_CSCF("192.168.0.13", 5081, "tcp", "ipv4"),
 		TSIP_STACK_SET_LOCAL_IP(LOCAL_IP),
 		
 		TSIP_STACK_SET_EARLY_IMS(tsk_true),
 
 
 /*
 	tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, "sip:"DOMAIN, "2233392625", "sip:2233392625@"DOMAIN,
 		TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
 		TSIP_STACK_SET_PASSWORD("d3sb7j4fb8"),
 		
 		TSIP_STACK_SET_EARLY_IMS(tsk_true),
 
 		TSIP_STACK_SET_HEADER("User-Agent", "IM-client/OMA1.0 doubango/v1.0.0"),
 */
 /*
 		tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, 
 		TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
 		TSIP_STACK_SET_PUBLIC_IDENTITY("sip:mamadou@"DOMAIN),
 		TSIP_STACK_SET_PRIVATE_IDENTITY("mamadou@"DOMAIN),
 		TSIP_STACK_SET_PASSWORD("mamadou"),
 		TSIP_STACK_SET_REALM("sip:"DOMAIN), // FIXME: without sip:
 		TSIP_STACK_SET_LOCAL_IP(LOCAL_IP),
 		//TSIP_STACK_SET_DISCOVERY_NAPTR(1),
 		TSIP_STACK_SET_PROXY_CSCF("192.168.16.104", "udp", 0),
 		//TSIP_STACK_SET_PROXY_CSCF("192.168.0.15", "udp", 0),
 		TSIP_STACK_SET_PROXY_CSCF_PORT(5060),
 		//TSIP_STACK_SET_SECAGREE_IPSEC("hmac-md5-96", "null", "trans", "esp"),
 		TSIP_STACK_SET_MOBILITY("fixed"),
 		TSIP_STACK_SET_DEVICE_ID("dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc"),
 		TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
 		TSIP_STACK_SET_PRIVACY("header;id"),
 */
 
 		TSIP_STACK_SET_NULL());
 
 
 
 
 	//tsip_ssession_handle_t *op = tsip_ssession_create(stack,
 	//	TSIP_SSESSION_SET_CONTEXT(usr_context),
 	//	TSIP_SSESSION_SET_HEADER("expires", "30"),
 	//	TSIP_SSESSION_SET_HEADER("Persistence", "session"),
 	//	
 	//	TSIP_SSESSION_SET_CAPS("language", "\"en,fr\""),
 	//	TSIP_SSESSION_SET_CAPS("+audio", ""),
 	//	TSIP_SSESSION_SET_CAPS("+g.oma.sip-im", ""),
 	//	
 	//	tsk_null);
 
 	
 tsip_ssession_handle_t *op = tsip_ssession_create(stack,
 	TSIP_SSESSION_SET_EXPIRES(30),
 	
 	TSIP_SSESSION_SET_CAPS("+g.oma.sip-im", ""),
 	TSIP_SSESSION_SET_CAPS("+audio", ""),
 	TSIP_SSESSION_SET_CAPS("automata", ""),
 	TSIP_SSESSION_SET_CAPS("language", "\"en,fr\""),
 	
 	TSIP_SSESSION_SET_HEADER("Supported", "ssl"),
 	TSIP_SSESSION_SET_HEADER("P-Access-Network-Info", "3GPP-UTRAN-TDD;utran-cell-id-3gpp=AAAAA0000BBBB"),
 
 	TSIP_SSESSION_UNSET_HEADER("P-Access-Network-Info"),
 	
 	TSIP_SSESSION_SET_NULL());
 
 	//tsip_ssession_id_t opid = tsip_ssession_get_id(op);
 
 	if((ret = tsip_stack_start(stack))){
 		goto bail;
 	}
 
 	tsip_action_REGISTER(op, 
 		TSIP_ACTION_SET_HEADER("My-Header-1", "My-Value-1"),
 		TSIP_ACTION_SET_HEADER("My-Header-2", "My-Value-1"),
 	
 		TSIP_ACTION_SET_NULL());
 
 	getchar();
 	//tsk_thread_sleep(2000);
 
 	tsip_action_UNREGISTER(op,
 		TSIP_ACTION_SET_NULL()
 		);
 
 	getchar();
 	tsk_thread_sleep(2000);
 
 	//tsip_unregister(op, 
 	//	TSIP_ACTION_SET_HEADER("Persistence2", "action"),
 	//
 	//	tsk_null);
 /*
 	tsip_subscribe(op, 
 		TSIP_ACTION_SET_HEADER("Persistence", "action"),
 	
 		tsk_null);
 
 	tsk_thread_sleep(5000);
 
 	tsip_unsubscribe(op, 
 		TSIP_ACTION_SET_HEADER("Persistence2", "action"),
 	
 		tsk_null);
 	*/
 
 	/* INVITE */
 	/*
 	{
 		tsip_ssession_handle_t *call = TSIP_SSESSION_CREATE(stack,
 			TSIP_SSESSION_SET_HEADER("to", "sip:samba@"DOMAIN),
 			TSIP_SSESSION_SET_CAPS("+g.3gpp.icsi-ref", "\"urn%3Aurn-7%3gpp-service.ims.icsi.mmtel\""),
 			TSIP_SSESSION_SET_HEADER("Supported", "timer, norefersub, precondition"),
 			TSIP_SSESSION_SET_HEADER("Require", "100rel"),
 
 			TSIP_SSESSION_SET_PARAM("content", TEST_STACK_SDP),
 			
 		TSIP_SSESSION_SET_NULL());
 		tsip_invite(stack, call);
 	}
 	*/
 
 	/* SUBSCRIBE */
 	//{
 	//	tsip_ssession_handle_t *ss2 = tsip_ssession_create(stack,
 	//		TSIP_SSESSION_SET_CONTEXT(usr_context),
 	//		TSIP_SSESSION_SET_HEADER("expires", "35"),
 	//		TSIP_SSESSION_SET_HEADER("Event", "reg"),
 	//		TSIP_SSESSION_SET_HEADER("Accept", "application/reginfo+xml"),
 	//		TSIP_SSESSION_SET_HEADER("Allow-Events", "refer, presence, presence.winfo, xcap-diff"),
 	//		TSIP_SSESSION_SET_HEADER("Allow", "INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER"),
 	//	
 	//		tsk_null);
 
 	//	tsip_subscribe(ss2, 
 	//		TSIP_ACTION_SET_HEADER("Description", "subscribing"),
 
 	//		tsk_null);
 
 	//	getchar();
 
 	//	tsip_unsubscribe(ss2,
 	//		TSIP_ACTION_SET_HEADER("Test", "unsubscribing"),
 	//		
 	//		tsk_null);
 	//}
 	
 	/* MESSAGE */
 	//{
 	//	tsip_ssession_handle_t *ss3 = TSIP_SSESSION_CREATE(stack,
 	//	TSIP_SSESSION_SET_HEADER("to", "sip:alice@"DOMAIN),
 	//	TSIP_SSESSION_SET_HEADER("Accept-Contact", "*;+g.oma.sip-im"),
 	//	
 	//	tsk_null);
 	//	tsip_message(ss3,
 	//		TSIP_ACTION_SET_HEADER("Content-Type", "text/plain"),
 	//		TSIP_ACTION_SET_PAYLOAD("Hello world!", tsk_strlen("Hello world!")),
 
 	//		tsk_null
 	//		);
 	//}
 
 	/* PUBLISH */
 	/*{
 		tsip_ssession_handle_t *ss4 = TSIP_SSESSION_CREATE(stack,
 			TSIP_SSESSION_SET_HEADER("expires", "30"),
 			TSIP_SSESSION_SET_HEADER("to", "sip:mamadou@"DOMAIN),
 			
 			TSIP_SSESSION_SET_HEADER("Accept-Contact", "*;+g.oma.sip-im"), 
 			TSIP_SSESSION_SET_HEADER("Event", "presence"),
 		
 			tsk_null);
 
 		tsip_publish(ss4,
 			TSIP_ACTION_SET_HEADER("Description", "publish"),
 			TSIP_ACTION_SET_HEADER("Content-Type", "application/pidf+xml"),
 			TSIP_ACTION_SET_PAYLOAD(TEST_STACK_PIDF, tsk_strlen(TEST_STACK_PIDF)),
 			
 			tsk_null);
 
 		getchar();
 
 		tsip_unpublish(ss4,
 			TSIP_ACTION_SET_HEADER("Description", "unpublish"),
 			
 			tsk_null);
 	}
 	*/
 	//	/*getchar();
 	//	tsip_ssession_set(op4,
 	//		TSIP_SSESSION_SET_PARAM("content", TEST_STACK_PIDF),
 
 	//		TSIP_SSESSION_SET_NULL());
 	//	tsip_publish(stack, op4);*/
 	//	
 	//	getchar();
 	//	tsip_ssession_hangup(op4);
 	//	
 	//}
 bail:
 	//while(1);//tsk_thread_sleep(500);
 	//while(1)
 		//tsk_thread_sleep(50000);
 	getchar();
 
 	tsip_stack_stop(stack);
 
 	TSK_OBJECT_SAFE_FREE(op);
 	TSK_OBJECT_SAFE_FREE(stack);
 
 	TSK_DEBUG_INFO("==================");
 	TSK_DEBUG_INFO("==================");
 	TSK_DEBUG_INFO("==================");
 	TSK_DEBUG_INFO("==================");
 }
 
 
 #endif /* _TEST_STACK_H */