From 5e73fc306427d078cf4fc0adfd9004faac1d299e Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Tue, 15 Nov 2005 11:40:41 +0000 Subject: [PATCH] Added package_created signal, added gm_mcp_session_reset, fixed gm_mcp_session_handle_multiline_end, fixed gm_mcp_session_handle_multiline, fixed memleaks --- gnoemoe/mcp/gm-mcp-session.c | 87 +++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/gnoemoe/mcp/gm-mcp-session.c b/gnoemoe/mcp/gm-mcp-session.c index afa46e0..e7f11ad 100644 --- a/gnoemoe/mcp/gm-mcp-session.c +++ b/gnoemoe/mcp/gm-mcp-session.c @@ -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 "