pidgin/pidgin

Bump the version for release
release-2.x.y v2.10.12
2015-12-31, Gary Kramlich
2ac1dcb9eb2e
Bump the version for release
/**
* @file transaction.c MSN transaction functions
*
* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include "internal.h"
#include "debug.h"
#include "msn.h"
#include "transaction.h"
MsnTransaction *
msn_transaction_new(MsnCmdProc *cmdproc, const char *command,
const char *format, ...)
{
MsnTransaction *trans;
va_list arg;
g_return_val_if_fail(command != NULL, NULL);
trans = g_new0(MsnTransaction, 1);
trans->cmdproc = cmdproc;
trans->command = g_strdup(command);
trans->saveable = TRUE;
if (format != NULL)
{
va_start(arg, format);
trans->params = g_strdup_vprintf(format, arg);
va_end(arg);
}
/* trans->queue = g_queue_new(); */
return trans;
}
void
msn_transaction_destroy(MsnTransaction *trans)
{
g_return_if_fail(trans != NULL);
g_free(trans->command);
g_free(trans->params);
g_free(trans->payload);
if (trans->data_free)
trans->data_free(trans->data);
#if 0
if (trans->pendent_cmd != NULL)
msn_message_unref(trans->pendent_msg);
#endif
#if 0
MsnTransaction *elem;
if (trans->queue != NULL)
{
while ((elem = g_queue_pop_head(trans->queue)) != NULL)
msn_transaction_destroy(elem);
g_queue_free(trans->queue);
}
#endif
if (trans->callbacks != NULL && trans->has_custom_callbacks)
g_hash_table_destroy(trans->callbacks);
if (trans->timer)
purple_timeout_remove(trans->timer);
g_free(trans);
}
char *
msn_transaction_to_string(MsnTransaction *trans)
{
char *str;
g_return_val_if_fail(trans != NULL, FALSE);
if (trans->params != NULL)
str = g_strdup_printf("%s %u %s\r\n", trans->command, trans->trId, trans->params);
else if (trans->saveable)
str = g_strdup_printf("%s %u\r\n", trans->command, trans->trId);
else
str = g_strdup_printf("%s\r\n", trans->command);
return str;
}
void
msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd)
{
purple_debug_info("msn", "queueing command.\n");
trans->pendent_cmd = cmd;
msn_command_ref(cmd);
}
void
msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc)
{
MsnCommand *cmd;
if (!cmdproc->servconn->connected)
return;
purple_debug_info("msn", "unqueueing command.\n");
cmd = trans->pendent_cmd;
g_return_if_fail(cmd != NULL);
msn_cmdproc_process_cmd(cmdproc, cmd);
msn_command_unref(cmd);
trans->pendent_cmd = NULL;
}
#if 0
void
msn_transaction_queue(MsnTransaction *trans, MsnTransaction *elem)
{
if (trans->queue == NULL)
trans->queue = g_queue_new();
g_queue_push_tail(trans->queue, elem);
}
void
msn_transaction_unqueue(MsnTransaction *trans, MsnCmdProc *cmdproc)
{
MsnTransaction *elem;
while ((elem = g_queue_pop_head(trans->queue)) != NULL)
msn_cmdproc_send_trans(cmdproc, elem);
}
#endif
void
msn_transaction_set_payload(MsnTransaction *trans,
const char *payload, gsize payload_len)
{
g_return_if_fail(trans != NULL);
g_return_if_fail(payload != NULL);
trans->payload = g_strdup(payload);
trans->payload_len = payload_len ? payload_len : strlen(trans->payload);
}
void
msn_transaction_set_data(MsnTransaction *trans, void *data)
{
g_return_if_fail(trans != NULL);
trans->data = data;
}
void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn)
{
g_return_if_fail(trans != NULL);
trans->data_free = fn;
}
void
msn_transaction_set_saveable(MsnTransaction *trans, gboolean saveable)
{
g_return_if_fail(trans != NULL);
trans->saveable = saveable;
}
void
msn_transaction_add_cb(MsnTransaction *trans, char *answer,
MsnTransCb cb)
{
g_return_if_fail(trans != NULL);
g_return_if_fail(answer != NULL);
if (trans->callbacks == NULL)
{
trans->has_custom_callbacks = TRUE;
trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
NULL);
}
else if (trans->has_custom_callbacks != TRUE)
g_return_if_reached ();
g_hash_table_insert(trans->callbacks, answer, cb);
}
static gboolean
transaction_timeout(gpointer data)
{
MsnTransaction *trans;
trans = data;
g_return_val_if_fail(trans != NULL, FALSE);
#if 0
purple_debug_info("msn", "timed out: %s %d %s\n", trans->command, trans->trId, trans->params);
#endif
trans->timer = 0;
if (trans->timeout_cb != NULL)
trans->timeout_cb(trans->cmdproc, trans);
return FALSE;
}
void
msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb)
{
if (trans->timer)
{
purple_debug_error("msn", "This shouldn't be happening\n");
purple_timeout_remove(trans->timer);
}
trans->timeout_cb = cb;
trans->timer = purple_timeout_add_seconds(60, transaction_timeout, trans);
}
void
msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb)
{
trans->error_cb = cb;
}