Mercurial > hg
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"); |