Added package_created signal, added gm_mcp_session_reset, fixed gm_mcp_session_handle_multiline_end, fixed gm_mcp_session_handle_multiline, fixed memleaks

This commit is contained in:
Jesse van den Kieboom 2005-11-15 11:40:41 +00:00
parent 5b9f325aef
commit 5e73fc3064
1 changed files with 67 additions and 20 deletions

View File

@ -8,6 +8,7 @@
#include "../gm-support.h"
#include "../gm-debug.h"
#include "../gm-options.h"
#include "../gm-string.h"
#define GM_MCP_SESSION_GET_PRIVATE(object)( \
G_TYPE_INSTANCE_GET_PRIVATE((object), \
@ -22,21 +23,22 @@ struct _GmMcpSessionPrivate {
GList *multiline;
};
/* Signals
/* Signals */
enum {
PROTO
PACKAGE_CREATED,
NUM_SIGNALS
};
static guint gm_mcp_session_signals[NUM_SIGNALS] = {0};*/
static guint gm_mcp_session_signals[NUM_SIGNALS] = {0};
G_DEFINE_TYPE(GmMcpSession, gm_mcp_session, G_TYPE_OBJECT)
static void
gm_mcp_session_finalize(GObject *object) {
//GmMcpSession *obj = GM_MCP_SESSION(object);
GmMcpSession *obj = GM_MCP_SESSION(object);
gm_mcp_session_reset(obj);
G_OBJECT_CLASS(gm_mcp_session_parent_class)->finalize(object);
}
@ -47,15 +49,16 @@ gm_mcp_session_class_init(GmMcpSessionClass *klass) {
object_class->finalize = gm_mcp_session_finalize;
klass->available_packages = gm_mcp_classes_initialize();
/*gm_mcp_session_signals[PROTO] =
g_signal_new("proto",
gm_mcp_session_signals[PACKAGE_CREATED] =
g_signal_new("package_created",
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(GmMcpSessionClass, proto),
G_STRUCT_OFFSET(GmMcpSessionClass, package_created),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
0);*/
1,
G_TYPE_OBJECT);
g_type_class_add_private(object_class, sizeof(GmMcpSessionPrivate));
}
@ -151,7 +154,7 @@ gm_mcp_session_invoke_multiline_handle(GmMcpSession *session, gchar *data_tag,
// Lines should only be freed when allValues is not handled!
if (!handle_all) {
g_list_free_simple(minfo->data);
gm_g_list_free_simple(minfo->data);
} else {
g_list_free(minfo->data);
}
@ -167,8 +170,10 @@ gm_mcp_session_invoke_multiline_handle(GmMcpSession *session, gchar *data_tag,
}
void
gm_mcp_session_handle_multiline(GmMcpSession *session, gchar *line) {
gchar *data_tag, *key, *value, *ptr = line, *key_start;
gm_mcp_session_handle_multiline(GmMcpSession *session, gchar const *line) {
gchar *data_tag, *key, *value;
gchar const *key_start;
gchar const *ptr = line;
gm_string_skip_nonspace(&ptr);
@ -180,10 +185,9 @@ gm_mcp_session_handle_multiline(GmMcpSession *session, gchar *line) {
gm_string_skip_space(&ptr);
key_start = ptr;
gm_string_skip_nonspace(&ptr);
if (*ptr) {
if (*ptr == '\0') {
return;
}
@ -199,14 +203,12 @@ gm_mcp_session_handle_multiline(GmMcpSession *session, gchar *line) {
void
gm_mcp_session_handle_multiline_end(GmMcpSession *session, gchar *line) {
gchar *ptr = line;
gchar const *ptr = line;
gchar *data_tag;
while (*ptr != '\0' && g_unichar_isspace(g_utf8_get_char(ptr))) {
ptr = g_utf8_next_char(ptr);
}
gm_string_skip_nonspace(&ptr);
data_tag = g_strndup(line, ptr - line);
gm_mcp_session_invoke_multiline_handle(session, data_tag, NULL, NULL);
g_free(data_tag);
}
@ -220,6 +222,48 @@ gm_mcp_session_new(GObject *world) {
return obj;
}
void
gm_mcp_session_reset(GmMcpSession *session) {
GList *item, *l;
McpMultilineInfo *minfo;
GmMcpPackage *package;
g_free(session->priv->authkey);
session->priv->authkey = NULL;
session->priv->version = -1;
l = g_list_copy(session->priv->packages);
for (item = l; item; item = item->next) {
package = GM_MCP_PACKAGE(item->data);
g_object_unref(package);
session->priv->packages = g_list_remove(session->priv->packages,
package);
}
g_list_free(l);
g_list_free(session->priv->packages);
session->priv->packages = NULL;
for (item = session->priv->multiline; item; item = item->next) {
minfo = (McpMultilineInfo *)(item->data);
g_free(minfo->data_tag);
g_free(minfo->key);
gm_g_list_free_simple(minfo->data);
g_free(minfo);
}
g_list_free(session->priv->multiline);
session->priv->multiline = NULL;
}
GList const *
gm_mcp_session_get_packages(GmMcpSession *session) {
return session->priv->packages;
@ -370,6 +414,9 @@ gm_mcp_session_create_package(GmMcpSession *session, GmMcpPackageClass *klass,
session->priv->packages = g_list_append(session->priv->packages,
package);
g_signal_emit(session, gm_mcp_session_signals[PACKAGE_CREATED],
0, G_OBJECT(package));
return package;
} else {
gm_debug_msg(DEBUG_MCP, "GmMcpSession.CreatePackage: package (%s) is "