Mercurial > pidgin
comparison libgaim/protocols/msn/command.c @ 20389:e354528c4163
propagate from branch 'im.pidgin.gaim' (head 70ac931e4936c7916eec18a07fe46a0af0fd7403)
to branch 'im.pidgin.rlaager.merging.soc-msnp13-to-svn18164' (head 5b5cde92182d2a922a8e7e6c2308342a5490a8c9)
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 15 Apr 2007 02:10:37 +0000 |
parents | cb3f61c55148 |
children | d634f88e25d8 |
comparison
equal
deleted
inserted
replaced
19842:21cb7a79ac7f | 20389:e354528c4163 |
---|---|
1 /** | |
2 * @file command.c MSN command functions | |
3 * | |
4 * gaim | |
5 * | |
6 * Gaim is the legal property of its developers, whose names are too numerous | |
7 * to list here. Please refer to the COPYRIGHT file distributed with this | |
8 * source distribution. | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
23 */ | |
24 #include "msn.h" | |
25 #include "command.h" | |
26 | |
27 /*local Function prototype*/ | |
28 int msn_get_payload_position(char *str); | |
29 int msn_set_payload_len(MsnCommand *cmd); | |
30 | |
31 static gboolean | |
32 is_num(char *str) | |
33 { | |
34 char *c; | |
35 for (c = str; *c; c++) { | |
36 if (!(g_ascii_isdigit(*c))) | |
37 return FALSE; | |
38 } | |
39 | |
40 return TRUE; | |
41 } | |
42 | |
43 /* | |
44 * check the command is the command with payload content | |
45 * if it is return TRUE | |
46 * else return FALSE | |
47 */ | |
48 static gboolean | |
49 msn_check_payload_cmd(char *str) | |
50 { | |
51 if( (!strcmp(str,"ADL")) || | |
52 (!strcmp(str,"GCF")) || | |
53 (!strcmp(str,"SG")) || | |
54 (!strcmp(str,"MSG")) || | |
55 (!strcmp(str,"RML")) || | |
56 (!strcmp(str,"UBX")) || | |
57 (!strcmp(str,"UBN")) || | |
58 (!strcmp(str,"UUM")) || | |
59 (!strcmp(str,"UBM")) || | |
60 (!strcmp(str,"FQY")) || | |
61 (!strcmp(str,"UUN")) || | |
62 (!strcmp(str,"UUX"))){ | |
63 return TRUE; | |
64 } | |
65 | |
66 return FALSE; | |
67 } | |
68 | |
69 /*get the payload positon*/ | |
70 int msn_get_payload_position(char *str) | |
71 { | |
72 /*because MSG has "MSG hotmail hotmail [payload length]"*/ | |
73 if(!(strcmp(str,"MSG"))|| (!strcmp(str,"UBX")) ){ | |
74 return 2; | |
75 } | |
76 /*Yahoo User Message UBM | |
77 * Format UBM email@yahoo.com 32 1 [payload length]*/ | |
78 if(!(strcmp(str,"UBM"))|| (!strcmp(str,"UUM")) ){ | |
79 return 3; | |
80 } | |
81 | |
82 return 1; | |
83 } | |
84 | |
85 /* | |
86 * set command Payload length | |
87 */ | |
88 int | |
89 msn_set_payload_len(MsnCommand *cmd) | |
90 { | |
91 char * param; | |
92 | |
93 if(msn_check_payload_cmd(cmd->command)){ | |
94 param = cmd->params[msn_get_payload_position(cmd->command)]; | |
95 #if 0 | |
96 if(!(strcmp(cmd->command,"MSG"))){ | |
97 param = cmd->params[2]; | |
98 }else{ | |
99 param = cmd->params[1]; | |
100 } | |
101 #endif | |
102 cmd->payload_len = is_num(param) ? atoi(param) : 0; | |
103 }else{ | |
104 cmd->payload_len = 0; | |
105 } | |
106 return 0; | |
107 } | |
108 | |
109 MsnCommand * | |
110 msn_command_from_string(const char *string) | |
111 { | |
112 MsnCommand *cmd; | |
113 char *tmp; | |
114 char *param_start; | |
115 char *param; | |
116 int c; | |
117 | |
118 g_return_val_if_fail(string != NULL, NULL); | |
119 | |
120 tmp = g_strdup(string); | |
121 param_start = strchr(tmp, ' '); | |
122 | |
123 cmd = g_new0(MsnCommand, 1); | |
124 cmd->command = tmp; | |
125 | |
126 if (param_start) | |
127 { | |
128 *param_start++ = '\0'; | |
129 cmd->params = g_strsplit(param_start, " ", 0); | |
130 | |
131 for (c = 0; cmd->params[c]; c++); | |
132 cmd->param_count = c; | |
133 | |
134 param = cmd->params[0]; | |
135 | |
136 cmd->trId = is_num(param) ? atoi(param) : 0; | |
137 } | |
138 else | |
139 cmd->trId = 0; | |
140 } | |
141 /*add payload Length checking*/ | |
142 msn_set_payload_len(cmd); | |
143 gaim_debug_info("MaYuan","get payload len:%d\n",cmd->payload_len); | |
144 | |
145 msn_command_ref(cmd); | |
146 | |
147 return cmd; | |
148 } | |
149 | |
150 void | |
151 msn_command_destroy(MsnCommand *cmd) | |
152 { | |
153 g_return_if_fail(cmd != NULL); | |
154 | |
155 if (cmd->ref_count > 0) | |
156 { | |
157 msn_command_unref(cmd); | |
158 return; | |
159 } | |
160 | |
161 if (cmd->payload != NULL) | |
162 g_free(cmd->payload); | |
163 | |
164 g_free(cmd->command); | |
165 g_strfreev(cmd->params); | |
166 g_free(cmd); | |
167 } | |
168 | |
169 MsnCommand * | |
170 msn_command_ref(MsnCommand *cmd) | |
171 { | |
172 g_return_val_if_fail(cmd != NULL, NULL); | |
173 | |
174 cmd->ref_count++; | |
175 return cmd; | |
176 } | |
177 | |
178 MsnCommand * | |
179 msn_command_unref(MsnCommand *cmd) | |
180 { | |
181 g_return_val_if_fail(cmd != NULL, NULL); | |
182 g_return_val_if_fail(cmd->ref_count > 0, NULL); | |
183 | |
184 cmd->ref_count--; | |
185 | |
186 if (cmd->ref_count == 0) | |
187 { | |
188 msn_command_destroy(cmd); | |
189 return NULL; | |
190 } | |
191 | |
192 return cmd; | |
193 } |