Store topic_set_time, topic_set_by.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 22 Apr 2007 10:26:51 +0000 (12:26 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 22 Apr 2007 10:26:51 +0000 (12:26 +0200)
NEWS
src/line.c
src/linestack_file.c
src/state.c

diff --git a/NEWS b/NEWS
index 38d711e727ed54a93caa2c69365965785b3dc5bb..7ae242e39dd399cd0f03dc9df2856fe6491eafaa 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,9 @@ Ctrlproxy 3.0.3 UNRELEASED
     * Handle 470 response correctly.
 
        * Recognize supported channel / user modes correctly.
+       
+       * Properly store topic_set_time and topic_set_by in the 
+         linestack. (#108, #125)
 
   INTERNALS
 
index 3942bef90ddd166f2fef67a30f47b0e5ac2517a1..fd5890d9eb94376580410cb5f78ca3f06f0504b4 100644 (file)
@@ -256,13 +256,14 @@ char *line_get_nick(const struct line *l)
 {
        char *nick = NULL;
        char *t;
-       g_assert(l);
-       g_assert(l->origin);
+       g_assert(l != NULL);
+       g_assert(l->origin != NULL);
 
        nick = g_strdup(l->origin);
        t = strchr(nick, '!');
-       if(!t
+       if(t == NULL
                return nick;
+
        *t = '\0';
        return nick;
 }
index 3b6e048fd5dd2682fe0c3b1e46a9386ab5e4baf2..8b208c57385620cb5e083c00f4eea4f7eb59cfc7 100644 (file)
@@ -158,6 +158,25 @@ static gboolean marshall_char(struct network_state *nst, const char *name, int l
        }
 }
 
+static gboolean marshall_long(struct network_state *nst, const char *name, int level, enum marshall_mode m, GIOChannel *t, long *n)
+{
+       if (m == MARSHALL_PUSH) {
+               char tmp[10];
+               g_snprintf(tmp, sizeof(tmp), "%ld", *n);
+               return marshall_set(t, level, name, tmp);
+       } else {
+               char *tmp;
+               gboolean ret = marshall_get(t, level, name, &tmp);
+               if (!ret) return FALSE;
+
+               *n = atol(tmp);
+
+               g_free(tmp);
+
+               return TRUE;
+       }
+}
+
 static gboolean marshall_int(struct network_state *nst, const char *name, int level, enum marshall_mode m, GIOChannel *t, int *n)
 {
        if (m == MARSHALL_PUSH) {
@@ -314,12 +333,13 @@ static gboolean marshall_channel_state (struct network_state *nst,
        ret &= marshall_string(nst, "name", level+1, m, t, &(*c)->name);
        ret &= marshall_string(nst, "key", level+1, m, t, &(*c)->key);
        ret &= marshall_string(nst, "topic", level+1, m, t, &(*c)->topic);
+       ret &= marshall_string(nst, "topic_set_by", level+1, m, t, &(*c)->topic_set_by);
+       ret &= marshall_long(nst, "topic_set_time", level+1, m, t, &(*c)->topic_set_time);
        ret &= marshall_GList(nst, "banlist", level+1, m, t, &(*c)->banlist, (marshall_fn_t)marshall_banlist_entry);
        ret &= marshall_GList(nst, "invitelist", level+1, m, t, &(*c)->invitelist, (marshall_fn_t)marshall_string);
        ret &= marshall_GList(nst, "exceptlist", level+1, m, t, &(*c)->exceptlist, (marshall_fn_t)marshall_string);
        (*c)->network = nst;
 
-
        marshall_struct(t, m, level+1, "nicks");
 
        /* Nicks  */
index dd95259b6bb3235d12e6a35ce5be6b4877d155ca..711a612eee6dc03800bd319abea1a75a3d3165c9 100644 (file)
@@ -434,7 +434,10 @@ static void handle_kick(struct network_state *s, struct line *l)
 static void handle_topic(struct network_state *s, struct line *l) 
 {
        struct channel_state *c = find_channel(s, l->args[1]);
-       if(c->topic)g_free(c->topic);
+       if (c->topic != NULL)
+               g_free(c->topic);
+       if (c->topic_set_by != NULL)
+               g_free(c->topic_set_by);
        c->topic = g_strdup(l->args[2]);
        c->topic_set_time = time(NULL);
        c->topic_set_by = line_get_nick(l);