www.pudn.com > exosip.rar > test.cpp


// test.cpp : Defines the entry point for the application. 
// 
 
#include "stdafx.h" 
#include "assert.h" 
#include  
#include  
#include  
#include  
#include "commands.h" 
#include "jinsubscriptions.h" 
#include "jsubscriptions.h" 
 
 
using namespace std; 
 
char server[200] = "@192.17.1.120"; 
char identity[200]= "sip:"; 
char registrar[200]= "sip:192.17.1.120:5600"; 
char username[100] = "7005"; 
char password[100] = "7005"; 
char contact[200] = "sip:"; 
int reg_id; 
 
int josua_online_status = EXOSIP_NOTIFY_ONLINE; 
int josua_registration_status = -1; 
char josua_registration_reason_phrase[100] = { '\0' }; 
char josua_registration_server[100] = { '\0' }; 
 
 
 
int josua_event_get() 
{ 
	int counter = 0; 
	 
	/* use events to print some info */ 
	eXosip_event_t *je; 
	 
	for (;;) 
	{ 
		je = eXosip_event_wait (0, 50); 
		eXosip_lock (); 
		/* eXosip_automatic_action (); */ 
		 
		eXosip_default_action (je); 
		eXosip_automatic_refresh (); 
		 
		eXosip_unlock (); 
		if (je == NULL) 
			break; 
		counter++; 
		if (je->type == EXOSIP_CALL_INVITE) 
		{ 
			call_new (je); 
		} else if (je->type == EXOSIP_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_REFER (je->request)) 
		{ 
			int i; 
			 
			if (je->tid > 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_message_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					eXosip_message_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_REFER (je->request)) 
		{ 
			int i; 
			 
			/* accepte call transfer */ 
			if (je->cid > 0 && je->did > 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 202, &answer); 
				if (i == 0) 
				{ 
					i = eXosip_call_send_answer (je->tid, 202, answer); 
				} 
				eXosip_unlock (); 
				 
				eXosip_lock (); 
				if (i == 0) 
				{ 
					osip_message_t *notify; 
					 
					i = eXosip_call_build_notify (je->did,EXOSIP_SUBCRSTATE_ACTIVE, ¬ify); 
					if (i == 0) 
					{ 
						osip_message_set_header (notify, "Event", "refer"); 
						osip_message_set_content_type (notify, "message/sipfrag"); 
						osip_message_set_body (notify, "SIP/2.0 100 Trying", 
							strlen ("SIP/2.0 100 Trying")); 
						i = eXosip_call_send_request (je->did, notify); 
					} 
					//if (i != 0) 
					//beep (); 
				} 
				eXosip_unlock (); 
			} else if (je->tid > 0)       /* bug?? */ 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_message_build_answer (je->tid, 400, &answer); 
				if (i == 0) 
				{ 
					eXosip_message_send_answer (je->tid, 400, answer); 
				} 
				eXosip_unlock (); 
			} 
			 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_UPDATE (je->request)) 
		{ 
			int i; 
			 
			/* accepte call transfer */ 
			if (je->cid > 0 && je->did > 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					i = eXosip_call_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			} else if (je->tid > 0)       /* bug?? */ 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_message_build_answer (je->tid, 400, &answer); 
				if (i == 0) 
				{ 
					eXosip_message_send_answer (je->tid, 400, answer); 
				} 
				eXosip_unlock (); 
			} 
			 
		} else if (je->type == EXOSIP_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_NOTIFY (je->request)) 
		{ 
			int i; 
			 
			if (je->tid > 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_message_build_answer (je->tid, 501, &answer); 
				if (i == 0) 
				{ 
					eXosip_message_send_answer (je->tid, 501, answer); 
				} 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_NOTIFY (je->request)) 
		{ 
			int i; 
			 
			if (je->cid > 0 && je->did > 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					i = eXosip_call_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_CALL_ACK) 
		{ 
			char buf[100]; 
			_snprintf (buf, 99, "<- (%i %i) ACK received", je->cid, je->did); 
			printf(buf); 
			call_ack (je); 
		} else if (je->type == EXOSIP_CALL_ANSWERED) 
		{ 
			call_answered (je); 
		} else if (je->type == EXOSIP_CALL_PROCEEDING) 
		{ 
			call_proceeding (je); 
		} else if (je->type == EXOSIP_CALL_RINGING) 
		{ 
			call_ringing (je); 
		} else if (je->type == EXOSIP_CALL_REDIRECTED) 
		{ 
			call_redirected (je); 
		} else if (je->type == EXOSIP_CALL_REQUESTFAILURE) 
		{ 
			call_requestfailure (je); 
		} else if (je->type == EXOSIP_CALL_SERVERFAILURE) 
		{ 
			call_serverfailure (je); 
		} else if (je->type == EXOSIP_CALL_GLOBALFAILURE) 
		{ 
			call_globalfailure (je); 
		} else if (je->type == EXOSIP_CALL_NOANSWER) 
		{ 
		} else if (je->type == EXOSIP_CALL_CLOSED) 
		{ 
			call_closed (je); 
		} else if (je->type == EXOSIP_CALL_RELEASED) 
		{ 
			call_closed (je); 
		} else if (je->type == EXOSIP_CALL_REINVITE) 
		{ 
			call_modified (je); 
		} else if (je->type == EXOSIP_REGISTRATION_SUCCESS) 
		{ 
			if (je->response != NULL) 
				josua_registration_status = je->response->status_code; 
			else 
				josua_registration_status = 0; 
			 
			if (je->request != NULL && je->request->req_uri != NULL && 
				je->request->req_uri->host != NULL) 
				_snprintf (josua_registration_server, 100, "sip:%s", 
				je->request->req_uri->host); 
			 
			if (je->response != NULL && je->response->reason_phrase != NULL 
				&& je->response->reason_phrase != '\0') 
				_snprintf (josua_registration_reason_phrase, 100, "%s", 
				je->response->reason_phrase); 
			else 
				josua_registration_reason_phrase[0] = '\0'; 
			 
			if (je->response != NULL) 
			{ 
				_josua_set_service_route (je->response); 
			} 
			 
		} else if (je->type == EXOSIP_REGISTRATION_FAILURE) 
		{ 
			if (je->response != NULL) 
				josua_registration_status = je->response->status_code; 
			else 
				josua_registration_status = 0; 
			 
			if (je->request != NULL && je->request->req_uri != NULL && 
				je->request->req_uri->host != NULL) 
				_snprintf (josua_registration_server, 100, "sip:%s", 
				je->request->req_uri->host); 
			 
			if (je->response != NULL && je->response->reason_phrase != NULL 
				&& je->response->reason_phrase != '\0') 
				_snprintf (josua_registration_reason_phrase, 100, "%s", 
				je->response->reason_phrase); 
			 
			else 
				josua_registration_reason_phrase[0] = '\0'; 
			 
		} else if (je->type == EXOSIP_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_OPTIONS (je->request)) 
		{ 
			int k; 
			 
			/* outside of any call */ 
			for (k = 0; k < MAX_NUMBER_OF_CALLS; k++) 
			{ 
				if (calls[k].state != NOT_USED) 
					break; 
			} 
			eXosip_lock (); 
			if (k == MAX_NUMBER_OF_CALLS) 
			{ 
				eXosip_options_send_answer (je->tid, 200, NULL); 
			} else 
			{ 
				/* answer 486 ok */ 
				eXosip_options_send_answer (je->tid, 486, NULL); 
			} 
			eXosip_unlock (); 
			 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_OPTIONS (je->request)) 
		{ 
			int k; 
			 
			/* answer the OPTIONS method */ 
			/* 1: search for an existing call */ 
			if (je->cid != 0) 
			{ 
				osip_message_t *answer; 
				int i; 
				 
				for (k = 0; k < MAX_NUMBER_OF_CALLS; k++) 
				{ 
					if (calls[k].state != NOT_USED && calls[k].did == je->did) 
						break; 
				} 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					eXosip_call_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			}  
			else                /* bug? */ 
			{ 
				eXosip_lock (); 
				eXosip_options_send_answer (je->tid, 400, NULL); 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_INFO (je->request)) 
		{ 
			int i; 
			 
			/* what's the purpose of sending INFO outside dialog? */ 
			eXosip_lock (); 
			i = eXosip_message_send_answer (je->tid, 501, NULL); 
			eXosip_unlock (); 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_INFO (je->request)) 
		{ 
			if (je->cid != 0) 
			{ 
				osip_message_t *answer; 
				int i; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					eXosip_call_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			}  
			else                /* bug? */ 
			{ 
				int i; 
				 
				eXosip_lock (); 
				i = eXosip_call_send_answer (je->tid, 400, NULL); 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_MESSAGE (je->request)) 
		{ 
			/* answer 2xx */ 
			eXosip_lock (); 
			eXosip_message_send_answer (je->tid, 200, NULL); 
			eXosip_unlock (); 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW 
			&& je->request != NULL && MSG_IS_MESSAGE (je->request)) 
		{ 
			/* answer 2xx */ 
			if (je->cid != 0) 
			{ 
				osip_message_t *answer; 
				int i; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 200, &answer); 
				if (i == 0) 
				{ 
					eXosip_call_send_answer (je->tid, 200, answer); 
				} 
				eXosip_unlock (); 
			}  
			else                /* bug? */ 
			{ 
				int i; 
				 
				eXosip_lock (); 
				i = eXosip_call_send_answer (je->tid, 400, NULL); 
				eXosip_unlock (); 
			} 
		} else if (je->type == EXOSIP_SUBSCRIPTION_ANSWERED) 
		{ 
			jsubscription_answered (je); 
		} else if (je->type == EXOSIP_SUBSCRIPTION_PROCEEDING) 
		{ 
			jsubscription_proceeding (je); 
		} else if (je->type == EXOSIP_SUBSCRIPTION_REDIRECTED) 
		{ 
			jsubscription_redirected (je); 
		} else if (je->type == EXOSIP_SUBSCRIPTION_REQUESTFAILURE) 
		{ 
			jsubscription_requestfailure (je); 
			 
			if ((je->response != NULL && je->response->status_code == 407) 
				|| (je->response != NULL && je->response->status_code == 401)) 
			{ 
				static int oddnumber = 0; 
				 
				if (oddnumber == 0) 
				{ 
					/* eXosip_subscribe_refresh(je->sid, "600"); */ 
					oddnumber = 1; 
				}  
				else 
					oddnumber = 0; 
			} 
		} else if (je->type == EXOSIP_SUBSCRIPTION_SERVERFAILURE) 
		{ 
			jsubscription_serverfailure (je); 
		} else if (je->type == EXOSIP_SUBSCRIPTION_GLOBALFAILURE) 
		{ 
			jsubscription_globalfailure (je); 
		} else if (je->type == EXOSIP_SUBSCRIPTION_NOTIFY) 
		{ 
			jsubscription_notify (je); 
		} else if (je->type == EXOSIP_IN_SUBSCRIPTION_NEW) 
		{ 
		/* search for the user to see if he has been 
			previously accepted or not! */ 
			 
			jinsubscription_new (je); 
		} else if (je->type == EXOSIP_MESSAGE_NEW && je->request != NULL) 
		{ 
			osip_message_t *answer; 
			int i; 
			 
			eXosip_lock (); 
			i = eXosip_message_build_answer (je->tid, 405, &answer); 
			if (i == 0) 
			{ 
				eXosip_message_send_answer (je->tid, 405, answer); 
			} 
			eXosip_unlock (); 
		} else if (je->type == EXOSIP_CALL_MESSAGE_NEW && je->request != NULL) 
		{ 
			int i; 
			 
			/* answer 2xx */ 
			if (je->cid != 0) 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_call_build_answer (je->tid, 405, &answer); 
				if (i == 0) 
				{ 
					eXosip_call_send_answer (je->tid, 405, answer); 
				} 
				eXosip_unlock (); 
			}  
			else                /* bug? */ 
			{ 
				osip_message_t *answer; 
				 
				eXosip_lock (); 
				i = eXosip_message_build_answer (je->tid, 405, &answer); 
				if (i == 0) 
				{ 
					eXosip_message_send_answer (je->tid, 405, answer); 
				} 
				eXosip_unlock (); 
			} 
		} 
		eXosip_event_free (je); 
    } 
	 
	if (counter > 0) 
		return 0; 
	 
	return -1; 
} 
 
