src/protocols/novell/nmconn.c

Sat, 31 Jul 2004 21:29:40 +0000

author
Christopher O'Brien <siege@pidgin.im>
date
Sat, 31 Jul 2004 21:29:40 +0000
changeset 9620
fe99fcea5c1c
parent 9360
c40bc951573a
child 10660
3f4f0e368ecb
permissions
-rw-r--r--

[gaim-migrate @ 10464]
Changes to those get_alias functions in blist.c from
Christopher (siege) O'Brien:

Renames gaim_get_buddy_alias to gaim_buddy_get_alias

Renames gaim_get_buddy_alias_only to
_gaim_buddy_get_alias_only

Adds function gaim_buddy_get_contact_alias, which looks
up a buddy's appropriate display name by order of:
buddy alias; contact alias; server alias; buddy name.
Note that the buddy alias is still the top-priority.

Changed conversation.c to use _get_contact_alias rather
than _get_alias

The end result of this is that aliasing the contact
will result in conversations with any of that contact's
buddies using the contact alias. This allows people
like myself to no longer have to alias each buddy to
the same alias in order to achieve the same effect.

committer: Mark Doliner <markdoliner@pidgin.im>

8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
1 /*
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
2 * nmconn.c
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
3 *
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
4 * Copyright (c) 2004 Novell, Inc. All Rights Reserved.
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
5 *
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
6 * This program is free software; you can redistribute it and/or modify
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
7 * it under the terms of the GNU General Public License as published by
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
8 * the Free Software Foundation; version 2 of the License.
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
9 *
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
10 * This program is distributed in the hope that it will be useful,
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
13 * GNU General Public License for more details.
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
14 *
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
15 * You should have received a copy of the GNU General Public License
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
16 * along with this program; if not, write to the Free Software
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
18 *
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
19 */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
20
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
21 #include <glib.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
22 #include <unistd.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
23 #include <errno.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
24 #include <string.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
25 #include <ctype.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
26 #include <time.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
27 #include "nmconn.h"
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
28
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
29 #ifdef _WIN32
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
30 #include <windows.h>
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
31 #endif
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
32
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
33 #define NO_ESCAPE(ch) ((ch == 0x20) || (ch >= 0x30 && ch <= 0x39) || \
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
34 (ch >= 0x41 && ch <= 0x5a) || (ch >= 0x61 && ch <= 0x7a))
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
35
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
36 /* Read data from conn until the end of a line */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
37 static NMERR_T
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
38 read_line(NMConn * conn, char *buff, int len)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
39 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
40 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
41 int total_bytes = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
42
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
43 while ((rc == NM_OK) && (total_bytes < (len - 1))) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
44 rc = nm_read_all(conn, &buff[total_bytes], 1);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
45 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
46 total_bytes += 1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
47 if (buff[total_bytes - 1] == '\n') {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
48 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
49 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
50 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
51 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
52 buff[total_bytes] = '\0';
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
53
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
54 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
55 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
56
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
57 static char *
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
58 url_escape_string(char *src)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
59 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
60 guint32 escape = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
61 char *p;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
62 char *q;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
63 char *encoded = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
64 int ch;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
65
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
66 static const char hex_table[16] = "0123456789abcdef";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
67
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
68 if (src == NULL) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
69 return NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
70 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
71
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
72 /* Find number of chars to escape */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
73 for (p = src; *p != '\0'; p++) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
74 ch = (guchar) *p;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
75 if (!NO_ESCAPE(ch)) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
76 escape++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
77 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
78 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
79
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
80 encoded = g_malloc((p - src) + (escape * 2) + 1);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
81
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
82 /* Escape the string */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
83 for (p = src, q = encoded; *p != '\0'; p++) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
84 ch = (guchar) * p;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
85 if (NO_ESCAPE(ch)) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
86 if (ch != 0x20) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
87 *q = ch;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
88 q++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
89 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
90 *q = '+';
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
91 q++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
92 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
93 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
94 *q = '%';
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
95 q++;
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
96
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
97 *q = hex_table[ch >> 4];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
98 q++;
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
99
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
100 *q = hex_table[ch & 15];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
101 q++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
102 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
103 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
104 *q = '\0';
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
105
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
106 return encoded;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
107 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
108
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
109 static char *
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
110 encode_method(guint8 method)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
111 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
112 char *str;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
113
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
114 switch (method) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
115 case NMFIELD_METHOD_EQUAL:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
116 str = "G";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
117 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
118 case NMFIELD_METHOD_UPDATE:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
119 str = "F";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
120 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
121 case NMFIELD_METHOD_GTE:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
122 str = "E";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
123 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
124 case NMFIELD_METHOD_LTE:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
125 str = "D";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
126 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
127 case NMFIELD_METHOD_NE:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
128 str = "C";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
129 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
130 case NMFIELD_METHOD_EXIST:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
131 str = "B";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
132 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
133 case NMFIELD_METHOD_NOTEXIST:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
134 str = "A";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
135 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
136 case NMFIELD_METHOD_SEARCH:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
137 str = "9";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
138 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
139 case NMFIELD_METHOD_MATCHBEGIN:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
140 str = "8";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
141 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
142 case NMFIELD_METHOD_MATCHEND:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
143 str = "7";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
144 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
145 case NMFIELD_METHOD_NOT_ARRAY:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
146 str = "6";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
147 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
148 case NMFIELD_METHOD_OR_ARRAY:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
149 str = "5";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
150 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
151 case NMFIELD_METHOD_AND_ARRAY:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
152 str = "4";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
153 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
154 case NMFIELD_METHOD_DELETE_ALL:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
155 str = "3";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
156 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
157 case NMFIELD_METHOD_DELETE:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
158 str = "2";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
159 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
160 case NMFIELD_METHOD_ADD:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
161 str = "1";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
162 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
163 default: /* NMFIELD_METHOD_VALID */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
164 str = "0";
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
165 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
166 }
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
167
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
168 return str;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
169 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
171 NMConn *
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
172 nm_create_conn(const char *addr, int port)
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
173 {
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
174 NMConn *conn = g_new0(NMConn, 1);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
175 conn->addr = g_strdup(addr);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
176 conn->port = port;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
177 return conn;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
178 }
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
179
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
180 void nm_release_conn(NMConn *conn)
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
181 {
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
182 if (conn) {
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
183 GSList *node;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
184 for (node = conn->requests; node; node = node->next) {
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
185 if (node->data)
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
186 nm_release_request(node->data);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
187 }
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
188 g_slist_free(conn->requests);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
189 conn->requests = NULL;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
190 if (conn->ssl_conn) {
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
191 g_free(conn->ssl_conn);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
192 conn->ssl_conn = NULL;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
193 }
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
194 g_free(conn->addr);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
195 conn->addr = NULL;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
196 g_free(conn);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
197 }
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
198 }
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
199
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
200 int
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
201 nm_tcp_write(NMConn * conn, const void *buff, int len)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
202 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
203 if (conn == NULL || buff == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
204 return -1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
205
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
206 if (!conn->use_ssl)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
207 return (write(conn->fd, buff, len));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
208 else if (conn->ssl_conn && conn->ssl_conn->write)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
209 return (conn->ssl_conn->write(conn->ssl_conn->data, buff, len));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
210 else
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
211 return -1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
212 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
213
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
214 int
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
215 nm_tcp_read(NMConn * conn, void *buff, int len)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
216 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
217 if (conn == NULL || buff == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
218 return -1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
219
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
220 if (!conn->use_ssl)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
221 return (read(conn->fd, buff, len));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
222 else if (conn->ssl_conn && conn->ssl_conn->read)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
223 return (conn->ssl_conn->read(conn->ssl_conn->data, buff, len));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
224 else
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
225 return -1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
226 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
227
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
228 NMERR_T
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
229 nm_read_all(NMConn * conn, char *buff, int len)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
230 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
231 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
232 int bytes_left = len;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
233 int bytes_read;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
234 int total_bytes = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
235 int retry = 10;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
236
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
237 if (conn == NULL || buff == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
238 return NMERR_BAD_PARM;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
239
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
240 /* Keep reading until buffer is full */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
241 while (bytes_left) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
242 bytes_read = nm_tcp_read(conn, &buff[total_bytes], bytes_left);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
243 if (bytes_read > 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
244 bytes_left -= bytes_read;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
245 total_bytes += bytes_read;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
246 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
247 if (errno == EAGAIN) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
248 if (--retry == 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
249 rc = NMERR_TCP_READ;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
250 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
251 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
252 #ifdef _WIN32
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
253 Sleep(1000);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
254 #else
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
255 usleep(1000);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
256 #endif
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
257 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
258 rc = NMERR_TCP_READ;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
259 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
260 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
261 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
262 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
263 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
264 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
265
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
266 NMERR_T
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
267 nm_read_uint32(NMConn *conn, guint32 *val)
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
268 {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
269 NMERR_T rc = NM_OK;
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
270
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
271 rc = nm_read_all(conn, (char *)val, sizeof(*val));
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
272 if (rc == NM_OK) {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
273 *val = GUINT32_FROM_LE(*val);
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
274 }
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
275
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
276 return rc;
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
277 }
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
278
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
279 NMERR_T
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
280 nm_read_uint16(NMConn *conn, guint16 *val)
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
281 {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
282 NMERR_T rc = NM_OK;
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
283
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
284 rc = nm_read_all(conn, (char *)val, sizeof(*val));
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
285 if (rc == NM_OK) {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
286 *val = GUINT16_FROM_LE(*val);
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
287 }
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
288
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
289 return rc;
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
290 }
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
291
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
292 NMERR_T
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
293 nm_write_fields(NMConn * conn, NMField * fields)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
294 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
295 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
296 NMField *field;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
297 char *value = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
298 char *method = NULL;
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
299 char buffer[4096];
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
300 int ret;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
301 int bytes_to_send;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
302 int val = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
303
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
304 if (conn == NULL || fields == NULL) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
305 return NMERR_BAD_PARM;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
306 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
307
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
308 /* Format each field as valid "post" data and write it out */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
309 for (field = fields; (rc == NM_OK) && (field->tag); field++) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
310
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
311 /* We don't currently handle binary types */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
312 if (field->method == NMFIELD_METHOD_IGNORE ||
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
313 field->type == NMFIELD_TYPE_BINARY) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
314 continue;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
315 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
316
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
317 /* Write the field tag */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
318 bytes_to_send = g_snprintf(buffer, sizeof(buffer), "&tag=%s", field->tag);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
319 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
320 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
321 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
322 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
323
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
324 /* Write the field method */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
325 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
326 method = encode_method(field->method);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
327 bytes_to_send = g_snprintf(buffer, sizeof(buffer), "&cmd=%s", method);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
328 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
329 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
330 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
331 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
332 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
333
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
334 /* Write the field value */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
335 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
336 switch (field->type) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
337 case NMFIELD_TYPE_UTF8:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
338 case NMFIELD_TYPE_DN:
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
339
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
340 value = url_escape_string((char *) field->ptr_value);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
341 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
342 "&val=%s", value);
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
343 if (bytes_to_send > (int)sizeof(buffer)) {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
344 ret = nm_tcp_write(conn, buffer, sizeof(buffer));
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
345 } else {
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
346 ret = nm_tcp_write(conn, buffer, bytes_to_send);
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
347 }
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
348
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
349 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
350 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
351 }
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
352
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
353 g_free(value);
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
354
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
355 break;
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
356
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
357 case NMFIELD_TYPE_ARRAY:
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
358 case NMFIELD_TYPE_MV:
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
359
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
360 val = nm_count_fields((NMField *) field->ptr_value);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
361 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
362 "&val=%u", val);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
363 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
364 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
365 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
366 }
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
367
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
368 break;
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
369
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
370 default:
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
371
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
372 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
373 "&val=%u", field->value);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
374 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
375 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
376 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
377 }
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
378
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
379 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
380 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
381 }
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
382
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
383 /* Write the field type */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
384 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
385 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
386 "&type=%u", field->type);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
387 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
388 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
389 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
390 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
391 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
392
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
393 /* If the field is a sub array then post its fields */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
394 if (rc == NM_OK && val > 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
395 if (field->type == NMFIELD_TYPE_ARRAY ||
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
396 field->type == NMFIELD_TYPE_MV) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
397
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
398 rc = nm_write_fields(conn, (NMField *) field->ptr_value);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
399
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
400 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
401 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
402 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
403
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
404 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
405 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
406
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
407 NMERR_T
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
408 nm_send_request(NMConn *conn, char *cmd, NMField *fields,
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
409 nm_response_cb cb, gpointer data, NMRequest **request)
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
410 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
411 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
412 char buffer[512];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
413 int bytes_to_send;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
414 int ret;
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
415 NMField *request_fields = NULL;
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents: 8933
diff changeset
416 char *str = NULL;
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
417
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
418 if (conn == NULL || cmd == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
419 return NMERR_BAD_PARM;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
420
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
421 /* Write the post */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
422 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
423 "POST /%s HTTP/1.0\r\n", cmd);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
424 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
425 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
426 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
427 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
428
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
429 /* Write headers */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
430 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
431 if (strcmp("login", cmd) == 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
432 bytes_to_send = g_snprintf(buffer, sizeof(buffer),
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
433 "Host: %s:%d\r\n\r\n", conn->addr, conn->port);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
434 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
435 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
436 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
437 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
438 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
439 bytes_to_send = g_snprintf(buffer, sizeof(buffer), "\r\n");
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
440 ret = nm_tcp_write(conn, buffer, bytes_to_send);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
441 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
442 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
443 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
444 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
445 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
446
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
447 /* Add the transaction id to the request fields */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
448 if (rc == NM_OK) {
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents: 8933
diff changeset
449 if (fields)
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
450 request_fields = nm_copy_field_array(fields);
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
451
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents: 8933
diff changeset
452 str = g_strdup_printf("%d", ++(conn->trans_id));
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
453 request_fields = nm_field_add_pointer(request_fields, NM_A_SZ_TRANSACTION_ID, 0,
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
454 NMFIELD_METHOD_VALID, 0,
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
455 str, NMFIELD_TYPE_UTF8);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
456 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
457
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
458 /* Send the request to the server */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
459 if (rc == NM_OK) {
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
460 rc = nm_write_fields(conn, request_fields);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
461 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
462
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
463 /* Write the CRLF to terminate the data */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
464 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
465 ret = nm_tcp_write(conn, "\r\n", strlen("\r\n"));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
466 if (ret < 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
467 rc = NMERR_TCP_WRITE;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
468 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
469 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
470
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
471 /* Create a request struct, add it to our queue, and return it */
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
472 if (rc == NM_OK) {
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
473 NMRequest *new_request = nm_create_request(cmd, conn->trans_id,
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
474 time(0), cb, NULL, data);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
475 nm_conn_add_request_item(conn, new_request);
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
476
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
477 /* Set the out param if it was sent in, otherwise release the request */
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
478 if (request)
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
479 *request = new_request;
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
480 else
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
481 nm_release_request(new_request);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
482 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
483
9360
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
484 if (request_fields != NULL)
c40bc951573a [gaim-migrate @ 10168]
Mike Stoddard <mistoddard@novell.com>
parents: 9268
diff changeset
485 nm_free_fields(&request_fields);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
486
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
487 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
488 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
489
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
490 NMERR_T
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
491 nm_read_header(NMConn * conn)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
492 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
493 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
494 char buffer[512];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
495 char *ptr = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
496 int i;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
497 char rtn_buf[8];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
498 int rtn_code = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
499
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
500 if (conn == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
501 return NMERR_BAD_PARM;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
502
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
503 *buffer = '\0';
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
504 rc = read_line(conn, buffer, sizeof(buffer));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
505 if (rc == NM_OK) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
506
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
507 /* Find the return code */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
508 ptr = strchr(buffer, ' ');
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
509 if (ptr != NULL) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
510 ptr++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
511
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
512 i = 0;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
513 while (isdigit(*ptr) && (i < 3)) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
514 rtn_buf[i] = *ptr;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
515 i++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
516 ptr++;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
517 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
518 rtn_buf[i] = '\0';
8684
7ec649752daa [gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents: 8675
diff changeset
519
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
520 if (i > 0)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
521 rtn_code = atoi(rtn_buf);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
522 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
523 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
524
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
525 /* Finish reading header, in the future we might want to do more processing here */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
526 /* TODO: handle more general redirects in the future */
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
527 while ((rc == NM_OK) && (strcmp(buffer, "\r\n") != 0)) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
528 rc = read_line(conn, buffer, sizeof(buffer));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
529 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
530
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
531 if (rc == NM_OK && rtn_code == 301)
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
532 rc = NMERR_SERVER_REDIRECT;
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
533
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
534 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
535 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
536
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
537 NMERR_T
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
538 nm_read_fields(NMConn * conn, int count, NMField ** fields)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
539 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
540 NMERR_T rc = NM_OK;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
541 guint8 type;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
542 guint8 method;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
543 guint32 val;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
544 char tag[64];
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
545 NMField *sub_fields = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
546 char *str = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
547
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
548 if (conn == NULL || fields == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
549 return NMERR_BAD_PARM;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
550
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
551 do {
8753
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
552 if (count > 0) {
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
553 count--;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
554 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
555
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
556 /* Read the field type, method, and tag */
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
557 rc = nm_read_all(conn, (char *)&type, sizeof(type));
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
558 if (rc != NM_OK || type == 0)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
559 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
560
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
561 rc = nm_read_all(conn, (char *)&method, sizeof(method));
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
562 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
563 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
564
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
565 rc = nm_read_uint32(conn, &val);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
566 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
567 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
568
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
569 if (val > sizeof(tag)) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
570 rc = NMERR_PROTOCOL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
571 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
572 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
573
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
574 rc = nm_read_all(conn, tag, val);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
575 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
576 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
577
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
578 if (type == NMFIELD_TYPE_MV || type == NMFIELD_TYPE_ARRAY) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
579
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
580 /* Read the subarray (first read the number of items in the array) */
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
581 rc = nm_read_uint32(conn, &val);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
582 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
583 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
584
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
585 if (val > 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
586 rc = nm_read_fields(conn, val, &sub_fields);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
587 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
588 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
589 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
590
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
591 *fields = nm_field_add_pointer(*fields, tag, 0, method,
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
592 0, sub_fields, type);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
593
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
594 sub_fields = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
595
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
596 } else if (type == NMFIELD_TYPE_UTF8 || type == NMFIELD_TYPE_DN) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
597
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
598 /* Read the string (first read the length) */
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
599 rc = nm_read_uint32(conn, &val);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
600 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
601 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
602
8753
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
603 if (val >= NMFIELD_MAX_STR_LENGTH) {
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
604 rc = NMERR_PROTOCOL;
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
605 break;
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
606 }
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
607
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
608 if (val > 0) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
609 str = g_new0(char, val + 1);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
610
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
611 rc = nm_read_all(conn, str, val);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
612 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
613 break;
8753
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
614
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
615 *fields = nm_field_add_pointer(*fields, tag, 0, method,
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
616 0, str, type);
8753
4a4e7b193a43 [gaim-migrate @ 9508]
Mike Stoddard <mistoddard@novell.com>
parents: 8684
diff changeset
617 str = NULL;
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
618 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
619
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
620 } else {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
621
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
622 /* Read the numerical value */
8874
6dda85680808 [gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents: 8753
diff changeset
623 rc = nm_read_uint32(conn, &val);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
624 if (rc != NM_OK)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
625 break;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
626
8933
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
627 *fields = nm_field_add_number(*fields, tag, 0, method,
0f1e8160581d [gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents: 8874
diff changeset
628 0, val, type);
8675
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
629 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
630
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
631 } while ((type != 0) && (count != 0));
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
632
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
633
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
634 if (str != NULL) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
635 g_free(str);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
636 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
637
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
638 if (sub_fields != NULL) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
639 nm_free_fields(&sub_fields);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
640 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
641
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
642 return rc;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
643 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
644
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
645 void
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
646 nm_conn_add_request_item(NMConn * conn, NMRequest * request)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
647 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
648 if (conn == NULL || request == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
649 return;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
650
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
651 nm_request_add_ref(request);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
652 conn->requests = g_slist_append(conn->requests, request);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
653 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
654
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
655 void
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
656 nm_conn_remove_request_item(NMConn * conn, NMRequest * request)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
657 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
658 if (conn == NULL || request == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
659 return;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
660
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
661 conn->requests = g_slist_remove(conn->requests, request);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
662 nm_release_request(request);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
663 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
664
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
665 NMRequest *
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
666 nm_conn_find_request(NMConn * conn, int trans_id)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
667 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
668 NMRequest *req = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
669 GSList *itr = NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
670
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
671 if (conn == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
672 return NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
673
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
674 itr = conn->requests;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
675 while (itr) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
676 req = (NMRequest *) itr->data;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
677 if (req != NULL && nm_request_get_trans_id(req) == trans_id) {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
678 return req;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
679 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
680 itr = g_slist_next(itr);
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
681 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
682 return NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
683 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
684
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
685 const char *
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
686 nm_conn_get_addr(NMConn * conn)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
687 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
688 if (conn == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
689 return NULL;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
690 else
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
691 return conn->addr;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
692 }
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
693
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
694 int
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
695 nm_conn_get_port(NMConn * conn)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
696 {
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
697 if (conn == NULL)
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
698 return -1;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
699 else
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
700 return conn->port;
4a14d9ec84a5 [gaim-migrate @ 9428]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
701 }

mercurial