Example #1
0
void
LM::HeapRoster::on_personal_details_updated ()
{
  LmMessage* message = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);

  lm_message_node_add_child (lm_message_get_node (message), "show", details->get_presence ().c_str ());
  lm_message_node_add_child (lm_message_get_node (message), "status", details->get_status ().c_str ());

  lm_connection_send (connection, message, NULL);
  lm_message_unref (message);
}
static void
send_message (LmConnection *conn, Arguments *arguments)
{
    LmMessage     *m;

    m = lm_message_new (arguments->test_contact, LM_MESSAGE_TYPE_MESSAGE);

    lm_message_node_add_child (m->node, "body", arguments->test_message);
    lm_connection_send (conn, m, NULL);
    lm_message_unref (m);
}
Example #3
0
void
LM::Presentity::revoke_from ()
{
  LmMessage* message = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);
  lm_message_node_set_attributes (lm_message_get_node (message),
				  "to", get_jid ().c_str (),
				  "type", "unsubscribed",
				  NULL);
  lm_connection_send_with_reply (connection, message, get_ignore_answer_handler (), NULL);
  lm_message_unref (message);
}
Example #4
0
LmHandlerResult handle_iq_commands(LmMessageHandler *h,
                                   LmConnection *c,
                                   LmMessage *m, gpointer ud)
{
  const char *requester_jid = NULL;
  LmMessageNode *cmd;
  const struct adhoc_command *command;

  // mcabber has only partial XEP-0146 support...
  if (LM_MESSAGE_SUB_TYPE_SET != lm_message_get_sub_type(m))
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;

  requester_jid = lm_message_get_from(m);

  cmd = lm_message_node_get_child(m->node, "command");
  if (!cmd) {
    //send_iq_error(c, m, XMPP_ERROR_BAD_REQUEST);
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  }
  if (jid_equal(lm_connection_get_jid(c), requester_jid)) {
    const char *action, *node;
    action = lm_message_node_get_attribute(cmd, "action");
    node = lm_message_node_get_attribute(cmd, "node");
    // action can be NULL, in which case it seems to take the default,
    // ie execute
    if (!action || !strcmp(action, "execute") || !strcmp(action, "cancel")
        || !strcmp(action, "next") || !strcmp(action, "complete")) {
      for (command = adhoc_command_list; command->name; command++) {
        if (!strcmp(node, command->name))
          command->callback(h, c, m, ud);
      }
      // "prev" action will get there, as we do not implement it,
      // and do not authorize it
    } else {
      LmMessage *r;
      LmMessageNode *err;
      r = lm_message_new_iq_error(m, XMPP_ERROR_BAD_REQUEST);
      if (r) {
        err = lm_message_node_get_child(r->node, "error");
        lm_message_node_set_attribute
          (lm_message_node_add_child(err, "malformed-action", NULL),
           "xmlns", NS_COMMANDS);
        lm_connection_send(c, r, NULL);
        lm_message_unref(r);
      }
    }
  } else {
    send_iq_error(c, m, XMPP_ERROR_FORBIDDEN);
  }
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
Example #5
0
int xmpp_room_setattrib(const char *roomid, const char *fjid,
                        const char *nick, struct role_affil ra,
                        const char *reason)
{
  LmMessage *iq;
  LmMessageHandler *handler;
  LmMessageNode *query, *x;

  if (!xmpp_is_online() || !roomid)
    return 1;
  if (!fjid && !nick) return 1;

  if (check_jid_syntax((char*)roomid)) {
    scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", roomid);
    return 1;
  }
  if (fjid && check_jid_syntax((char*)fjid)) {
    scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", fjid);
    return 1;
  }

  if (ra.type == type_affil && ra.val.affil == affil_outcast && !fjid)
    return 1; // Shouldn't happen (jid mandatory when banning)

  iq = lm_message_new_with_sub_type(roomid, LM_MESSAGE_TYPE_IQ,
                                    LM_MESSAGE_SUB_TYPE_SET);
  query = lm_message_node_add_child(iq->node, "query", NULL);
  lm_message_node_set_attribute(query, "xmlns", NS_MUC_ADMIN);
  x = lm_message_node_add_child(query, "item", NULL);

  if (fjid) {
    lm_message_node_set_attribute(x, "jid", fjid);
  } else { // nickname
    lm_message_node_set_attribute(x, "nick", nick);
  }

  if (ra.type == type_affil)
    lm_message_node_set_attribute(x, "affiliation", straffil[ra.val.affil]);
  else if (ra.type == type_role)
    lm_message_node_set_attribute(x, "role", strrole[ra.val.role]);

  if (reason)
    lm_message_node_add_child(x, "reason", reason);

  handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE);
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
  lm_message_handler_unref(handler);
  lm_message_unref(iq);

  return 0;
}
Example #6
0
// This function borrows some code from the Pidgin project
LmHandlerResult handle_iq_time(LmMessageHandler *h, LmConnection *c,
                               LmMessage *m, gpointer ud)
{
  LmMessage *r;
  LmMessageNode *query;
  char *buf, *utf8_buf;
  time_t now_t;
  struct tm *now;

  time(&now_t);

  if (!settings_opt_get_int("iq_hide_requests")) {
    scr_LogPrint(LPRINT_LOGNORM, "Received an IQ time request from <%s>",
                 lm_message_get_from(m));
  }

  if (settings_opt_get_int("iq_time_hide")) {
    send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE);
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  }

  buf = g_new0(char, 512);

  r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT);
  query = lm_message_node_add_child(r->node, "query", NULL);
  lm_message_node_set_attribute(query, "xmlns", NS_TIME);

  now = gmtime(&now_t);

  strftime(buf, 512, "%Y%m%dT%T", now);
  lm_message_node_add_child(query, "utc", buf);

  now = localtime(&now_t);

  strftime(buf, 512, "%Z", now);
  if ((utf8_buf = to_utf8(buf))) {
    lm_message_node_add_child(query, "tz", utf8_buf);
    g_free(utf8_buf);
  }

  strftime(buf, 512, "%d %b %Y %T", now);
  if ((utf8_buf = to_utf8(buf))) {
    lm_message_node_add_child(query, "display", utf8_buf);
    g_free(utf8_buf);
  }

  lm_connection_send(c, r, NULL);
  lm_message_unref(r);
  g_free(buf);
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
Example #7
0
File: xmpp.c Project: grouzen/xinb
/* TODO: large messages are not sent. (?)
         maybe I'll be splitting messages.
 */
