diff options
| -rw-r--r-- | facebook/facebook-api.c | 58 | ||||
| -rw-r--r-- | facebook/facebook-api.h | 10 | ||||
| -rw-r--r-- | facebook/facebook.c | 5 | 
3 files changed, 63 insertions, 10 deletions
diff --git a/facebook/facebook-api.c b/facebook/facebook-api.c index 9ba01ec..7a698b0 100644 --- a/facebook/facebook-api.c +++ b/facebook/facebook-api.c @@ -1064,6 +1064,36 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,          }      }; +    values = fb_json_values_new(root); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.log_message_type"); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, "$.author"); +    fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, +                       "$.log_message_data.name"); +    fb_json_values_update(values, &err); + +    if (G_UNLIKELY(err != NULL)) { +        g_propagate_error(error, err); +        g_object_unref(values); +        return events; +    } + +    str = fb_json_values_next_str(values, NULL); + +    if (g_strcmp0(str, "log:thread-name") == 0) { +        str = fb_json_values_next_str(values, ""); +        str = strrchr(str, ':'); + +        if (str != NULL) { +            devent = fb_api_event_dup(event, FALSE); +            devent->type = FB_API_EVENT_TYPE_THREAD_TOPIC; +            devent->uid = FB_ID_FROM_STR(str + 1); +            devent->text = fb_json_values_next_str_dup(values, NULL); +            events = g_slist_prepend(events, devent); +        } +    } + +    g_object_unref(values); +      for (i = 0; i < G_N_ELEMENTS(evtypes); i++) {          values = fb_json_values_new(root);          fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$"); @@ -1074,7 +1104,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,              str = strrchr(str, ':');              if (str != NULL) { -                devent = fb_api_event_dup(event); +                devent = fb_api_event_dup(event, FALSE);                  devent->type = evtypes[i].type;                  devent->uid = FB_ID_FROM_STR(str + 1);                  events = g_slist_prepend(events, devent); @@ -1093,7 +1123,7 @@ fb_api_event_parse(FbApi *api, FbApiEvent *event, GSList *events,  }  static void -fb_api_cb_mercury(FbApi *api, GByteArray *pload) +fb_api_cb_publish_mercury(FbApi *api, GByteArray *pload)  {      const gchar *str;      FbApiEvent event; @@ -1112,7 +1142,7 @@ fb_api_cb_mercury(FbApi *api, GByteArray *pload)      fb_json_values_set_array(values, FALSE, "$.actions");      while (fb_json_values_update(values, &err)) { -        fb_api_event_reset(&event); +        fb_api_event_reset(&event, FALSE);          str = fb_json_values_next_str(values, "0");          event.tid = FB_ID_FROM_STR(str); @@ -1518,7 +1548,7 @@ fb_api_cb_mqtt_publish(FbMqtt *mqtt, const gchar *topic, GByteArray *pload,          void (*func) (FbApi *api, GByteArray *pload);      } parsers[] = {          {"/mark_thread_response", fb_api_cb_publish_mark}, -        {"/mercury", fb_api_cb_mercury}, +        {"/mercury", fb_api_cb_publish_mercury},          {"/orca_typing_notifications", fb_api_cb_publish_typing},          {"/t_ms", fb_api_cb_publish_ms},          {"/t_p", fb_api_cb_publish_p} @@ -2782,19 +2812,32 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state)  }  FbApiEvent * -fb_api_event_dup(const FbApiEvent *event) +fb_api_event_dup(const FbApiEvent *event, gboolean deep)  { +    FbApiEvent *ret; +      if (event == NULL) {          return g_new0(FbApiEvent, 1);      } -    return g_memdup(event, sizeof *event); +    ret = g_memdup(event, sizeof *event); + +    if (deep) { +        ret->text = g_strdup(event->text); +    } + +    return ret;  }  void -fb_api_event_reset(FbApiEvent *event) +fb_api_event_reset(FbApiEvent *event, gboolean deep)  {      g_return_if_fail(event != NULL); + +    if (deep) { +        g_free(event->text); +    } +      memset(event, 0, sizeof *event);  } @@ -2802,6 +2845,7 @@ void  fb_api_event_free(FbApiEvent *event)  {      if (G_LIKELY(event != NULL)) { +        g_free(event->text);          g_free(event);      }  } diff --git a/facebook/facebook-api.h b/facebook/facebook-api.h index d72abbc..75bd739 100644 --- a/facebook/facebook-api.h +++ b/facebook/facebook-api.h @@ -255,6 +255,7 @@ typedef enum  /**   * FbApiEventType: + * @FB_API_EVENT_TYPE_THREAD_TOPIC: The thread topic was changed.   * @FB_API_EVENT_TYPE_THREAD_USER_ADDED: A thread user was added.   * @FB_API_EVENT_TYPE_THREAD_USER_REMOVED: A thread user was removed.   * @@ -262,6 +263,7 @@ typedef enum   */  typedef enum  { +    FB_API_EVENT_TYPE_THREAD_TOPIC,      FB_API_EVENT_TYPE_THREAD_USER_ADDED,      FB_API_EVENT_TYPE_THREAD_USER_REMOVED  } FbApiEventType; @@ -309,6 +311,7 @@ struct _FbApiClass   * @type: The #FbApiEventType.   * @uid: The user #FbId.   * @tid: The thread #FbId. + * @text: The event text.   *   * Represents a Facebook update event.   */ @@ -317,6 +320,7 @@ struct _FbApiEvent      FbApiEventType type;      FbId uid;      FbId tid; +    gchar *text;  };  /** @@ -643,6 +647,7 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state);  /**   * fb_api_event_dup:   * @event: The #FbApiEvent or #NULL. + * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.   *   * Duplicates an #FbApiEvent. If @event is #NULL, a new zero filled   * #FbApiEvent is returned. The returned #FbApiEvent should be freed @@ -651,16 +656,17 @@ fb_api_typing(FbApi *api, FbId uid, gboolean state);   * Returns: The new #FbApiEvent.   */  FbApiEvent * -fb_api_event_dup(const FbApiEvent *event); +fb_api_event_dup(const FbApiEvent *event, gboolean deep);  /**   * fb_api_event_reset:   * @event: The #FbApiEvent. + * @deep: #TRUE to free allocated data, otherwise #FALSE.   *   * Resets an #FbApiEvent.   */  void -fb_api_event_reset(FbApiEvent *event); +fb_api_event_reset(FbApiEvent *event, gboolean deep);  /**   * fb_api_event_free: diff --git a/facebook/facebook.c b/facebook/facebook.c index 61bc04d..8b970a5 100644 --- a/facebook/facebook.c +++ b/facebook/facebook.c @@ -221,6 +221,10 @@ fb_cb_api_events(FbApi *api, GSList *events, gpointer data)          FB_ID_TO_STR(event->uid, uid);          switch (event->type) { +        case FB_API_EVENT_TYPE_THREAD_TOPIC: +            imcb_chat_topic(gc, uid, (gchar *) event->text, 0); +            break; +          case FB_API_EVENT_TYPE_THREAD_USER_ADDED:              if (bee_user_by_handle(ic->bee, ic, uid) == NULL) {                  g_hash_table_insert(fetch, &event->tid, event); @@ -755,7 +759,6 @@ fb_chat_topic(struct groupchat *gc, char *topic)      api = fb_data_get_api(fata);      tid = FB_ID_FROM_STR(gc->title);      fb_api_thread_topic(api, tid, topic); -    imcb_chat_topic(gc, NULL, topic, 0);  }  static account_t *  | 
