comparison mcabber/src/jab_iq.c @ 1283:2faf179166f3

Implement XEP-0202 (Entity Time) Mcabber now answers urn:xmpp:time IQ requests.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 25 Aug 2007 22:48:59 +0200
parents dbc907b2d92f
children e42f48103609
comparison
equal deleted inserted replaced
1282:d438b56990cd 1283:2faf179166f3
1361 "var", NS_CHATSTATES); 1361 "var", NS_CHATSTATES);
1362 #endif 1362 #endif
1363 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"), 1363 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"),
1364 "var", NS_TIME); 1364 "var", NS_TIME);
1365 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"), 1365 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"),
1366 "var", NS_XMPP_TIME);
1367 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"),
1366 "var", NS_VERSION); 1368 "var", NS_VERSION);
1367 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"), 1369 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"),
1368 "var", NS_PING); 1370 "var", NS_PING);
1369 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"), 1371 xmlnode_put_attrib(xmlnode_insert_tag(ansquery, "feature"),
1370 "var", NS_COMMANDS); 1372 "var", NS_COMMANDS);
1471 xmlnode_free(x); 1473 xmlnode_free(x);
1472 } 1474 }
1473 1475
1474 // This function borrows some code from the Gaim project 1476 // This function borrows some code from the Gaim project
1475 static void handle_iq_time(jconn conn, char *from, const char *id, 1477 static void handle_iq_time(jconn conn, char *from, const char *id,
1476 xmlnode xmldata) 1478 xmlnode xmldata)
1477 { 1479 {
1478 xmlnode x; 1480 xmlnode x;
1479 xmlnode myquery; 1481 xmlnode myquery;
1480 char *buf, *utf8_buf; 1482 char *buf, *utf8_buf;
1481 time_t now_t; 1483 time_t now_t;
1515 xmlnode_free(x); 1517 xmlnode_free(x);
1516 g_free(buf); 1518 g_free(buf);
1517 } 1519 }
1518 1520
1519 // This function borrows some code from the Gaim project 1521 // This function borrows some code from the Gaim project
1522 static void handle_iq_time202(jconn conn, char *from, const char *id,
1523 xmlnode xmldata)
1524 {
1525 xmlnode x;
1526 xmlnode myquery;
1527 char *buf, *utf8_buf;
1528 time_t now_t;
1529 struct tm *now;
1530 char const *sign;
1531 int diff;
1532
1533 time(&now_t);
1534
1535 scr_LogPrint(LPRINT_LOGNORM, "Received an IQ time request from <%s>", from);
1536
1537 buf = g_new0(char, 512);
1538
1539 x = jutil_iqnew(JPACKET__RESULT, NULL);
1540 xmlnode_hide(xmlnode_get_tag(x, "query"));
1541 xmlnode_put_attrib(xmlnode_insert_tag(x, "time"), "xmlns", NS_XMPP_TIME);
1542 xmlnode_put_attrib(x, "id", id);
1543 xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
1544 myquery = xmlnode_get_tag(x, "time");
1545
1546 now = localtime(&now_t);
1547
1548 if (now->tm_isdst < 0)
1549 diff = 0;
1550 else
1551 diff = now->tm_gmtoff;
1552 if (diff < 0) {
1553 sign = "-";
1554 diff = -diff;
1555 } else {
1556 sign = "+";
1557 }
1558 diff /= 60;
1559 snprintf(buf, 512, "%c%02d:%02d", *sign, diff / 60, diff % 60);
1560 if ((utf8_buf = to_utf8(buf))) {
1561 xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "tzo"), utf8_buf, -1);
1562 g_free(utf8_buf);
1563 }
1564
1565 now = gmtime(&now_t);
1566
1567 strftime(buf, 512, "%Y-%m-%dT%TZ", now);
1568 xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "utc"), buf, -1);
1569
1570 jab_send(jc, x);
1571 xmlnode_free(x);
1572 g_free(buf);
1573 }
1574
1575 // This function borrows some code from the Gaim project
1520 static void handle_iq_get(jconn conn, char *from, xmlnode xmldata) 1576 static void handle_iq_get(jconn conn, char *from, xmlnode xmldata)
1521 { 1577 {
1522 const char *id, *ns; 1578 const char *id, *ns;
1523 xmlnode x; 1579 xmlnode x;
1524 guint iq_not_implemented = FALSE; 1580 guint iq_not_implemented = FALSE;
1531 1587
1532 x = xmlnode_get_tag(xmldata, "ping"); 1588 x = xmlnode_get_tag(xmldata, "ping");
1533 ns = xmlnode_get_attrib(x, "xmlns"); 1589 ns = xmlnode_get_attrib(x, "xmlns");
1534 if (ns && !strcmp(ns, NS_PING)) { 1590 if (ns && !strcmp(ns, NS_PING)) {
1535 handle_iq_ping(conn, from, id, xmldata); 1591 handle_iq_ping(conn, from, id, xmldata);
1592 return;
1593 }
1594
1595 x = xmlnode_get_tag(xmldata, "time");
1596 ns = xmlnode_get_attrib(x, "xmlns");
1597 if (ns && !strcmp(ns, NS_XMPP_TIME)) {
1598 handle_iq_time202(conn, from, id, xmldata);
1536 return; 1599 return;
1537 } 1600 }
1538 1601
1539 x = xmlnode_get_tag(xmldata, "query"); 1602 x = xmlnode_get_tag(xmldata, "query");
1540 ns = xmlnode_get_attrib(x, "xmlns"); 1603 ns = xmlnode_get_attrib(x, "xmlns");