gboolean xmpp_send_message(Xinb *x, LmMessageSubType subtype)
{
    LmMessage *m;

    if(x->state != LM_CONNECTION_STATE_AUTHENTICATED) {
        log_record(x, LOGS_ERR,
                   "Unable to send message: not authenticated");
        return FALSE;
    }

    m = lm_message_new_with_sub_type(x->to, LM_MESSAGE_TYPE_MESSAGE, subtype);
    lm_message_node_add_child(m->node, "body", x->message);
    if(!lm_connection_send(x->conn, m, &(x->gerror))) {
        log_record(x, LOGS_ERR, "Unable to send message to '%s': %s",
                   x->to, x->gerror->message);
        g_clear_error(&(x->gerror));
        lm_message_unref(m);
        return FALSE;
    }
    
    lm_message_unref(m);
    return TRUE;
}
Example #8
0
/*
 * Инициализация 
 */
gboolean jid_init(LmConnection *connect, const struct _jid *jid) {
  LmMessage       *m;
  LmMessageNode   *query, *storage;
  GError          *error = NULL;

  // <iq type='get'><query xmlns='jabber:iq:roster'/></iq>
  m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
                        LM_MESSAGE_SUB_TYPE_GET);  
  query = lm_message_node_add_child(m->node, "query", NULL);
  lm_message_node_set_attributes(query, "xmlns", "jabber:iq:roster", NULL);

  if(!lm_connection_send(connect, m, &error)) {
      g_print ("Failed sent query 'xmlns=jabber:iq:roster', due to: %s\n",
                error->message);
      return FALSE;
  }
  
  // <iq type='get'><query xmlns='jabber:iq:private'><storage xmlns='storage:bookmarks'/></query></iq>
  m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
                        LM_MESSAGE_SUB_TYPE_GET);  
  query = lm_message_node_add_child(m->node, "query", NULL);
  storage = lm_message_node_add_child(m->node, "storage", NULL);

  lm_message_node_set_attributes(query, "xmlns", "jabber:iq:private", NULL);
  lm_message_node_set_attributes(storage, "xmlns", "storage:bookmarks", NULL);

  if(!lm_connection_send(connect, m, &error)) {
      g_print ("Failed sent query 'jabber:iq:private', due to: %s\n",
                error->message);
      return FALSE;
  }

  // <iq type='get'><query xmlns='jabber:iq:private'><storage xmlns='storage:rosternotes'/></query></iq>
  m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
                        LM_MESSAGE_SUB_TYPE_GET);
  query = lm_message_node_add_child(m->node, "query", NULL);
  storage = lm_message_node_add_child(m->node, "storage", NULL);

  lm_message_node_set_attributes(query, "xmlns", "jabber:iq:private", NULL);
  lm_message_node_set_attributes(storage, "xmlns", "storage:rosternotes", NULL);

  if(!lm_connection_send(connect, m, &error)) {
      g_print ("Failed sent second query 'jabber:iq:private', due to: %s\n",
                error->message);
      return FALSE;
  }
  
  lm_message_unref(m);
  return TRUE;
}
Example #9
0
void
LM::HeapRoster::subscribe_from_form_submitted (bool submitted,
					       Ekiga::Form& result)
{
  if ( !submitted)
    return;

  const std::string jid = result.hidden ("jid");
  const std::string answer = result.single_choice ("answer");

  if (answer == "grant") {

    LmMessage* message = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);
    lm_message_node_set_attributes (lm_message_get_node (message),
				    "to", jid.c_str (),
				    "type", "subscribed",
				    NULL);
    lm_connection_send (connection, message, NULL);
    lm_message_unref (message);
    LmMessage* subscribe = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);
    lm_message_node_set_attributes (lm_message_get_node (subscribe),
				    "to", jid.c_str (),
				    "type", "subscribe",
				    NULL);
    lm_connection_send (connection, subscribe, NULL);
    lm_message_unref (subscribe);
  } else if (answer == "refuse") {

    LmMessage* message = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);
    lm_message_node_set_attributes (lm_message_get_node (message),
				    "to", jid.c_str (),
				    "type", "unsubscribed",
				    NULL);
    lm_connection_send (connection, message, NULL);
    lm_message_unref (message);
  }
}
Example #10
0
static gboolean
sasl_digest_md5_check_server_response(LmSASL *sasl, GHashTable *challenge)
{
	LmMessage   *msg;
	const gchar *rspauth;
	int          result;

	rspauth = g_hash_table_lookup (challenge, "rspauth");
	if (rspauth == NULL) {
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL,
		       "%s: server sent an invalid reply (no rspauth)\n",
		       G_STRFUNC);

		if (sasl->handler) {
			sasl->handler (sasl, sasl->connection, 
				       TRUE, "server error");
		}
		return FALSE;
	}

	if (strcmp (sasl->digest_md5_rspauth, rspauth) != 0) {
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_SSL,
		       "%s: server sent an invalid reply (rspauth not matching)\n", 
		       G_STRFUNC);

		if (sasl->handler) {
			sasl->handler (sasl, sasl->connection,
				       TRUE, "server error");
		}
		return FALSE;
	}

	msg = lm_message_new (NULL, LM_MESSAGE_TYPE_RESPONSE);
	lm_message_node_set_attributes (msg->node,
					"xmlns", XMPP_NS_SASL_AUTH,
					NULL);

	result = lm_connection_send (sasl->connection, msg, NULL);
	lm_message_unref (msg);

	if (!result) {
		g_warning ("Failed to send SASL response\n");
		return FALSE;
	}

	sasl->state = SASL_AUTH_STATE_DIGEST_MD5_SENT_FINAL_RESPONSE;

	return TRUE;
}
Example #11
0
void
LM::HeapRoster::handle_up (LmConnection* connection_,
			   const std::string name_)
{
  connection = connection_;
  name = name_;

  { // populate the roster
    LmMessage* roster_request = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
    LmMessageNode* node = lm_message_node_add_child (lm_message_get_node (roster_request), "query", NULL);
    lm_message_node_set_attributes (node, "xmlns", "jabber:iq:roster", NULL);
    lm_connection_send_with_reply (connection, roster_request,
				   build_message_handler (boost::bind (&LM::HeapRoster::handle_initial_roster_reply, this, _1, _2)), NULL);
    lm_message_unref (roster_request);
  }
  { // initial presence push
    LmMessage* presence_push = lm_message_new (NULL, LM_MESSAGE_TYPE_PRESENCE);
    lm_connection_send (connection, presence_push, NULL);
    lm_message_unref (presence_push);
  }

  on_personal_details_updated (); // fake, but if we start as dnd, we want it known
  updated ();
}
Example #12
0
void
xmpp_mesg_send(const char *to, const char *msg)
{
	LmMessage *m;
	GError *err = NULL;
	m = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_MESSAGE,
	                                 LM_MESSAGE_SUB_TYPE_CHAT);
	lm_message_node_add_child(m->node, "body", msg);
	if(!lm_connection_send(xmpp_connection_get(), m, &err)) {
		ui_print("Error sending message: %s\n", err->message);
		g_error_free(err);
	}
	lua_msg_callback(NULL, to, msg);
	lm_message_unref(m);
} /* xmpp_send_message */
Example #13
0
static void
request_version(XMPP_SERVER_REC *server, const char *dest)
{
	LmMessage *lmsg;
	LmMessageNode *node;
	char *recoded;

	recoded = xmpp_recode_out(dest);
	lmsg = lm_message_new_with_sub_type(recoded,
	    LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
	g_free(recoded);
	node = lm_message_node_add_child(lmsg->node, "query", NULL);
	lm_message_node_set_attribute(node, XMLNS, XMLNS_VERSION);
	signal_emit("xmpp send iq", 2, server, lmsg);
	lm_message_unref(lmsg);
}
Example #14
0
void
LM::Presentity::remove_presentity ()
{
  LmMessage* message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
  LmMessageNode* query = lm_message_node_add_child (lm_message_get_node (message), "query", NULL);
  lm_message_node_set_attribute (query, "xmlns", "jabber:iq:roster");
  LmMessageNode* node = lm_message_node_add_child (query, "item", NULL);

  lm_message_node_set_attributes (node,
				  "jid", get_jid ().c_str (),
				  "subscription", "remove",
				  NULL);

  lm_connection_send_with_reply (connection, message, get_ignore_answer_handler (), NULL);
  lm_message_unref (message);
}
Example #15
0
/* SYNTAX: ROSTER GROUP <jid> [<group>] */
static void
cmd_roster_group(const char *data, XMPP_SERVER_REC *server)
{
	LmMessage *lmsg;
	LmMessageNode *query_node, *item_node;
	XMPP_ROSTER_USER_REC *user;
	XMPP_ROSTER_GROUP_REC *group;
	const char *jid, *group_name;
	char *recoded;
	void *free_arg;

	CMD_XMPP_SERVER(server);
	if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &jid,
	    &group_name))
		return;
	if (*jid == '\0')
		cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
	user = rosters_find_user(server->roster, jid, &group, NULL);
	if (user == NULL) {
		signal_emit("xmpp not in roster", 2, server, jid);
		goto out;
	}
	lmsg = lm_message_new_with_sub_type(NULL,
	    LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
	query_node = lm_message_node_add_child(lmsg->node, "query", NULL);
	lm_message_node_set_attribute(query_node, "xmlns", "jabber:iq:roster");
	item_node = lm_message_node_add_child(query_node, "item", NULL);
	recoded = xmpp_recode_out(jid);
	lm_message_node_set_attribute(item_node, "jid", recoded);
	g_free(recoded);
	if (*group_name != '\0') {
		recoded = xmpp_recode_out(group_name);
		lm_message_node_add_child(item_node, "group", recoded);
		g_free(recoded);
	}
	if (user->name != NULL) {
		recoded = xmpp_recode_out(user->name);
		lm_message_node_set_attribute(item_node, "name", recoded);
		g_free(recoded);
	}
	signal_emit("xmpp send iq", 2, server, lmsg);
	lm_message_unref(lmsg);

out:
	cmd_params_free(free_arg);
}
Example #16
0
//doc Loudmouth send(toJid, message) Sends a message (<code>Sequence</code>) to provided JID (<code>Sequence</code>). Returns <code>true</code> or <code>false</code>.
IoObject *IoLoudmouth_send(IoLoudmouth *self, IoObject *locals, IoMessage *m) {
  char *to        = IoMessage_locals_cStringArgAt_(m, locals, 0);
  char *msg_body  = IoMessage_locals_cStringArgAt_(m, locals, 1);
  int success     = 0;

  LmMessage *xmpp_msg = lm_message_new_with_sub_type(
    to, LM_MESSAGE_TYPE_MESSAGE, LM_MESSAGE_SUB_TYPE_CHAT
  );

  lm_message_node_add_child(xmpp_msg->node, "body", msg_body);
  success = lm_connection_send(LMCONN(self), xmpp_msg, NULL);
  lm_message_unref(xmpp_msg);
  free(to);
  free(msg_body);

  return IOBOOL(self, success);
}
Example #17
0
// Join a MUC room
void xmpp_room_join(const char *room, const char *nickname, const char *passwd)
{
  LmMessage *x;
  LmMessageNode *y;
  gchar *roomid;
  GSList *room_elt;

  if (!xmpp_is_online() || !room)
    return;
  if (!nickname)        return;

  roomid = g_strdup_printf("%s/%s", room, nickname);
  if (check_jid_syntax(roomid)) {
    scr_LogPrint(LPRINT_NORMAL, "<%s/%s> is not a valid Jabber room", room,
                 nickname);
    g_free(roomid);
    return;
  }

  room_elt = roster_find(room, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM);
  // Add room if it doesn't already exist
  if (!room_elt) {
    room_elt = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM,
                               sub_none, -1);
  } else {
    // Make sure this is a room (it can be a conversion user->room)
    buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
  }
  // If insideroom is TRUE, this is a nickname change and we don't care here
  if (!buddy_getinsideroom(room_elt->data)) {
    // We're trying to enter a room
    buddy_setnickname(room_elt->data, nickname);
  }

  // Send the XML request
  x = lm_message_new_presence(mystatus, roomid, mystatusmsg);
  xmpp_insert_entity_capabilities(x->node, mystatus); // Entity Caps (XEP-0115)
  y = lm_message_node_add_child(x->node, "x", NULL);
  lm_message_node_set_attribute(y, "xmlns", NS_MUC);
  if (passwd)
    lm_message_node_add_child(y, "password", passwd);

  lm_connection_send(lconnection, x, NULL);
  lm_message_unref(x);
  g_free(roomid);
}
Example #18
0
static void
sig_server_quit(XMPP_SERVER_REC *server, char *reason)
{
	LmMessage *lmsg;
	char *str;

	if (!IS_XMPP_SERVER(server))
		return;
	lmsg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_PRESENCE,
	    LM_MESSAGE_SUB_TYPE_UNAVAILABLE);
	str = xmpp_recode_out((reason != NULL) ?
	    reason : settings_get_str("quit_message"));
	lm_message_node_add_child(lmsg->node, "status", str);
	g_free(str);
	signal_emit("xmpp send presence", 2, server, lmsg);
	lm_message_unref(lmsg);
}
Example #19
0
void
muc_nick(MUC_REC *channel, const char *nick)
{
	LmMessage *lmsg;
	LmMessageNode *node;
	char *recoded, *str;

	g_return_if_fail(IS_MUC(channel));
	if (!channel->server->connected)
		return;
	str = g_strconcat(channel->name, "/", nick, NULL);
	recoded = xmpp_recode_out(str);
	g_free(str);
	lmsg = lm_message_new(recoded, LM_MESSAGE_TYPE_PRESENCE);
	g_free(recoded);
	node = lm_message_node_add_child(lmsg->node, "x", NULL);
	lm_message_node_set_attribute(node, XMLNS, XMLNS_MUC);
	if (!channel->joined) {
		if (channel->key != NULL) {
			recoded = xmpp_recode_out(channel->key);
			lm_message_node_add_child(node, "password", recoded);
			g_free(recoded);
		}
		node = lm_message_node_add_child(node, "history", NULL);
		str = g_strdup_printf("%d",
		    settings_get_int("xmpp_history_maxstanzas"));
		lm_message_node_set_attribute(node, "maxstanzas", str);
		g_free(str);
		if (channel->server->show != XMPP_PRESENCE_AVAILABLE) {
			recoded = xmpp_recode_out(
			    xmpp_presence_show[channel->server->show]);
			lm_message_node_add_child(lmsg->node, "show", recoded);
			g_free(recoded);
		}
		if (channel->server->away_reason != NULL) {
			recoded = xmpp_recode_out(
			    channel->server->away_reason);
			lm_message_node_add_child(lmsg->node, "status",
			    recoded);
			g_free(recoded);
		}
	}
	signal_emit("xmpp send presence", 2, channel->server, lmsg);
	lm_message_unref(lmsg);
}
Example #20
0
LmHandlerResult handle_iq_version(LmMessageHandler *h, LmConnection *c,
                                  LmMessage *m, gpointer ud)
{
  LmMessage *r;
  LmMessageNode *query;

  if (!settings_opt_get_int("iq_hide_requests")) {
    scr_LogPrint(LPRINT_LOGNORM, "Received an IQ version request from <%s>",
                 lm_message_get_from(m));
  }

  if (settings_opt_get_int("iq_version_hide")) {
    send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE);
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
  }

  r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT);

  query = lm_message_node_add_child(r->node, "query", NULL);
  lm_message_node_set_attribute(query, "xmlns", NS_VERSION);

  lm_message_node_add_child(query, "name", PACKAGE_NAME);

  // MCabber version
  if (!settings_opt_get_int("iq_version_hide_version")) {
    char *ver = mcabber_version();
    lm_message_node_add_child(query, "version", ver);
    g_free(ver);
  }

  // OS details
  if (!settings_opt_get_int("iq_version_hide_os")) {
    char *os;
    struct utsname osinfo;
    uname(&osinfo);
    os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release,
                         osinfo.machine);
    lm_message_node_add_child(query, "os", os);
    g_free(os);
  }

  lm_connection_send(c, r, NULL);
  lm_message_unref(r);
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
Example #21
0
/*
 * Установка статуса и приоритета
 */
