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 }