示例#1
0
int fetion_conversation_send_sms_to_myself_with_reply(Conversation* conversation,
			   	const char* message)
{
	SipHeader *toheader = NULL;
	SipHeader *eheader = NULL;
	char       *res = NULL;
	char        rep[1024];
	int         code;
	FetionSip  *sip = conversation->currentUser->sip;

	fetion_sip_set_type(sip , SIP_MESSAGE);
	toheader = fetion_sip_header_new("T" , conversation->currentUser->sipuri);
	eheader  = fetion_sip_event_header_new(SIP_EVENT_SENDCATMESSAGE);
	fetion_sip_add_header(sip , toheader);
	fetion_sip_add_header(sip , eheader);
	res = fetion_sip_to_string(sip , message);
	debug_info("Sent a message to myself" , conversation->currentContact->sipuri);
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res);
	memset(rep, 0, sizeof(rep));
	tcp_connection_recv(sip->tcp , rep , sizeof(rep));
	code = fetion_sip_get_code(rep);
	if(code == 200 || code == 280){
		return 1;
	}else{
		return -1;
	}
}
示例#2
0
char *http_connection_get_response(FetionConnection *conn)
{
	char buf[1024 * 4];
	char *res = 0, *res1 = 0, *pos = 0;
	int c = 0, res_len = 0;

	while((c = tcp_connection_recv(
				conn, buf, sizeof(buf) - 1)) != 0) {
		if (!res) res_len = 0;
		else      res_len = strlen(res);
		res = realloc(res, res_len + c + 1);
		strncpy(res + res_len, buf, c);
		res[res_len + c]  = '\0';
	}

	if(!(pos = strstr(res, "\r\n\r\n"))) return (char*)0;
	pos += 4;

	if(!(res1 = malloc(strlen(pos) + 1))) return (char*)0;
	strncpy(res1, pos, strlen(pos));
	res1[strlen(pos)] = '\0';

	free(res);

	return res1;
}
示例#3
0
int fetion_conversation_send_sms_with_reply(Conversation *conv, const char *msg)
{
	char       rep[1024];

	FetionSip* sip = conv->currentSip == NULL ?
		   	conv->currentUser->sip : conv->currentSip;
	SipHeader *toheader , *cheader , *kheader , *nheader;
	Message *message;
	char* res;
	struct tm *now;
	struct tm now_copy;

	fetion_sip_set_type(sip , SIP_MESSAGE);
	nheader  = fetion_sip_event_header_new(SIP_EVENT_CATMESSAGE);
	toheader = fetion_sip_header_new("T" , conv->currentContact->sipuri);
	cheader  = fetion_sip_header_new("C" , "text/plain");
	kheader  = fetion_sip_header_new("K" , "SaveHistory");
	fetion_sip_add_header(sip , toheader);
	fetion_sip_add_header(sip , cheader);
	fetion_sip_add_header(sip , kheader);
	fetion_sip_add_header(sip , nheader);
	/* add message to list */
	now = get_currenttime();
	now_copy = *now;
	message = fetion_message_new();
	fetion_message_set_sipuri(message , conv->currentContact->sipuri);
	fetion_message_set_time(message , now_copy);
	fetion_message_set_message(message , msg);
	fetion_message_set_callid(message , sip->callid);

	res = fetion_sip_to_string(sip , msg);
	debug_info("Sent a message to %s" , conv->currentContact->sipuri);
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res);

	memset(rep , 0 , sizeof(rep));
	tcp_connection_recv(sip->tcp , rep , sizeof(rep));

	if(fetion_sip_get_code(rep) == 280 || fetion_sip_get_code(rep) == 200){
		return 1;
	}else{
		return -1;
	}
}
示例#4
0
int fetion_conversation_send_sms_to_phone_with_reply(Conversation* conversation
		, const char* message , int* daycount , int* monthcount)
{
	
	SipHeader *toheader , *eheader , *aheader;
	char* res;
	char* xml;
	User *user = conversation->currentUser;
	FetionSip* sip = user->sip;
	char astr[256] , rep[1024];
	char* sipuri = conversation->currentContact->sipuri;

	fetion_sip_set_type(sip , SIP_MESSAGE);
	toheader = fetion_sip_header_new("T" , sipuri);
	eheader  = fetion_sip_event_header_new(SIP_EVENT_SENDCATMESSAGE);
	fetion_sip_add_header(sip , toheader);
	if(user->verification != NULL){
		sprintf(astr , "Verify algorithm=\"picc\",chid=\"%s\",response=\"%s\""
				, user->verification->guid
				, user->verification->code);
		aheader = fetion_sip_header_new("A" , astr);
		fetion_sip_add_header(sip , aheader);
	}
	fetion_sip_add_header(sip , eheader);
	res = fetion_sip_to_string(sip , message);
	debug_info("Sent a message to (%s)`s mobile phone" , sipuri);
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res);

	memset(rep , 0 , sizeof(rep));
	tcp_connection_recv(sip->tcp , rep , sizeof(rep));

	if(fetion_sip_get_code(rep) == 280){
		xml = strstr(rep , "\r\n\r\n") + 4;
		fetion_conversation_parse_send_sms(xml , daycount , monthcount);
		return 1;
	}else{
		debug_error("Send a message to (%s)`s mobile phone failed",
				sipuri);
		return -1;
	}
}
示例#5
0
static void fetion_start_transfer(FetionSip *sip){
	
	SipHeader *kheader = NULL;
	SipHeader *theader = NULL;
	char *res = NULL;
	char buf[2048];

	fetion_sip_set_type(sip , SIP_SERVICE);
	
	kheader = fetion_sip_header_new("N" , "StartTransfer");
	theader = fetion_sip_header_new("XI" , SESSIONID);
	fetion_sip_add_header(sip , kheader);
	fetion_sip_add_header(sip , theader);
	res = fetion_sip_to_string(sip , NULL);
	tcp_connection_send(sip->tcp , res , strlen(res));
	free(res);
	memset(buf, 0, sizeof(buf));
	tcp_connection_recv(sip->tcp , buf , sizeof(buf));
	printf("%s\n" , buf);
}
示例#6
0
int fetion_conversation_send_sms_to_phone(Conversation* conversation,
			   	const char* message)
{
	
	SipHeader *toheader = NULL;
	SipHeader *eheader = NULL;
	SipHeader *aheader = NULL;
	User *user = conversation->currentUser;
	char* res = NULL;
	FetionSip* sip = user->sip;
	char* sipuri = conversation->currentContact->sipuri;
	char astr[256] , rep[1024];
	int code;

	fetion_sip_set_type(sip , SIP_MESSAGE);
	toheader = fetion_sip_header_new("T" , sipuri);
	eheader  = fetion_sip_event_header_new(SIP_EVENT_SENDCATMESSAGE);
	fetion_sip_add_header(sip , toheader);
	if(user->verification != NULL){
		memset(astr, 0, sizeof(astr));
		sprintf(astr , "Verify algorithm=\"picc\",chid=\"%s\",response=\"%s\""
				, user->verification->guid
				, user->verification->code);
		aheader = fetion_sip_header_new("A" , astr);
		fetion_sip_add_header(sip , aheader);
	}
	fetion_sip_add_header(sip , eheader);
	res = fetion_sip_to_string(sip , message);
	debug_info("Sent a message to (%s)`s mobile phone" , sipuri);
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res);
	memset(rep, 0, sizeof(rep));
	tcp_connection_recv(sip->tcp , rep , sizeof(rep));
	code = fetion_sip_get_code(rep);
	if(code == 420 || code == 421){
		return -1;
	}else{
		return 1;
	}
}
示例#7
0
void fetion_share_request(FetionSip *sip , Share *share)
{
	SipHeader *kheader = NULL;
	SipHeader *theader = NULL;
	char *res = NULL;
	char *body = NULL;
	char buf[2048];

	fetion_sip_set_type(sip , SIP_OPTION);
	
	kheader = fetion_sip_header_new("K" , "ShareContent");
	theader = fetion_sip_header_new("T" , share->sipuri);
	fetion_sip_add_header(sip , kheader);
	fetion_sip_add_header(sip , theader);
	body = generate_share_request_body(share);
	res = fetion_sip_to_string(sip , body);
	tcp_connection_send(sip->tcp , res , strlen(res));
	free(res);
	memset(buf, 0, sizeof(buf));
	tcp_connection_recv(sip->tcp , buf , sizeof(buf));
	printf("%s\n" , buf);

	fetion_start_transfer(sip);
}
示例#8
0
int fetion_conversation_invite_friend(Conversation* conversation)
{
	FetionSip* sip = conversation->currentUser->sip;
	char *res , *ip , *credential , auth[256] , *body;
	int port , ret;
	FetionConnection* conn;
	Proxy *proxy = conversation->currentUser->config->proxy;
	SipHeader *eheader , *theader , *mheader , *nheader , *aheader;


	/*start chat*/
	fetion_sip_set_type(sip , SIP_SERVICE);
	eheader = fetion_sip_event_header_new(SIP_EVENT_STARTCHAT);
	fetion_sip_add_header(sip , eheader);
	res = fetion_sip_to_string(sip , NULL);
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res); res = NULL;
	res = fetion_sip_get_response(sip);
	if(!res)
		return -1;

	memset(auth , 0 , sizeof(auth));
	fetion_sip_get_attr(res , "A" , auth);
	if(auth==NULL)
		return -1;

	fetion_sip_get_auth_attr(auth , &ip , &port , &credential);
	sal_free(res); res = NULL;
	conn = tcp_connection_new();

	if(proxy != NULL && proxy->proxyEnabled)
		ret = tcp_connection_connect_with_proxy(conn , ip , port , proxy);
	else
		ret = tcp_connection_connect(conn , ip , port);

	if(ret == -1)
		return -1;

	/*clone sip*/
	conversation->currentSip = fetion_sip_clone(conversation->currentUser->sip);
	memset(conversation->currentSip->sipuri, 0 , sizeof(conversation->currentSip->sipuri));
	strcpy(conversation->currentSip->sipuri , conversation->currentContact->sipuri);
	fetion_sip_set_connection(conversation->currentSip , conn);
	sal_free(ip); ip = NULL;
	/*register*/
	sip = conversation->currentSip;
	fetion_sip_set_type(sip , SIP_REGISTER);
	aheader = fetion_sip_credential_header_new(credential);
	theader = fetion_sip_header_new("K" , "text/html-fragment");
	mheader = fetion_sip_header_new("K" , "multiparty");
	nheader = fetion_sip_header_new("K" , "nudge");
	fetion_sip_add_header(sip , aheader);
	fetion_sip_add_header(sip , theader);
	fetion_sip_add_header(sip , mheader);
	fetion_sip_add_header(sip , nheader);
	res = fetion_sip_to_string(sip , NULL);
	tcp_connection_send(conn , res , strlen(res));
	sal_free(res);res = NULL;
	sal_free(credential); credential = NULL;
	res = fetion_sip_get_response(sip);
	sal_free(res); res = NULL;
	/*invite buddy*/
	fetion_sip_set_type(sip , SIP_SERVICE);
	eheader = fetion_sip_event_header_new(SIP_EVENT_INVITEBUDDY);
	fetion_sip_add_header(sip , eheader);
	body = generate_invite_friend_body(conversation->currentContact->sipuri);
	res = fetion_sip_to_string(sip , body);	
	sal_free(body); body = NULL;
	tcp_connection_send(sip->tcp , res , strlen(res));
	sal_free(res); res = NULL;
	res = fetion_sip_get_response(sip);

	if(fetion_sip_get_code(res) == 200)	{
		sal_free(res);
		res = (char*)sal_malloc(2048);
		memset(res , 0 , 2048);
		tcp_connection_recv(sip->tcp , res , 2048);
		//res = fetion_sip_get_response(sip);
		sal_free(res);
		return 1;
	}else{
		sal_free(res);
		return -1;
	}
}
示例#9
0
int tcp_connection_connect_with_proxy(FetionConnection* connection 
		, const char* ipaddress , const int port , Proxy *proxy)
{
	struct sockaddr_in addr;
	
	char *ip = get_ip_by_name(proxy->proxyHost);
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr(ip);
	free(ip);
	addr.sin_port = htons(proxy->proxyPort);
	strcpy(connection->remote_ipaddress , ipaddress);
	connection->remote_port = port;

	unsigned int n = MAX_RECV_BUF_SIZE;
	int ret = setsockopt(connection->socketfd , SOL_SOCKET , SO_RCVBUF , (const char*)&n , sizeof(n));
	if(ret == -1) return -1;
	ret = connect(connection->socketfd , (struct sockaddr*)&addr , sizeof(struct sockaddr));
	if(ret == -1) return -1;
	printf("%s:%d\n", ipaddress, port);
	
	char http[1024] , code[5] , *pos = NULL;
	unsigned char authentication[1024];
	char authen[1024];
	char authorization[1024];
	
	memset(authorization, 0, sizeof(authorization));
	if(strlen(proxy->proxyUser) != 0 && strlen(proxy->proxyPass) != 0)
	{
		memset(authen, 0, sizeof(authen));
		sprintf(authen , "%s:%s" , proxy->proxyUser , proxy->proxyPass);
		EVP_EncodeBlock(authentication , (unsigned char*)authen , strlen(authen));
		sprintf(authorization , "Proxy-Authorization: Basic %s\r\n" , (char*)authentication);
	}

	memset(http, 0, sizeof(http));
	snprintf(http , sizeof(http)-1 , "CONNECT %s:%d HTTP/1.1\r\n"
				   "Host: %s:%d\r\n%s"
				   "User-Agent: OpenFetion\r\n\r\n"
				 , ipaddress , port , ipaddress , port , authorization);

	tcp_connection_send(connection , http , strlen(http));

	memset(http, 0, sizeof(http));

	tcp_connection_recv(connection , http , sizeof(http));

	pos = strstr(http , " ");
	if(pos == NULL){
		return -1;
	}
	pos++;
	n = strlen(pos) - strlen(strstr(pos , " "));
	memset(code, 0, sizeof(code));
	strncpy(code, pos, (sizeof(code)-1 < n) ? (sizeof(code)-1) : n);
	code[sizeof(code)-1]='\0';

	if(strcmp(code , "200") != 0)
		return -1;

	return 1;
}