Esempio n. 1
0
static void
_win_chat_print_incoming_message(ProfWin *window, GTimeVal *tv_stamp,
    const char * const from, const char * const message)
{
    if (tv_stamp == NULL) {
        win_print_time(window, '-');
    } else {
        GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp);
        gchar *date_fmt = g_date_time_format(time, "%H:%M:%S");
        wattron(window->win, COLOUR_TIME);
        wprintw(window->win, "%s - ", date_fmt);
        wattroff(window->win, COLOUR_TIME);
        g_date_time_unref(time);
        g_free(date_fmt);
    }

    if (strncmp(message, "/me ", 4) == 0) {
        wattron(window->win, COLOUR_THEM);
        wprintw(window->win, "*%s ", from);
        waddstr(window->win, message + 4);
        wprintw(window->win, "\n");
        wattroff(window->win, COLOUR_THEM);
    } else {
        wattron(window->win, COLOUR_THEM);
        wprintw(window->win, "%s: ", from);
        wattroff(window->win, COLOUR_THEM);
        waddstr(window->win, message);
        wprintw(window->win, "\n");
    }
}
Esempio n. 2
0
void
ui_room_history(const char * const room_jid, const char * const nick,
    GTimeVal tv_stamp, const char * const message)
{
    ProfWin *window = wins_get_by_recipient(room_jid);

    GDateTime *time = g_date_time_new_from_timeval_utc(&tv_stamp);
    gchar *date_fmt = g_date_time_format(time, "%H:%M:%S");
    wprintw(window->win, "%s - ", date_fmt);
    g_date_time_unref(time);
    g_free(date_fmt);

    if (strncmp(message, "/me ", 4) == 0) {
        wprintw(window->win, "*%s ", nick);
        waddstr(window->win, message + 4);
        wprintw(window->win, "\n");
    } else {
        wprintw(window->win, "%s: ", nick);
        _win_show_message(window->win, message);
    }

    if (wins_is_current(window)) {
        wins_refresh_current();
    }
}
Esempio n. 3
0
/**
 * as_iso8601_to_datetime:
 *
 * Helper function to work around a bug in g_time_val_from_iso8601.
 * Can be dropped when the bug gets resolved upstream:
 * https://bugzilla.gnome.org/show_bug.cgi?id=760983
 **/
GDateTime*
as_iso8601_to_datetime (const gchar *iso_date)
{
	GTimeVal tv;
	guint dmy[] = {0, 0, 0};

	/* nothing set */
	if (iso_date == NULL || iso_date[0] == '\0')
		return NULL;

	/* try to parse complete ISO8601 date */
	if (g_strstr_len (iso_date, -1, " ") != NULL) {
		if (g_time_val_from_iso8601 (iso_date, &tv) && tv.tv_sec != 0)
			return g_date_time_new_from_timeval_utc (&tv);
	}

	/* g_time_val_from_iso8601() blows goats and won't
	 * accept a valid ISO8601 formatted date without a
	 * time value - try and parse this case */
	if (sscanf (iso_date, "%u-%u-%u", &dmy[0], &dmy[1], &dmy[2]) != 3)
		return NULL;

	/* create valid object */
	return g_date_time_new_utc (dmy[0], dmy[1], dmy[2], 0, 0, 0);
}
Esempio n. 4
0
/**
 * pk_iso8601_to_datetime: (skip)
 * @iso_date: The ISO8601 date to convert
 *
 * Return value: If valid then a new %GDateTime, else NULL
 *
 * Since: 0.8.11
 **/
