int fetion_buddylist_delete(User* user , int id) { FetionSip* sip = user->sip; SipHeader* eheader; char *res , *body; int ret; fetion_sip_set_type(sip , SIP_SERVICE); eheader = fetion_sip_event_header_new(SIP_EVENT_DELETEBUDDYLIST); fetion_sip_add_header(sip , eheader); body = generate_delete_buddylist_body(id); res = fetion_sip_to_string(sip , body); free(body); tcp_connection_send(sip->tcp , res , strlen(res)); free(res); res = fetion_sip_get_response(sip); ret = fetion_sip_get_code(res); free(res); if(ret == 200) { fetion_group_remove(user->groupList , id); debug_info("Delete buddy list success"); return 1; } else { debug_error("Delete buddy list failed , errno:%d" , ret); return -1; } }
int fetion_buddylist_edit(User* user , int id , const char* name) { FetionSip* sip = user->sip; SipHeader* eheader; char *res , *body; int ret; fetion_sip_set_type(sip , SIP_SERVICE); eheader = fetion_sip_event_header_new(SIP_EVENT_SETBUDDYLISTINFO); fetion_sip_add_header(sip , eheader); body = generate_edit_buddylist_body(id , name); res = fetion_sip_to_string(sip , body); free(body); tcp_connection_send(sip->tcp , res , strlen(res)); free(res); res = fetion_sip_get_response(sip); ret = fetion_sip_get_code(res); free(res); if(ret == 200) { debug_info("Set buddy list name to %s success" , name); return 1; } else { debug_error("Set buddy list name to %s failed , errno:%d" , name , ret); return -1; } }
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; } }
int fetion_buddylist_create(User* user , const char* name) { FetionSip* sip = user->sip; SipHeader* eheader; char *res , *body; int ret; fetion_sip_set_type(sip , SIP_SERVICE); eheader = fetion_sip_event_header_new(SIP_EVENT_CREATEBUDDYLIST); fetion_sip_add_header(sip , eheader); body = generate_create_buddylist_body(name); res = fetion_sip_to_string(sip , body); free(body); tcp_connection_send(sip->tcp , res , strlen(res)); free(res) ; res = fetion_sip_get_response(sip); ret = fetion_sip_get_code(res); if(ret == 200) { ret = parse_create_buddylist_response(user , res); free(res); debug_info("Create buddy list success"); return ret; } else { free(res); debug_error("Create buddy list failed , errno :" , ret); return -1; } }
int pg_group_get_list(User *user) { FetionSip *sip; SipHeader *eheader; const char *body = "<args><group-list /></args>"; char *res; extern int callid; sip = user->sip; eheader = fetion_sip_event_header_new(SIP_EVENT_PGGETGROUPLIST); if(eheader == NULL){ return -1; } fetion_sip_set_type(sip , SIP_SERVICE); fetion_sip_add_header(sip , eheader); user->pgGroupCallId = callid; res = fetion_sip_to_string(sip , body); if(res == NULL){ return -1; } int ret = tcp_connection_send(sip->tcp , res , strlen(res)); free(res); return ret; }
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; } }
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; } }
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); }
int fetion_conversation_send_sms(Conversation* conversation , const char* msg) { FetionSip* sip = conversation->currentSip == NULL ? conversation->currentUser->sip : conversation->currentSip; SipHeader *toheader , *cheader , *kheader , *nheader; Message *message; struct unacked_list *unacked; 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" , conversation->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 , conversation->currentContact->sipuri); fetion_message_set_time(message , now_copy); fetion_message_set_message(message , msg); fetion_message_set_callid(message , sip->callid); unacked = unacked_list_new(message); unacked_list_append(unackedlist , unacked); res = fetion_sip_to_string(sip , msg); debug_info("Sent a message to %s" , conversation->currentContact->sipuri); if(tcp_connection_send(sip->tcp , res , strlen(res)) == -1){ sal_free(res); return -1; } sal_free(res); return 1; }
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; } }
int fetion_conversation_send_nudge(Conversation* conversation) { SipHeader *toheader = NULL; char* res = NULL; char* body = NULL; FetionSip* sip = conversation->currentSip; if(sip == NULL) { debug_error("Did not start a chat chanel , can not send a nudge"); return -1; } char* sipuri = conversation->currentContact->sipuri; fetion_sip_set_type(sip , SIP_INCOMING); toheader = fetion_sip_header_new("T" , sipuri); fetion_sip_add_header(sip , toheader); body = generate_send_nudge_body(); res = fetion_sip_to_string(sip , body); sal_free(body); debug_info("Sent a nudge to (%s)" , sipuri); tcp_connection_send(sip->tcp , res , strlen(res)); sal_free(res); /* res = fetion_sip_get_response(sip); if(fetion_sip_get_code(res) == 280) { sal_free(res); return 1; } else { printf("%s\n" , res); sal_free(res); debug_error("Send nuge failed"); return -1; }*/ return 1; }
int fetion_conversation_send_sms_to_myself(Conversation* conversation, const char* message) { SipHeader *toheader = NULL; SipHeader *eheader = NULL; char* res = NULL; 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); if(tcp_connection_send(sip->tcp , res , strlen(res)) == -1) { sal_free(res); return -1; } sal_free(res); res = fetion_sip_get_response(sip); sal_free(res); return 1; }
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); }
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; } }
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; }