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_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 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_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_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 gint sms_response_cb(fetion_account *account, const gchar *sipmsg, fetion_transaction *trans) { gint code; g_source_remove(trans->timer); code = fetion_sip_get_code(sipmsg); hybrid_debug_info("fetion", "send message response:\n%s", sipmsg); if (code != 200 && code != 280) { return HYBRID_ERROR; } /* TODO add error message to textview */ return HYBRID_OK; }
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_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; } }
/** * Callback function to handle the read event after * rendered sipc authentication. */ static gint sipc_auth_cb(fetion_account *ac, const gchar *sipmsg, fetion_transaction *trans) { gint code; gint length; gchar *pos; code = fetion_sip_get_code(sipmsg); hybrid_debug_info("fetion", "sipc recv:\n%s", sipmsg); if (code == FETION_SIP_OK) { /**< ok, we got the contact list */ /* update the portrait. */ fetion_account_update_portrait(ac); length = fetion_sip_get_length(sipmsg); pos = strstr(ac->buffer, "\r\n\r\n") + 4; parse_sipc_resp(ac, pos, length); /* set the nickname of the hybrid account. */ hybrid_account_set_nickname(ac->account, ac->nickname); /* set the mood phrase of the hybrid account. */ hybrid_account_set_status_text(ac->account, ac->mood_phrase); hybrid_account_set_state(ac->account, HYBRID_STATE_INVISIBLE); /* set the connection status. */ hybrid_account_set_connection_status(ac->account, HYBRID_CONNECTION_CONNECTED); /* init group list */ fetion_groups_init(ac); /* init buddy list */ fetion_buddies_init(ac); /* start scribe the pushed msg */ fetion_buddy_scribe(ac); } else if (420 == code || 421 == code) { if (HYBRID_ERROR == parse_sipc_verification(ac, sipmsg)) { hybrid_account_error_reason(ac->account, _("Fetion Protocol ERROR.")); return FALSE; } hybrid_debug_error("fetion", "sipc authentication need Verification."); verify_data.sipc_conn = ac->sk; verify_data.type = VERIFY_TYPE_SIP; hybrid_proxy_connect(NAV_SERVER, 80, pic_download_cb, ac); g_free(ac->buffer); ac->buffer = NULL; return HYBRID_OK; } else { g_free(ac->buffer); ac->buffer = NULL; return HYBRID_ERROR; } return HYBRID_ERROR; }
static gint buddy_add_cb(fetion_account *account, const gchar *sipmsg, fetion_transaction *trans) { gint code; gchar *pos; gchar *value; gchar *name; fetion_buddy *buddy; HybridGroup *group; HybridBuddy *bd; xmlnode *root; xmlnode *node; hybrid_debug_info("fetion", "add buddy, recv:\n%s", sipmsg); if ((code = fetion_sip_get_code(sipmsg)) != 200) { hybrid_message_box_show(HYBRID_MESSAGE_WARNING, "Add buddy error. Server response with %d", code); return HYBRID_ERROR; } if (!(pos = strstr(sipmsg, "\r\n\r\n"))) { goto add_buddy_unknown_err; } pos += 4; if (!(root = xmlnode_root(pos, strlen(pos)))) { goto add_buddy_unknown_err; } if (!(node = xmlnode_find(root, "buddy"))) { xmlnode_free(root); goto add_buddy_unknown_err; } if (xmlnode_has_prop(node, "status-code")) { value = xmlnode_prop(node, "status-code"); code = atoi(value); g_free(value); if (code == 200) { goto add_buddy_ok; } xmlnode_free(node); if (code == 521) { hybrid_message_box_show(HYBRID_MESSAGE_WARNING, "The buddy has already been in your buddy list,\n" "Please don't add it duplicately."); return HYBRID_ERROR; } if (code == 404) { hybrid_message_box_show(HYBRID_MESSAGE_WARNING, "The buddy you try to add doesn't exist."); return HYBRID_ERROR; } if (code == 486) { hybrid_message_box_show(HYBRID_MESSAGE_WARNING, "You have reached the daily limit of adding buddies,\n" "please try another day."); return HYBRID_ERROR; } goto add_buddy_unknown_err; } add_buddy_ok: if (!xmlnode_has_prop(node, "user-id") || !xmlnode_has_prop(node, "local-name") || !xmlnode_has_prop(node, "uri") || !xmlnode_has_prop(node, "buddy-lists")) { xmlnode_free(root); goto add_buddy_unknown_err; } buddy = fetion_buddy_create(); buddy->userid = xmlnode_prop(node, "user-id"); buddy->localname = xmlnode_prop(node, "local-name"); buddy->sipuri = xmlnode_prop(node, "uri"); buddy->groups = xmlnode_prop(node, "buddy-lists"); xmlnode_free(root); account->buddies = g_slist_append(account->buddies, buddy); if (!(group = hybrid_blist_find_group(account->account, buddy->groups))) { fetion_buddy_destroy(buddy); account->buddies = g_slist_remove(account->buddies, buddy); goto add_buddy_unknown_err; } if (buddy->localname && *(buddy->localname) == '\0') { name = get_sid_from_sipuri(buddy->sipuri); } else { name = g_strdup(buddy->localname); } bd = hybrid_blist_add_buddy(account->account, group, buddy->userid, name); hybrid_blist_set_buddy_status(bd, FALSE); g_free(name); return HYBRID_OK; add_buddy_unknown_err: hybrid_message_box_show(HYBRID_MESSAGE_WARNING, "Add buddy error. Unknown reason."); return HYBRID_ERROR; }
fetion_buddy* fetion_buddy_parse_info(fetion_account *ac, const gchar *userid, const gchar *sipmsg) { xmlnode *root; xmlnode *node; gchar *pos; gchar *temp; gchar *value; fetion_buddy *buddy; gint code; code = fetion_sip_get_code(sipmsg); if (code != 200) { hybrid_debug_error("fetion", "get information with code:%d", code); return NULL; } if (!(pos = strstr(sipmsg, "\r\n\r\n"))) { goto get_info_error; } pos += 4; if (!(root = xmlnode_root(pos, strlen(pos)))) { goto get_info_error; } if (!(node = xmlnode_find(root, "contact"))) { xmlnode_free(root); goto get_info_error; } if (!(buddy = fetion_buddy_find_by_userid(ac, userid))) { xmlnode_free(root); goto get_info_error; } if (xmlnode_has_prop(node, "sid")) { value = xmlnode_prop(node, "sid"); g_free(buddy->sid); buddy->sid = g_strdup(value); g_free(value); } if (xmlnode_has_prop(node, "mobile-no")) { value = xmlnode_prop(node, "mobile-no"); g_free(buddy->mobileno); buddy->mobileno = g_strdup(value); g_free(value); } if (xmlnode_has_prop(node, "impresa")) { value = xmlnode_prop(node, "impresa"); g_free(buddy->mood_phrase); buddy->mood_phrase = g_strdup(value); g_free(value); } if (xmlnode_has_prop(node, "nickname")) { value = xmlnode_prop(node, "nickname"); g_free(buddy->nickname); buddy->nickname = g_strdup(value); g_free(value); } if (xmlnode_has_prop(node, "gender")) { value = xmlnode_prop(node, "gender"); buddy->gender = atoi(value); g_free(value); } if (xmlnode_has_prop(node, "carrier-region")) { value = xmlnode_prop(node, "carrier-region"); for (pos = value; *pos && *pos != '.'; pos ++); g_free(buddy->country); buddy->country = g_strndup(value, pos - value); for (pos ++, temp = pos; *pos && *pos != '.'; pos ++); g_free(buddy->province); buddy->province = g_strndup(temp, pos - temp); for (pos ++, temp = pos; *pos && *pos != '.'; pos ++); g_free(buddy->city); buddy->city = g_strndup(temp, pos - temp); } xmlnode_free(node); return buddy; get_info_error: hybrid_debug_error("fetion", "invalid get-info response"); return NULL; }