GDateTime *
pk_iso8601_to_datetime (const gchar *iso_date)
{
	gboolean ret = FALSE;
	guint retval;
	guint d = 0;
	guint m = 0;
	guint y = 0;
	GTimeVal time_val;
	GDateTime *date = NULL;

	if (iso_date == NULL || iso_date[0] == '\0')
		goto out;

	/* try to parse complete ISO8601 date */
	if (g_strstr_len (iso_date, -1, " ") != NULL)
		ret = g_time_val_from_iso8601 (iso_date, &time_val);
	if (ret && time_val.tv_sec != 0) {
		g_debug ("Parsed %s %i", iso_date, ret);
		date = g_date_time_new_from_timeval_utc (&time_val);
		goto out;
	}

	/* g_time_val_from_iso8601() blows goats and won't
	 * accept a valid ISO8601 formatted date without a
	 * time value - try and parse this case */
	retval = sscanf (iso_date, "%u-%u-%u", &y, &m, &d);
	if (retval != 3)
		goto out;

	/* create valid object */
	date = g_date_time_new_utc (y, m, d, 0, 0, 0);
out:
	return date;
}
Esempio n. 5
0
/**
 * mongo_bson_iter_get_value_date_time:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches a #GDateTime for the current value pointed to by @iter.
 *
 * Returns: A new #GDateTime which should be freed with g_date_time_unref().
 */
GDateTime *
mongo_bson_iter_get_value_date_time (MongoBsonIter *iter)
{
   GTimeVal tv;

   g_return_val_if_fail(iter != NULL, NULL);

   mongo_bson_iter_get_value_timeval(iter, &tv);
   return g_date_time_new_from_timeval_utc(&tv);
}
Esempio n. 6
0
/**
 * CacheUtilDatetimeFromString:
 * @value: String containing the date, in the "{yyyy}-{mm}-{dd}T{hh}:{mm}:{ss}Z"
 * format (ISO 8601). Dates are always UTC.
 * @result: (out): GDateTime respresenting the given @value.
 *
 * Returns: #TRUE if @result was modified or #FALSE if the date couldn't be
 * parsed.
 */