gboolean set_status(LmConnection *connect, const struct _jid *jid,
                    const gchar *status, const gchar *priority) {
  LmMessage *m;
  GError    *error = NULL;

  // Создаём и отправляем сообщение
  m = lm_message_new(NULL, LM_MESSAGE_TYPE_PRESENCE); 
  lm_message_node_add_child(m->node, "status", status);
  lm_message_node_add_child(m->node, "priority", priority);

  if(!lm_connection_send(connect, m, &error)) {
      g_print ("Failed set status and priority, due to: %s\n",
                error->message);
      return FALSE;
  }
  lm_message_unref(m); 
  return TRUE;
}
Example #22
0
File: harmony.c Project: KDE/amarok
void harmony_success_reply(LmConnection *connection, LmMessage *message, GError **err) {
    LmMessage *message_out;
    LmMessageNode *harmony_download_node;
    LmMessageNode *message_out_node;
    
    message_out = lm_message_new_with_sub_type(MP3TUNES_HARMONY_CONDUCTOR, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_RESULT);
    lm_message_node_set_attribute(message_out->node, "id", lm_message_node_get_attribute(message->node, "id"));
    message_out_node = lm_message_node_add_child(message_out->node, "success", NULL);

    harmony_download_node = lm_message_node_get_child(message->node, "download");
    if (harmony_download_node) {
        lm_message_node_set_attribute(message_out_node, "messageId", lm_message_node_get_attribute(harmony_download_node, "messageId"));
    }
    lm_message_node_set_attribute(message_out_node, "xmlns", MP3TUNES_HARMONY_XMLNS);

    lm_connection_send(connection, message_out, err);
    lm_message_unref(message_out);
}
Example #23
0
void
disco_request(XMPP_SERVER_REC *server, const char *dest)
{
	LmMessage *lmsg;
	LmMessageNode *node;
	char *recoded;

	g_return_if_fail(IS_XMPP_SERVER(server));
	g_return_if_fail(dest != NULL && dest != '\0');
	recoded = xmpp_recode_out(dest);
	lmsg = lm_message_new_with_sub_type(recoded, LM_MESSAGE_TYPE_IQ,
	    LM_MESSAGE_SUB_TYPE_GET);
	g_free(recoded);
	node = lm_message_node_add_child(lmsg->node, "query", NULL);
	lm_message_node_set_attribute(node, XMLNS, XMLNS_DISCO);
	signal_emit("xmpp send iq", 2, server, lmsg);
	lm_message_unref(lmsg);
}
Example #24
0
IoObject *IoLoudmouth_setPresence(IoLoudmouth *self, IoObject *locals, IoMessage *m) {
  char *pres_c  = IoMessage_locals_cStringArgAt_(m, locals, 0);
  IoSeq *status = IoMessage_locals_valueArgAt_(m, locals, 1);
  int success   = 0;
  LmMessage *xmpp_msg = lm_message_new_with_sub_type(
    NULL,
    LM_MESSAGE_TYPE_PRESENCE,
    str2msg_subtype(pres_c)
  );

  if(ISSEQ(status))
    lm_message_node_add_child(xmpp_msg->node, "status", CSTRING(status));

  success = lm_connection_send(LMCONN(self), xmpp_msg, NULL);
  lm_message_unref(xmpp_msg);
  free(pres_c);

  return IOBOOL(self, success);
}
Example #25
0
static void
authentication_cb (LmConnection *connection, gboolean result, gpointer ud)
{
        g_print ("Auth: %d\n", result);
	free_user_info ((UserInfo *) ud);
 
        if (result == TRUE) {
                LmMessage *m;
                 
		m = lm_message_new_with_sub_type (NULL,
                                                  LM_MESSAGE_TYPE_PRESENCE,
                                                  LM_MESSAGE_SUB_TYPE_AVAILABLE);
                g_print (":: %s\n", lm_message_node_to_string (m->node));
                 
                lm_connection_send (connection, m, NULL);
                lm_message_unref (m);
        }

}
Example #26
0
/*
 * Отправка сообщения на другой jid
 */
