[ekg2-commit] r4192 - trunk/plugins/icq: trunk/plugins/icq/icq.c trunk/plugins/icq/misc.c trunk/plugins/icq/misc.h
SVN commit
svn w toxygen.net
Śro, 6 Sie 2008, 10:26:03 CEST
Author: darkjames
Date: 2008-08-06 10:26:03 +0200 (Wed, 06 Aug 2008)
New Revision: 4192
Modified:
trunk/plugins/icq/icq.c
trunk/plugins/icq/misc.c
trunk/plugins/icq/misc.h
Log:
- implement /msg (for now) only us-ascii messages.
Modified: trunk/plugins/icq/icq.c
===================================================================
--- trunk/plugins/icq/icq.c 2008-08-06 06:24:40 UTC (rev 4191)
+++ trunk/plugins/icq/icq.c 2008-08-06 08:26:03 UTC (rev 4192)
@@ -15,6 +15,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
@@ -37,6 +38,9 @@
#include <ekg/vars.h>
#include <ekg/xmalloc.h>
+#include <ekg/log.h>
+#include <ekg/msgqueue.h>
+
#include "icq.h"
#include "misc.h"
@@ -93,6 +97,33 @@
return 0;
}
+static uint32_t icq_get_uid(session_t *s, const char *target) {
+ char *uid;
+ long int uin;
+
+ if (!target)
+ return 0;
+
+ if (!(uid = get_uid(s, target)))
+ uid = (char *) target;
+
+ if (!xstrncmp(uid, "icq:", 4))
+ uid += 4;
+
+ if (!uid[0])
+ return 0;
+
+ uin = strtol(uid, &uid, 10); /* XXX, strtoll() */
+
+ if (uid[0])
+ return 0;
+
+ if (uin <= 0)
+ return 0;
+
+ return uin;
+}
+
void icq_session_connected(session_t *s) {
icq_private_t *j = s->priv;
string_t pkt;
@@ -607,6 +638,95 @@
return -1;
}
+static COMMAND(icq_command_msg) {
+ uint32_t uin;
+ char *uid;
+
+ if (!xstrcmp(target, "*")) {
+ if (msg_all(session, name, params[1]) == -1)
+ printq("list_empty");
+ return 0;
+ }
+
+ if (!(uin = icq_get_uid(session, target))) {
+ printq("invalid_uid", target);
+ return -1;
+ }
+
+ uid = saprintf("icq:%u", uin);
+
+ if (!session->connected)
+ goto msgdisplay;
+
+ if (config_last & 4)
+ last_add(1, uid, time(NULL), 0, params[1]);
+
+ /* XXX, recode, and do other magic stuff :( */
+ /* sent message */
+ {
+ /* for now params[1] should be US-ASCII encoded message.
+ * sorry */
+ string_t pkt;
+ string_t tlv_2, tlv_101;
+
+ /* TLV(101) */
+ tlv_101 = icq_pack("WW", 0x03, 0x00); /* codepage, encoding, copied from ICQ lite */
+ string_append(tlv_101, params[1]);
+
+ /* TLV(2) */
+ tlv_2 = icq_pack("tcT",
+ icq_pack_tlv_char(0x501, 0x1), /* TLV(501) features, meaning unknown, duplicated from ICQ Lite */
+ icq_pack_tlv(0x0101, tlv_101->str, tlv_101->len)/* TLV(101) text TLV. */
+ );
+ string_free(tlv_101, 1);
+
+ /* main packet */
+ pkt = icq_pack("iiWu", (uint32_t) rand(), (uint32_t) rand(), 0x01, (uint32_t) uin);
+ icq_pack_append(pkt, "TTT",
+ icq_pack_tlv(0x02, tlv_2->str, tlv_2->len), /* TLV(2) message-block */
+ icq_pack_tlv(0x03, NULL, 0), /* TLV(3) server-ack */
+ icq_pack_tlv(0x06, NULL, 0) /* TLV(6) received-offline */
+ );
+
+ /* message-header */
+ icq_makesnac(session, pkt, 0x04, 0x06, 0, 0);
+ icq_send_pkt(session, pkt);
+
+ string_free(tlv_2, 1);
+ }
+
+msgdisplay:
+ if (!quiet) { /* if (1) ? */
+ char **rcpts = xcalloc(2, sizeof(char *));
+ int class = EKG_MSGCLASS_SENT_CHAT; /* XXX? */
+
+ rcpts[0] = xstrdup(uid);
+ rcpts[1] = NULL;
+
+ /* XXX, encrypt */
+
+ protocol_message_emit(session, session->uid, rcpts, params[1], NULL, time(NULL), class, NULL, EKG_NO_BEEP, 0);
+
+ array_free(rcpts);
+
+ /* XXX, it's copied from jabber-plugin, however i think we should _always_ add message to queue (if we're offline), even if we want do it quiet */
+ if (!session->connected)
+ return msg_queue_add(session_uid_get(session), uid, params[1], "offline", class);
+ }
+
+ if (!quiet)
+ session_unidle(session);
+
+ return 0;
+}
+
+static COMMAND(icq_command_inline_msg) {
+ const char *p[2] = { NULL, params[0] };
+ if (!params[0] || !target)
+ return -1;
+ return icq_command_msg(("msg"), p, session, target, quiet);
+}
+
static COMMAND(icq_command_away) {
const char *format;
@@ -731,24 +851,12 @@
}
static COMMAND(icq_command_userinfo) {
- const char *uid;
-
string_t pkt;
- int number;
+ uint32_t number;
int minimal_req = 0; /* XXX */
- if (!(uid = get_uid(session, target)))
- uid = target;
-
- if (!xstrncmp(uid, "icq:", 4))
- uid += 4;
-
- /* XXX */
-
- number = atoi(uid);
-
- if (number <= 0) {
- printq("invalid_params", name);
+ if (!(number = icq_get_uid(session, target))) {
+ printq("invalid_uid", target);
return -1;
}
@@ -764,24 +872,13 @@
#define ROT16(x) ((x & 0xff) << 8 | x >> 8)
static COMMAND(icq_command_searchuin) {
- const char *uid;
-
string_t pkt;
- int uin;
+ uint32_t uin;
debug_function("icq_command_searchuin() %s\n", params[0]);
- if (!(uid = get_uid(session, target)))
- uid = target;
-
- if (!xstrncmp(uid, "icq:", 4))
- uid += 4;
-
- /* XXX */
- uin = atoi(uid);
-
- if (uin <= 0) {
- printq("invalid_params", name);
+ if (!(uin = icq_get_uid(session, target))) {
+ printq("invalid_uid", target);
return -1;
}
@@ -898,6 +995,7 @@
#define ICQ_ONLY SESSION_MUSTBELONG | SESSION_MUSTHASPRIVATE
#define ICQ_FLAGS ICQ_ONLY | SESSION_MUSTBECONNECTED
#define ICQ_FLAGS_TARGET ICQ_FLAGS | COMMAND_ENABLEREQPARAMS | COMMAND_PARAMASTARGET
+#define ICQ_FLAGS_MSG ICQ_ONLY | COMMAND_ENABLEREQPARAMS | COMMAND_PARAMASTARGET
PLUGIN_CHECK_VER("icq");
@@ -910,6 +1008,9 @@
query_connect_id(&icq_plugin, SESSION_ADDED, icq_session_init, NULL);
query_connect_id(&icq_plugin, SESSION_REMOVED, icq_session_deinit, NULL);
+ command_add(&icq_plugin, "icq:", "?", icq_command_inline_msg, ICQ_ONLY, NULL);
+ command_add(&icq_plugin, "icq:msg", "!uU !", icq_command_msg, ICQ_FLAGS_MSG, NULL);
+
command_add(&icq_plugin, "icq:away", NULL, icq_command_away, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:back", NULL, icq_command_away, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:dnd", NULL, icq_command_away, ICQ_ONLY, NULL);
Modified: trunk/plugins/icq/misc.c
===================================================================
--- trunk/plugins/icq/misc.c 2008-08-06 06:24:40 UTC (rev 4191)
+++ trunk/plugins/icq/misc.c 2008-08-06 08:26:03 UTC (rev 4192)
@@ -138,6 +138,17 @@
break;
}
+ case 'u': /* uid */
+ {
+ uint32_t uin = va_arg(ap, uint32_t);
+ const char *buf = itoa(uin); /* XXX, enough? */
+
+ icq_pack_append(str, "C", (uint32_t) xstrlen(buf));
+ string_append(str, buf);
+
+ break;
+ }
+
case 'P': /* caps */
{
uint32_t t_new = 0x09460000 | va_arg(ap, uint32_t);
Modified: trunk/plugins/icq/misc.h
===================================================================
--- trunk/plugins/icq/misc.h 2008-08-06 06:24:40 UTC (rev 4191)
+++ trunk/plugins/icq/misc.h 2008-08-06 08:26:03 UTC (rev 4192)
@@ -29,6 +29,7 @@
string_t icq_pack_append(string_t str, char *format, ...);
#define icq_pack_tlv(type, data, datalen) (uint32_t) type, (uint32_t) datalen, (uint8_t *) data
+#define icq_pack_tlv_char(type, data) (uint32_t) type, (uint32_t) 1, (uint32_t) data
#define icq_pack_tlv_word(type, data) (uint32_t) type, (uint32_t) 2, (uint32_t) data
#define icq_pack_tlv_dword(type, data) (uint32_t) type, (uint32_t) 4, (uint32_t) data
#define icq_pack_tlv_str(type, str) icq_pack_tlv(type, str, xstrlen(str))
Więcej informacji o liście dyskusyjnej ekg2-commit