gboolean CacheUtilDatetimeFromString(const gchar *value, GDateTime **result) {
  GTimeVal tv = {0, 0};
  g_assert(result);

  if (g_time_val_from_iso8601(value, &tv)) {
    *result = g_date_time_new_from_timeval_utc(&tv);
    return TRUE;
  } else {
    return FALSE;
  }
}
Esempio n. 7
0
void
sv_ev_roster_received(void)
{
    if (prefs_get_boolean(PREF_ROSTER)) {
        ui_show_roster();
    }

    char *account_name = session_get_account_name();

#ifdef HAVE_LIBGPGME
    // check pgp key valid if specified
    ProfAccount *account = accounts_get_account(account_name);
    if (account && account->pgp_keyid) {
        char *err_str = NULL;
        if (!p_gpg_valid_key(account->pgp_keyid, &err_str)) {
            cons_show_error("Invalid PGP key ID specified: %s, %s", account->pgp_keyid, err_str);
        }
        free(err_str);
    }
    account_free(account);
#endif

    // send initial presence
    resource_presence_t conn_presence = accounts_get_login_presence(account_name);
    char *last_activity_str = accounts_get_last_activity(account_name);
    if (last_activity_str) {
        GDateTime *nowdt = g_date_time_new_now_utc();

        GTimeVal lasttv;
        gboolean res = g_time_val_from_iso8601(last_activity_str, &lasttv);
        if (res) {
            GDateTime *lastdt = g_date_time_new_from_timeval_utc(&lasttv);
            GTimeSpan diff_micros = g_date_time_difference(nowdt, lastdt);
            int diff_secs = (diff_micros / 1000) / 1000;
            if (prefs_get_boolean(PREF_LASTACTIVITY)) {
                cl_ev_presence_send(conn_presence, NULL, diff_secs);
            } else {
                cl_ev_presence_send(conn_presence, NULL, 0);
            }
            g_date_time_unref(lastdt);
        } else {
            cl_ev_presence_send(conn_presence, NULL, 0);
        }

        free(last_activity_str);
        g_date_time_unref(nowdt);
    } else {
        cl_ev_presence_send(conn_presence, NULL, 0);
    }

    const char *fulljid = connection_get_fulljid();
    plugins_on_connect(account_name, fulljid);
}
Esempio n. 8
0
void
chat_log_chat(const gchar * const login, gchar *other,
    const gchar * const msg, chat_log_direction_t direction, GTimeVal *tv_stamp)
{
    struct dated_chat_log *dated_log = g_hash_table_lookup(logs, other);

    // no log for user
    if (dated_log == NULL) {
        dated_log = _create_log(other, login);
        g_hash_table_insert(logs, strdup(other), dated_log);

    // log exists but needs rolling
    } else if (_log_roll_needed(dated_log)) {
        dated_log = _create_log(other, login);
        g_hash_table_replace(logs, strdup(other), dated_log);
    }

    gchar *date_fmt = NULL;
    GDateTime *dt = NULL;
    if (tv_stamp == NULL) {
        dt = g_date_time_new_now_local();
    } else {
        dt = g_date_time_new_from_timeval_utc(tv_stamp);
    }

    date_fmt = g_date_time_format(dt, "%H:%M:%S");

    FILE *logp = fopen(dated_log->filename, "a");
    g_chmod(dated_log->filename, S_IRUSR | S_IWUSR);
    if (logp != NULL) {
        if (direction == PROF_IN_LOG) {
            if (strncmp(msg, "/me ", 4) == 0) {
                fprintf(logp, "%s - *%s %s\n", date_fmt, other, msg + 4);
            } else {
                fprintf(logp, "%s - %s: %s\n", date_fmt, other, msg);
            }
        } else {
            if (strncmp(msg, "/me ", 4) == 0) {
                fprintf(logp, "%s - *me %s\n", date_fmt, msg + 4);
            } else {
                fprintf(logp, "%s - me: %s\n", date_fmt, msg);
            }
        }
        fflush(logp);
        int result = fclose(logp);
        if (result == EOF) {
            log_error("Error closing file %s, errno = %d", dated_log->filename, errno);
        }
    }

    g_free(date_fmt);
    g_date_time_unref(dt);
}
Esempio n. 9
0
static GDateTime*
gnc_g_date_time_new_from_timeval_local (const GTimeVal* tv)
{
#ifndef G_OS_WIN32
    return g_date_time_new_from_timeval_local (tv);
#else
    GTimeZone *tz = gnc_g_time_zone_new_local ();
    GDateTime *gdt = g_date_time_new_from_timeval_utc (tv);
    if (!gdt)
	return gdt;
    return gnc_g_date_time_adjust_for_dst (gdt, tz);
#endif
}
Esempio n. 10
0
static GDateTime *
parse_date (const gchar *iso8601_string)
{
  char *padded_date;
  GDateTime *date;
  GTimeVal tv;

  padded_date = g_strconcat (iso8601_string, "T00:00:00Z", NULL);
  g_time_val_from_iso8601 (padded_date, &tv);
  date = g_date_time_new_from_timeval_utc (&tv);
  g_free (padded_date);
  return date;
}
Esempio n. 11
0
void
win_save_print(ProfWin *window, const char show_char, GTimeVal *tstamp,
    int flags, theme_item_t theme_item, const char * const from, const char * const message)
{
    GDateTime *time;

    if (tstamp == NULL) {
        time = g_date_time_new_now_local();
    } else {
        time = g_date_time_new_from_timeval_utc(tstamp);
    }

    buffer_push(window->buffer, show_char, time, flags, theme_item, from, message);
    _win_print(window, show_char, time, flags, theme_item, from, message);
}
Esempio n. 12
0
/**
 * grl_date_time_from_iso8601:
 * @date: a date expressed in iso8601 format
 *
 * Returns: a newly-allocated #GDateTime set to the time corresponding to
 * @date, or %NULL if @date could not be parsed properly.
 *
 * Since: 0.2.0
 */
