// create a new transaction and add it to the transaction_list // success: SUCCESS, // failure: ERRNO_MP_ALLOC, ERRNO_MP_LIST_PUSH int transaction_create_and_add_to_list(transaction_t ** tr, list_t * tr_list, packet_head_t * pkt_hdr_ptr, uint32_t card_id) { RET_ON_FAIL(transaction_create(tr, tr_list->count, pkt_hdr_ptr)); // update transaction with new card id (*tr)->card_id = card_id; RET_ON_FAIL(transaction_add_to_list(*tr, tr_list)); return SUCCESS; }
void message_error(int uid, char *format, ...) { TransactionOut t; char *reply_buffer; va_list ap; va_start(ap, format); reply_buffer = xvasprintf(format, ap); va_end(ap); t = transaction_create(HL_QUIT_MESSAGE, 1); transaction_add_string(t, HL_MESSAGE, reply_buffer); xfree(reply_buffer); transaction_write(uid, t); transaction_out_destroy(t); }
void fetion_buddy_handle_request(fetion_account *ac, const gchar *sipuri, const gchar *userid, const gchar *alias, const gchar *groupid, gboolean accept) { fetion_sip *sip; sip_header *eheader; gchar *body; gchar *sip_text; fetion_transaction *trans; g_return_if_fail(ac != NULL); g_return_if_fail(sipuri != NULL); g_return_if_fail(userid != NULL); g_return_if_fail(groupid != NULL); sip = ac->sip; fetion_sip_set_type(sip, SIP_SERVICE); eheader = sip_event_header_create(SIP_EVENT_HANDLECONTACTREQUEST); if (accept) { trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_userid(trans, userid); transaction_set_callback(trans, handle_request_cb); transaction_add(ac, trans); } fetion_sip_add_header(sip, eheader); body = generate_handle_request_body(sipuri, userid, alias, groupid, accept); sip_text = fetion_sip_to_string(sip, body); g_free(body); if (send(ac->sk, sip_text, strlen(sip_text), 0) == -1) { hybrid_debug_error("fetion", "handle buddy request failed."); g_free(sip_text); return; } g_free(sip_text); }
gint fetion_message_send_to_me(fetion_account *account, const gchar *text) { sip_header *toheader; sip_header *eheader; gchar *sip_text; fetion_sip *sip; fetion_transaction *trans; g_return_val_if_fail(account != NULL, HYBRID_ERROR); g_return_val_if_fail(text != NULL, HYBRID_ERROR); sip = account->sip; fetion_sip_set_type(sip, SIP_MESSAGE); toheader = sip_header_create("T", account->sipuri); eheader = sip_event_header_create(SIP_EVENT_SENDCATMESSAGE); fetion_sip_add_header(sip, toheader); fetion_sip_add_header(sip, eheader); trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_callback(trans, sms_to_me_cb); transaction_add(account, trans); sip_text = fetion_sip_to_string(sip, text); hybrid_debug_info("fetion", "send sms to youself,send:\n%s", sip_text); if (send(account->sk, sip_text, strlen(sip_text), 0) == -1) { hybrid_debug_error("fetion", "send message to yourself error."); return HYBRID_ERROR; } g_free(sip_text); return HYBRID_OK; }
gint fetion_buddy_add(fetion_account *account, const gchar *groupid, const gchar *no, const gchar *alias) { fetion_sip *sip; sip_header *eheader; fetion_transaction *trans; gchar *body; gchar *sip_text; g_return_val_if_fail(account != NULL, HYBRID_ERROR); g_return_val_if_fail(groupid != NULL, HYBRID_ERROR); g_return_val_if_fail(no != NULL, HYBRID_ERROR); sip = account->sip; fetion_sip_set_type(sip, SIP_SERVICE); eheader = sip_event_header_create(SIP_EVENT_ADDBUDDY); fetion_sip_add_header(sip, eheader); trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_callback(trans, buddy_add_cb); transaction_add(account, trans); body = generate_buddy_add_body(no, groupid, alias, account->nickname); sip_text = fetion_sip_to_string(sip, body); g_free(body); hybrid_debug_info("fetion", "add buddy,send:\n%s", sip_text); if (send(account->sk, sip_text, strlen(sip_text), 0) == -1) { hybrid_debug_error("fetion", "add buddy failed"); return HYBRID_ERROR; } g_free(sip_text); return HYBRID_OK; }
gint fetion_message_new_chat(fetion_account *account, const gchar *userid, const gchar *text) { fetion_sip *sip; sip_header *eheader; fetion_transaction *trans; gchar *sip_text; g_return_val_if_fail(account != NULL, HYBRID_ERROR); g_return_val_if_fail(userid != NULL, HYBRID_ERROR); sip = account->sip; /*start chat*/ fetion_sip_set_type(sip, SIP_SERVICE); eheader = sip_event_header_create(SIP_EVENT_STARTCHAT); fetion_sip_add_header(sip, eheader); trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_userid(trans, userid); transaction_set_msg(trans, text); transaction_set_callback(trans, new_chat_cb); transaction_add(account, trans); sip_text = fetion_sip_to_string(sip, NULL); hybrid_debug_info("fetion", "new chat,send:\n%s", sip_text); if (send(account->sk, sip_text, strlen(sip_text), 0) == -1) { hybrid_debug_error("fetion", "new chat failed"); return HYBRID_ERROR; } g_free(sip_text); return HYBRID_OK; }
gint fetion_buddy_get_info(fetion_account *ac, const gchar *userid, TransCallback callback, gpointer data) { fetion_transaction *trans; fetion_sip *sip; sip_header *eheader; gchar *body; gchar *res; g_return_val_if_fail(ac != NULL, HYBRID_ERROR); g_return_val_if_fail(userid != NULL, HYBRID_ERROR); sip = ac->sip; fetion_sip_set_type(sip , SIP_SERVICE); eheader = sip_event_header_create(SIP_EVENT_GETCONTACTINFO); trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_userid(trans, userid); transaction_set_callback(trans, callback); transaction_set_data(trans, data); transaction_add(ac, trans); fetion_sip_add_header(sip, eheader); body = generate_get_info_body(userid); res = fetion_sip_to_string(sip, body); g_free(body); hybrid_debug_info("fetion", "send:\n%s", res); if (send(ac->sk, res, strlen(res), 0) == -1) { g_free(res); return HYBRID_ERROR; } g_free(res); return HYBRID_OK; }
gint fetion_message_send(fetion_account *account, const gchar *userid, const gchar *text) { fetion_sip *sip; sip_header *toheader; sip_header *cheader; sip_header *kheader; sip_header *nheader; gchar *sip_text; fetion_buddy *buddy; g_return_val_if_fail(account != NULL, HYBRID_ERROR); g_return_val_if_fail(userid != NULL && *userid != '\0', HYBRID_ERROR); g_return_val_if_fail(text != NULL, HYBRID_ERROR); sip = account->sip; if (!(buddy = fetion_buddy_find_by_userid(account, userid))) { hybrid_debug_error("fetion", "FATAL, can't find specified buddy"); return HYBRID_ERROR; } fetion_transaction *trans = transaction_create(); transaction_set_userid(trans, userid); transaction_set_msg(trans, text); if (!account->channel_ready) { /* If the channel is not ready, make the transaction to wait * until the transaction is ready */ transaction_wait(account, trans); hybrid_debug_info("fetion", "channel not ready, transaction sleep."); return HYBRID_OK; } fetion_sip_set_type(sip, SIP_MESSAGE); nheader = sip_event_header_create(SIP_EVENT_CATMESSAGE); toheader = sip_header_create("T", buddy->sipuri); cheader = sip_header_create("C", "text/plain"); kheader = sip_header_create("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); transaction_set_callid(trans, sip->callid); transaction_set_callback(trans, sms_response_cb); transaction_set_data(trans, account); transaction_set_timeout(trans, (GSourceFunc)sms_timeout_cb, trans); transaction_add(account, trans); sip_text = fetion_sip_to_string(sip, text); hybrid_debug_info("fetion", "send message, send:\n%s", sip_text); if (send(account->sk, sip_text, strlen(sip_text), 0) == -1) { g_free(sip_text); return HYBRID_ERROR; } g_free(sip_text); return HYBRID_OK; }
/** * Start sipc authencation with the response string. * * @param response It is generated by generate_response(). */ static gint sipc_aut_action(gint sk, fetion_account *ac, const gchar *response) { gchar *sipmsg; gchar *body; sip_header *aheader; sip_header *akheader; sip_header *ackheader; fetion_transaction *trans; fetion_sip *sip = ac->sip; ac->sk = sk; hybrid_debug_info("fetion", "sipc authencation action"); hybrid_account_set_connection_string(ac->account, _("start sipc authentication...")); body = generate_auth_body(ac); fetion_sip_set_type(sip, SIP_REGISTER); aheader = sip_authentication_header_create(response); akheader = sip_header_create("AK", "ak-value"); trans = transaction_create(); transaction_set_callid(trans, sip->callid); transaction_set_callback(trans, sipc_auth_cb); transaction_add(ac, trans); fetion_sip_add_header(sip, aheader); fetion_sip_add_header(sip, akheader); if(ac->verification != NULL && ac->verification->algorithm != NULL) { ackheader = sip_ack_header_create(ac->verification->code, ac->verification->algorithm, ac->verification->type, ac->verification->guid); fetion_sip_add_header(sip , ackheader); } fetion_verification_destroy(ac->verification); ac->verification = NULL; sipmsg = fetion_sip_to_string(sip, body); g_free(body); hybrid_debug_info("fetion", "Start sipc authentication , with ak-value"); hybrid_debug_info("fetion", "send:\n%s", sipmsg); if(send(sk, sipmsg, strlen(sipmsg), 0) == -1) { hybrid_debug_error("fetion", "send sipc auth request:%s\n", strerror(errno)); g_free(sipmsg); return HYBRID_ERROR; } g_free(sipmsg); return 0; }