aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordequis <dx@dxzone.com.ar>2015-03-09 07:14:58 -0300
committerdequis <dx@dxzone.com.ar>2015-04-10 14:10:40 -0300
commitd80822c66f79471bc2e12167a14611dd3c49da65 (patch)
tree5f8013dd11dbe463368cc29c3e05a780b7a33ef3
parent11e42dcf7366ee547b9651648724d35d12e36091 (diff)
msn: implement PUT /user to set status as online
-rw-r--r--protocols/msn/msn.c43
-rw-r--r--protocols/msn/msn.h25
-rw-r--r--protocols/msn/msn_util.c11
3 files changed, 42 insertions, 37 deletions
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index c1b5ce77..a2f13104 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -177,8 +177,8 @@ static GList *msn_away_states(struct im_connection *ic)
static void msn_set_away(struct im_connection *ic, char *state, char *message)
{
- //char *uux;
struct msn_data *md = ic->proto_data;
+ char *nick, *psm, *idle, *statecode, *body, *buf;
if (state == NULL) {
md->away_state = msn_away_state_list;
@@ -186,32 +186,23 @@ static void msn_set_away(struct im_connection *ic, char *state, char *message)
md->away_state = msn_away_state_list + 1;
}
- if (!msn_ns_write(ic, -1, "CHG %d %s %d:%02d\r\n", ++md->trId, md->away_state->code, MSN_CAP1, MSN_CAP2)) {
- return;
- }
+ statecode = (char *) md->away_state->code;
+ nick = set_getstr(&ic->acc->set, "display_name");
+ psm = message ? message : "";
+ idle = strcmp(statecode, "IDL") ? "false" : "true";
+
+ body = g_markup_printf_escaped(MSN_PUT_USER_BODY,
+ nick, psm, psm, md->uuid, statecode, md->uuid, idle, statecode,
+ MSN_CAP1, MSN_CAP2, MSN_CAP1, MSN_CAP2
+ );
+
+ buf = g_strdup_printf(MSN_PUT_HEADERS, ic->acc->user, ic->acc->user, md->uuid,
+ "/user", "application/user+xml",
+ strlen(body), body);
+ msn_ns_write(ic, -1, "PUT %d %zd\r\n%s", ++md->trId, strlen(buf), buf);
- uux = g_markup_printf_escaped("<EndpointData><Capabilities>%d:%02d"
- "</Capabilities></EndpointData>",
- MSN_CAP1, MSN_CAP2);
- msn_ns_write(ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen(uux), uux);
- g_free(uux);
-
- uux = g_markup_printf_escaped("<PrivateEndpointData><EpName>%s</EpName>"
- "<Idle>%s</Idle><ClientType>%d</ClientType>"
- "<State>%s</State></PrivateEndpointData>",
- md->uuid,
- strcmp(md->away_state->code, "IDL") ? "false" : "true",
- 1, /* ? */
- md->away_state->code);
- msn_ns_write(ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen(uux), uux);
- g_free(uux);
-
- uux = g_markup_printf_escaped("<Data><DDP></DDP><PSM>%s</PSM>"
- "<CurrentMedia></CurrentMedia>"
- "<MachineGuid>%s</MachineGuid></Data>",
- message ? message : "", md->uuid);
- msn_ns_write(ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen(uux), uux);
- g_free(uux);
+ g_free(buf);
+ g_free(body);
}
static void msn_get_info(struct im_connection *ic, char *who)
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index 3827c992..c4517b78 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -66,13 +66,15 @@
#define MSN_CAP1 0xC000
#define MSN_CAP2 0x0000
-#define MSN_MESSAGE_HEADERS \
+#define MSN_BASE_HEADERS \
"Routing: 1.0\r\n" \
"To: 1:%s\r\n" \
"From: 1:%s;epid={%s}\r\n" \
"\r\n" \
"Reliability: 1.0\r\n" \
- "\r\n" \
+ "\r\n"
+
+#define MSN_MESSAGE_HEADERS MSN_BASE_HEADERS \
"Messaging: 2.0\r\n" \
"Message-Type: Text\r\n" \
"Content-Length: %zd\r\n" \
@@ -81,6 +83,25 @@
"\r\n" \
"%s"
+#define MSN_PUT_HEADERS MSN_BASE_HEADERS \
+ "Publication: 1.0\r\n" \
+ "Uri: %s\r\n" \
+ "Content-Type: %s\r\n" \
+ "Content-Length: %zd\r\n" \
+ "\r\n" \
+ "%s"
+
+#define MSN_PUT_USER_BODY \
+ "<user>" \
+ "<s n=\"PE\"><UserTileLocation></UserTileLocation><FriendlyName>%s</FriendlyName><PSM>%s</PSM><DDP></DDP>" \
+ "<Scene></Scene><ASN></ASN><ColorScheme>-3</ColorScheme><BDG></BDG><RUM>%s</RUM><RUL></RUL><RLT>0</RLT>" \
+ "<RID></RID><SUL></SUL><MachineGuid>%s</MachineGuid></s>" \
+ "<s n=\"IM\"><Status>%s</Status><CurrentMedia></CurrentMedia></s>" \
+ "<sep n=\"PD\"><ClientType>1</ClientType><EpName>%s</EpName><Idle>%s</Idle><State>%s</State></sep>" \
+ "<sep n=\"PE\"><VER>BitlBee:" BITLBEE_VERSION "</VER><TYP>1</TYP><Capabilities>%d:%d</Capabilities></sep>" \
+ "<sep n=\"IM\"><Capabilities>%d:%d</Capabilities></sep>" \
+ "</user>"
+
#define MSN_TYPING_HEADERS "MIME-Version: 1.0\r\n" \
"Content-Type: text/x-msmsgscontrol\r\n" \
"TypingUser: %s\r\n" \
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index 43256a2a..c5832b1b 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -537,15 +537,8 @@ struct msn_group *msn_group_by_id(struct im_connection *ic, const char *id)
int msn_ns_set_display_name(struct im_connection *ic, const char *value)
{
- struct msn_data *md = ic->proto_data;
- char fn[strlen(value) * 3 + 1];
-
- strcpy(fn, value);
- http_encode(fn);
-
- /* Note: We don't actually know if the server accepted the new name,
- and won't give proper feedback yet if it doesn't. */
- return msn_ns_write(ic, -1, "PRP %d MFN %s\r\n", ++md->trId, fn);
+ // TODO, implement this through msn_set_away's method
+ return 1;
}
const char *msn_normalize_handle(const char *handle)