GDateTime *
grl_date_time_from_iso8601 (const gchar *date)
{
  GTimeVal t = { 0, };
  gboolean ret;
  gchar *date_time;
  gint date_length;

  if (!date) {
    return NULL;
  }

  ret = g_time_val_from_iso8601 (date, &t);

  /* second condition works around
   * https://bugzilla.gnome.org/show_bug.cgi?id=650968 */
  if (!ret || (t.tv_sec == 0 && t.tv_usec == 0)) {
    /* We might be in the case where there is a date alone. In that case, we
     * take the convention of setting it to noon GMT */

    /* Date can could be YYYY, YYYY-MM, YYYY-MM-DD or YYYYMMDD */
    date_length = strlen (date);
    switch (date_length) {
    case 4:
      date_time = g_strdup_printf ("%s-01-01T12:00:00Z", date);
      break;
    case 7:
      date_time = g_strdup_printf ("%s-01T12:00:00Z", date);
      break;
    default:
      date_time = g_strdup_printf ("%sT12:00:00Z", date);
    }
    ret = g_time_val_from_iso8601 (date_time, &t);
    g_free (date_time);
  }

  if (ret)
    return g_date_time_new_from_timeval_utc (&t);

  return NULL;
}
Esempio n. 13
0
void
win_print_with_receipt(ProfWin *window, const char show_char, int pad_indent, GTimeVal *tstamp,
    int flags, theme_item_t theme_item, const char *const from, const char *const message, char *id)
{
    GDateTime *time;

    if (tstamp == NULL) {
        time = g_date_time_new_now_local();
    } else {
        time = g_date_time_new_from_timeval_utc(tstamp);
    }

    DeliveryReceipt *receipt = malloc(sizeof(struct delivery_receipt_t));
    receipt->id = strdup(id);
    receipt->received = FALSE;

    buffer_push(window->layout->buffer, show_char, pad_indent, time, flags, theme_item, from, message, receipt);
    _win_print(window, show_char, pad_indent, time, flags, theme_item, from, message, receipt);
    // TODO: cross-reference.. this should be replaced by a real event-based system
    inp_nonblocking(TRUE);
    g_date_time_unref(time);
}
Esempio n. 14
0
TpDebugMessage *
_tp_debug_message_new (gdouble timestamp,
    const gchar *domain,
    TpDebugLevel level,
    const gchar *message)
{
  TpDebugMessage *self;
  GTimeVal tv;

  g_return_val_if_fail (domain != NULL, NULL);
  g_return_val_if_fail (message != NULL, NULL);

  self = g_object_new (TP_TYPE_DEBUG_MESSAGE,
      NULL);

  tv.tv_sec = (glong) timestamp;
  tv.tv_usec = ((timestamp - (int) timestamp) * 1e6);

  if (g_strrstr (domain, "/"))
    {
      gchar **parts = g_strsplit (domain, "/", 2);
      self->priv->domain = g_strdup (parts[0]);
      self->priv->category = g_strdup (parts[1]);
      g_strfreev (parts);
    }
  else
    {
      self->priv->domain = g_strdup (domain);
      self->priv->category = NULL;
    }

  self->priv->time = g_date_time_new_from_timeval_utc (&tv);

  self->priv->level = debug_level_to_log_level_flags (level);
  self->priv->message = g_strdup (message);
  g_strchomp (self->priv->message);

  return self;
}
Esempio n. 15
0
static gboolean
news_format_rss_read_from_xml (NewsFormatRss  *rss,
                        XmlReader      *reader,
                        NewsFeed       *feed,
                        GError        **error)
{
   GHashTable *categories = NULL;
   GHashTable *persons = NULL;
   GHashTable *links = NULL;
   GomAdapter *adapter;
   gchar *str;

   ENTRY;

   g_return_val_if_fail(NEWS_IS_FORMAT_RSS(rss), FALSE);
   g_return_val_if_fail(XML_IS_READER(reader), FALSE);
   g_return_val_if_fail(NEWS_IS_FEED(feed), FALSE);

   adapter = news_format_get_adapter(NEWS_FORMAT(rss));
   g_assert(adapter);

skip:
   if (!xml_reader_read_to_next(reader) ||
       !xml_reader_is_a(reader, "rss")) {
      if (xml_reader_is_a(reader, "xml-stylesheet") ||
          xml_reader_is_a(reader, "#comment")) {
         goto skip;
      }
      RETURN_ERROR;
   }

   if (!xml_reader_is_a_local(reader, "rss")) {
      RETURN_ERROR;
   }

   if ((str = xml_reader_get_attribute(reader, "version"))) {
      if (!!g_strcmp0(str, "2.0")) {
         g_set_error(error, XML_READER_ERROR, XML_READER_ERROR_INVALID,
                  _("RSS Version \"%s\" is not supported."), str);
         g_free(str);
         RETURN(FALSE);
      }
      g_free(str);
   }

   if (!xml_reader_read_start_element(reader, "channel")) {
      RETURN_ERROR;
   }

   persons = g_hash_table_new_full(g_str_hash, g_str_equal,
                                   g_free, g_object_unref);
   categories = g_hash_table_new_full(g_str_hash, g_str_equal,
                                      g_free, g_object_unref);
   links = g_hash_table_new_full(g_str_hash, g_str_equal,
                                 g_free, g_object_unref);

   xml_reader_read(reader);

   for (xml_reader_read_to_next(reader);
        xml_reader_get_node_type(reader) != XML_READER_TYPE_END_ELEMENT;
        xml_reader_read_to_next(reader)) {

      if ((xml_reader_get_node_type(reader) != XML_READER_TYPE_ELEMENT) || rss->priv->error) {
         g_hash_table_destroy(categories);
         g_hash_table_destroy(persons);
         g_hash_table_destroy(links);
         RETURN_ERROR;
      }

      if (xml_reader_is_a_local(reader, "title")) {
         str = xml_reader_read_string(reader);
         g_object_set(feed, "title", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "link")) {
         GomCollection *collection;
         NewsLink *link_;

         g_object_get(feed, "links", &collection, NULL);
         if ((link_ = news_format_rss_read_link(rss, reader, links))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(link_));
            g_object_unref(link_);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "description")) {
         str = xml_reader_read_string(reader);
         g_object_set(feed, "description", str, NULL);
         g_free(str);
         xml_reader_read_end_element(reader);
      } else if (xml_reader_is_a_local(reader, "language")) {
         str = xml_reader_read_string(reader);
         g_object_set(feed, "language", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "copyright")) {
         str = xml_reader_read_string(reader);
         g_object_set(feed, "copyright", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "managingEditor")) {
         GomCollection *collection;
         NewsPerson *person;

         g_object_get(feed, "authors", &collection, NULL);
         if ((person = news_format_rss_read_person(rss, reader, persons))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(person));
            g_object_unref(person);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "pubDate") ||
                 xml_reader_is_a_local(reader, "lastBuildDate")) {
         GDateTime *dt;
         GTimeVal tv;

         if ((str = xml_reader_read_string(reader))) {
            if (g_time_val_from_iso8601(str, &tv)) {
               if ((dt = g_date_time_new_from_timeval_utc(&tv))) {
                  g_object_set(feed,
                            "last-updated-at", dt,
                            NULL);
                  g_date_time_unref(dt);
               }
            }
            g_free(str);
         }
      } else if (xml_reader_is_a_local(reader, "category")) {
         GomCollection *collection;
         NewsCategory *category;

         g_object_get(feed, "categories", &collection, NULL);
         if ((category = news_format_rss_read_category(rss, reader, categories))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(category));
            g_object_unref(category);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "generator")) {
         str = xml_reader_read_string(reader);
         g_object_set(feed, "generator", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "item")) {
         GomCollection *collection;
         NewsItem *item;

         g_object_get(feed, "items", &collection, NULL);
         item = g_object_new(NEWS_TYPE_ITEM,
                        "adapter", adapter,
                        "is-new", TRUE,
                        NULL);
         if (news_format_rss_read_item(rss, reader, item, persons, categories, links)) {
            gom_collection_add_resource(collection,
                                 GOM_RESOURCE(item));
         }
         g_object_unref(item);
         g_object_unref(collection);
      }
   }

   g_hash_table_destroy(categories);
   g_hash_table_destroy(links);
   g_hash_table_destroy(persons);

   RETURN(TRUE);
}
Esempio n. 16
0
static int
_roster_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)
{
    const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);

    if (g_strcmp0(id, "roster") != 0) {
        return 1;
    }

    // handle initial roster response
    xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
    xmpp_stanza_t *item = xmpp_stanza_get_children(query);

    while (item) {
        const char *barejid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID);
        gchar *barejid_lower = g_utf8_strdown(barejid, -1);
        const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME);
        const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION);

        // do not set nickname to empty string, set to NULL instead
        if (name && (strlen(name) == 0)) name = NULL;

        gboolean pending_out = FALSE;
        const char *ask = xmpp_stanza_get_attribute(item, STANZA_ATTR_ASK);
        if (g_strcmp0(ask, "subscribe") == 0) {
            pending_out = TRUE;
        }

        GSList *groups = _get_groups_from_item(item);

        gboolean added = roster_add(barejid_lower, name, groups, sub, pending_out);
        if (!added) {
            log_warning("Attempt to add contact twice: %s", barejid_lower);
        }

        g_free(barejid_lower);
        item = xmpp_stanza_get_next(item);
    }

    sv_ev_roster_received();

    char *account = jabber_get_account_name();
    resource_presence_t conn_presence = accounts_get_login_presence(account);

    char *last_activity_str = accounts_get_last_activity(account);
    if (last_activity_str) {
        GDateTime *nowdt = g_date_time_new_now_utc();

        GTimeVal lasttv;
        gboolean res = g_time_val_from_iso8601(last_activity_str, &lasttv);
        if (res) {
            GDateTime *lastdt = g_date_time_new_from_timeval_utc(&lasttv);
            GTimeSpan diff_micros = g_date_time_difference(nowdt, lastdt);
            int diff_secs = (diff_micros / 1000) / 1000;
            cl_ev_presence_send(conn_presence, NULL, diff_secs);
            g_date_time_unref(lastdt);
        } else {
            cl_ev_presence_send(conn_presence, NULL, 0);
        }

        free(last_activity_str);
        g_date_time_unref(nowdt);
    } else {
        cl_ev_presence_send(conn_presence, NULL, 0);
    }

    return 1;
}
Esempio n. 17
0
static gboolean
news_format_rss_read_item (NewsFormatRss *rss,
                           XmlReader     *reader,
                           NewsItem      *item,
                           GHashTable    *persons,
                           GHashTable    *categories,
                           GHashTable    *links)
{
   gchar *str;

   xml_reader_read(reader);

   for (;
        xml_reader_get_node_type(reader) != XML_READER_TYPE_END_ELEMENT;
        xml_reader_read_to_next(reader)) {
      if (rss->priv->error) {
         break;
      }

      if (xml_reader_is_a_local(reader, "author")) {
         GomCollection *collection;
         NewsPerson *person;

         g_object_get(item, "authors", &collection, NULL);
         if ((person = news_format_rss_read_person(rss, reader, persons))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(person));
            g_object_unref(person);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "category")) {
         GomCollection *collection;
         NewsCategory *category;

         g_object_get(item, "categories", &collection, NULL);
         if ((category = news_format_rss_read_category(rss, reader, categories))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(category));
            g_object_unref(category);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "link")) {
         GomCollection *collection;
         NewsLink *link_;

         g_object_get(item, "links", &collection, NULL);
         if ((link_ = news_format_rss_read_link(rss, reader, links))) {
            gom_collection_add_resource(collection, GOM_RESOURCE(link_));
            g_object_unref(link_);
         }
         g_object_unref(collection);
      } else if (xml_reader_is_a_local(reader, "guid")) {
         str = xml_reader_read_string(reader);
         g_object_set(item, "item-id", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "description")) {
         str = xml_reader_read_inner_xml(reader);
         g_object_set(item, "summary", str, NULL);
         g_free(str);
         xml_reader_read_end_element(reader);
      } else if (xml_reader_is_a_local(reader, "title")) {
         str = xml_reader_read_string(reader);
         g_object_set(item, "title", str, NULL);
         g_free(str);
      } else if (xml_reader_is_a_local(reader, "pubDate")) {
         GDateTime *dt;
         GTimeVal tv;

         if ((str = xml_reader_read_string(reader))) {
            if (g_time_val_from_iso8601(str, &tv)) {
               if ((dt = g_date_time_new_from_timeval_utc(&tv))) {
                  g_object_set(item,
                               "last-updated-at", dt,
                               NULL);
                  g_date_time_unref(dt);
               }
            }
            g_free(str);
         }
      } else if (xml_reader_is_a_local(reader, "source")) {
         /*
          * TODO:
          */
      }
   }

   xml_reader_read_end_element(reader);

   return TRUE;
}
Esempio n. 18
0
void
ui_incoming_msg(const char * const from, const char * const message,
    GTimeVal *tv_stamp, gboolean priv)
{
    gboolean win_created = FALSE;
    char *display_from = NULL;
    win_type_t win_type;

    if (priv) {
        win_type = WIN_PRIVATE;
        display_from = get_nick_from_full_jid(from);
    } else {
        win_type = WIN_CHAT;
        PContact contact = roster_get_contact(from);
        if (contact != NULL) {
            if (p_contact_name(contact) != NULL) {
                display_from = strdup(p_contact_name(contact));
            } else {
                display_from = strdup(from);
            }
        } else {
            display_from = strdup(from);
        }
    }

    ProfWin *window = wins_get_by_recipient(from);
    if (window == NULL) {
        window = wins_new(from, win_type);
        win_created = TRUE;
    }

    int num = wins_get_num(window);

    // currently viewing chat window with sender
    if (wins_is_current(window)) {
        if (tv_stamp == NULL) {
            win_print_time(window, '-');
        } else {
            GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp);
            gchar *date_fmt = g_date_time_format(time, "%H:%M:%S");
            wattron(window->win, COLOUR_TIME);
            wprintw(window->win, "%s - ", date_fmt);
            wattroff(window->win, COLOUR_TIME);
            g_date_time_unref(time);
            g_free(date_fmt);
        }

        if (strncmp(message, "/me ", 4) == 0) {
            wattron(window->win, COLOUR_THEM);
            wprintw(window->win, "*%s ", display_from);
            waddstr(window->win, message + 4);
            wprintw(window->win, "\n");
            wattroff(window->win, COLOUR_THEM);
        } else {
            _win_show_user(window->win, display_from, 1);
            _win_show_message(window->win, message);
        }
        title_bar_set_typing(FALSE);
        title_bar_draw();
        status_bar_active(num);
        wins_refresh_current();

    // not currently viewing chat window with sender
    } else {
        status_bar_new(num);
        cons_show_incoming_message(display_from, num);
        if (prefs_get_boolean(PREF_FLASH))
            flash();

        window->unread++;
        if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) {
            _win_show_history(window->win, num, from);
        }

        if (tv_stamp == NULL) {
            win_print_time(window, '-');
        } else {
            // show users status first, when receiving message via delayed delivery
            if (win_created) {
                PContact pcontact = roster_get_contact(from);
                if (pcontact != NULL) {
                    win_show_contact(window, pcontact);
                }
            }
            GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp);
            gchar *date_fmt = g_date_time_format(time, "%H:%M:%S");
            wattron(window->win, COLOUR_TIME);
            wprintw(window->win, "%s - ", date_fmt);
            wattroff(window->win, COLOUR_TIME);
            g_date_time_unref(time);
            g_free(date_fmt);
        }

        if (strncmp(message, "/me ", 4) == 0) {
            wattron(window->win, COLOUR_THEM);
            wprintw(window->win, "*%s ", display_from);
            waddstr(window->win, message + 4);
            wprintw(window->win, "\n");
            wattroff(window->win, COLOUR_THEM);
        } else {
            _win_show_user(window->win, display_from, 1);
            _win_show_message(window->win, message);
        }
    }

    int ui_index = num;
    if (ui_index == 10) {
        ui_index = 0;
    }

    if (prefs_get_boolean(PREF_BEEP))
        beep();
    if (prefs_get_boolean(PREF_NOTIFY_MESSAGE))
        notify_message(display_from, ui_index);

    free(display_from);
}