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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
1 /**
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
2 * @file sipmsg.c
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
3 *
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
4 * gaim
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
5 *
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
6 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
7 *
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
11 * (at your option) any later version.
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
12 *
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
16 * GNU General Public License for more details.
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
17 *
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
21 */
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
22
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
23 #include "internal.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
24
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
25 #include "accountopt.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
26 #include "blist.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
27 #include "conversation.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
28 #include "debug.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
29 #include "notify.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
30 #include "prpl.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
31 #include "plugin.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
32 #include "util.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
33 #include "version.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
34
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
35 #include "simple.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
36 #include "sipmsg.h"
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
41 struct sipmsg *smsg;
14069
d594f0466585 [gaim-migrate @ 16690]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12747
diff changeset
42
11398
90290f579926 [gaim-migrate @ 13630]
Thomas Butter <tbutter>
parents: 11181
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
51 return smsg;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
52 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
55 struct sipmsg *msg = g_new0(struct sipmsg,1);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
56 gchar **lines = g_strsplit(header,"\r\n",0);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
57 gchar **parts;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
58 gchar *dummy;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
59 gchar *dummy2;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
60 gchar *tmp;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
61 int i=1;
11483
0d18fa6c3b41 [gaim-migrate @ 13725]
Thomas Butter <tbutter>
parents: 11439
diff changeset
62 if(!lines[0]) return NULL;
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
63 parts = g_strsplit(lines[0], " ", 3);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
67 g_free(msg);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
68 return NULL;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
69 }
11820
2cf6d4cf2cb0 [gaim-migrate @ 14111]
Richard Laager <rlaager@wiktel.com>
parents: 11483
diff changeset
70 if(strstr(parts[0],"SIP")) { /* numeric response */
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
71 msg->method = g_strdup(parts[2]);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
74 msg->method = g_strdup(parts[0]);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
75 msg->target = g_strdup(parts[1]);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
76 msg->response = 0;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
77 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
78 g_strfreev(parts);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
79 for(i=1; lines[i] && strlen(lines[i])>2; i++) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
80 parts = g_strsplit(lines[i], ":", 2);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
84 g_free(msg);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
85 return NULL;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
86 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
87 dummy = parts[1];
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
88 dummy2 = 0;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
89 while(*dummy==' ' || *dummy=='\t') dummy++;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
90 dummy2 = g_strdup(dummy);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
91 while(lines[i+1] && (lines[i+1][0]==' ' || lines[i+1][0]=='\t')) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
92 i++;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
93 dummy = lines[i];
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
94 while(*dummy==' ' || *dummy=='\t') dummy++;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
95 tmp = g_strdup_printf("%s %s",dummy2, dummy);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
96 g_free(dummy2);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
97 dummy2 = tmp;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
98 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
99 sipmsg_add_header(msg, parts[0], dummy2);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
100 g_strfreev(parts);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
101 }
11439
617e67e1c985 [gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11398
diff changeset
102 g_strfreev(lines);
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
103 msg->bodylen = strtol(sipmsg_find_header(msg, "Content-Length"),NULL,10);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
104 if(msg->response) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
105 tmp = sipmsg_find_header(msg, "CSeq");
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
106 if(!tmp) {
11820
2cf6d4cf2cb0 [gaim-migrate @ 14111]
Richard Laager <rlaager@wiktel.com>
parents: 11483
diff changeset
107 /* SHOULD NOT HAPPEN */
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
108 msg->method = 0;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
109 } else {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
110 parts = g_strsplit(tmp, " ", 2);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
111 msg->method = g_strdup(parts[1]);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
112 g_strfreev(parts);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
113 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
114 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
115 return msg;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
116 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
119 GSList *cur;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
120 struct siphdrelement *elem;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
121 gaim_debug(GAIM_DEBUG_MISC, "simple", "SIP MSG\n");
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
122 gaim_debug(GAIM_DEBUG_MISC, "simple", "response: %d\nmethod: %s\nbodylen: %d\n",msg->response,msg->method,msg->bodylen);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
123 if(msg->target) gaim_debug(GAIM_DEBUG_MISC, "simple", "target: %s\n",msg->target);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
124 cur = msg->headers;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
125 while(cur) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
128 cur = g_slist_next(cur);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
129 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
144 cur = msg->headers;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
145 while(cur) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
149 cur = g_slist_next(cur);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
150 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
157 struct siphdrelement *element = g_new0(struct siphdrelement,1);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
158 element->name = g_strdup(name);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
159 element->value = g_strdup(value);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
160 msg->headers = g_slist_append(msg->headers, element);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
161 }
11439
617e67e1c985 [gaim-migrate @ 13676]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11398
diff changeset
162
11181
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
163 void sipmsg_free(struct sipmsg *msg) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
164 struct siphdrelement *elem;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
165 while(msg->headers) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
166 elem = msg->headers->data;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
167 msg->headers = g_slist_remove(msg->headers,elem);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
168 g_free(elem->name);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
169 g_free(elem->value);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
170 g_free(elem);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
175 g_free(msg);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
176 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
179 struct siphdrelement *elem;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
180 GSList *tmp = msg->headers;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
181 while(tmp) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
182 elem = tmp->data;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
183 if(strcmp(elem->name, name)==0) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
188 return;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
189 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
190 tmp = g_slist_next(tmp);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
191 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
192 return;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
193 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
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
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
196 GSList *tmp;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
197 struct siphdrelement *elem;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
198 tmp = msg->headers;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
199 while(tmp) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
200 elem = tmp->data;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
201 if(strcmp(elem->name,name)==0) {
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
202 return elem->value;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
203 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
204 tmp = g_slist_next(tmp);
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
205 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
206 return NULL;
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
207 }
e5bbe5070e04 [gaim-migrate @ 13292]
Thomas Butter <tbutter>
parents:
diff changeset
208