DWORD WINAPI EventThread(LPVOID pParam) 
{ 
	while(1) 
	{ 
		josua_event_get(); 
	} 
	 
} 
 
int build_Message(osip_message_t* &dest) 
{ 
	char szBuffer[512] = {0}; 
	osip_call_id_t *callid = 0; 
	osip_cseq_t *cseq = 0; 
	osip_uri_t* url; 
	 
	int i = osip_message_init (&dest); 
	if (i != 0) 
		return -1; 
	//Register request  
	osip_message_set_version(dest,osip_strdup("SIP/2.0")); 
	osip_message_set_method(dest,osip_strdup("MESSAGE")); 
	osip_message_set_status_code (dest, 0); 
	osip_message_set_reason_phrase (dest, NULL); 
	 
	 
	//via 
	strcpy(szBuffer, "Via: SIP/2.0/UDP 192.168.1.25;branch=z9hG4bKf98d2a6774ace856066419c40e74dafe6.0"); 
	osip_message_set_via (dest, szBuffer); 
	 
	//FROM 
	strcpy(szBuffer,"From: ;tag=f4755bfd00314d30be1987cd31d2a2dc"); 
	osip_message_set_from(dest,szBuffer); 
	 
	//TO 
	sprintf(szBuffer,"To: "); 
	osip_message_set_to(dest,szBuffer); 
	osip_uri_init(&url); 
	osip_uri_set_scheme(url,osip_strdup("sip")); 
	osip_uri_set_host(url,osip_strdup("192.17.1.120")); 
	dest->req_uri = url; 
	 
	//call id 
	osip_call_id_init(&callid); 
	osip_call_id_set_number(callid, osip_strdup("7a55548087ee4946bfd332a6b02eebc6")); 
	osip_call_id_set_host(callid, osip_strdup("192.17.1.25")); 
	dest->call_id = callid; 
 
	//cseq 
	osip_cseq_init (&cseq); 
	osip_cseq_set_number (cseq, osip_strdup("1"));  
	osip_cseq_set_method (cseq, osip_strdup("MESSAGE")); 
	dest->cseq = cseq; 
	 
	// max forwards 
	osip_message_set_max_forwards (dest, osip_strdup("70"));  
	osip_message_set_content_length (dest, osip_strdup("27")); 
	 
	//contact 
	sprintf(szBuffer,"Contact: "); 
	osip_message_set_contact(dest,szBuffer); 
 
	osip_message_set_contact(dest,"Content-Type: text/plain;charset=UTF-8"); 
	 
	return 0; 
} 
 
 
 
 
int APIENTRY WinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPSTR     lpCmdLine, 
                     int       nCmdShow) 
{ 
	// TODO: Place code here. 
	int i; 
	 
	cout << "Usage:"<< endl; 
	cout << "a - answering call"<< endl; 
	cout << "h - hangup"<< endl; 
	cout << "r - ringing"<< endl; 
	cout << "c - call"<< endl; 
	cout << "q - quit"<< endl; 
	 
	strcat(identity,username); 
	strcat(identity,server); 
	strcpy(contact,identity); 
	 
	 
 
	if (eXosip_init ()) { 
		printf("eXosip_init failed\n"); 
		exit (1); 
	} 
	 
	 
	i = eXosip_listen_addr (17, NULL, 5060, 2, 0); 
	if (i!=0) { 
		eXosip_quit(); 
		printf("could not initialize transport layer\n"); 
		exit (1); 
	} 
	 
	 
    { 
		if (eXosip_add_authentication_info 
			("7005", "7005", "7005", NULL, NULL)) 
        { 
			exit (1); 
        } 
    } 
	 
	//½ÓÊÕÏß³Ì 
	HANDLE pEventThread; 
	DWORD  nEventThreadID; 
	 
	pEventThread = ::CreateThread(NULL,0, 
		EventThread, NULL, 0, &nEventThreadID);   
	 
	osip_message_t *reg = NULL; 
	eXosip_lock (); 
	reg_id = eXosip_register_build_initial_register(identity, registrar, contact,1800,®); 
	if (reg_id< 0) 
	{ 
		eXosip_unlock(); 
		eXosip_quit(); 
		printf("could not initialize register\n"); 
		exit (1); 
	} 
	 
	eXosip_register_send_register (reg_id, reg); 
	eXosip_unlock (); 
	 
	Sleep(1000); 
	 
	_josua_start_call("","", 
		NULL,NULL,"10500", NULL); 
 
 
 
//	char buf[255] = "Welcome to China"; 
//	_josua_start_message("sip:7005@192.17.1.120:5600","sip:7001@192.17.1.120:5600",NULL,buf); 
 
	while(1) 
	{ 
		Sleep(10); 
	} 
 
	 
	return 0; 
} 
 
 
 
 
void __exit( int r ) 
{ 
	char line[256]; 
	gets( line ); 
	exit( r ); 
} 
 
void josua_printf(char* buf) 
{ 
	printf( "\n" ); 
}