Example #1
0
// 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;
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
/**
 * 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;
}