diff options
| author | dequis <dx@dxzone.com.ar> | 2015-09-13 01:57:25 -0300 | 
|---|---|---|
| committer | dequis <dx@dxzone.com.ar> | 2015-10-30 07:28:32 -0300 | 
| commit | 884577f0bc3ceedebb68f3df1c5b60a131b5baa8 (patch) | |
| tree | 0e55b2b7cd45cdcf7f45b63558cc4f595e2d5488 /protocols | |
| parent | fb2338df133ff82ce06dbeae4737a50f26861fdb (diff) | |
MSN: self message support
This is straightforward, like receiving a message with From/To swapped
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/msn/ns.c | 47 | 
1 files changed, 34 insertions, 13 deletions
| diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index 3968e97a..b7006bf2 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -38,7 +38,7 @@ static gboolean msn_ns_callback(gpointer data, gint source, b_input_condition co  static void msn_ns_send_adl_start(struct im_connection *ic);  static void msn_ns_send_adl(struct im_connection *ic);  static void msn_ns_structured_message(struct msn_data *md, char *msg, int msglen, char **cmd); -static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action); +static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action, gboolean selfmessage);  static void msn_ns_nfy(struct msn_data *md, char *who, char **parts, char *action, gboolean is_put);  int msn_ns_write(struct im_connection *ic, int fd, const char *fmt, ...) @@ -474,27 +474,49 @@ int msn_ns_message(struct msn_data *md, char *msg, int msglen, char **cmd, int n  	return 1;  } +/* returns newly allocated string */ +static char *msn_ns_parse_header_address(struct msn_data *md, char *headers, char *header_name) +{ +	char *semicolon = NULL; +	char *header = NULL; +	char *address = NULL; + +	if (!(header = get_rfc822_header(headers, header_name, 0))) { +		return NULL; +	} + +	/* either the semicolon or the end of the string */ +	semicolon = strchr(header, ';') ? : (header + strlen(header)); + +	address = g_strndup(header + 2, semicolon - header - 2); + +	g_free(header); +	return address; +} +  static void msn_ns_structured_message(struct msn_data *md, char *msg, int msglen, char **cmd)  {  	char **parts = NULL; -	char *semicolon = NULL;  	char *action = NULL; -	char *from = NULL;  	char *who = NULL; +	gboolean selfmessage = FALSE;  	parts = g_strsplit(msg, "\r\n\r\n", 4); -	if (!(from = get_rfc822_header(parts[0], "From", 0))) { +	if (!(who = msn_ns_parse_header_address(md, parts[0], "From"))) {  		goto cleanup;  	} -	/* either the semicolon or the end of the string */ -	semicolon = strchr(from, ';') ? : (from + strlen(from)); - -	who = g_strndup(from + 2, semicolon - from - 2); +	if (strcmp(who, md->ic->acc->user) == 0) { +		selfmessage = TRUE; +		g_free(who); +		if (!(who = msn_ns_parse_header_address(md, parts[0], "To"))) { +			goto cleanup; +		} +	}  	if ((strcmp(cmd[0], "SDG") == 0) && (action = get_rfc822_header(parts[2], "Message-Type", 0))) { -		msn_ns_sdg(md, who, parts, action); +		msn_ns_sdg(md, who, parts, action, selfmessage);  	} else if ((strcmp(cmd[0], "NFY") == 0) && (action = get_rfc822_header(parts[2], "Uri", 0))) {  		gboolean is_put = (strcmp(cmd[1], "PUT") == 0); @@ -504,18 +526,17 @@ static void msn_ns_structured_message(struct msn_data *md, char *msg, int msglen  cleanup:  	g_strfreev(parts);  	g_free(action); -	g_free(from);  	g_free(who);  } -static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action) +static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action, gboolean selfmessage)  {  	struct im_connection *ic = md->ic; -	if (strcmp(action, "Control/Typing") == 0) { +	if (strcmp(action, "Control/Typing") == 0 && !selfmessage) {  		imcb_buddy_typing(ic, who, OPT_TYPING);  	} else if (strcmp(action, "Text") == 0) { -		imcb_buddy_msg(ic, who, parts[3], 0, 0); +		imcb_buddy_msg(ic, who, parts[3], selfmessage ? OPT_SELFMESSAGE : 0, 0);  	}  } | 