gboolean jid_message(LmConnection *connect, 
                    const gchar* to_jid, const gchar* text) {
  LmMessage *m;
  GError    *error = NULL;
  // Создаём сообщение
  m = lm_message_new_with_sub_type(to_jid, LM_MESSAGE_TYPE_MESSAGE,
                                      LM_MESSAGE_SUB_TYPE_CHAT);

  lm_message_node_add_child(m->node, "body", text);

  if(!lm_connection_send(connect, m, &error)) {
      g_print ("Failed sent message to '%s' due to: %s\n",
                to_jid, error->message);
      return FALSE;
  }

  printf("Send message to %s\n", to_jid);
  lm_message_unref(m);
  return TRUE;
}
Example #27
0
static void
sig_connected(XMPP_SERVER_REC *server)
{
	LmMessage *lmsg;
	char *str;

	if (!IS_XMPP_SERVER(server) || (server->connrec->reconnection
	    && xmpp_presence_changed(server->connrec->show, server->show,
	    server->connrec->away_reason, server->away_reason,
	    server->connrec->priority, server->priority)))
		return;
	/* set presence available */
	lmsg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_PRESENCE,
	    LM_MESSAGE_SUB_TYPE_AVAILABLE);
	str = g_strdup_printf("%d", server->priority);
	lm_message_node_add_child(lmsg->node, "priority", str);
	g_free(str);
	signal_emit("xmpp send presence", 2, server, lmsg);
	lm_message_unref(lmsg);
}
Example #28
0
/*
 * Обработчик входящих сообщений
 */
