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:
parent
5b9f325aef
commit
5e73fc3064
|
@ -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 "
|
||||
|
|
Reference in New Issue