示例#1
0
    static void
send_message (GObject *object,
        TpMessage *message,
        TpMessageSendingFlags flags)
{
    FetionImChannel *self = FETION_IM_CHANNEL (object);
    TpBaseChannel *base = TP_BASE_CHANNEL (self);
    if (tp_asv_get_string (tp_message_peek (message, 0), "interface") != NULL)
    {
        /* this message is interface-specific - let's not echo it */
        goto finally;
    }

    FetionConnection *conn =
        FETION_CONNECTION (tp_base_channel_get_connection(base));

    HybridAccount *account = conn->priv->account;

    TpHandle from = tp_base_channel_get_target_handle (base);
    const GHashTable *input = tp_message_peek (message, 1);
    const gchar *send_message = tp_asv_get_string (input, "content");
    HybridBuddy *buddy = hybrid_blist_find_buddy_by_handle(account, from);
    hybrid_conv_send_message(account,buddy,send_message);

finally:
    /* "OK, we've sent the message" (after calling this, message must not be
     * dereferenced) */
    tp_message_mixin_sent (object, message, flags, "", NULL);

}
示例#2
0
/** start send message **/
static void
send_message (GObject *object,
        TpMessage *message,
        TpMessageSendingFlags flags)
{
    LwqqChannel* self = LWQQ_CHANNEL(object);
    TpBaseChannel *base = TP_BASE_CHANNEL (self);
    if (tp_asv_get_string (tp_message_peek (message, 0), "interface") != NULL)
    {
        /* this message is interface-specific - let's not echo it */
        goto finally;
    }

    LwqqConnection *conn =
        LWQQ_CONNECTION(tp_base_channel_get_connection(base));

    LwqqClient* lc = conn->lc;

    TpHandle to = tp_base_channel_get_target_handle (base);
    const GHashTable *input = tp_message_peek (message, 1);
    const gchar *send_message = tp_asv_get_string (input, "content");
    LwqqBuddy* buddy = lwqq_find_buddy_by_handle(conn, to);
    lwqq_msg_send_text(lc, LWQQ_MS_BUDDY_MSG, buddy->uin, send_message);

finally:
    /* "OK, we've sent the message" (after calling this, message must not be
* dereferenced) */
    tp_message_mixin_sent (object, message, flags, "", NULL);
}
guint
_tp_signalled_message_get_pending_message_id (TpMessage *message,
    gboolean *valid)
{
  const GHashTable *part0;

  g_return_val_if_fail (TP_IS_SIGNALLED_MESSAGE (message), 0);
  g_return_val_if_fail (valid != NULL, 0);

  part0 = tp_message_peek (message, 0);
  if (part0 == NULL)
    {
      *valid = FALSE;
      return 0;
    }

  return tp_asv_get_uint32 (part0, "pending-message-id", valid);
}
示例#4
0
文件: msg.c 项目: keis/charlatan
static void
message_cb (TpMessage *message)
{
    TpContact *sender = tp_signalled_message_get_sender (message);
    GDateTime *received = g_date_time_new_from_unix_utc (
        tp_message_get_received_timestamp (message));
    gchar *timestamp = g_date_time_format (received, "%Y-%m-%d %H:%M:%S");
    const gchar *sender_identifier = tp_contact_get_identifier (sender);
    const gchar *sender_alias = tp_contact_get_alias (sender);

    if (!writer.first) {
        g_print ("\n\n");
    } else {
        writer.first = 0;
    }

    printf ("Message-Token: %s\n", tp_message_get_token (message));
    printf ("From: \"%s\" <%s>\n", sender_alias, sender_identifier);
    printf ("Date: %s\n\n", timestamp);

    g_free (timestamp);

    unsigned int parts = tp_message_count_parts (message);
    for (unsigned int i = 1; i < parts; i++) {
        const GHashTable *part = tp_message_peek (message, i);
        const gchar *content_type = g_value_get_string (
            g_hash_table_lookup ((GHashTable*)part, "content-type"));
        const gchar *content = g_value_get_string (
            g_hash_table_lookup ((GHashTable*)part, "content"));

        if (verbose) {
            printf ("- #%d %s\n", i, content_type);
        }
        printf ("%s\n", content);
    }
}
示例#5
0
void idle_text_send(GObject *obj, TpMessage *message, TpMessageSendingFlags flags, const gchar *recipient, IdleConnection *conn) {
    GError *error = NULL;
    const GHashTable *part;
    TpChannelTextMessageType type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL;
    gboolean result = TRUE;
    const gchar *content_type, *text;
    guint n_parts;
    GStrv messages;
    GStrv bodies;
    gsize msg_len;
    guint i;

#define INVALID_ARGUMENT(msg, ...) \
	G_STMT_START { \
		IDLE_DEBUG (msg , ## __VA_ARGS__); \
		g_set_error (&error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT, \
				msg , ## __VA_ARGS__); \
		goto failed; \
	} G_STMT_END

    g_return_if_fail (recipient != NULL);

    part = tp_message_peek (message, 0);

    if (tp_asv_lookup (part, "message-type") != NULL)
        type = tp_asv_get_uint32 (part, "message-type", &result);

    if (!result)
        INVALID_ARGUMENT ("message-type must be a 32-bit unsigned integer");

    if (type >= NUM_TP_CHANNEL_TEXT_MESSAGE_TYPES)
        INVALID_ARGUMENT ("invalid message type: %u", type);

    n_parts = tp_message_count_parts (message);

    if (n_parts != 2)
        INVALID_ARGUMENT ("message must contain exactly 1 part, not %u", (n_parts - 1));

    part = tp_message_peek (message, 1);
    content_type = tp_asv_get_string (part, "content-type");
    text = tp_asv_get_string (part, "content");

    if (tp_strdiff (content_type, "text/plain"))
        INVALID_ARGUMENT ("message must be text/plain");

    if (tp_str_empty (text))
        INVALID_ARGUMENT ("content must be a UTF-8 string");

    /* Okay, it's valid. Let's send it. */

    msg_len = idle_connection_get_max_message_length(conn);
    messages = idle_text_encode_and_split(type, recipient, text, msg_len, &bodies, &error);
    if (messages == NULL)
        goto failed;

    for(i = 0; messages[i] != NULL; i++) {
        g_assert(bodies[i] != NULL);
        idle_connection_send(conn, messages[i]);
    }

    g_strfreev(messages);
    g_strfreev(bodies);

    tp_message_mixin_sent (obj, message, flags, "", NULL);
    return;

failed:
    g_assert (error != NULL);
    tp_message_mixin_sent (obj, message, 0, NULL, error);
    g_error_free (error);
}