LmHandlerResult handle_messages(LmMessageHandler *handler,
                  LmConnection *connect, LmMessage *m, gpointer data) {
  printf("\nОбрабатываю событие LM_MESSAGE_TYPE_MESSAGE\n");

  const gchar *from, *to, *body, *xmlns;
        gchar  *str, *sstr = NULL;
  
  LmMessageSubType mstype;

  xmlns = lm_message_node_get_child_attribute(m->node, "x", "xmlns");
  if(!xmlns)
    xmlns = "";
  if(!strstr(xmlns, "delay")) {

    from = lm_message_node_get_attribute(m->node, "from");
    to = lm_message_node_get_attribute(m->node, "to");
    body = lm_message_node_get_child_value(m->node, "body");

    mstype = lm_message_get_sub_type(m);

    if(body) {
      str = g_strdup(body);
      sstr = g_strdup(strtok(str, " "));
    }

    if(sstr) {

      printf("Incoming message\n\tfrom: %s\n\tto: %s\n\tbody: %s\n",
              from, to, body);

      handler_cmd(connect, sstr, strchr(body, ' '));
    }
    
    free(str);
    free(sstr);
  }
  
  usleep(100000);
  lm_message_unref(m);
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
Example #29
0
static void
send_composing_event(XMPP_SERVER_REC *server, const char *dest, const char *id,
    gboolean composing)
{
	LmMessage *lmsg;
	LmMessageNode *node;
	char *recoded;

	recoded = xmpp_recode_out(dest);
	lmsg = lm_message_new_with_sub_type(recoded,
	    LM_MESSAGE_TYPE_MESSAGE, LM_MESSAGE_SUB_TYPE_CHAT);
	g_free(recoded);
	node = lm_message_node_add_child(lmsg->node, "x", NULL);
	lm_message_node_set_attribute(node, XMLNS, XMLNS_EVENT);
	if (composing)
		lm_message_node_add_child(node, "composing", NULL);
	if (id != NULL)
		lm_message_node_add_child(node, "id", id);
	signal_emit("xmpp send message", 2, server, lmsg);
	lm_message_unref(lmsg);
}
Example #30
0
/* SYNTAX: PRESENCE UNSUBSCRIBE <jid> */
static void
cmd_presence_unsubscribe(const char *data, XMPP_SERVER_REC *server)
{
	LmMessage *lmsg;
	const char *jid;
	char *recoded;
	void *free_arg;

	CMD_XMPP_SERVER(server);
	if (!cmd_get_params(data, &free_arg, 1, &jid))
		return;
	if (*jid == '\0')
		cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
	recoded = xmpp_recode_out(jid);
	lmsg = lm_message_new_with_sub_type(recoded,
	    LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE);
	g_free(recoded);
	signal_emit("xmpp send presence", 2, server, lmsg);
	lm_message_unref(lmsg);
	cmd_params_free(free_arg);
}