Mercurial > pidgin
annotate src/protocols/simple/sipmsg.c @ 14122:dabbcb9b013d
[gaim-migrate @ 16759]
This initializes threads for glib and dbus, because under some
circumstances multithreaded libraries are causing dbus badness
(namely, gnome-vfs). This fix doesn't really belong in Gaim, but in
the interest of expedience (we don't want to wait for upstream
libraries to get their initializations all worked around to make
things safe) the fix goes here. Note that all Gaim frontends will
have to initialize glib threads if other threaded libraries which
interact with glib or dbus or what-have-you come into play.
committer: Tailor Script <tailor@pidgin.im>
| author | Ethan Blanton <elb@pidgin.im> |
|---|---|
| date | Mon, 14 Aug 2006 21:46:17 +0000 |
| parents | d594f0466585 |
| children |
| rev | line source |
|---|---|
| 11181 | 1 /** |
| 2 * @file sipmsg.c | |
| 3 * | |
| 4 * gaim | |
| 5 * | |
| 6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de> | |
| 7 * | |
| 8 * This program is free software; you can redistribute it and/or modify | |
| 9 * it under the terms of the GNU General Public License as published by | |
| 10 * the Free Software Foundation; either version 2 of the License, or | |
| 11 * (at your option) any later version. | |
| 12 * | |
| 13 * This program is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 * GNU General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU General Public License | |
| 19 * along with this program; if not, write to the Free Software | |
| 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 */ | |
| 22 | |
| 23 #include "internal.h" | |
| 24 | |
| 25 #include "accountopt.h" | |
| 26 #include "blist.h" | |
| 27 #include "conversation.h" | |
| 28 #include "debug.h" | |
| 29 #include "notify.h" | |
| 30 #include "prpl.h" | |
| 31 #include "plugin.h" | |
| 32 #include "util.h" | |
| 33 #include "version.h" | |
| 34 | |
| 35 #include "simple.h" | |
| 36 #include "sipmsg.h" | |
| 37 | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
38 struct sipmsg *sipmsg_parse_msg(const gchar *msg) { |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
39 const char *tmp = strstr(msg, "\r\n\r\n"); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
40 char *line; |
| 11181 | 41 struct sipmsg *smsg; |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
42 |
| 11398 | 43 if(!tmp) return NULL; |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
44 |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
45 line = g_strndup(msg, tmp - msg); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
46 |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
47 smsg = sipmsg_parse_header(line); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
48 smsg->body = g_strdup(tmp + 4); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
49 |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
50 g_free(line); |
| 11181 | 51 return smsg; |
| 52 } | |
| 53 | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
54 struct sipmsg *sipmsg_parse_header(const gchar *header) { |
| 11181 | 55 struct sipmsg *msg = g_new0(struct sipmsg,1); |
| 56 gchar **lines = g_strsplit(header,"\r\n",0); | |
| 57 gchar **parts; | |
| 58 gchar *dummy; | |
| 59 gchar *dummy2; | |
| 60 gchar *tmp; | |
| 61 int i=1; | |
| 11483 | 62 if(!lines[0]) return NULL; |
| 11181 | 63 parts = g_strsplit(lines[0], " ", 3); |
| 64 if(!parts[0] || !parts[1] || !parts[2]) { | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
65 g_strfreev(parts); |
|
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
66 g_strfreev(lines); |
| 11181 | 67 g_free(msg); |
| 68 return NULL; | |
| 69 } | |
|
11820
2cf6d4cf2cb0
[gaim-migrate @ 14111]
Richard Laager <rlaager@wiktel.com>
parents:
11483
diff
changeset
|
70 if(strstr(parts[0],"SIP")) { /* numeric response */ |
| 11181 | 71 msg->method = g_strdup(parts[2]); |
| 72 msg->response = strtol(parts[1],NULL,10); | |
|
11820
2cf6d4cf2cb0
[gaim-migrate @ 14111]
Richard Laager <rlaager@wiktel.com>
parents:
11483
diff
changeset
|
73 } else { /* request */ |
| 11181 | 74 msg->method = g_strdup(parts[0]); |
| 75 msg->target = g_strdup(parts[1]); | |
| 76 msg->response = 0; | |
| 77 } | |
| 78 g_strfreev(parts); | |
| 79 for(i=1; lines[i] && strlen(lines[i])>2; i++) { | |
| 80 parts = g_strsplit(lines[i], ":", 2); | |
| 81 if(!parts[0] || !parts[1]) { | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
82 g_strfreev(parts); |
|
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
83 g_strfreev(lines); |
| 11181 | 84 g_free(msg); |
| 85 return NULL; | |
| 86 } | |
| 87 dummy = parts[1]; | |
| 88 dummy2 = 0; | |
| 89 while(*dummy==' ' || *dummy=='\t') dummy++; | |
| 90 dummy2 = g_strdup(dummy); | |
| 91 while(lines[i+1] && (lines[i+1][0]==' ' || lines[i+1][0]=='\t')) { | |
| 92 i++; | |
| 93 dummy = lines[i]; | |
| 94 while(*dummy==' ' || *dummy=='\t') dummy++; | |
| 95 tmp = g_strdup_printf("%s %s",dummy2, dummy); | |
| 96 g_free(dummy2); | |
| 97 dummy2 = tmp; | |
| 98 } | |
| 99 sipmsg_add_header(msg, parts[0], dummy2); | |
| 100 g_strfreev(parts); | |
| 101 } | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
102 g_strfreev(lines); |
| 11181 | 103 msg->bodylen = strtol(sipmsg_find_header(msg, "Content-Length"),NULL,10); |
| 104 if(msg->response) { | |
| 105 tmp = sipmsg_find_header(msg, "CSeq"); | |
| 106 if(!tmp) { | |
|
11820
2cf6d4cf2cb0
[gaim-migrate @ 14111]
Richard Laager <rlaager@wiktel.com>
parents:
11483
diff
changeset
|
107 /* SHOULD NOT HAPPEN */ |
| 11181 | 108 msg->method = 0; |
| 109 } else { | |
| 110 parts = g_strsplit(tmp, " ", 2); | |
| 111 msg->method = g_strdup(parts[1]); | |
| 112 g_strfreev(parts); | |
| 113 } | |
| 114 } | |
| 115 return msg; | |
| 116 } | |
| 117 | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
118 void sipmsg_print(const struct sipmsg *msg) { |
| 11181 | 119 GSList *cur; |
| 120 struct siphdrelement *elem; | |
| 121 gaim_debug(GAIM_DEBUG_MISC, "simple", "SIP MSG\n"); | |
| 122 gaim_debug(GAIM_DEBUG_MISC, "simple", "response: %d\nmethod: %s\nbodylen: %d\n",msg->response,msg->method,msg->bodylen); | |
| 123 if(msg->target) gaim_debug(GAIM_DEBUG_MISC, "simple", "target: %s\n",msg->target); | |
| 124 cur = msg->headers; | |
| 125 while(cur) { | |
| 126 elem = cur->data; | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
127 gaim_debug(GAIM_DEBUG_MISC, "simple", "name: %s value: %s\n",elem->name, elem->value); |
| 11181 | 128 cur = g_slist_next(cur); |
| 129 } | |
| 130 } | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
131 |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
132 char *sipmsg_to_string(const struct sipmsg *msg) { |
| 11181 | 133 GSList *cur; |
|
12743
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
134 GString *outstr = g_string_new(""); |
| 11181 | 135 struct siphdrelement *elem; |
|
12743
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
136 |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
137 if(msg->response) |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
138 g_string_append_printf(outstr, "SIP/2.0 %d Unknown\r\n", |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
139 msg->response); |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
140 else |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
141 g_string_append_printf(outstr, "%s %s SIP/2.0\r\n", |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
142 msg->method, msg->target); |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
143 |
| 11181 | 144 cur = msg->headers; |
| 145 while(cur) { | |
| 146 elem = cur->data; | |
|
12743
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
147 g_string_append_printf(outstr, "%s: %s\r\n", elem->name, |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
148 elem->value); |
| 11181 | 149 cur = g_slist_next(cur); |
| 150 } | |
| 151 | |
|
12743
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
152 g_string_append_printf(outstr, "\r\n%s", msg->bodylen ? msg->body : ""); |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
153 |
|
33ed71b35a43
[gaim-migrate @ 15090]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11820
diff
changeset
|
154 return g_string_free(outstr, FALSE); |
| 11181 | 155 } |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
156 void sipmsg_add_header(struct sipmsg *msg, const gchar *name, const gchar *value) { |
| 11181 | 157 struct siphdrelement *element = g_new0(struct siphdrelement,1); |
| 158 element->name = g_strdup(name); | |
| 159 element->value = g_strdup(value); | |
| 160 msg->headers = g_slist_append(msg->headers, element); | |
| 161 } | |
|
11439
617e67e1c985
[gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11398
diff
changeset
|
162 |
| 11181 | 163 void sipmsg_free(struct sipmsg *msg) { |
| 164 struct siphdrelement *elem; | |
| 165 while(msg->headers) { | |
| 166 elem = msg->headers->data; | |
| 167 msg->headers = g_slist_remove(msg->headers,elem); | |
| 168 g_free(elem->name); | |
| 169 g_free(elem->value); | |
| 170 g_free(elem); | |
| 171 } | |
|
12747
b62d685cf841
[gaim-migrate @ 15094]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12743
diff
changeset
|
172 g_free(msg->method); |
|
b62d685cf841
[gaim-migrate @ 15094]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12743
diff
changeset
|
173 g_free(msg->target); |
|
b62d685cf841
[gaim-migrate @ 15094]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12743
diff
changeset
|
174 g_free(msg->body); |
| 11181 | 175 g_free(msg); |
| 176 } | |
| 177 | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
178 void sipmsg_remove_header(struct sipmsg *msg, const gchar *name) { |
| 11181 | 179 struct siphdrelement *elem; |
| 180 GSList *tmp = msg->headers; | |
| 181 while(tmp) { | |
| 182 elem = tmp->data; | |
| 183 if(strcmp(elem->name, name)==0) { | |
| 184 msg->headers = g_slist_remove(msg->headers, elem); | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
185 g_free(elem->name); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
186 g_free(elem->value); |
|
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
187 g_free(elem); |
| 11181 | 188 return; |
| 189 } | |
| 190 tmp = g_slist_next(tmp); | |
| 191 } | |
| 192 return; | |
| 193 } | |
| 194 | |
|
14069
d594f0466585
[gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12747
diff
changeset
|
195 gchar *sipmsg_find_header(struct sipmsg *msg, const gchar *name) { |
| 11181 | 196 GSList *tmp; |
| 197 struct siphdrelement *elem; | |
| 198 tmp = msg->headers; | |
| 199 while(tmp) { | |
| 200 elem = tmp->data; | |
| 201 if(strcmp(elem->name,name)==0) { | |
| 202 return elem->value; | |
| 203 } | |
| 204 tmp = g_slist_next(tmp); | |
| 205 } | |
| 206 return NULL; | |
| 207 } | |
| 208 |
